DPDK patches and discussions
 help / color / mirror / Atom feed
Search results ordered by [date|relevance]  view[summary|nested|Atom feed]
thread overview below | download: 
* [PATCH v4 01/19] mbuf: replace term sanity check
  @ 2023-08-02 23:25  5%   ` Stephen Hemminger
  0 siblings, 0 replies; 200+ results
From: Stephen Hemminger @ 2023-08-02 23:25 UTC (permalink / raw)
  To: dev
  Cc: Stephen Hemminger, Andrew Rybchenko, Morten Brørup,
	Olivier Matz, Steven Webster, Matt Peters

Replace rte_mbuf_sanity_check() with rte_mbuf_verify()
to match the similar macro RTE_VERIFY() in rte_debug.h

The term sanity check is on the Tier 2 list of words
that should be replaced.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
Acked-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
---
 app/test/test_mbuf.c                   | 28 +++++-----
 doc/guides/prog_guide/mbuf_lib.rst     |  4 +-
 doc/guides/rel_notes/deprecation.rst   |  3 ++
 doc/guides/rel_notes/release_23_11.rst |  4 ++
 drivers/net/avp/avp_ethdev.c           | 18 +++----
 drivers/net/sfc/sfc_ef100_rx.c         |  6 +--
 drivers/net/sfc/sfc_ef10_essb_rx.c     |  4 +-
 drivers/net/sfc/sfc_ef10_rx.c          |  4 +-
 drivers/net/sfc/sfc_rx.c               |  2 +-
 examples/ipv4_multicast/main.c         |  2 +-
 lib/mbuf/rte_mbuf.c                    | 23 ++++++---
 lib/mbuf/rte_mbuf.h                    | 71 ++++++++++++++------------
 lib/mbuf/version.map                   |  1 +
 13 files changed, 94 insertions(+), 76 deletions(-)

diff --git a/app/test/test_mbuf.c b/app/test/test_mbuf.c
index efac01806bee..f3f5400e2eca 100644
--- a/app/test/test_mbuf.c
+++ b/app/test/test_mbuf.c
@@ -261,8 +261,8 @@ test_one_pktmbuf(struct rte_mempool *pktmbuf_pool)
 		GOTO_FAIL("Buffer should be continuous");
 	memset(hdr, 0x55, MBUF_TEST_HDR2_LEN);
 
-	rte_mbuf_sanity_check(m, 1);
-	rte_mbuf_sanity_check(m, 0);
+	rte_mbuf_verify(m, 1);
+	rte_mbuf_verify(m, 0);
 	rte_pktmbuf_dump(stdout, m, 0);
 
 	/* this prepend should fail */
@@ -1161,7 +1161,7 @@ test_refcnt_mbuf(void)
 
 #ifdef RTE_EXEC_ENV_WINDOWS
 static int
-test_failing_mbuf_sanity_check(struct rte_mempool *pktmbuf_pool)
+test_failing_mbuf_verify(struct rte_mempool *pktmbuf_pool)
 {
 	RTE_SET_USED(pktmbuf_pool);
 	return TEST_SKIPPED;
@@ -1180,12 +1180,12 @@ mbuf_check_pass(struct rte_mbuf *buf)
 }
 
 static int
-test_failing_mbuf_sanity_check(struct rte_mempool *pktmbuf_pool)
+test_failing_mbuf_verify(struct rte_mempool *pktmbuf_pool)
 {
 	struct rte_mbuf *buf;
 	struct rte_mbuf badbuf;
 
-	printf("Checking rte_mbuf_sanity_check for failure conditions\n");
+	printf("Checking rte_mbuf_verify for failure conditions\n");
 
 	/* get a good mbuf to use to make copies */
 	buf = rte_pktmbuf_alloc(pktmbuf_pool);
@@ -1707,7 +1707,7 @@ test_mbuf_validate_tx_offload(const char *test_name,
 		GOTO_FAIL("%s: mbuf allocation failed!\n", __func__);
 	if (rte_pktmbuf_pkt_len(m) != 0)
 		GOTO_FAIL("%s: Bad packet length\n", __func__);
-	rte_mbuf_sanity_check(m, 0);
+	rte_mbuf_verify(m, 0);
 	m->ol_flags = ol_flags;
 	m->tso_segsz = segsize;
 	ret = rte_validate_tx_offload(m);
@@ -1914,7 +1914,7 @@ test_pktmbuf_read(struct rte_mempool *pktmbuf_pool)
 		GOTO_FAIL("%s: mbuf allocation failed!\n", __func__);
 	if (rte_pktmbuf_pkt_len(m) != 0)
 		GOTO_FAIL("%s: Bad packet length\n", __func__);
-	rte_mbuf_sanity_check(m, 0);
+	rte_mbuf_verify(m, 0);
 
 	data = rte_pktmbuf_append(m, MBUF_TEST_DATA_LEN2);
 	if (data == NULL)
@@ -1963,7 +1963,7 @@ test_pktmbuf_read_from_offset(struct rte_mempool *pktmbuf_pool)
 
 	if (rte_pktmbuf_pkt_len(m) != 0)
 		GOTO_FAIL("%s: Bad packet length\n", __func__);
-	rte_mbuf_sanity_check(m, 0);
+	rte_mbuf_verify(m, 0);
 
 	/* prepend an ethernet header */
 	hdr = (struct ether_hdr *)rte_pktmbuf_prepend(m, hdr_len);
@@ -2108,7 +2108,7 @@ create_packet(struct rte_mempool *pktmbuf_pool,
 			GOTO_FAIL("%s: mbuf allocation failed!\n", __func__);
 		if (rte_pktmbuf_pkt_len(pkt_seg) != 0)
 			GOTO_FAIL("%s: Bad packet length\n", __func__);
-		rte_mbuf_sanity_check(pkt_seg, 0);
+		rte_mbuf_verify(pkt_seg, 0);
 		/* Add header only for the first segment */
 		if (test_data->flags == MBUF_HEADER && seg == 0) {
 			hdr_len = sizeof(struct rte_ether_hdr);
@@ -2320,7 +2320,7 @@ test_pktmbuf_ext_shinfo_init_helper(struct rte_mempool *pktmbuf_pool)
 		GOTO_FAIL("%s: mbuf allocation failed!\n", __func__);
 	if (rte_pktmbuf_pkt_len(m) != 0)
 		GOTO_FAIL("%s: Bad packet length\n", __func__);
-	rte_mbuf_sanity_check(m, 0);
+	rte_mbuf_verify(m, 0);
 
 	ext_buf_addr = rte_malloc("External buffer", buf_len,
 			RTE_CACHE_LINE_SIZE);
@@ -2484,8 +2484,8 @@ test_pktmbuf_ext_pinned_buffer(struct rte_mempool *std_pool)
 		GOTO_FAIL("%s: test_pktmbuf_copy(pinned) failed\n",
 			  __func__);
 
-	if (test_failing_mbuf_sanity_check(pinned_pool) < 0)
-		GOTO_FAIL("%s: test_failing_mbuf_sanity_check(pinned)"
+	if (test_failing_mbuf_verify(pinned_pool) < 0)
+		GOTO_FAIL("%s: test_failing_mbuf_verify(pinned)"
 			  " failed\n", __func__);
 
 	if (test_mbuf_linearize_check(pinned_pool) < 0)
@@ -2859,8 +2859,8 @@ test_mbuf(void)
 		goto err;
 	}
 
-	if (test_failing_mbuf_sanity_check(pktmbuf_pool) < 0) {
-		printf("test_failing_mbuf_sanity_check() failed\n");
+	if (test_failing_mbuf_verify(pktmbuf_pool) < 0) {
+		printf("test_failing_mbuf_verify() failed\n");
 		goto err;
 	}
 
diff --git a/doc/guides/prog_guide/mbuf_lib.rst b/doc/guides/prog_guide/mbuf_lib.rst
index 049357c75563..0accb51a98c7 100644
--- a/doc/guides/prog_guide/mbuf_lib.rst
+++ b/doc/guides/prog_guide/mbuf_lib.rst
@@ -266,8 +266,8 @@ can be found in several of the sample applications, for example, the IPv4 Multic
 Debug
 -----
 
-In debug mode, the functions of the mbuf library perform sanity checks before any operation (such as, buffer corruption,
-bad type, and so on).
+In debug mode, the functions of the mbuf library perform consistency checks
+before any operation (such as, buffer corruption, bad type, and so on).
 
 Use Cases
 ---------
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 494b401cda4b..1d8bbb0fd5f6 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -220,3 +220,6 @@ Deprecation Notices
   will be deprecated and subsequently removed in DPDK 24.11 release.
   Before this, the new port library API (functions rte_swx_port_*)
   will gradually transition from experimental to stable status.
+
+* mbuf: The function ``rte_mbuf_sanity_check`` is deprecated in DPDK 23.11
+  release. The new function will be ``rte_mbuf_verify``.
diff --git a/doc/guides/rel_notes/release_23_11.rst b/doc/guides/rel_notes/release_23_11.rst
index 6b4dd21fd0e1..8ff07c4a075f 100644
--- a/doc/guides/rel_notes/release_23_11.rst
+++ b/doc/guides/rel_notes/release_23_11.rst
@@ -84,6 +84,10 @@ API Changes
    Also, make sure to start the actual text at the margin.
    =======================================================
 
+* mbuf: function ``rte_mbuf_sanity_check`` has been renamed to
+  ``rte_mbuf_verify``. The old function name is deprecated
+  and will be removed in DPDK 24.11.
+
 
 ABI Changes
 -----------
diff --git a/drivers/net/avp/avp_ethdev.c b/drivers/net/avp/avp_ethdev.c
index b2a08f563542..b402c7a2ad16 100644
--- a/drivers/net/avp/avp_ethdev.c
+++ b/drivers/net/avp/avp_ethdev.c
@@ -1231,7 +1231,7 @@ _avp_mac_filter(struct avp_dev *avp, struct rte_mbuf *m)
 
 #ifdef RTE_LIBRTE_AVP_DEBUG_BUFFERS
 static inline void
-__avp_dev_buffer_sanity_check(struct avp_dev *avp, struct rte_avp_desc *buf)
+__avp_dev_buffer_check(struct avp_dev *avp, struct rte_avp_desc *buf)
 {
 	struct rte_avp_desc *first_buf;
 	struct rte_avp_desc *pkt_buf;
@@ -1272,12 +1272,12 @@ __avp_dev_buffer_sanity_check(struct avp_dev *avp, struct rte_avp_desc *buf)
 			  first_buf->pkt_len, pkt_len);
 }
 
-#define avp_dev_buffer_sanity_check(a, b) \
-	__avp_dev_buffer_sanity_check((a), (b))
+#define avp_dev_buffer_check(a, b) \
+	__avp_dev_buffer_check((a), (b))
 
 #else /* RTE_LIBRTE_AVP_DEBUG_BUFFERS */
 
-#define avp_dev_buffer_sanity_check(a, b) do {} while (0)
+#define avp_dev_buffer_check(a, b) do {} while (0)
 
 #endif
 
@@ -1302,7 +1302,7 @@ avp_dev_copy_from_buffers(struct avp_dev *avp,
 	void *pkt_data;
 	unsigned int i;
 
-	avp_dev_buffer_sanity_check(avp, buf);
+	avp_dev_buffer_check(avp, buf);
 
 	/* setup the first source buffer */
 	pkt_buf = avp_dev_translate_buffer(avp, buf);
@@ -1370,7 +1370,7 @@ avp_dev_copy_from_buffers(struct avp_dev *avp,
 	rte_pktmbuf_pkt_len(m) = total_length;
 	m->vlan_tci = vlan_tci;
 
-	__rte_mbuf_sanity_check(m, 1);
+	__rte_mbuf_verify(m, 1);
 
 	return m;
 }
@@ -1614,7 +1614,7 @@ avp_dev_copy_to_buffers(struct avp_dev *avp,
 	char *pkt_data;
 	unsigned int i;
 
-	__rte_mbuf_sanity_check(mbuf, 1);
+	__rte_mbuf_verify(mbuf, 1);
 
 	m = mbuf;
 	src_offset = 0;
@@ -1680,7 +1680,7 @@ avp_dev_copy_to_buffers(struct avp_dev *avp,
 		first_buf->vlan_tci = mbuf->vlan_tci;
 	}
 
-	avp_dev_buffer_sanity_check(avp, buffers[0]);
+	avp_dev_buffer_check(avp, buffers[0]);
 
 	return total_length;
 }
@@ -1798,7 +1798,7 @@ avp_xmit_scattered_pkts(void *tx_queue,
 
 #ifdef RTE_LIBRTE_AVP_DEBUG_BUFFERS
 	for (i = 0; i < nb_pkts; i++)
-		avp_dev_buffer_sanity_check(avp, tx_bufs[i]);
+		avp_dev_buffer_check(avp, tx_bufs[i]);
 #endif
 
 	/* send the packets */
diff --git a/drivers/net/sfc/sfc_ef100_rx.c b/drivers/net/sfc/sfc_ef100_rx.c
index 2677003da326..8199b56f2740 100644
--- a/drivers/net/sfc/sfc_ef100_rx.c
+++ b/drivers/net/sfc/sfc_ef100_rx.c
@@ -179,7 +179,7 @@ sfc_ef100_rx_qrefill(struct sfc_ef100_rxq *rxq)
 			struct sfc_ef100_rx_sw_desc *rxd;
 			rte_iova_t dma_addr;
 
-			__rte_mbuf_raw_sanity_check(m);
+			__rte_mbuf_raw_verify(m);
 
 			dma_addr = rte_mbuf_data_iova_default(m);
 			if (rxq->flags & SFC_EF100_RXQ_NIC_DMA_MAP) {
@@ -551,7 +551,7 @@ sfc_ef100_rx_process_ready_pkts(struct sfc_ef100_rxq *rxq,
 		rxq->ready_pkts--;
 
 		pkt = sfc_ef100_rx_next_mbuf(rxq);
-		__rte_mbuf_raw_sanity_check(pkt);
+		__rte_mbuf_raw_verify(pkt);
 
 		RTE_BUILD_BUG_ON(sizeof(pkt->rearm_data[0]) !=
 				 sizeof(rxq->rearm_data));
@@ -575,7 +575,7 @@ sfc_ef100_rx_process_ready_pkts(struct sfc_ef100_rxq *rxq,
 			struct rte_mbuf *seg;
 
 			seg = sfc_ef100_rx_next_mbuf(rxq);
-			__rte_mbuf_raw_sanity_check(seg);
+			__rte_mbuf_raw_verify(seg);
 
 			seg->data_off = RTE_PKTMBUF_HEADROOM;
 
diff --git a/drivers/net/sfc/sfc_ef10_essb_rx.c b/drivers/net/sfc/sfc_ef10_essb_rx.c
index 78bd430363b1..74647e2792b1 100644
--- a/drivers/net/sfc/sfc_ef10_essb_rx.c
+++ b/drivers/net/sfc/sfc_ef10_essb_rx.c
@@ -125,7 +125,7 @@ sfc_ef10_essb_next_mbuf(const struct sfc_ef10_essb_rxq *rxq,
 	struct rte_mbuf *m;
 
 	m = (struct rte_mbuf *)((uintptr_t)mbuf + rxq->buf_stride);
-	__rte_mbuf_raw_sanity_check(m);
+	__rte_mbuf_raw_verify(m);
 	return m;
 }
 
@@ -136,7 +136,7 @@ sfc_ef10_essb_mbuf_by_index(const struct sfc_ef10_essb_rxq *rxq,
 	struct rte_mbuf *m;
 
 	m = (struct rte_mbuf *)((uintptr_t)mbuf + idx * rxq->buf_stride);
-	__rte_mbuf_raw_sanity_check(m);
+	__rte_mbuf_raw_verify(m);
 	return m;
 }
 
diff --git a/drivers/net/sfc/sfc_ef10_rx.c b/drivers/net/sfc/sfc_ef10_rx.c
index 30a320d0791c..72b03b3bba7a 100644
--- a/drivers/net/sfc/sfc_ef10_rx.c
+++ b/drivers/net/sfc/sfc_ef10_rx.c
@@ -148,7 +148,7 @@ sfc_ef10_rx_qrefill(struct sfc_ef10_rxq *rxq)
 			struct sfc_ef10_rx_sw_desc *rxd;
 			rte_iova_t phys_addr;
 
-			__rte_mbuf_raw_sanity_check(m);
+			__rte_mbuf_raw_verify(m);
 
 			SFC_ASSERT((id & ~ptr_mask) == 0);
 			rxd = &rxq->sw_ring[id];
@@ -297,7 +297,7 @@ sfc_ef10_rx_process_event(struct sfc_ef10_rxq *rxq, efx_qword_t rx_ev,
 		rxd = &rxq->sw_ring[pending++ & ptr_mask];
 		m = rxd->mbuf;
 
-		__rte_mbuf_raw_sanity_check(m);
+		__rte_mbuf_raw_verify(m);
 
 		m->data_off = RTE_PKTMBUF_HEADROOM;
 		rte_pktmbuf_data_len(m) = seg_len;
diff --git a/drivers/net/sfc/sfc_rx.c b/drivers/net/sfc/sfc_rx.c
index 1dde2c111001..645c8643d1c1 100644
--- a/drivers/net/sfc/sfc_rx.c
+++ b/drivers/net/sfc/sfc_rx.c
@@ -120,7 +120,7 @@ sfc_efx_rx_qrefill(struct sfc_efx_rxq *rxq)
 		     ++i, id = (id + 1) & rxq->ptr_mask) {
 			m = objs[i];
 
-			__rte_mbuf_raw_sanity_check(m);
+			__rte_mbuf_raw_verify(m);
 
 			rxd = &rxq->sw_desc[id];
 			rxd->mbuf = m;
diff --git a/examples/ipv4_multicast/main.c b/examples/ipv4_multicast/main.c
index 6d0a8501eff5..f39658f4e249 100644
--- a/examples/ipv4_multicast/main.c
+++ b/examples/ipv4_multicast/main.c
@@ -258,7 +258,7 @@ mcast_out_pkt(struct rte_mbuf *pkt, int use_clone)
 	hdr->pkt_len = (uint16_t)(hdr->data_len + pkt->pkt_len);
 	hdr->nb_segs = pkt->nb_segs + 1;
 
-	__rte_mbuf_sanity_check(hdr, 1);
+	__rte_mbuf_verify(hdr, 1);
 	return hdr;
 }
 /* >8 End of mcast_out_kt. */
diff --git a/lib/mbuf/rte_mbuf.c b/lib/mbuf/rte_mbuf.c
index 686e797c80c4..91cb2f84f6a1 100644
--- a/lib/mbuf/rte_mbuf.c
+++ b/lib/mbuf/rte_mbuf.c
@@ -363,9 +363,9 @@ rte_pktmbuf_pool_create_extbuf(const char *name, unsigned int n,
 	return mp;
 }
 
-/* do some sanity checks on a mbuf: panic if it fails */
+/* do some checks on a mbuf: panic if it fails */
 void
-rte_mbuf_sanity_check(const struct rte_mbuf *m, int is_header)
+rte_mbuf_verify(const struct rte_mbuf *m, int is_header)
 {
 	const char *reason;
 
@@ -373,6 +373,13 @@ rte_mbuf_sanity_check(const struct rte_mbuf *m, int is_header)
 		rte_panic("%s\n", reason);
 }
 
+/* For ABI compatibility, to be removed in next release */
+void
+rte_mbuf_sanity_check(const struct rte_mbuf *m, int is_header)
+{
+	rte_mbuf_verify(m, is_header);
+}
+
 int rte_mbuf_check(const struct rte_mbuf *m, int is_header,
 		   const char **reason)
 {
@@ -492,7 +499,7 @@ void rte_pktmbuf_free_bulk(struct rte_mbuf **mbufs, unsigned int count)
 		if (unlikely(m == NULL))
 			continue;
 
-		__rte_mbuf_sanity_check(m, 1);
+		__rte_mbuf_verify(m, 1);
 
 		do {
 			m_next = m->next;
@@ -542,7 +549,7 @@ rte_pktmbuf_clone(struct rte_mbuf *md, struct rte_mempool *mp)
 		return NULL;
 	}
 
-	__rte_mbuf_sanity_check(mc, 1);
+	__rte_mbuf_verify(mc, 1);
 	return mc;
 }
 
@@ -592,7 +599,7 @@ rte_pktmbuf_copy(const struct rte_mbuf *m, struct rte_mempool *mp,
 	struct rte_mbuf *mc, *m_last, **prev;
 
 	/* garbage in check */
-	__rte_mbuf_sanity_check(m, 1);
+	__rte_mbuf_verify(m, 1);
 
 	/* check for request to copy at offset past end of mbuf */
 	if (unlikely(off >= m->pkt_len))
@@ -656,7 +663,7 @@ rte_pktmbuf_copy(const struct rte_mbuf *m, struct rte_mempool *mp,
 	}
 
 	/* garbage out check */
-	__rte_mbuf_sanity_check(mc, 1);
+	__rte_mbuf_verify(mc, 1);
 	return mc;
 }
 
@@ -667,7 +674,7 @@ rte_pktmbuf_dump(FILE *f, const struct rte_mbuf *m, unsigned dump_len)
 	unsigned int len;
 	unsigned int nb_segs;
 
-	__rte_mbuf_sanity_check(m, 1);
+	__rte_mbuf_verify(m, 1);
 
 	fprintf(f, "dump mbuf at %p, iova=%#" PRIx64 ", buf_len=%u\n", m, rte_mbuf_iova_get(m),
 		m->buf_len);
@@ -685,7 +692,7 @@ rte_pktmbuf_dump(FILE *f, const struct rte_mbuf *m, unsigned dump_len)
 	nb_segs = m->nb_segs;
 
 	while (m && nb_segs != 0) {
-		__rte_mbuf_sanity_check(m, 0);
+		__rte_mbuf_verify(m, 0);
 
 		fprintf(f, "  segment at %p, data=%p, len=%u, off=%u, refcnt=%u\n",
 			m, rte_pktmbuf_mtod(m, void *),
diff --git a/lib/mbuf/rte_mbuf.h b/lib/mbuf/rte_mbuf.h
index 913c459b1cc6..3bd50d7307b3 100644
--- a/lib/mbuf/rte_mbuf.h
+++ b/lib/mbuf/rte_mbuf.h
@@ -339,13 +339,13 @@ rte_pktmbuf_priv_flags(struct rte_mempool *mp)
 
 #ifdef RTE_LIBRTE_MBUF_DEBUG
 
-/**  check mbuf type in debug mode */
-#define __rte_mbuf_sanity_check(m, is_h) rte_mbuf_sanity_check(m, is_h)
+/**  do mbuf type in debug mode */
+#define __rte_mbuf_verify(m, is_h) rte_mbuf_verify(m, is_h)
 
 #else /*  RTE_LIBRTE_MBUF_DEBUG */
 
-/**  check mbuf type in debug mode */
-#define __rte_mbuf_sanity_check(m, is_h) do { } while (0)
+/**  ignore mbuf checks if not in debug mode */
+#define __rte_mbuf_verify(m, is_h) do { } while (0)
 
 #endif /*  RTE_LIBRTE_MBUF_DEBUG */
 
@@ -514,10 +514,9 @@ rte_mbuf_ext_refcnt_update(struct rte_mbuf_ext_shared_info *shinfo,
 
 
 /**
- * Sanity checks on an mbuf.
+ * Check that the mbuf is valid and panic if corrupted.
  *
- * Check the consistency of the given mbuf. The function will cause a
- * panic if corruption is detected.
+ * Acts assertion that mbuf is consistent. If not it calls rte_panic().
  *
  * @param m
  *   The mbuf to be checked.
@@ -526,13 +525,17 @@ rte_mbuf_ext_refcnt_update(struct rte_mbuf_ext_shared_info *shinfo,
  *   of a packet (in this case, some fields like nb_segs are not checked)
  */
 void
+rte_mbuf_verify(const struct rte_mbuf *m, int is_header);
+
+/* Older deprecated name for rte_mbuf_verify() */
+void __rte_deprecated
 rte_mbuf_sanity_check(const struct rte_mbuf *m, int is_header);
 
 /**
- * Sanity checks on a mbuf.
+ * Do consistency checks on a mbuf.
  *
- * Almost like rte_mbuf_sanity_check(), but this function gives the reason
- * if corruption is detected rather than panic.
+ * Check the consistency of the given mbuf and if not valid
+ * return the reason.
  *
  * @param m
  *   The mbuf to be checked.
@@ -551,7 +554,7 @@ int rte_mbuf_check(const struct rte_mbuf *m, int is_header,
 		   const char **reason);
 
 /**
- * Sanity checks on a reinitialized mbuf in debug mode.
+ * Do checks on a reinitialized mbuf in debug mode.
  *
  * Check the consistency of the given reinitialized mbuf.
  * The function will cause a panic if corruption is detected.
@@ -563,16 +566,16 @@ int rte_mbuf_check(const struct rte_mbuf *m, int is_header,
  *   The mbuf to be checked.
  */
 static __rte_always_inline void
-__rte_mbuf_raw_sanity_check(__rte_unused const struct rte_mbuf *m)
+__rte_mbuf_raw_verify(__rte_unused const struct rte_mbuf *m)
 {
 	RTE_ASSERT(rte_mbuf_refcnt_read(m) == 1);
 	RTE_ASSERT(m->next == NULL);
 	RTE_ASSERT(m->nb_segs == 1);
-	__rte_mbuf_sanity_check(m, 0);
+	__rte_mbuf_verify(m, 0);
 }
 
 /** For backwards compatibility. */
-#define MBUF_RAW_ALLOC_CHECK(m) __rte_mbuf_raw_sanity_check(m)
+#define MBUF_RAW_ALLOC_CHECK(m) __rte_mbuf_raw_verify(m)
 
 /**
  * Allocate an uninitialized mbuf from mempool *mp*.
@@ -599,7 +602,7 @@ static inline struct rte_mbuf *rte_mbuf_raw_alloc(struct rte_mempool *mp)
 
 	if (rte_mempool_get(mp, (void **)&m) < 0)
 		return NULL;
-	__rte_mbuf_raw_sanity_check(m);
+	__rte_mbuf_raw_verify(m);
 	return m;
 }
 
@@ -622,7 +625,7 @@ rte_mbuf_raw_free(struct rte_mbuf *m)
 {
 	RTE_ASSERT(!RTE_MBUF_CLONED(m) &&
 		  (!RTE_MBUF_HAS_EXTBUF(m) || RTE_MBUF_HAS_PINNED_EXTBUF(m)));
-	__rte_mbuf_raw_sanity_check(m);
+	__rte_mbuf_raw_verify(m);
 	rte_mempool_put(m->pool, m);
 }
 
@@ -886,7 +889,7 @@ static inline void rte_pktmbuf_reset(struct rte_mbuf *m)
 	rte_pktmbuf_reset_headroom(m);
 
 	m->data_len = 0;
-	__rte_mbuf_sanity_check(m, 1);
+	__rte_mbuf_verify(m, 1);
 }
 
 /**
@@ -942,22 +945,22 @@ static inline int rte_pktmbuf_alloc_bulk(struct rte_mempool *pool,
 	switch (count % 4) {
 	case 0:
 		while (idx != count) {
-			__rte_mbuf_raw_sanity_check(mbufs[idx]);
+			__rte_mbuf_raw_verify(mbufs[idx]);
 			rte_pktmbuf_reset(mbufs[idx]);
 			idx++;
 			/* fall-through */
 	case 3:
-			__rte_mbuf_raw_sanity_check(mbufs[idx]);
+			__rte_mbuf_raw_verify(mbufs[idx]);
 			rte_pktmbuf_reset(mbufs[idx]);
 			idx++;
 			/* fall-through */
 	case 2:
-			__rte_mbuf_raw_sanity_check(mbufs[idx]);
+			__rte_mbuf_raw_verify(mbufs[idx]);
 			rte_pktmbuf_reset(mbufs[idx]);
 			idx++;
 			/* fall-through */
 	case 1:
-			__rte_mbuf_raw_sanity_check(mbufs[idx]);
+			__rte_mbuf_raw_verify(mbufs[idx]);
 			rte_pktmbuf_reset(mbufs[idx]);
 			idx++;
 			/* fall-through */
@@ -1185,8 +1188,8 @@ static inline void rte_pktmbuf_attach(struct rte_mbuf *mi, struct rte_mbuf *m)
 	mi->pkt_len = mi->data_len;
 	mi->nb_segs = 1;
 
-	__rte_mbuf_sanity_check(mi, 1);
-	__rte_mbuf_sanity_check(m, 0);
+	__rte_mbuf_verify(mi, 1);
+	__rte_mbuf_verify(m, 0);
 }
 
 /**
@@ -1341,7 +1344,7 @@ static inline int __rte_pktmbuf_pinned_extbuf_decref(struct rte_mbuf *m)
 static __rte_always_inline struct rte_mbuf *
 rte_pktmbuf_prefree_seg(struct rte_mbuf *m)
 {
-	__rte_mbuf_sanity_check(m, 0);
+	__rte_mbuf_verify(m, 0);
 
 	if (likely(rte_mbuf_refcnt_read(m) == 1)) {
 
@@ -1412,7 +1415,7 @@ static inline void rte_pktmbuf_free(struct rte_mbuf *m)
 	struct rte_mbuf *m_next;
 
 	if (m != NULL)
-		__rte_mbuf_sanity_check(m, 1);
+		__rte_mbuf_verify(m, 1);
 
 	while (m != NULL) {
 		m_next = m->next;
@@ -1493,7 +1496,7 @@ rte_pktmbuf_copy(const struct rte_mbuf *m, struct rte_mempool *mp,
  */
 static inline void rte_pktmbuf_refcnt_update(struct rte_mbuf *m, int16_t v)
 {
-	__rte_mbuf_sanity_check(m, 1);
+	__rte_mbuf_verify(m, 1);
 
 	do {
 		rte_mbuf_refcnt_update(m, v);
@@ -1510,7 +1513,7 @@ static inline void rte_pktmbuf_refcnt_update(struct rte_mbuf *m, int16_t v)
  */
 static inline uint16_t rte_pktmbuf_headroom(const struct rte_mbuf *m)
 {
-	__rte_mbuf_sanity_check(m, 0);
+	__rte_mbuf_verify(m, 0);
 	return m->data_off;
 }
 
@@ -1524,7 +1527,7 @@ static inline uint16_t rte_pktmbuf_headroom(const struct rte_mbuf *m)
  */
 static inline uint16_t rte_pktmbuf_tailroom(const struct rte_mbuf *m)
 {
-	__rte_mbuf_sanity_check(m, 0);
+	__rte_mbuf_verify(m, 0);
 	return (uint16_t)(m->buf_len - rte_pktmbuf_headroom(m) -
 			  m->data_len);
 }
@@ -1539,7 +1542,7 @@ static inline uint16_t rte_pktmbuf_tailroom(const struct rte_mbuf *m)
  */
 static inline struct rte_mbuf *rte_pktmbuf_lastseg(struct rte_mbuf *m)
 {
-	__rte_mbuf_sanity_check(m, 1);
+	__rte_mbuf_verify(m, 1);
 	while (m->next != NULL)
 		m = m->next;
 	return m;
@@ -1583,7 +1586,7 @@ static inline struct rte_mbuf *rte_pktmbuf_lastseg(struct rte_mbuf *m)
 static inline char *rte_pktmbuf_prepend(struct rte_mbuf *m,
 					uint16_t len)
 {
-	__rte_mbuf_sanity_check(m, 1);
+	__rte_mbuf_verify(m, 1);
 
 	if (unlikely(len > rte_pktmbuf_headroom(m)))
 		return NULL;
@@ -1618,7 +1621,7 @@ static inline char *rte_pktmbuf_append(struct rte_mbuf *m, uint16_t len)
 	void *tail;
 	struct rte_mbuf *m_last;
 
-	__rte_mbuf_sanity_check(m, 1);
+	__rte_mbuf_verify(m, 1);
 
 	m_last = rte_pktmbuf_lastseg(m);
 	if (unlikely(len > rte_pktmbuf_tailroom(m_last)))
@@ -1646,7 +1649,7 @@ static inline char *rte_pktmbuf_append(struct rte_mbuf *m, uint16_t len)
  */
 static inline char *rte_pktmbuf_adj(struct rte_mbuf *m, uint16_t len)
 {
-	__rte_mbuf_sanity_check(m, 1);
+	__rte_mbuf_verify(m, 1);
 
 	if (unlikely(len > m->data_len))
 		return NULL;
@@ -1678,7 +1681,7 @@ static inline int rte_pktmbuf_trim(struct rte_mbuf *m, uint16_t len)
 {
 	struct rte_mbuf *m_last;
 
-	__rte_mbuf_sanity_check(m, 1);
+	__rte_mbuf_verify(m, 1);
 
 	m_last = rte_pktmbuf_lastseg(m);
 	if (unlikely(len > m_last->data_len))
@@ -1700,7 +1703,7 @@ static inline int rte_pktmbuf_trim(struct rte_mbuf *m, uint16_t len)
  */
 static inline int rte_pktmbuf_is_contiguous(const struct rte_mbuf *m)
 {
-	__rte_mbuf_sanity_check(m, 1);
+	__rte_mbuf_verify(m, 1);
 	return m->nb_segs == 1;
 }
 
diff --git a/lib/mbuf/version.map b/lib/mbuf/version.map
index f010d4692e3e..04d9ffc1bdb3 100644
--- a/lib/mbuf/version.map
+++ b/lib/mbuf/version.map
@@ -31,6 +31,7 @@ DPDK_24 {
 	rte_mbuf_set_platform_mempool_ops;
 	rte_mbuf_set_user_mempool_ops;
 	rte_mbuf_user_mempool_ops;
+	rte_mbuf_verify;
 	rte_pktmbuf_clone;
 	rte_pktmbuf_copy;
 	rte_pktmbuf_dump;
-- 
2.39.2


^ permalink raw reply	[relevance 5%]

* Re: [PATCH] eal/windows: resolve conversion and truncation warnings
  @ 2023-08-02 22:41  3%   ` Tyler Retzlaff
  0 siblings, 0 replies; 200+ results
From: Tyler Retzlaff @ 2023-08-02 22:41 UTC (permalink / raw)
  To: Dmitry Kozlyuk
  Cc: dev, Narcisa Ana Maria Vasile, Dmitry Malloy, Pallavi Kadam

On Thu, Aug 03, 2023 at 01:29:00AM +0300, Dmitry Kozlyuk wrote:
> 2023-08-02 13:48 (UTC-0700), Tyler Retzlaff:
> > * Initialize const int NS_PER_SEC with an integer literal instead of
> >   double thereby avoiding implicit conversion from double to int.
> > 
> > * Cast the result of the expression assigned to timspec.tv_nsec to long.
> 
> Typo: "timespec".

oops 

> 
> >   Windows builds generate integer truncation warning for this assignment
> >   since the result of the expression was 8 bytes (LONGLONG) but
> >   on Windows targets is 4 bytes.
> 
> Probably "but **tv_nsec** on Windows targets is 4 bytes".

thanks i'll update the wording.

one thing that confuses me a little and this change won't break how the
code already works (just makes the cast redundant) is that for mingw
sizeof(long) is being reported as 8 bytes.

this is in spec relative to the C standard but it does leave me somewhat
concerned if struct timespec as defined in the windows headers crosses
an abi boundary.

have you ever noticed this? any thoughts on it?

> 
> >   The value produced for the expression should safely fit in the long.
> > 
> > Signed-off-by: Tyler Retzlaff <roretzla@linux.microsoft.com>
> > ---
> >  lib/eal/windows/include/rte_os_shim.h | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> Acked-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>

thanks!

^ permalink raw reply	[relevance 3%]

* [PATCH v10 10/13] eal: expand most macros to empty when using MSVC
  @ 2023-08-02 21:35  5%   ` Tyler Retzlaff
  0 siblings, 0 replies; 200+ results
From: Tyler Retzlaff @ 2023-08-02 21:35 UTC (permalink / raw)
  To: dev
  Cc: Bruce Richardson, Konstantin Ananyev, Ciara Power, thomas,
	david.marchand, mb, Tyler Retzlaff

For now expand a lot of common rte macros empty. The catch here is we
need to test that most of the macros do what they should but at the same
time they are blocking work needed to bootstrap of the unit tests.

Later we will return and provide (where possible) expansions that work
correctly for msvc and where not possible provide some alternate macros
to achieve the same outcome.

Signed-off-by: Tyler Retzlaff <roretzla@linux.microsoft.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
---
 lib/eal/include/rte_branch_prediction.h |  8 +++++
 lib/eal/include/rte_common.h            | 54 +++++++++++++++++++++++++++++++++
 lib/eal/include/rte_compat.h            | 20 ++++++++++++
 3 files changed, 82 insertions(+)

diff --git a/lib/eal/include/rte_branch_prediction.h b/lib/eal/include/rte_branch_prediction.h
index 414cd92..c0356ca 100644
--- a/lib/eal/include/rte_branch_prediction.h
+++ b/lib/eal/include/rte_branch_prediction.h
@@ -24,7 +24,11 @@
  *      do_stuff();
  */
 #ifndef likely
+#ifdef RTE_TOOLCHAIN_MSVC
+#define likely(x)	(!!(x))
+#else
 #define likely(x)	__builtin_expect(!!(x), 1)
+#endif
 #endif /* likely */
 
 /**
@@ -37,7 +41,11 @@
  *      do_stuff();
  */
 #ifndef unlikely
+#ifdef RTE_TOOLCHAIN_MSVC
+#define unlikely(x)	(!!(x))
+#else
 #define unlikely(x)	__builtin_expect(!!(x), 0)
+#endif
 #endif /* unlikely */
 
 #ifdef __cplusplus
diff --git a/lib/eal/include/rte_common.h b/lib/eal/include/rte_common.h
index 2f464e3..b087532 100644
--- a/lib/eal/include/rte_common.h
+++ b/lib/eal/include/rte_common.h
@@ -41,6 +41,10 @@
 #define RTE_STD_C11
 #endif
 
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __extension__
+#endif
+
 /*
  * RTE_TOOLCHAIN_GCC is defined if the target is built with GCC,
  * while a host application (like pmdinfogen) may have another compiler.
@@ -65,7 +69,11 @@
 /**
  * Force alignment
  */
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_aligned(a)
+#else
 #define __rte_aligned(a) __attribute__((__aligned__(a)))
+#endif
 
 #ifdef RTE_ARCH_STRICT_ALIGN
 typedef uint64_t unaligned_uint64_t __rte_aligned(1);
@@ -80,16 +88,29 @@
 /**
  * Force a structure to be packed
  */
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_packed
+#else
 #define __rte_packed __attribute__((__packed__))
+#endif
 
 /**
  * Macro to mark a type that is not subject to type-based aliasing rules
  */
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_may_alias
+#else
 #define __rte_may_alias __attribute__((__may_alias__))
+#endif
 
 /******* Macro to mark functions and fields scheduled for removal *****/
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_deprecated
+#define __rte_deprecated_msg(msg)
+#else
 #define __rte_deprecated	__attribute__((__deprecated__))
 #define __rte_deprecated_msg(msg)	__attribute__((__deprecated__(msg)))
+#endif
 
 /**
  *  Macro to mark macros and defines scheduled for removal
@@ -110,14 +131,22 @@
 /**
  * Force symbol to be generated even if it appears to be unused.
  */
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_used
+#else
 #define __rte_used __attribute__((used))
+#endif
 
 /*********** Macros to eliminate unused variable warnings ********/
 
 /**
  * short definition to mark a function parameter unused
  */
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_unused
+#else
 #define __rte_unused __attribute__((__unused__))
+#endif
 
 /**
  * Mark pointer as restricted with regard to pointer aliasing.
@@ -141,6 +170,9 @@
  * even if the underlying stdio implementation is ANSI-compliant,
  * so this must be overridden.
  */
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_format_printf(format_index, first_arg)
+#else
 #if RTE_CC_IS_GNU
 #define __rte_format_printf(format_index, first_arg) \
 	__attribute__((format(gnu_printf, format_index, first_arg)))
@@ -148,6 +180,7 @@
 #define __rte_format_printf(format_index, first_arg) \
 	__attribute__((format(printf, format_index, first_arg)))
 #endif
+#endif
 
 /**
  * Tells compiler that the function returns a value that points to
@@ -222,7 +255,11 @@ static void __attribute__((destructor(RTE_PRIO(prio)), used)) func(void)
 /**
  * Hint never returning function
  */
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_noreturn
+#else
 #define __rte_noreturn __attribute__((noreturn))
+#endif
 
 /**
  * Issue a warning in case the function's return value is ignored.
@@ -247,12 +284,20 @@ static void __attribute__((destructor(RTE_PRIO(prio)), used)) func(void)
  *  }
  * @endcode
  */
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_warn_unused_result
+#else
 #define __rte_warn_unused_result __attribute__((warn_unused_result))
+#endif
 
 /**
  * Force a function to be inlined
  */
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_always_inline
+#else
 #define __rte_always_inline inline __attribute__((always_inline))
+#endif
 
 /**
  * Force a function to be noinlined
@@ -437,7 +482,11 @@ static void __attribute__((destructor(RTE_PRIO(prio)), used)) func(void)
 #define RTE_CACHE_LINE_MIN_SIZE 64
 
 /** Force alignment to cache line. */
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_cache_aligned
+#else
 #define __rte_cache_aligned __rte_aligned(RTE_CACHE_LINE_SIZE)
+#endif
 
 /** Force minimum cache line alignment. */
 #define __rte_cache_min_aligned __rte_aligned(RTE_CACHE_LINE_MIN_SIZE)
@@ -812,6 +861,10 @@ static void __attribute__((destructor(RTE_PRIO(prio)), used)) func(void)
  *  struct wrapper *w = container_of(x, struct wrapper, c);
  */
 #ifndef container_of
+#ifdef RTE_TOOLCHAIN_MSVC
+#define container_of(ptr, type, member) \
+			((type *)((uintptr_t)(ptr) - offsetof(type, member)))
+#else
 #define container_of(ptr, type, member)	__extension__ ({		\
 			const typeof(((type *)0)->member) *_ptr = (ptr); \
 			__rte_unused type *_target_ptr =	\
@@ -819,6 +872,7 @@ static void __attribute__((destructor(RTE_PRIO(prio)), used)) func(void)
 			(type *)(((uintptr_t)_ptr) - offsetof(type, member)); \
 		})
 #endif
+#endif
 
 /** Swap two variables. */
 #define RTE_SWAP(a, b) \
diff --git a/lib/eal/include/rte_compat.h b/lib/eal/include/rte_compat.h
index fc9fbaa..716bc03 100644
--- a/lib/eal/include/rte_compat.h
+++ b/lib/eal/include/rte_compat.h
@@ -12,14 +12,22 @@
 
 #ifndef ALLOW_EXPERIMENTAL_API
 
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_experimental
+#else
 #define __rte_experimental \
 __attribute__((deprecated("Symbol is not yet part of stable ABI"), \
 section(".text.experimental")))
+#endif
 
 #else
 
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_experimental
+#else
 #define __rte_experimental \
 __attribute__((section(".text.experimental")))
+#endif
 
 #endif
 
@@ -30,23 +38,35 @@
 
 #if !defined ALLOW_INTERNAL_API && __has_attribute(error) /* For GCC */
 
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_internal
+#else
 #define __rte_internal \
 __attribute__((error("Symbol is not public ABI"), \
 section(".text.internal")))
+#endif
 
 #elif !defined ALLOW_INTERNAL_API && __has_attribute(diagnose_if) /* For clang */
 
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_internal
+#else
 #define __rte_internal \
 _Pragma("GCC diagnostic push") \
 _Pragma("GCC diagnostic ignored \"-Wgcc-compat\"") \
 __attribute__((diagnose_if(1, "Symbol is not public ABI", "error"), \
 section(".text.internal"))) \
 _Pragma("GCC diagnostic pop")
+#endif
 
 #else
 
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_internal
+#else
 #define __rte_internal \
 __attribute__((section(".text.internal")))
+#endif
 
 #endif
 
-- 
1.8.3.1


^ permalink raw reply	[relevance 5%]

* [PATCH 1/2] eal: remove RTE_CPUFLAG_NUMFLAGS
@ 2023-08-02 21:11  2% Sivaprasad Tummala
  2023-08-02 21:11  3% ` [PATCH 2/2] test/cpuflags: " Sivaprasad Tummala
  0 siblings, 1 reply; 200+ results
From: Sivaprasad Tummala @ 2023-08-02 21:11 UTC (permalink / raw)
  To: ruifeng.wang, zhoumin, drc, kda, bruce.richardson, konstantin.v.ananyev
  Cc: dev

This patch removes RTE_CPUFLAG_NUMFLAGS to allow new CPU
features without breaking ABI each time.

Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
---
 lib/eal/arm/include/rte_cpuflags_32.h    | 1 -
 lib/eal/arm/include/rte_cpuflags_64.h    | 1 -
 lib/eal/arm/rte_cpuflags.c               | 7 +++++--
 lib/eal/loongarch/include/rte_cpuflags.h | 1 -
 lib/eal/loongarch/rte_cpuflags.c         | 7 +++++--
 lib/eal/ppc/include/rte_cpuflags.h       | 1 -
 lib/eal/ppc/rte_cpuflags.c               | 7 +++++--
 lib/eal/riscv/include/rte_cpuflags.h     | 1 -
 lib/eal/riscv/rte_cpuflags.c             | 7 +++++--
 lib/eal/x86/include/rte_cpuflags.h       | 1 -
 lib/eal/x86/rte_cpuflags.c               | 7 +++++--
 11 files changed, 25 insertions(+), 16 deletions(-)

diff --git a/lib/eal/arm/include/rte_cpuflags_32.h b/lib/eal/arm/include/rte_cpuflags_32.h
index 4e254428a2..41ab0d5f21 100644
--- a/lib/eal/arm/include/rte_cpuflags_32.h
+++ b/lib/eal/arm/include/rte_cpuflags_32.h
@@ -43,7 +43,6 @@ enum rte_cpu_flag_t {
 	RTE_CPUFLAG_V7L,
 	RTE_CPUFLAG_V8L,
 	/* The last item */
-	RTE_CPUFLAG_NUMFLAGS,/**< This should always be the last! */
 };
 
 #include "generic/rte_cpuflags.h"
diff --git a/lib/eal/arm/include/rte_cpuflags_64.h b/lib/eal/arm/include/rte_cpuflags_64.h
index aa7a56d491..ea5193e510 100644
--- a/lib/eal/arm/include/rte_cpuflags_64.h
+++ b/lib/eal/arm/include/rte_cpuflags_64.h
@@ -37,7 +37,6 @@ enum rte_cpu_flag_t {
 	RTE_CPUFLAG_SVEBF16,
 	RTE_CPUFLAG_AARCH64,
 	/* The last item */
-	RTE_CPUFLAG_NUMFLAGS,/**< This should always be the last! */
 };
 
 #include "generic/rte_cpuflags.h"
diff --git a/lib/eal/arm/rte_cpuflags.c b/lib/eal/arm/rte_cpuflags.c
index 56e7b2e689..447a8d9f9f 100644
--- a/lib/eal/arm/rte_cpuflags.c
+++ b/lib/eal/arm/rte_cpuflags.c
@@ -139,8 +139,9 @@ rte_cpu_get_flag_enabled(enum rte_cpu_flag_t feature)
 {
 	const struct feature_entry *feat;
 	hwcap_registers_t regs = {0};
+	unsigned int num_flags = RTE_DIM(rte_cpu_feature_table);
 
-	if (feature >= RTE_CPUFLAG_NUMFLAGS)
+	if (feature >= num_flags)
 		return -ENOENT;
 
 	feat = &rte_cpu_feature_table[feature];
@@ -154,7 +155,9 @@ rte_cpu_get_flag_enabled(enum rte_cpu_flag_t feature)
 const char *
 rte_cpu_get_flag_name(enum rte_cpu_flag_t feature)
 {
-	if (feature >= RTE_CPUFLAG_NUMFLAGS)
+	unsigned int num_flags = RTE_DIM(rte_cpu_feature_table);
+
+	if (feature >= num_flags)
 		return NULL;
 	return rte_cpu_feature_table[feature].name;
 }
diff --git a/lib/eal/loongarch/include/rte_cpuflags.h b/lib/eal/loongarch/include/rte_cpuflags.h
index 1c80779262..9ff8baaa3c 100644
--- a/lib/eal/loongarch/include/rte_cpuflags.h
+++ b/lib/eal/loongarch/include/rte_cpuflags.h
@@ -27,7 +27,6 @@ enum rte_cpu_flag_t {
 	RTE_CPUFLAG_LBT_ARM,
 	RTE_CPUFLAG_LBT_MIPS,
 	/* The last item */
-	RTE_CPUFLAG_NUMFLAGS /**< This should always be the last! */
 };
 
 #include "generic/rte_cpuflags.h"
diff --git a/lib/eal/loongarch/rte_cpuflags.c b/lib/eal/loongarch/rte_cpuflags.c
index 0a75ca58d4..642eb42509 100644
--- a/lib/eal/loongarch/rte_cpuflags.c
+++ b/lib/eal/loongarch/rte_cpuflags.c
@@ -66,8 +66,9 @@ rte_cpu_get_flag_enabled(enum rte_cpu_flag_t feature)
 {
 	const struct feature_entry *feat;
 	hwcap_registers_t regs = {0};
+	unsigned int num_flags = RTE_DIM(rte_cpu_feature_table);
 
-	if (feature >= RTE_CPUFLAG_NUMFLAGS)
+	if (feature >= num_flags)
 		return -ENOENT;
 
 	feat = &rte_cpu_feature_table[feature];
@@ -81,7 +82,9 @@ rte_cpu_get_flag_enabled(enum rte_cpu_flag_t feature)
 const char *
 rte_cpu_get_flag_name(enum rte_cpu_flag_t feature)
 {
-	if (feature >= RTE_CPUFLAG_NUMFLAGS)
+	unsigned int num_flags = RTE_DIM(rte_cpu_feature_table);
+
+	if (feature >= num_flags)
 		return NULL;
 	return rte_cpu_feature_table[feature].name;
 }
diff --git a/lib/eal/ppc/include/rte_cpuflags.h b/lib/eal/ppc/include/rte_cpuflags.h
index a88355d170..b74e7a73ee 100644
--- a/lib/eal/ppc/include/rte_cpuflags.h
+++ b/lib/eal/ppc/include/rte_cpuflags.h
@@ -49,7 +49,6 @@ enum rte_cpu_flag_t {
 	RTE_CPUFLAG_HTM,
 	RTE_CPUFLAG_ARCH_2_07,
 	/* The last item */
-	RTE_CPUFLAG_NUMFLAGS,/**< This should always be the last! */
 };
 
 #include "generic/rte_cpuflags.h"
diff --git a/lib/eal/ppc/rte_cpuflags.c b/lib/eal/ppc/rte_cpuflags.c
index 61db5c216d..3a639ef45a 100644
--- a/lib/eal/ppc/rte_cpuflags.c
+++ b/lib/eal/ppc/rte_cpuflags.c
@@ -90,8 +90,9 @@ rte_cpu_get_flag_enabled(enum rte_cpu_flag_t feature)
 {
 	const struct feature_entry *feat;
 	hwcap_registers_t regs = {0};
+	unsigned int num_flags = RTE_DIM(rte_cpu_feature_table);
 
-	if (feature >= RTE_CPUFLAG_NUMFLAGS)
+	if (feature >= num_flags)
 		return -ENOENT;
 
 	feat = &rte_cpu_feature_table[feature];
@@ -105,7 +106,9 @@ rte_cpu_get_flag_enabled(enum rte_cpu_flag_t feature)
 const char *
 rte_cpu_get_flag_name(enum rte_cpu_flag_t feature)
 {
-	if (feature >= RTE_CPUFLAG_NUMFLAGS)
+	unsigned int num_flags = RTE_DIM(rte_cpu_feature_table);
+
+	if (feature >= num_flags)
 		return NULL;
 	return rte_cpu_feature_table[feature].name;
 }
diff --git a/lib/eal/riscv/include/rte_cpuflags.h b/lib/eal/riscv/include/rte_cpuflags.h
index 66e787f898..803c3655ae 100644
--- a/lib/eal/riscv/include/rte_cpuflags.h
+++ b/lib/eal/riscv/include/rte_cpuflags.h
@@ -43,7 +43,6 @@ enum rte_cpu_flag_t {
 	RTE_CPUFLAG_RISCV_ISA_Y, /* Reserved */
 	RTE_CPUFLAG_RISCV_ISA_Z, /* Reserved */
 	/* The last item */
-	RTE_CPUFLAG_NUMFLAGS,/**< This should always be the last! */
 };
 
 #include "generic/rte_cpuflags.h"
diff --git a/lib/eal/riscv/rte_cpuflags.c b/lib/eal/riscv/rte_cpuflags.c
index 4f6d29b947..a452261188 100644
--- a/lib/eal/riscv/rte_cpuflags.c
+++ b/lib/eal/riscv/rte_cpuflags.c
@@ -95,8 +95,9 @@ rte_cpu_get_flag_enabled(enum rte_cpu_flag_t feature)
 {
 	const struct feature_entry *feat;
 	hwcap_registers_t regs = {0};
+	unsigned int num_flags = RTE_DIM(rte_cpu_feature_table);
 
-	if (feature >= RTE_CPUFLAG_NUMFLAGS)
+	if (feature >= num_flags)
 		return -ENOENT;
 
 	feat = &rte_cpu_feature_table[feature];
@@ -110,7 +111,9 @@ rte_cpu_get_flag_enabled(enum rte_cpu_flag_t feature)
 const char *
 rte_cpu_get_flag_name(enum rte_cpu_flag_t feature)
 {
-	if (feature >= RTE_CPUFLAG_NUMFLAGS)
+	unsigned int num_flags = RTE_DIM(rte_cpu_feature_table);
+
+	if (feature >= num_flags)
 		return NULL;
 	return rte_cpu_feature_table[feature].name;
 }
diff --git a/lib/eal/x86/include/rte_cpuflags.h b/lib/eal/x86/include/rte_cpuflags.h
index 92e90fb6e0..7fc6117243 100644
--- a/lib/eal/x86/include/rte_cpuflags.h
+++ b/lib/eal/x86/include/rte_cpuflags.h
@@ -135,7 +135,6 @@ enum rte_cpu_flag_t {
 	RTE_CPUFLAG_WAITPKG,                /**< UMONITOR/UMWAIT/TPAUSE */
 
 	/* The last item */
-	RTE_CPUFLAG_NUMFLAGS,               /**< This should always be the last! */
 };
 
 #include "generic/rte_cpuflags.h"
diff --git a/lib/eal/x86/rte_cpuflags.c b/lib/eal/x86/rte_cpuflags.c
index d6b518251b..00d17c7515 100644
--- a/lib/eal/x86/rte_cpuflags.c
+++ b/lib/eal/x86/rte_cpuflags.c
@@ -149,8 +149,9 @@ rte_cpu_get_flag_enabled(enum rte_cpu_flag_t feature)
 	const struct feature_entry *feat;
 	cpuid_registers_t regs;
 	unsigned int maxleaf;
+	unsigned int num_flags = RTE_DIM(rte_cpu_feature_table);
 
-	if (feature >= RTE_CPUFLAG_NUMFLAGS)
+	if (feature >= num_flags)
 		/* Flag does not match anything in the feature tables */
 		return -ENOENT;
 
@@ -176,7 +177,9 @@ rte_cpu_get_flag_enabled(enum rte_cpu_flag_t feature)
 const char *
 rte_cpu_get_flag_name(enum rte_cpu_flag_t feature)
 {
-	if (feature >= RTE_CPUFLAG_NUMFLAGS)
+	unsigned int num_flags = RTE_DIM(rte_cpu_feature_table);
+
+	if (feature >= num_flags)
 		return NULL;
 	return rte_cpu_feature_table[feature].name;
 }
-- 
2.34.1


^ permalink raw reply	[relevance 2%]

* [PATCH 2/2] test/cpuflags: remove RTE_CPUFLAG_NUMFLAGS
  2023-08-02 21:11  2% [PATCH 1/2] eal: remove RTE_CPUFLAG_NUMFLAGS Sivaprasad Tummala
@ 2023-08-02 21:11  3% ` Sivaprasad Tummala
  0 siblings, 0 replies; 200+ results
From: Sivaprasad Tummala @ 2023-08-02 21:11 UTC (permalink / raw)
  To: ruifeng.wang, zhoumin, drc, kda, bruce.richardson, konstantin.v.ananyev
  Cc: dev

This patch removes RTE_CPUFLAG_NUMFLAGS to allow new CPU
features without breaking ABI each time.

Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
---
 app/test/test_cpuflags.c | 9 ---------
 1 file changed, 9 deletions(-)

diff --git a/app/test/test_cpuflags.c b/app/test/test_cpuflags.c
index a0e342ae48..2b8563602c 100644
--- a/app/test/test_cpuflags.c
+++ b/app/test/test_cpuflags.c
@@ -322,15 +322,6 @@ test_cpuflags(void)
 	CHECK_FOR_FLAG(RTE_CPUFLAG_LBT_MIPS);
 #endif
 
-	/*
-	 * Check if invalid data is handled properly
-	 */
-	printf("\nCheck for invalid flag:\t");
-	result = rte_cpu_get_flag_enabled(RTE_CPUFLAG_NUMFLAGS);
-	printf("%s\n", cpu_flag_result(result));
-	if (result != -ENOENT)
-		return -1;
-
 	return 0;
 }
 
-- 
2.34.1


^ permalink raw reply	[relevance 3%]

* Re: [PATCH] eventdev: fix alignment padding
  @ 2023-08-02 16:19  0%             ` Jerin Jacob
  0 siblings, 0 replies; 200+ results
From: Jerin Jacob @ 2023-08-02 16:19 UTC (permalink / raw)
  To: Morten Brørup; +Cc: Mattias Rönnblom, Sivaprasad Tummala, jerinj, dev

On Tue, May 23, 2023 at 8:45 PM Jerin Jacob <jerinjacobk@gmail.com> wrote:
>
> On Wed, May 17, 2023 at 7:05 PM Morten Brørup <mb@smartsharesystems.com> wrote:
> >

> Shiva,
>
> Please send ABI change notice for this for 23.11 NOW.
> Once it is Acked and merged. I will merge the patch for 23.11 release.
>
> I am marking the patch as DEFERRED in patchwork and next release
> window it will come as NEW in patchwork.


Any objection to merge this?

^ permalink raw reply	[relevance 0%]

* Re: [PATCH v3] Add support for IBM Z s390x
  2023-08-02 15:34  3%   ` David Miller
@ 2023-08-02 15:48  3%     ` David Miller
  0 siblings, 0 replies; 200+ results
From: David Miller @ 2023-08-02 15:48 UTC (permalink / raw)
  To: David Marchand
  Cc: dev, Mathew S Thoennes, Konstantin Ananyev, Olivier Matz,
	Yipeng Wang, Sameh Gobriel, Bruce Richardson, Vladimir Medvedkin,
	Dmitry Kozlyuk, Yuying Zhang, Beilei Xing, Matan Azrad,
	Viacheslav Ovsiienko, Ori Kam, Suanming Mou, Qiming Yang,
	Wenjun Wu, Jakub Grajciar, Harman Kalra, Thomas Monjalon,
	David Christensen

It looks like this is still from v2, v3 (fixes the build issue,
missing operator) was submit the same day..
The abi-test failure referenced is present on v3 (which the bot has
only accepted today).
Patch v4 will be split as requested.

Thanks.
  - David Miller

On Wed, Aug 2, 2023 at 10:34 AM David Miller <dmiller423@gmail.com> wrote:
>
> Hello,
>
>    I'm happy to split it,  I will resubmit when these changes are made.
> I was planning to spend some time to figure out why the CI abi test is
> failing / it had previously passed all tests locally.
> The (one) long term maintainer will be Mathew S Thoennes <tardis@us.ibm.com>.
> I will relay your concerns about CI and have him speak with David Christensen.
>
>   - David Miller
>
> On Wed, Aug 2, 2023 at 10:25 AM David Marchand
> <david.marchand@redhat.com> wrote:
> >
> > Hello David,
> >
> > On Wed, Jul 26, 2023 at 3:35 AM David Miller <dmiller423@gmail.com> wrote:
> > >
> > > Minimal changes to drivers and app to support the IBM s390x.
> >
> > This seems a bit more than "minimal changes" :-).
> >
> > >
> > > Signed-off-by: David Miller <dmiller423@gmail.com>
> > > Reviewed-by: Mathew S Thoennes <tardis@us.ibm.com>
> > > ---
> > >  app/test-acl/main.c                          |   4 +
> > >  app/test/test_acl.c                          |   1 +
> > >  app/test/test_atomic.c                       |   7 +-
> > >  app/test/test_cmdline_ipaddr.c               |  12 +-
> > >  app/test/test_cmdline_num.c                  | 110 ++++
> > >  app/test/test_hash_functions.c               |  29 +
> > >  app/test/test_xmmt_ops.h                     |  14 +
> > >  buildtools/pmdinfogen.py                     |  11 +-
> > >  config/meson.build                           |   2 +
> > >  config/s390x/meson.build                     |  51 ++
> > >  config/s390x/s390x_linux_clang_ubuntu        |  19 +
> > >  doc/guides/nics/features/i40e.ini            |   1 +
> > >  drivers/common/mlx5/mlx5_common.h            |   9 +
> > >  drivers/net/i40e/i40e_rxtx_vec_s390x.c       | 630 +++++++++++++++++++
> > >  drivers/net/i40e/meson.build                 |   2 +
> > >  drivers/net/ixgbe/ixgbe_rxtx.c               |   8 +-
> > >  drivers/net/memif/rte_eth_memif.h            |   2 +
> > >  drivers/net/mlx5/mlx5_rx.c                   |  24 +-
> > >  drivers/net/octeontx/base/octeontx_pki_var.h |   6 +
> > >  examples/l3fwd/l3fwd_em.c                    |   8 +
> > >  examples/l3fwd/l3fwd_lpm_s390x.h             | 137 ++++
> > >  examples/l3fwd/l3fwd_s390x.h                 | 261 ++++++++
> > >  lib/acl/acl_bld.c                            |   3 +
> > >  lib/acl/acl_gen.c                            |   9 +
> > >  lib/acl/acl_run_scalar.c                     |   8 +
> > >  lib/acl/rte_acl.c                            |  27 +
> > >  lib/acl/rte_acl.h                            |   5 +-
> > >  lib/eal/s390x/include/meson.build            |  16 +
> > >  lib/eal/s390x/include/rte_atomic.h           |  44 ++
> > >  lib/eal/s390x/include/rte_byteorder.h        |  43 ++
> > >  lib/eal/s390x/include/rte_cpuflags.h         |  41 ++
> > >  lib/eal/s390x/include/rte_cycles.h           |  44 ++
> > >  lib/eal/s390x/include/rte_io.h               | 184 ++++++
> > >  lib/eal/s390x/include/rte_mcslock.h          |  18 +
> > >  lib/eal/s390x/include/rte_memcpy.h           |  55 ++
> > >  lib/eal/s390x/include/rte_pause.h            |  22 +
> > >  lib/eal/s390x/include/rte_power_intrinsics.h |  20 +
> > >  lib/eal/s390x/include/rte_prefetch.h         |  46 ++
> > >  lib/eal/s390x/include/rte_rwlock.h           |  42 ++
> > >  lib/eal/s390x/include/rte_spinlock.h         |  85 +++
> > >  lib/eal/s390x/include/rte_ticketlock.h       |  18 +
> > >  lib/eal/s390x/include/rte_vect.h             |  35 ++
> > >  lib/eal/s390x/meson.build                    |  16 +
> > >  lib/eal/s390x/rte_cpuflags.c                 |  91 +++
> > >  lib/eal/s390x/rte_cycles.c                   |  11 +
> > >  lib/eal/s390x/rte_hypervisor.c               |  11 +
> > >  lib/eal/s390x/rte_power_intrinsics.c         |  51 ++
> > >  lib/hash/rte_fbk_hash.h                      |   7 +
> > >  lib/lpm/meson.build                          |   1 +
> > >  lib/lpm/rte_lpm.h                            |   2 +
> > >  lib/lpm/rte_lpm6.c                           |  18 +
> > >  lib/lpm/rte_lpm_s390x.h                      | 130 ++++
> > >  meson.build                                  |   2 +
> > >  53 files changed, 2439 insertions(+), 14 deletions(-)
> >
> > - This is too big to review.
> > Please split this patch separating the really minimum support (getting
> > EAL and main libraries to build, disabling the rest that is "broken"
> > for s390x) then adding more components support in later patches.
> >
> > RISC V and LoongArch "recent" additions are good examples.
> > https://patchwork.dpdk.org/project/dpdk/list/?series=23380&state=%2A&archive=both
> > https://patchwork.dpdk.org/project/dpdk/list/?series=24969&state=%2A&archive=both
> >
> > - We need one maintainer for this new architecture.
> >
> > - You'll notice that the DPDK CI reported issues, please fix them.
> >
> > - What are the plans in terms of CI? We need some compilation testing
> > and ideally some regular runtime testing.
> > Maybe you can reach out to IBM PPC DPDK guys, like David Christensen,
> > to see what they are doing.
> >
> >
> > --
> > David Marchand
> >

^ permalink raw reply	[relevance 3%]

* Re: [PATCH v3] Add support for IBM Z s390x
  @ 2023-08-02 15:34  3%   ` David Miller
  2023-08-02 15:48  3%     ` David Miller
  0 siblings, 1 reply; 200+ results
From: David Miller @ 2023-08-02 15:34 UTC (permalink / raw)
  To: David Marchand
  Cc: dev, Mathew S Thoennes, Konstantin Ananyev, Olivier Matz,
	Yipeng Wang, Sameh Gobriel, Bruce Richardson, Vladimir Medvedkin,
	Dmitry Kozlyuk, Yuying Zhang, Beilei Xing, Matan Azrad,
	Viacheslav Ovsiienko, Ori Kam, Suanming Mou, Qiming Yang,
	Wenjun Wu, Jakub Grajciar, Harman Kalra, Thomas Monjalon,
	David Christensen

Hello,

   I'm happy to split it,  I will resubmit when these changes are made.
I was planning to spend some time to figure out why the CI abi test is
failing / it had previously passed all tests locally.
The (one) long term maintainer will be Mathew S Thoennes <tardis@us.ibm.com>.
I will relay your concerns about CI and have him speak with David Christensen.

  - David Miller

On Wed, Aug 2, 2023 at 10:25 AM David Marchand
<david.marchand@redhat.com> wrote:
>
> Hello David,
>
> On Wed, Jul 26, 2023 at 3:35 AM David Miller <dmiller423@gmail.com> wrote:
> >
> > Minimal changes to drivers and app to support the IBM s390x.
>
> This seems a bit more than "minimal changes" :-).
>
> >
> > Signed-off-by: David Miller <dmiller423@gmail.com>
> > Reviewed-by: Mathew S Thoennes <tardis@us.ibm.com>
> > ---
> >  app/test-acl/main.c                          |   4 +
> >  app/test/test_acl.c                          |   1 +
> >  app/test/test_atomic.c                       |   7 +-
> >  app/test/test_cmdline_ipaddr.c               |  12 +-
> >  app/test/test_cmdline_num.c                  | 110 ++++
> >  app/test/test_hash_functions.c               |  29 +
> >  app/test/test_xmmt_ops.h                     |  14 +
> >  buildtools/pmdinfogen.py                     |  11 +-
> >  config/meson.build                           |   2 +
> >  config/s390x/meson.build                     |  51 ++
> >  config/s390x/s390x_linux_clang_ubuntu        |  19 +
> >  doc/guides/nics/features/i40e.ini            |   1 +
> >  drivers/common/mlx5/mlx5_common.h            |   9 +
> >  drivers/net/i40e/i40e_rxtx_vec_s390x.c       | 630 +++++++++++++++++++
> >  drivers/net/i40e/meson.build                 |   2 +
> >  drivers/net/ixgbe/ixgbe_rxtx.c               |   8 +-
> >  drivers/net/memif/rte_eth_memif.h            |   2 +
> >  drivers/net/mlx5/mlx5_rx.c                   |  24 +-
> >  drivers/net/octeontx/base/octeontx_pki_var.h |   6 +
> >  examples/l3fwd/l3fwd_em.c                    |   8 +
> >  examples/l3fwd/l3fwd_lpm_s390x.h             | 137 ++++
> >  examples/l3fwd/l3fwd_s390x.h                 | 261 ++++++++
> >  lib/acl/acl_bld.c                            |   3 +
> >  lib/acl/acl_gen.c                            |   9 +
> >  lib/acl/acl_run_scalar.c                     |   8 +
> >  lib/acl/rte_acl.c                            |  27 +
> >  lib/acl/rte_acl.h                            |   5 +-
> >  lib/eal/s390x/include/meson.build            |  16 +
> >  lib/eal/s390x/include/rte_atomic.h           |  44 ++
> >  lib/eal/s390x/include/rte_byteorder.h        |  43 ++
> >  lib/eal/s390x/include/rte_cpuflags.h         |  41 ++
> >  lib/eal/s390x/include/rte_cycles.h           |  44 ++
> >  lib/eal/s390x/include/rte_io.h               | 184 ++++++
> >  lib/eal/s390x/include/rte_mcslock.h          |  18 +
> >  lib/eal/s390x/include/rte_memcpy.h           |  55 ++
> >  lib/eal/s390x/include/rte_pause.h            |  22 +
> >  lib/eal/s390x/include/rte_power_intrinsics.h |  20 +
> >  lib/eal/s390x/include/rte_prefetch.h         |  46 ++
> >  lib/eal/s390x/include/rte_rwlock.h           |  42 ++
> >  lib/eal/s390x/include/rte_spinlock.h         |  85 +++
> >  lib/eal/s390x/include/rte_ticketlock.h       |  18 +
> >  lib/eal/s390x/include/rte_vect.h             |  35 ++
> >  lib/eal/s390x/meson.build                    |  16 +
> >  lib/eal/s390x/rte_cpuflags.c                 |  91 +++
> >  lib/eal/s390x/rte_cycles.c                   |  11 +
> >  lib/eal/s390x/rte_hypervisor.c               |  11 +
> >  lib/eal/s390x/rte_power_intrinsics.c         |  51 ++
> >  lib/hash/rte_fbk_hash.h                      |   7 +
> >  lib/lpm/meson.build                          |   1 +
> >  lib/lpm/rte_lpm.h                            |   2 +
> >  lib/lpm/rte_lpm6.c                           |  18 +
> >  lib/lpm/rte_lpm_s390x.h                      | 130 ++++
> >  meson.build                                  |   2 +
> >  53 files changed, 2439 insertions(+), 14 deletions(-)
>
> - This is too big to review.
> Please split this patch separating the really minimum support (getting
> EAL and main libraries to build, disabling the rest that is "broken"
> for s390x) then adding more components support in later patches.
>
> RISC V and LoongArch "recent" additions are good examples.
> https://patchwork.dpdk.org/project/dpdk/list/?series=23380&state=%2A&archive=both
> https://patchwork.dpdk.org/project/dpdk/list/?series=24969&state=%2A&archive=both
>
> - We need one maintainer for this new architecture.
>
> - You'll notice that the DPDK CI reported issues, please fix them.
>
> - What are the plans in terms of CI? We need some compilation testing
> and ideally some regular runtime testing.
> Maybe you can reach out to IBM PPC DPDK guys, like David Christensen,
> to see what they are doing.
>
>
> --
> David Marchand
>

^ permalink raw reply	[relevance 3%]

* [PATCH v5] build: update DPDK to use C11 standard
  2023-07-31 10:38  4% [PATCH] build: update DPDK to use C11 standard Bruce Richardson
                   ` (2 preceding siblings ...)
  2023-08-01 13:15  4% ` [PATCH v4] " Bruce Richardson
@ 2023-08-02 12:31  4% ` Bruce Richardson
  3 siblings, 0 replies; 200+ results
From: Bruce Richardson @ 2023-08-02 12:31 UTC (permalink / raw)
  To: dev; +Cc: Bruce Richardson, Morten Brørup, Tyler Retzlaff

As previously announced, DPDK 23.11 will require a C11 supporting
compiler and will use the C11 standard in all builds.

Forcing use of the C standard, rather than the standard with
GNU extensions, means that some posix definitions which are not in
the C standard are unavailable by default. We fix this by ensuring
the correct defines or cflags are passed to the components that
need them.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
Acked-by: Tyler Retzlaff <roretzla@linux.microsoft.com>
---
V5:
* Fix build issues with bool type in altivec code, due to bool type
  being in C11. Use __bool for altivec-specific version instead.

V4:
* pass cflags to the structure and definition checks in mlx* drivers
  to ensure posix definitions - as well as C-standard ones - are
  available.

V3:
* remove (now unneeded) use of -std=gnu99 in failsafe net driver.

V2:
* Resubmit now that 23.11-rc0 patch applied
* Add _POSIX_C_SOURCE macro to eal_common_errno.c to get POSIX
  definition of strerror_r() with c11 standard.

---
 doc/guides/linux_gsg/sys_reqs.rst      |  3 ++-
 doc/guides/rel_notes/deprecation.rst   | 18 ------------------
 doc/guides/rel_notes/release_23_11.rst | 17 +++++++++++++++++
 drivers/common/mlx5/linux/meson.build  |  5 +++--
 drivers/net/failsafe/meson.build       |  1 -
 drivers/net/mlx4/meson.build           |  4 ++--
 lib/acl/acl_run_altivec.h              |  4 ++--
 lib/eal/common/eal_common_errno.c      |  1 +
 meson.build                            |  1 +
 9 files changed, 28 insertions(+), 26 deletions(-)

diff --git a/doc/guides/linux_gsg/sys_reqs.rst b/doc/guides/linux_gsg/sys_reqs.rst
index dfeaf4e1c5..13be715933 100644
--- a/doc/guides/linux_gsg/sys_reqs.rst
+++ b/doc/guides/linux_gsg/sys_reqs.rst
@@ -27,7 +27,8 @@ Compilation of the DPDK
     The setup commands and installed packages needed on various systems may be different.
     For details on Linux distributions and the versions tested, please consult the DPDK Release Notes.
 
-*   General development tools including a supported C compiler such as gcc (version 4.9+) or clang (version 3.4+),
+*   General development tools including a C compiler supporting the C11 standard,
+    including standard atomics, for example: GCC (version 5.0+) or Clang (version 3.6+),
     and ``pkg-config`` or ``pkgconf`` to be used when building end-user binaries against DPDK.
 
     * For RHEL/Fedora systems these can be installed using ``dnf groupinstall "Development Tools"``
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 494b401cda..cc939d3c67 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -17,24 +17,6 @@ Other API and ABI deprecation notices are to be posted below.
 Deprecation Notices
 -------------------
 
-* C Compiler: From DPDK 23.11 onwards,
-  building DPDK will require a C compiler which supports the C11 standard,
-  including support for C11 standard atomics.
-
-  More specifically, the requirements will be:
-
-  * Support for flag "-std=c11" (or similar)
-  * __STDC_NO_ATOMICS__ is *not defined* when using c11 flag
-
-  Please note:
-
-  * C11, including standard atomics, is supported from GCC version 5 onwards,
-    and is the default language version in that release
-    (Ref: https://gcc.gnu.org/gcc-5/changes.html)
-  * C11 is the default compilation mode in Clang from version 3.6,
-    which also added support for standard atomics
-    (Ref: https://releases.llvm.org/3.6.0/tools/clang/docs/ReleaseNotes.html)
-
 * build: Enabling deprecated libraries (``flow_classify``, ``kni``)
   won't be possible anymore through the use of the ``disable_libs`` build option.
   A new build option for deprecated libraries will be introduced instead.
diff --git a/doc/guides/rel_notes/release_23_11.rst b/doc/guides/rel_notes/release_23_11.rst
index 6b4dd21fd0..c8b9ed456c 100644
--- a/doc/guides/rel_notes/release_23_11.rst
+++ b/doc/guides/rel_notes/release_23_11.rst
@@ -20,6 +20,23 @@ DPDK Release 23.11
       ninja -C build doc
       xdg-open build/doc/guides/html/rel_notes/release_23_11.html
 
+* Build Requirements: From DPDK 23.11 onwards,
+  building DPDK will require a C compiler which supports the C11 standard,
+  including support for C11 standard atomics.
+
+  More specifically, the requirements will be:
+
+  * Support for flag "-std=c11" (or similar)
+  * __STDC_NO_ATOMICS__ is *not defined* when using c11 flag
+
+  Please note:
+
+  * C11, including standard atomics, is supported from GCC version 5 onwards,
+    and is the default language version in that release
+    (Ref: https://gcc.gnu.org/gcc-5/changes.html)
+  * C11 is the default compilation mode in Clang from version 3.6,
+    which also added support for standard atomics
+    (Ref: https://releases.llvm.org/3.6.0/tools/clang/docs/ReleaseNotes.html)
 
 New Features
 ------------
diff --git a/drivers/common/mlx5/linux/meson.build b/drivers/common/mlx5/linux/meson.build
index 15edc13041..b3a64547c5 100644
--- a/drivers/common/mlx5/linux/meson.build
+++ b/drivers/common/mlx5/linux/meson.build
@@ -231,11 +231,12 @@ if  libmtcr_ul_found
 endif
 
 foreach arg:has_sym_args
-    mlx5_config.set(arg[0], cc.has_header_symbol(arg[1], arg[2], dependencies: libs))
+    mlx5_config.set(arg[0], cc.has_header_symbol(arg[1], arg[2], dependencies: libs, args: cflags))
 endforeach
 foreach arg:has_member_args
     file_prefix = '#include <' + arg[1] + '>'
-    mlx5_config.set(arg[0], cc.has_member(arg[2], arg[3], prefix : file_prefix, dependencies: libs))
+    mlx5_config.set(arg[0],
+            cc.has_member(arg[2], arg[3], prefix : file_prefix, dependencies: libs, args: cflags))
 endforeach
 
 # Build Glue Library
diff --git a/drivers/net/failsafe/meson.build b/drivers/net/failsafe/meson.build
index 6013e13722..c1d361083b 100644
--- a/drivers/net/failsafe/meson.build
+++ b/drivers/net/failsafe/meson.build
@@ -7,7 +7,6 @@ if is_windows
     subdir_done()
 endif
 
-cflags += '-std=gnu99'
 cflags += '-D_DEFAULT_SOURCE'
 cflags += '-D_XOPEN_SOURCE=700'
 cflags += '-pedantic'
diff --git a/drivers/net/mlx4/meson.build b/drivers/net/mlx4/meson.build
index a038c1ec1b..3c5ee24186 100644
--- a/drivers/net/mlx4/meson.build
+++ b/drivers/net/mlx4/meson.build
@@ -103,12 +103,12 @@ has_sym_args = [
 config = configuration_data()
 foreach arg:has_sym_args
     config.set(arg[0], cc.has_header_symbol(arg[1], arg[2],
-        dependencies: libs))
+        dependencies: libs, args: cflags))
 endforeach
 foreach arg:has_member_args
     file_prefix = '#include <' + arg[1] + '>'
     config.set(arg[0], cc.has_member(arg[2], arg[3],
-        prefix: file_prefix, dependencies: libs))
+        prefix: file_prefix, dependencies: libs, args: cflags))
 endforeach
 configure_file(output : 'mlx4_autoconf.h', configuration : config)
 
diff --git a/lib/acl/acl_run_altivec.h b/lib/acl/acl_run_altivec.h
index 4556e1503b..3c30466d2d 100644
--- a/lib/acl/acl_run_altivec.h
+++ b/lib/acl/acl_run_altivec.h
@@ -41,7 +41,7 @@ resolve_priority_altivec(uint64_t transition, int n,
 {
 	uint32_t x;
 	xmm_t results, priority, results1, priority1;
-	__vector bool int selector;
+	__vector __bool int selector;
 	xmm_t *saved_results, *saved_priority;
 
 	for (x = 0; x < categories; x += RTE_ACL_RESULTS_MULTIPLIER) {
@@ -110,7 +110,7 @@ transition4(xmm_t next_input, const uint64_t *trans,
 	xmm_t in, node_type, r, t;
 	xmm_t dfa_ofs, quad_ofs;
 	xmm_t *index_mask, *tp;
-	__vector bool int dfa_msk;
+	__vector __bool int dfa_msk;
 	__vector signed char zeroes = {};
 	union {
 		uint64_t d64[2];
diff --git a/lib/eal/common/eal_common_errno.c b/lib/eal/common/eal_common_errno.c
index ef8f782abb..b30e2f0ad4 100644
--- a/lib/eal/common/eal_common_errno.c
+++ b/lib/eal/common/eal_common_errno.c
@@ -4,6 +4,7 @@
 
 /* Use XSI-compliant portable version of strerror_r() */
 #undef _GNU_SOURCE
+#define _POSIX_C_SOURCE 200809L
 
 #include <stdio.h>
 #include <string.h>
diff --git a/meson.build b/meson.build
index 39cb73846d..70b54f0c98 100644
--- a/meson.build
+++ b/meson.build
@@ -9,6 +9,7 @@ project('DPDK', 'c',
         license: 'BSD',
         default_options: [
             'buildtype=release',
+            'c_std=c11',
             'default_library=static',
             'warning_level=2',
         ],
-- 
2.39.2


^ permalink raw reply	[relevance 4%]

* [PATCH v9 1/4] ethdev: add API for mbufs recycle mode
  @ 2023-08-02  8:08  3%   ` Feifei Wang
  0 siblings, 0 replies; 200+ results
From: Feifei Wang @ 2023-08-02  8:08 UTC (permalink / raw)
  To: Thomas Monjalon, Ferruh Yigit, Andrew Rybchenko
  Cc: dev, nd, Feifei Wang, Honnappa Nagarahalli, Ruifeng Wang,
	Morten Brørup

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset=quit, Size: 15883 bytes --]

Add 'rte_eth_recycle_rx_queue_info_get' and 'rte_eth_recycle_mbufs'
APIs to recycle used mbufs from a transmit queue of an Ethernet device,
and move these mbufs into a mbuf ring for a receive queue of an Ethernet
device. This can bypass mempool 'put/get' operations hence saving CPU
cycles.

For each recycling mbufs, the rte_eth_recycle_mbufs() function performs
the following operations:
- Copy used *rte_mbuf* buffer pointers from Tx mbuf ring into Rx mbuf
ring.
- Replenish the Rx descriptors with the recycling *rte_mbuf* mbufs freed
from the Tx mbuf ring.

Suggested-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
Suggested-by: Ruifeng Wang <ruifeng.wang@arm.com>
Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
Reviewed-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
---
 doc/guides/rel_notes/release_23_11.rst |  15 ++
 lib/ethdev/ethdev_driver.h             |  10 ++
 lib/ethdev/ethdev_private.c            |   2 +
 lib/ethdev/rte_ethdev.c                |  31 +++++
 lib/ethdev/rte_ethdev.h                | 181 +++++++++++++++++++++++++
 lib/ethdev/rte_ethdev_core.h           |  23 +++-
 lib/ethdev/version.map                 |   4 +
 7 files changed, 260 insertions(+), 6 deletions(-)

diff --git a/doc/guides/rel_notes/release_23_11.rst b/doc/guides/rel_notes/release_23_11.rst
index 6b4dd21fd0..fd16d267ae 100644
--- a/doc/guides/rel_notes/release_23_11.rst
+++ b/doc/guides/rel_notes/release_23_11.rst
@@ -55,6 +55,13 @@ New Features
      Also, make sure to start the actual text at the margin.
      =======================================================
 
+* **Add mbufs recycling support. **
+
+  Added ``rte_eth_recycle_rx_queue_info_get`` and ``rte_eth_recycle_mbufs``
+  APIs which allow the user to copy used mbufs from the Tx mbuf ring
+  into the Rx mbuf ring. This feature supports the case that the Rx Ethernet
+  device is different from the Tx Ethernet device with respective driver
+  callback functions in ``rte_eth_recycle_mbufs``.
 
 Removed Items
 -------------
@@ -100,6 +107,14 @@ ABI Changes
    Also, make sure to start the actual text at the margin.
    =======================================================
 
+* ethdev: Added ``recycle_tx_mbufs_reuse`` and ``recycle_rx_descriptors_refill``
+  fields to ``rte_eth_dev`` structure.
+
+* ethdev: Structure ``rte_eth_fp_ops`` was affected to add
+  ``recycle_tx_mbufs_reuse`` and ``recycle_rx_descriptors_refill``
+  fields, to move ``rxq`` and ``txq`` fields, to change the size of
+  ``reserved1`` and ``reserved2`` fields.
+
 
 Known Issues
 ------------
diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h
index 980f837ab6..b0c55a8523 100644
--- a/lib/ethdev/ethdev_driver.h
+++ b/lib/ethdev/ethdev_driver.h
@@ -58,6 +58,10 @@ struct rte_eth_dev {
 	eth_rx_descriptor_status_t rx_descriptor_status;
 	/** Check the status of a Tx descriptor */
 	eth_tx_descriptor_status_t tx_descriptor_status;
+	/** Pointer to PMD transmit mbufs reuse function */
+	eth_recycle_tx_mbufs_reuse_t recycle_tx_mbufs_reuse;
+	/** Pointer to PMD receive descriptors refill function */
+	eth_recycle_rx_descriptors_refill_t recycle_rx_descriptors_refill;
 
 	/**
 	 * Device data that is shared between primary and secondary processes
@@ -507,6 +511,10 @@ typedef void (*eth_rxq_info_get_t)(struct rte_eth_dev *dev,
 typedef void (*eth_txq_info_get_t)(struct rte_eth_dev *dev,
 	uint16_t tx_queue_id, struct rte_eth_txq_info *qinfo);
 
+typedef void (*eth_recycle_rxq_info_get_t)(struct rte_eth_dev *dev,
+	uint16_t rx_queue_id,
+	struct rte_eth_recycle_rxq_info *recycle_rxq_info);
+
 typedef int (*eth_burst_mode_get_t)(struct rte_eth_dev *dev,
 	uint16_t queue_id, struct rte_eth_burst_mode *mode);
 
@@ -1250,6 +1258,8 @@ struct eth_dev_ops {
 	eth_rxq_info_get_t         rxq_info_get;
 	/** Retrieve Tx queue information */
 	eth_txq_info_get_t         txq_info_get;
+	/** Retrieve mbufs recycle Rx queue information */
+	eth_recycle_rxq_info_get_t recycle_rxq_info_get;
 	eth_burst_mode_get_t       rx_burst_mode_get; /**< Get Rx burst mode */
 	eth_burst_mode_get_t       tx_burst_mode_get; /**< Get Tx burst mode */
 	eth_fw_version_get_t       fw_version_get; /**< Get firmware version */
diff --git a/lib/ethdev/ethdev_private.c b/lib/ethdev/ethdev_private.c
index 14ec8c6ccf..f8ab64f195 100644
--- a/lib/ethdev/ethdev_private.c
+++ b/lib/ethdev/ethdev_private.c
@@ -277,6 +277,8 @@ eth_dev_fp_ops_setup(struct rte_eth_fp_ops *fpo,
 	fpo->rx_queue_count = dev->rx_queue_count;
 	fpo->rx_descriptor_status = dev->rx_descriptor_status;
 	fpo->tx_descriptor_status = dev->tx_descriptor_status;
+	fpo->recycle_tx_mbufs_reuse = dev->recycle_tx_mbufs_reuse;
+	fpo->recycle_rx_descriptors_refill = dev->recycle_rx_descriptors_refill;
 
 	fpo->rxq.data = dev->data->rx_queues;
 	fpo->rxq.clbk = (void **)(uintptr_t)dev->post_rx_burst_cbs;
diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
index 0840d2b594..ea89a101a1 100644
--- a/lib/ethdev/rte_ethdev.c
+++ b/lib/ethdev/rte_ethdev.c
@@ -5876,6 +5876,37 @@ rte_eth_tx_queue_info_get(uint16_t port_id, uint16_t queue_id,
 	return 0;
 }
 
+int
+rte_eth_recycle_rx_queue_info_get(uint16_t port_id, uint16_t queue_id,
+		struct rte_eth_recycle_rxq_info *recycle_rxq_info)
+{
+	struct rte_eth_dev *dev;
+
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
+	dev = &rte_eth_devices[port_id];
+
+	if (queue_id >= dev->data->nb_rx_queues) {
+		RTE_ETHDEV_LOG(ERR, "Invalid Rx queue_id=%u\n", queue_id);
+		return -EINVAL;
+	}
+
+	if (dev->data->rx_queues == NULL ||
+			dev->data->rx_queues[queue_id] == NULL) {
+		RTE_ETHDEV_LOG(ERR,
+			   "Rx queue %"PRIu16" of device with port_id=%"
+			   PRIu16" has not been setup\n",
+			   queue_id, port_id);
+		return -EINVAL;
+	}
+
+	if (*dev->dev_ops->recycle_rxq_info_get == NULL)
+		return -ENOTSUP;
+
+	dev->dev_ops->recycle_rxq_info_get(dev, queue_id, recycle_rxq_info);
+
+	return 0;
+}
+
 int
 rte_eth_rx_burst_mode_get(uint16_t port_id, uint16_t queue_id,
 			  struct rte_eth_burst_mode *mode)
diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h
index 04a2564f22..9dc5749d83 100644
--- a/lib/ethdev/rte_ethdev.h
+++ b/lib/ethdev/rte_ethdev.h
@@ -1820,6 +1820,30 @@ struct rte_eth_txq_info {
 	uint8_t queue_state;        /**< one of RTE_ETH_QUEUE_STATE_*. */
 } __rte_cache_min_aligned;
 
+/**
+ * @warning
+ * @b EXPERIMENTAL: this structure may change without prior notice.
+ *
+ * Ethernet device Rx queue information structure for recycling mbufs.
+ * Used to retrieve Rx queue information when Tx queue reusing mbufs and moving
+ * them into Rx mbuf ring.
+ */
+struct rte_eth_recycle_rxq_info {
+	struct rte_mbuf **mbuf_ring; /**< mbuf ring of Rx queue. */
+	struct rte_mempool *mp;     /**< mempool of Rx queue. */
+	uint16_t *refill_head;      /**< head of Rx queue refilling mbufs. */
+	uint16_t *receive_tail;     /**< tail of Rx queue receiving pkts. */
+	uint16_t mbuf_ring_size;     /**< configured number of mbuf ring size. */
+	/**
+	 * Requirement on mbuf refilling batch size of Rx mbuf ring.
+	 * For some PMD drivers, the number of Rx mbuf ring refilling mbufs
+	 * should be aligned with mbuf ring size, in order to simplify
+	 * ring wrapping around.
+	 * Value 0 means that PMD drivers have no requirement for this.
+	 */
+	uint16_t refill_requirement;
+} __rte_cache_min_aligned;
+
 /* Generic Burst mode flag definition, values can be ORed. */
 
 /**
@@ -4853,6 +4877,31 @@ int rte_eth_rx_queue_info_get(uint16_t port_id, uint16_t queue_id,
 int rte_eth_tx_queue_info_get(uint16_t port_id, uint16_t queue_id,
 	struct rte_eth_txq_info *qinfo);
 
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice
+ *
+ * Retrieve information about given ports's Rx queue for recycling mbufs.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param queue_id
+ *   The Rx queue on the Ethernet devicefor which information
+ *   will be retrieved.
+ * @param recycle_rxq_info
+ *   A pointer to a structure of type *rte_eth_recycle_rxq_info* to be filled.
+ *
+ * @return
+ *   - 0: Success
+ *   - -ENODEV:  If *port_id* is invalid.
+ *   - -ENOTSUP: routine is not supported by the device PMD.
+ *   - -EINVAL:  The queue_id is out of range.
+ */
+__rte_experimental
+int rte_eth_recycle_rx_queue_info_get(uint16_t port_id,
+		uint16_t queue_id,
+		struct rte_eth_recycle_rxq_info *recycle_rxq_info);
+
 /**
  * Retrieve information about the Rx packet burst mode.
  *
@@ -6527,6 +6576,138 @@ 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
+ *
+ * Recycle used mbufs from a transmit queue of an Ethernet device, and move
+ * these mbufs into a mbuf ring for a receive queue of an Ethernet device.
+ * This can bypass mempool path to save CPU cycles.
+ *
+ * The rte_eth_recycle_mbufs() function loops, with rte_eth_rx_burst() and
+ * rte_eth_tx_burst() functions, freeing Tx used mbufs and replenishing Rx
+ * descriptors. The number of recycling mbufs depends on the request of Rx mbuf
+ * ring, with the constraint of enough used mbufs from Tx mbuf ring.
+ *
+ * For each recycling mbufs, the rte_eth_recycle_mbufs() function performs the
+ * following operations:
+ *
+ * - Copy used *rte_mbuf* buffer pointers from Tx mbuf ring into Rx mbuf ring.
+ *
+ * - Replenish the Rx descriptors with the recycling *rte_mbuf* mbufs freed
+ *   from the Tx mbuf ring.
+ *
+ * This function spilts Rx and Tx path with different callback functions. The
+ * callback function recycle_tx_mbufs_reuse is for Tx driver. The callback
+ * function recycle_rx_descriptors_refill is for Rx driver. rte_eth_recycle_mbufs()
+ * can support the case that Rx Ethernet device is different from Tx Ethernet device.
+ *
+ * It is the responsibility of users to select the Rx/Tx queue pair to recycle
+ * mbufs. Before call this function, users must call rte_eth_recycle_rxq_info_get
+ * function to retrieve selected Rx queue information.
+ * @see rte_eth_recycle_rxq_info_get, struct rte_eth_recycle_rxq_info
+ *
+ * Currently, the rte_eth_recycle_mbufs() function can support to feed 1 Rx queue from
+ * 2 Tx queues in the same thread. Do not pair the Rx queue and Tx queue in different
+ * threads, in order to avoid memory error rewriting.
+ *
+ * @param rx_port_id
+ *   Port identifying the receive side.
+ * @param rx_queue_id
+ *   The index of the receive queue identifying the receive side.
+ *   The value must be in the range [0, nb_rx_queue - 1] previously supplied
+ *   to rte_eth_dev_configure().
+ * @param tx_port_id
+ *   Port identifying the transmit side.
+ * @param tx_queue_id
+ *   The index of the transmit queue identifying the transmit side.
+ *   The value must be in the range [0, nb_tx_queue - 1] previously supplied
+ *   to rte_eth_dev_configure().
+ * @param recycle_rxq_info
+ *   A pointer to a structure of type *rte_eth_recycle_rxq_info* which contains
+ *   the information of the Rx queue mbuf ring.
+ * @return
+ *   The number of recycling mbufs.
+ */
+__rte_experimental
+static inline uint16_t
+rte_eth_recycle_mbufs(uint16_t rx_port_id, uint16_t rx_queue_id,
+		uint16_t tx_port_id, uint16_t tx_queue_id,
+		struct rte_eth_recycle_rxq_info *recycle_rxq_info)
+{
+	struct rte_eth_fp_ops *p;
+	void *qd;
+	uint16_t nb_mbufs;
+
+#ifdef RTE_ETHDEV_DEBUG_TX
+	if (tx_port_id >= RTE_MAX_ETHPORTS ||
+			tx_queue_id >= RTE_MAX_QUEUES_PER_PORT) {
+		RTE_ETHDEV_LOG(ERR,
+				"Invalid tx_port_id=%u or tx_queue_id=%u\n",
+				tx_port_id, tx_queue_id);
+		return 0;
+	}
+#endif
+
+	/* fetch pointer to queue data */
+	p = &rte_eth_fp_ops[tx_port_id];
+	qd = p->txq.data[tx_queue_id];
+
+#ifdef RTE_ETHDEV_DEBUG_TX
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(tx_port_id, 0);
+
+	if (qd == NULL) {
+		RTE_ETHDEV_LOG(ERR, "Invalid Tx queue_id=%u for port_id=%u\n",
+				tx_queue_id, tx_port_id);
+		return 0;
+	}
+#endif
+	if (p->recycle_tx_mbufs_reuse == NULL)
+		return 0;
+
+	/* Copy used *rte_mbuf* buffer pointers from Tx mbuf ring
+	 * into Rx mbuf ring.
+	 */
+	nb_mbufs = p->recycle_tx_mbufs_reuse(qd, recycle_rxq_info);
+
+	/* If no recycling mbufs, return 0. */
+	if (nb_mbufs == 0)
+		return 0;
+
+#ifdef RTE_ETHDEV_DEBUG_RX
+	if (rx_port_id >= RTE_MAX_ETHPORTS ||
+			rx_queue_id >= RTE_MAX_QUEUES_PER_PORT) {
+		RTE_ETHDEV_LOG(ERR, "Invalid rx_port_id=%u or rx_queue_id=%u\n",
+				rx_port_id, rx_queue_id);
+		return 0;
+	}
+#endif
+
+	/* fetch pointer to queue data */
+	p = &rte_eth_fp_ops[rx_port_id];
+	qd = p->rxq.data[rx_queue_id];
+
+#ifdef RTE_ETHDEV_DEBUG_RX
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(rx_port_id, 0);
+
+	if (qd == NULL) {
+		RTE_ETHDEV_LOG(ERR, "Invalid Rx queue_id=%u for port_id=%u\n",
+				rx_queue_id, rx_port_id);
+		return 0;
+	}
+#endif
+
+	if (p->recycle_rx_descriptors_refill == NULL)
+		return 0;
+
+	/* Replenish the Rx descriptors with the recycling
+	 * into Rx mbuf ring.
+	 */
+	p->recycle_rx_descriptors_refill(qd, nb_mbufs);
+
+	return nb_mbufs;
+}
+
 /**
  * @warning
  * @b EXPERIMENTAL: this API may change without prior notice
diff --git a/lib/ethdev/rte_ethdev_core.h b/lib/ethdev/rte_ethdev_core.h
index 46e9721e07..a24ad7a6b2 100644
--- a/lib/ethdev/rte_ethdev_core.h
+++ b/lib/ethdev/rte_ethdev_core.h
@@ -55,6 +55,13 @@ typedef int (*eth_rx_descriptor_status_t)(void *rxq, uint16_t offset);
 /** @internal Check the status of a Tx descriptor */
 typedef int (*eth_tx_descriptor_status_t)(void *txq, uint16_t offset);
 
+/** @internal Copy used mbufs from Tx mbuf ring into Rx mbuf ring */
+typedef uint16_t (*eth_recycle_tx_mbufs_reuse_t)(void *txq,
+		struct rte_eth_recycle_rxq_info *recycle_rxq_info);
+
+/** @internal Refill Rx descriptors with the recycling mbufs */
+typedef void (*eth_recycle_rx_descriptors_refill_t)(void *rxq, uint16_t nb);
+
 /**
  * @internal
  * Structure used to hold opaque pointers to internal ethdev Rx/Tx
@@ -83,15 +90,17 @@ struct rte_eth_fp_ops {
 	 * Rx fast-path functions and related data.
 	 * 64-bit systems: occupies first 64B line
 	 */
+	/** Rx queues data. */
+	struct rte_ethdev_qdata rxq;
 	/** PMD receive function. */
 	eth_rx_burst_t rx_pkt_burst;
 	/** Get the number of used Rx descriptors. */
 	eth_rx_queue_count_t rx_queue_count;
 	/** Check the status of a Rx descriptor. */
 	eth_rx_descriptor_status_t rx_descriptor_status;
-	/** Rx queues data. */
-	struct rte_ethdev_qdata rxq;
-	uintptr_t reserved1[3];
+	/** Refill Rx descriptors with the recycling mbufs. */
+	eth_recycle_rx_descriptors_refill_t recycle_rx_descriptors_refill;
+	uintptr_t reserved1[2];
 	/**@}*/
 
 	/**@{*/
@@ -99,15 +108,17 @@ struct rte_eth_fp_ops {
 	 * Tx fast-path functions and related data.
 	 * 64-bit systems: occupies second 64B line
 	 */
+	/** Tx queues data. */
+	struct rte_ethdev_qdata txq;
 	/** PMD transmit function. */
 	eth_tx_burst_t tx_pkt_burst;
 	/** PMD transmit prepare function. */
 	eth_tx_prep_t tx_pkt_prepare;
 	/** Check the status of a Tx descriptor. */
 	eth_tx_descriptor_status_t tx_descriptor_status;
-	/** Tx queues data. */
-	struct rte_ethdev_qdata txq;
-	uintptr_t reserved2[3];
+	/** Copy used mbufs from Tx mbuf ring into Rx. */
+	eth_recycle_tx_mbufs_reuse_t recycle_tx_mbufs_reuse;
+	uintptr_t reserved2[2];
 	/**@}*/
 
 } __rte_cache_aligned;
diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map
index b965d6aa52..e52c1563b4 100644
--- a/lib/ethdev/version.map
+++ b/lib/ethdev/version.map
@@ -312,6 +312,10 @@ EXPERIMENTAL {
 	rte_flow_async_action_list_handle_query_update;
 	rte_flow_async_actions_update;
 	rte_flow_restore_info_dynflag;
+
+	# added in 23.11
+	rte_eth_recycle_mbufs;
+	rte_eth_recycle_rx_queue_info_get;
 };
 
 INTERNAL {
-- 
2.25.1


^ permalink raw reply	[relevance 3%]

* [PATCH v8 1/4] ethdev: add API for mbufs recycle mode
  @ 2023-08-02  7:38  3%   ` Feifei Wang
  0 siblings, 0 replies; 200+ results
From: Feifei Wang @ 2023-08-02  7:38 UTC (permalink / raw)
  To: Thomas Monjalon, Ferruh Yigit, Andrew Rybchenko
  Cc: dev, nd, Feifei Wang, Honnappa Nagarahalli, Ruifeng Wang,
	Morten Brørup

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset=yes, Size: 15883 bytes --]

Add 'rte_eth_recycle_rx_queue_info_get' and 'rte_eth_recycle_mbufs'
APIs to recycle used mbufs from a transmit queue of an Ethernet device,
and move these mbufs into a mbuf ring for a receive queue of an Ethernet
device. This can bypass mempool 'put/get' operations hence saving CPU
cycles.

For each recycling mbufs, the rte_eth_recycle_mbufs() function performs
the following operations:
- Copy used *rte_mbuf* buffer pointers from Tx mbuf ring into Rx mbuf
ring.
- Replenish the Rx descriptors with the recycling *rte_mbuf* mbufs freed
from the Tx mbuf ring.

Suggested-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
Suggested-by: Ruifeng Wang <ruifeng.wang@arm.com>
Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
Reviewed-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
---
 doc/guides/rel_notes/release_23_11.rst |  15 ++
 lib/ethdev/ethdev_driver.h             |  10 ++
 lib/ethdev/ethdev_private.c            |   2 +
 lib/ethdev/rte_ethdev.c                |  31 +++++
 lib/ethdev/rte_ethdev.h                | 181 +++++++++++++++++++++++++
 lib/ethdev/rte_ethdev_core.h           |  23 +++-
 lib/ethdev/version.map                 |   4 +
 7 files changed, 260 insertions(+), 6 deletions(-)

diff --git a/doc/guides/rel_notes/release_23_11.rst b/doc/guides/rel_notes/release_23_11.rst
index 6b4dd21fd0..fd16d267ae 100644
--- a/doc/guides/rel_notes/release_23_11.rst
+++ b/doc/guides/rel_notes/release_23_11.rst
@@ -55,6 +55,13 @@ New Features
      Also, make sure to start the actual text at the margin.
      =======================================================
 
+* **Add mbufs recycling support. **
+
+  Added ``rte_eth_recycle_rx_queue_info_get`` and ``rte_eth_recycle_mbufs``
+  APIs which allow the user to copy used mbufs from the Tx mbuf ring
+  into the Rx mbuf ring. This feature supports the case that the Rx Ethernet
+  device is different from the Tx Ethernet device with respective driver
+  callback functions in ``rte_eth_recycle_mbufs``.
 
 Removed Items
 -------------
@@ -100,6 +107,14 @@ ABI Changes
    Also, make sure to start the actual text at the margin.
    =======================================================
 
+* ethdev: Added ``recycle_tx_mbufs_reuse`` and ``recycle_rx_descriptors_refill``
+  fields to ``rte_eth_dev`` structure.
+
+* ethdev: Structure ``rte_eth_fp_ops`` was affected to add
+  ``recycle_tx_mbufs_reuse`` and ``recycle_rx_descriptors_refill``
+  fields, to move ``rxq`` and ``txq`` fields, to change the size of
+  ``reserved1`` and ``reserved2`` fields.
+
 
 Known Issues
 ------------
diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h
index 980f837ab6..b0c55a8523 100644
--- a/lib/ethdev/ethdev_driver.h
+++ b/lib/ethdev/ethdev_driver.h
@@ -58,6 +58,10 @@ struct rte_eth_dev {
 	eth_rx_descriptor_status_t rx_descriptor_status;
 	/** Check the status of a Tx descriptor */
 	eth_tx_descriptor_status_t tx_descriptor_status;
+	/** Pointer to PMD transmit mbufs reuse function */
+	eth_recycle_tx_mbufs_reuse_t recycle_tx_mbufs_reuse;
+	/** Pointer to PMD receive descriptors refill function */
+	eth_recycle_rx_descriptors_refill_t recycle_rx_descriptors_refill;
 
 	/**
 	 * Device data that is shared between primary and secondary processes
@@ -507,6 +511,10 @@ typedef void (*eth_rxq_info_get_t)(struct rte_eth_dev *dev,
 typedef void (*eth_txq_info_get_t)(struct rte_eth_dev *dev,
 	uint16_t tx_queue_id, struct rte_eth_txq_info *qinfo);
 
+typedef void (*eth_recycle_rxq_info_get_t)(struct rte_eth_dev *dev,
+	uint16_t rx_queue_id,
+	struct rte_eth_recycle_rxq_info *recycle_rxq_info);
+
 typedef int (*eth_burst_mode_get_t)(struct rte_eth_dev *dev,
 	uint16_t queue_id, struct rte_eth_burst_mode *mode);
 
@@ -1250,6 +1258,8 @@ struct eth_dev_ops {
 	eth_rxq_info_get_t         rxq_info_get;
 	/** Retrieve Tx queue information */
 	eth_txq_info_get_t         txq_info_get;
+	/** Retrieve mbufs recycle Rx queue information */
+	eth_recycle_rxq_info_get_t recycle_rxq_info_get;
 	eth_burst_mode_get_t       rx_burst_mode_get; /**< Get Rx burst mode */
 	eth_burst_mode_get_t       tx_burst_mode_get; /**< Get Tx burst mode */
 	eth_fw_version_get_t       fw_version_get; /**< Get firmware version */
diff --git a/lib/ethdev/ethdev_private.c b/lib/ethdev/ethdev_private.c
index 14ec8c6ccf..f8ab64f195 100644
--- a/lib/ethdev/ethdev_private.c
+++ b/lib/ethdev/ethdev_private.c
@@ -277,6 +277,8 @@ eth_dev_fp_ops_setup(struct rte_eth_fp_ops *fpo,
 	fpo->rx_queue_count = dev->rx_queue_count;
 	fpo->rx_descriptor_status = dev->rx_descriptor_status;
 	fpo->tx_descriptor_status = dev->tx_descriptor_status;
+	fpo->recycle_tx_mbufs_reuse = dev->recycle_tx_mbufs_reuse;
+	fpo->recycle_rx_descriptors_refill = dev->recycle_rx_descriptors_refill;
 
 	fpo->rxq.data = dev->data->rx_queues;
 	fpo->rxq.clbk = (void **)(uintptr_t)dev->post_rx_burst_cbs;
diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
index 0840d2b594..ea89a101a1 100644
--- a/lib/ethdev/rte_ethdev.c
+++ b/lib/ethdev/rte_ethdev.c
@@ -5876,6 +5876,37 @@ rte_eth_tx_queue_info_get(uint16_t port_id, uint16_t queue_id,
 	return 0;
 }
 
+int
+rte_eth_recycle_rx_queue_info_get(uint16_t port_id, uint16_t queue_id,
+		struct rte_eth_recycle_rxq_info *recycle_rxq_info)
+{
+	struct rte_eth_dev *dev;
+
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
+	dev = &rte_eth_devices[port_id];
+
+	if (queue_id >= dev->data->nb_rx_queues) {
+		RTE_ETHDEV_LOG(ERR, "Invalid Rx queue_id=%u\n", queue_id);
+		return -EINVAL;
+	}
+
+	if (dev->data->rx_queues == NULL ||
+			dev->data->rx_queues[queue_id] == NULL) {
+		RTE_ETHDEV_LOG(ERR,
+			   "Rx queue %"PRIu16" of device with port_id=%"
+			   PRIu16" has not been setup\n",
+			   queue_id, port_id);
+		return -EINVAL;
+	}
+
+	if (*dev->dev_ops->recycle_rxq_info_get == NULL)
+		return -ENOTSUP;
+
+	dev->dev_ops->recycle_rxq_info_get(dev, queue_id, recycle_rxq_info);
+
+	return 0;
+}
+
 int
 rte_eth_rx_burst_mode_get(uint16_t port_id, uint16_t queue_id,
 			  struct rte_eth_burst_mode *mode)
diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h
index 04a2564f22..9dc5749d83 100644
--- a/lib/ethdev/rte_ethdev.h
+++ b/lib/ethdev/rte_ethdev.h
@@ -1820,6 +1820,30 @@ struct rte_eth_txq_info {
 	uint8_t queue_state;        /**< one of RTE_ETH_QUEUE_STATE_*. */
 } __rte_cache_min_aligned;
 
+/**
+ * @warning
+ * @b EXPERIMENTAL: this structure may change without prior notice.
+ *
+ * Ethernet device Rx queue information structure for recycling mbufs.
+ * Used to retrieve Rx queue information when Tx queue reusing mbufs and moving
+ * them into Rx mbuf ring.
+ */
+struct rte_eth_recycle_rxq_info {
+	struct rte_mbuf **mbuf_ring; /**< mbuf ring of Rx queue. */
+	struct rte_mempool *mp;     /**< mempool of Rx queue. */
+	uint16_t *refill_head;      /**< head of Rx queue refilling mbufs. */
+	uint16_t *receive_tail;     /**< tail of Rx queue receiving pkts. */
+	uint16_t mbuf_ring_size;     /**< configured number of mbuf ring size. */
+	/**
+	 * Requirement on mbuf refilling batch size of Rx mbuf ring.
+	 * For some PMD drivers, the number of Rx mbuf ring refilling mbufs
+	 * should be aligned with mbuf ring size, in order to simplify
+	 * ring wrapping around.
+	 * Value 0 means that PMD drivers have no requirement for this.
+	 */
+	uint16_t refill_requirement;
+} __rte_cache_min_aligned;
+
 /* Generic Burst mode flag definition, values can be ORed. */
 
 /**
@@ -4853,6 +4877,31 @@ int rte_eth_rx_queue_info_get(uint16_t port_id, uint16_t queue_id,
 int rte_eth_tx_queue_info_get(uint16_t port_id, uint16_t queue_id,
 	struct rte_eth_txq_info *qinfo);
 
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice
+ *
+ * Retrieve information about given ports's Rx queue for recycling mbufs.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param queue_id
+ *   The Rx queue on the Ethernet devicefor which information
+ *   will be retrieved.
+ * @param recycle_rxq_info
+ *   A pointer to a structure of type *rte_eth_recycle_rxq_info* to be filled.
+ *
+ * @return
+ *   - 0: Success
+ *   - -ENODEV:  If *port_id* is invalid.
+ *   - -ENOTSUP: routine is not supported by the device PMD.
+ *   - -EINVAL:  The queue_id is out of range.
+ */
+__rte_experimental
+int rte_eth_recycle_rx_queue_info_get(uint16_t port_id,
+		uint16_t queue_id,
+		struct rte_eth_recycle_rxq_info *recycle_rxq_info);
+
 /**
  * Retrieve information about the Rx packet burst mode.
  *
@@ -6527,6 +6576,138 @@ 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
+ *
+ * Recycle used mbufs from a transmit queue of an Ethernet device, and move
+ * these mbufs into a mbuf ring for a receive queue of an Ethernet device.
+ * This can bypass mempool path to save CPU cycles.
+ *
+ * The rte_eth_recycle_mbufs() function loops, with rte_eth_rx_burst() and
+ * rte_eth_tx_burst() functions, freeing Tx used mbufs and replenishing Rx
+ * descriptors. The number of recycling mbufs depends on the request of Rx mbuf
+ * ring, with the constraint of enough used mbufs from Tx mbuf ring.
+ *
+ * For each recycling mbufs, the rte_eth_recycle_mbufs() function performs the
+ * following operations:
+ *
+ * - Copy used *rte_mbuf* buffer pointers from Tx mbuf ring into Rx mbuf ring.
+ *
+ * - Replenish the Rx descriptors with the recycling *rte_mbuf* mbufs freed
+ *   from the Tx mbuf ring.
+ *
+ * This function spilts Rx and Tx path with different callback functions. The
+ * callback function recycle_tx_mbufs_reuse is for Tx driver. The callback
+ * function recycle_rx_descriptors_refill is for Rx driver. rte_eth_recycle_mbufs()
+ * can support the case that Rx Ethernet device is different from Tx Ethernet device.
+ *
+ * It is the responsibility of users to select the Rx/Tx queue pair to recycle
+ * mbufs. Before call this function, users must call rte_eth_recycle_rxq_info_get
+ * function to retrieve selected Rx queue information.
+ * @see rte_eth_recycle_rxq_info_get, struct rte_eth_recycle_rxq_info
+ *
+ * Currently, the rte_eth_recycle_mbufs() function can support to feed 1 Rx queue from
+ * 2 Tx queues in the same thread. Do not pair the Rx queue and Tx queue in different
+ * threads, in order to avoid memory error rewriting.
+ *
+ * @param rx_port_id
+ *   Port identifying the receive side.
+ * @param rx_queue_id
+ *   The index of the receive queue identifying the receive side.
+ *   The value must be in the range [0, nb_rx_queue - 1] previously supplied
+ *   to rte_eth_dev_configure().
+ * @param tx_port_id
+ *   Port identifying the transmit side.
+ * @param tx_queue_id
+ *   The index of the transmit queue identifying the transmit side.
+ *   The value must be in the range [0, nb_tx_queue - 1] previously supplied
+ *   to rte_eth_dev_configure().
+ * @param recycle_rxq_info
+ *   A pointer to a structure of type *rte_eth_recycle_rxq_info* which contains
+ *   the information of the Rx queue mbuf ring.
+ * @return
+ *   The number of recycling mbufs.
+ */
+__rte_experimental
+static inline uint16_t
+rte_eth_recycle_mbufs(uint16_t rx_port_id, uint16_t rx_queue_id,
+		uint16_t tx_port_id, uint16_t tx_queue_id,
+		struct rte_eth_recycle_rxq_info *recycle_rxq_info)
+{
+	struct rte_eth_fp_ops *p;
+	void *qd;
+	uint16_t nb_mbufs;
+
+#ifdef RTE_ETHDEV_DEBUG_TX
+	if (tx_port_id >= RTE_MAX_ETHPORTS ||
+			tx_queue_id >= RTE_MAX_QUEUES_PER_PORT) {
+		RTE_ETHDEV_LOG(ERR,
+				"Invalid tx_port_id=%u or tx_queue_id=%u\n",
+				tx_port_id, tx_queue_id);
+		return 0;
+	}
+#endif
+
+	/* fetch pointer to queue data */
+	p = &rte_eth_fp_ops[tx_port_id];
+	qd = p->txq.data[tx_queue_id];
+
+#ifdef RTE_ETHDEV_DEBUG_TX
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(tx_port_id, 0);
+
+	if (qd == NULL) {
+		RTE_ETHDEV_LOG(ERR, "Invalid Tx queue_id=%u for port_id=%u\n",
+				tx_queue_id, tx_port_id);
+		return 0;
+	}
+#endif
+	if (p->recycle_tx_mbufs_reuse == NULL)
+		return 0;
+
+	/* Copy used *rte_mbuf* buffer pointers from Tx mbuf ring
+	 * into Rx mbuf ring.
+	 */
+	nb_mbufs = p->recycle_tx_mbufs_reuse(qd, recycle_rxq_info);
+
+	/* If no recycling mbufs, return 0. */
+	if (nb_mbufs == 0)
+		return 0;
+
+#ifdef RTE_ETHDEV_DEBUG_RX
+	if (rx_port_id >= RTE_MAX_ETHPORTS ||
+			rx_queue_id >= RTE_MAX_QUEUES_PER_PORT) {
+		RTE_ETHDEV_LOG(ERR, "Invalid rx_port_id=%u or rx_queue_id=%u\n",
+				rx_port_id, rx_queue_id);
+		return 0;
+	}
+#endif
+
+	/* fetch pointer to queue data */
+	p = &rte_eth_fp_ops[rx_port_id];
+	qd = p->rxq.data[rx_queue_id];
+
+#ifdef RTE_ETHDEV_DEBUG_RX
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(rx_port_id, 0);
+
+	if (qd == NULL) {
+		RTE_ETHDEV_LOG(ERR, "Invalid Rx queue_id=%u for port_id=%u\n",
+				rx_queue_id, rx_port_id);
+		return 0;
+	}
+#endif
+
+	if (p->recycle_rx_descriptors_refill == NULL)
+		return 0;
+
+	/* Replenish the Rx descriptors with the recycling
+	 * into Rx mbuf ring.
+	 */
+	p->recycle_rx_descriptors_refill(qd, nb_mbufs);
+
+	return nb_mbufs;
+}
+
 /**
  * @warning
  * @b EXPERIMENTAL: this API may change without prior notice
diff --git a/lib/ethdev/rte_ethdev_core.h b/lib/ethdev/rte_ethdev_core.h
index 46e9721e07..a24ad7a6b2 100644
--- a/lib/ethdev/rte_ethdev_core.h
+++ b/lib/ethdev/rte_ethdev_core.h
@@ -55,6 +55,13 @@ typedef int (*eth_rx_descriptor_status_t)(void *rxq, uint16_t offset);
 /** @internal Check the status of a Tx descriptor */
 typedef int (*eth_tx_descriptor_status_t)(void *txq, uint16_t offset);
 
+/** @internal Copy used mbufs from Tx mbuf ring into Rx mbuf ring */
+typedef uint16_t (*eth_recycle_tx_mbufs_reuse_t)(void *txq,
+		struct rte_eth_recycle_rxq_info *recycle_rxq_info);
+
+/** @internal Refill Rx descriptors with the recycling mbufs */
+typedef void (*eth_recycle_rx_descriptors_refill_t)(void *rxq, uint16_t nb);
+
 /**
  * @internal
  * Structure used to hold opaque pointers to internal ethdev Rx/Tx
@@ -83,15 +90,17 @@ struct rte_eth_fp_ops {
 	 * Rx fast-path functions and related data.
 	 * 64-bit systems: occupies first 64B line
 	 */
+	/** Rx queues data. */
+	struct rte_ethdev_qdata rxq;
 	/** PMD receive function. */
 	eth_rx_burst_t rx_pkt_burst;
 	/** Get the number of used Rx descriptors. */
 	eth_rx_queue_count_t rx_queue_count;
 	/** Check the status of a Rx descriptor. */
 	eth_rx_descriptor_status_t rx_descriptor_status;
-	/** Rx queues data. */
-	struct rte_ethdev_qdata rxq;
-	uintptr_t reserved1[3];
+	/** Refill Rx descriptors with the recycling mbufs. */
+	eth_recycle_rx_descriptors_refill_t recycle_rx_descriptors_refill;
+	uintptr_t reserved1[2];
 	/**@}*/
 
 	/**@{*/
@@ -99,15 +108,17 @@ struct rte_eth_fp_ops {
 	 * Tx fast-path functions and related data.
 	 * 64-bit systems: occupies second 64B line
 	 */
+	/** Tx queues data. */
+	struct rte_ethdev_qdata txq;
 	/** PMD transmit function. */
 	eth_tx_burst_t tx_pkt_burst;
 	/** PMD transmit prepare function. */
 	eth_tx_prep_t tx_pkt_prepare;
 	/** Check the status of a Tx descriptor. */
 	eth_tx_descriptor_status_t tx_descriptor_status;
-	/** Tx queues data. */
-	struct rte_ethdev_qdata txq;
-	uintptr_t reserved2[3];
+	/** Copy used mbufs from Tx mbuf ring into Rx. */
+	eth_recycle_tx_mbufs_reuse_t recycle_tx_mbufs_reuse;
+	uintptr_t reserved2[2];
 	/**@}*/
 
 } __rte_cache_aligned;
diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map
index b965d6aa52..e52c1563b4 100644
--- a/lib/ethdev/version.map
+++ b/lib/ethdev/version.map
@@ -312,6 +312,10 @@ EXPERIMENTAL {
 	rte_flow_async_action_list_handle_query_update;
 	rte_flow_async_actions_update;
 	rte_flow_restore_info_dynflag;
+
+	# added in 23.11
+	rte_eth_recycle_mbufs;
+	rte_eth_recycle_rx_queue_info_get;
 };
 
 INTERNAL {
-- 
2.25.1


^ permalink raw reply	[relevance 3%]

* [PATCH RESEND v6 2/5] ethdev: fix skip valid port in probing callback
  2023-08-02  3:15  3% ` [PATCH RESEND v6 " Huisong Li
@ 2023-08-02  3:15  2%   ` Huisong Li
  0 siblings, 0 replies; 200+ results
From: Huisong Li @ 2023-08-02  3:15 UTC (permalink / raw)
  To: dev
  Cc: thomas, ferruh.yigit, andrew.rybchenko, fengchengwen,
	liudongdong3, liuyonglong, lihuisong

The event callback in application may use the macro RTE_ETH_FOREACH_DEV to
iterate over all enabled ports to do something(like, verifying the port id
validity) when receive a probing event. If the ethdev state of a port is
not RTE_ETH_DEV_UNUSED, this port will be considered as a valid port.

However, this state is set to RTE_ETH_DEV_ATTACHED after pushing probing
event. It means that probing callback will skip this port. But this
assignment can not move to front of probing notification. See
commit be8cd210379a ("ethdev: fix port probing notification")

So this patch has to add a new state, RTE_ETH_DEV_ALLOCATED. Set the ethdev
state to RTE_ETH_DEV_ALLOCATED before pushing probing event and set it to
RTE_ETH_DEV_ATTACHED after definitely probed. And this port is valid if its
device state is 'ALLOCATED' or 'ATTACHED'.

In addition, the new state has to be placed behind 'REMOVED' to avoid ABI
break. Fortunately, this ethdev state is internal and applications can not
access it directly. So this patch encapsulates an API, rte_eth_dev_is_used,
for ethdev or PMD to call and eliminate concerns about using this state
enum value comparison.

Fixes: be8cd210379a ("ethdev: fix port probing notification")
Cc: stable@dpdk.org

Signed-off-by: Huisong Li <lihuisong@huawei.com>
Acked-by: Chengwen Feng <fengchengwen@huawei.com>
---
 drivers/net/bnxt/bnxt_ethdev.c |  3 ++-
 drivers/net/mlx5/mlx5.c        |  2 +-
 lib/ethdev/ethdev_driver.c     | 13 ++++++++++---
 lib/ethdev/ethdev_driver.h     | 12 ++++++++++++
 lib/ethdev/ethdev_pci.h        |  2 +-
 lib/ethdev/rte_class_eth.c     |  2 +-
 lib/ethdev/rte_ethdev.c        |  4 ++--
 lib/ethdev/rte_ethdev.h        |  4 +++-
 lib/ethdev/version.map         |  1 +
 9 files changed, 33 insertions(+), 10 deletions(-)

diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index ee1552452a..bf1910709b 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -6108,7 +6108,8 @@ bnxt_dev_uninit(struct rte_eth_dev *eth_dev)
 
 	PMD_DRV_LOG(DEBUG, "Calling Device uninit\n");
 
-	if (eth_dev->state != RTE_ETH_DEV_UNUSED)
+
+	if (rte_eth_dev_is_used(eth_dev->state))
 		bnxt_dev_close_op(eth_dev);
 
 	return 0;
diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
index b373306f98..54c6fff889 100644
--- a/drivers/net/mlx5/mlx5.c
+++ b/drivers/net/mlx5/mlx5.c
@@ -3152,7 +3152,7 @@ mlx5_eth_find_next(uint16_t port_id, struct rte_device *odev)
 	while (port_id < RTE_MAX_ETHPORTS) {
 		struct rte_eth_dev *dev = &rte_eth_devices[port_id];
 
-		if (dev->state != RTE_ETH_DEV_UNUSED &&
+		if (rte_eth_dev_is_used(dev->state) &&
 		    dev->device &&
 		    (dev->device == odev ||
 		     (dev->device->driver &&
diff --git a/lib/ethdev/ethdev_driver.c b/lib/ethdev/ethdev_driver.c
index 0be1e8ca04..29e9417bea 100644
--- a/lib/ethdev/ethdev_driver.c
+++ b/lib/ethdev/ethdev_driver.c
@@ -50,8 +50,8 @@ eth_dev_find_free_port(void)
 	for (i = 0; i < RTE_MAX_ETHPORTS; i++) {
 		/* Using shared name field to find a free port. */
 		if (eth_dev_shared_data->data[i].name[0] == '\0') {
-			RTE_ASSERT(rte_eth_devices[i].state ==
-				   RTE_ETH_DEV_UNUSED);
+			RTE_ASSERT(!rte_eth_dev_is_used(
+					rte_eth_devices[i].state));
 			return i;
 		}
 	}
@@ -208,11 +208,18 @@ rte_eth_dev_probing_finish(struct rte_eth_dev *dev)
 	if (rte_eal_process_type() == RTE_PROC_SECONDARY)
 		eth_dev_fp_ops_setup(rte_eth_fp_ops + dev->data->port_id, dev);
 
+	dev->state = RTE_ETH_DEV_ALLOCATED;
 	rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_NEW, NULL);
 
 	dev->state = RTE_ETH_DEV_ATTACHED;
 }
 
+bool rte_eth_dev_is_used(uint16_t dev_state)
+{
+	return dev_state == RTE_ETH_DEV_ALLOCATED ||
+		dev_state == RTE_ETH_DEV_ATTACHED;
+}
+
 int
 rte_eth_dev_release_port(struct rte_eth_dev *eth_dev)
 {
@@ -221,7 +228,7 @@ rte_eth_dev_release_port(struct rte_eth_dev *eth_dev)
 
 	eth_dev_shared_data_prepare();
 
-	if (eth_dev->state != RTE_ETH_DEV_UNUSED)
+	if (rte_eth_dev_is_used(eth_dev->state))
 		rte_eth_dev_callback_process(eth_dev,
 				RTE_ETH_EVENT_DESTROY, NULL);
 
diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h
index 980f837ab6..5bd2780643 100644
--- a/lib/ethdev/ethdev_driver.h
+++ b/lib/ethdev/ethdev_driver.h
@@ -1582,6 +1582,18 @@ int rte_eth_dev_callback_process(struct rte_eth_dev *dev,
 __rte_internal
 void rte_eth_dev_probing_finish(struct rte_eth_dev *dev);
 
+/**
+ * Check if a Ethernet device state is used or not
+ *
+ * @param dev_state
+ *   The state of the Ethernet device
+ * @return
+ *   - true if the state of the Ethernet device is allocated or attached
+ *   - false if this state is neither allocated nor attached
+ */
+__rte_internal
+bool rte_eth_dev_is_used(uint16_t dev_state);
+
 /**
  * Create memzone for HW rings.
  * malloc can't be used as the physical address is needed.
diff --git a/lib/ethdev/ethdev_pci.h b/lib/ethdev/ethdev_pci.h
index 320e3e0093..efe20be1a7 100644
--- a/lib/ethdev/ethdev_pci.h
+++ b/lib/ethdev/ethdev_pci.h
@@ -165,7 +165,7 @@ rte_eth_dev_pci_generic_remove(struct rte_pci_device *pci_dev,
 	 * eth device has been released.
 	 */
 	if (rte_eal_process_type() == RTE_PROC_SECONDARY &&
-	    eth_dev->state == RTE_ETH_DEV_UNUSED)
+	    !rte_eth_dev_is_used(eth_dev->state))
 		return 0;
 
 	if (dev_uninit) {
diff --git a/lib/ethdev/rte_class_eth.c b/lib/ethdev/rte_class_eth.c
index b61dae849d..88e56dd9a4 100644
--- a/lib/ethdev/rte_class_eth.c
+++ b/lib/ethdev/rte_class_eth.c
@@ -118,7 +118,7 @@ eth_dev_match(const struct rte_eth_dev *edev,
 	const struct rte_kvargs *kvlist = arg->kvlist;
 	unsigned int pair;
 
-	if (edev->state == RTE_ETH_DEV_UNUSED)
+	if (!rte_eth_dev_is_used(edev->state))
 		return -1;
 	if (arg->device != NULL && arg->device != edev->device)
 		return -1;
diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
index 0840d2b594..ec44490cde 100644
--- a/lib/ethdev/rte_ethdev.c
+++ b/lib/ethdev/rte_ethdev.c
@@ -338,7 +338,7 @@ uint16_t
 rte_eth_find_next(uint16_t port_id)
 {
 	while (port_id < RTE_MAX_ETHPORTS &&
-			rte_eth_devices[port_id].state == RTE_ETH_DEV_UNUSED)
+	       !rte_eth_dev_is_used(rte_eth_devices[port_id].state))
 		port_id++;
 
 	if (port_id >= RTE_MAX_ETHPORTS)
@@ -397,7 +397,7 @@ rte_eth_dev_is_valid_port(uint16_t port_id)
 	int is_valid;
 
 	if (port_id >= RTE_MAX_ETHPORTS ||
-	    (rte_eth_devices[port_id].state == RTE_ETH_DEV_UNUSED))
+	    !rte_eth_dev_is_used(rte_eth_devices[port_id].state))
 		is_valid = 0;
 	else
 		is_valid = 1;
diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h
index 04a2564f22..e7e521efc4 100644
--- a/lib/ethdev/rte_ethdev.h
+++ b/lib/ethdev/rte_ethdev.h
@@ -2003,10 +2003,12 @@ typedef uint16_t (*rte_tx_callback_fn)(uint16_t port_id, uint16_t queue,
 enum rte_eth_dev_state {
 	/** Device is unused before being probed. */
 	RTE_ETH_DEV_UNUSED = 0,
-	/** Device is attached when allocated in probing. */
+	/** Device is attached when definitely probed. */
 	RTE_ETH_DEV_ATTACHED,
 	/** Device is in removed state when plug-out is detected. */
 	RTE_ETH_DEV_REMOVED,
+	/** Device is allocated and is set before reporting new event. */
+	RTE_ETH_DEV_ALLOCATED,
 };
 
 struct rte_eth_dev_sriov {
diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map
index b965d6aa52..ad95329b57 100644
--- a/lib/ethdev/version.map
+++ b/lib/ethdev/version.map
@@ -326,6 +326,7 @@ INTERNAL {
 	rte_eth_dev_get_by_name;
 	rte_eth_dev_is_rx_hairpin_queue;
 	rte_eth_dev_is_tx_hairpin_queue;
+	rte_eth_dev_is_used;
 	rte_eth_dev_probing_finish;
 	rte_eth_dev_release_port;
 	rte_eth_dev_internal_reset;
-- 
2.22.0


^ permalink raw reply	[relevance 2%]

* [PATCH RESEND v6 0/5] app/testpmd: support multiple process attach and detach port
       [not found]     <20220825024425.10534-1-lihuisong@huawei.com>
  2023-05-27  2:11  3% ` [PATCH V6 0/5] app/testpmd: support multiple process attach and detach port Huisong Li
@ 2023-08-02  3:15  3% ` Huisong Li
  2023-08-02  3:15  2%   ` [PATCH RESEND v6 2/5] ethdev: fix skip valid port in probing callback Huisong Li
  1 sibling, 1 reply; 200+ results
From: Huisong Li @ 2023-08-02  3:15 UTC (permalink / raw)
  To: dev
  Cc: thomas, ferruh.yigit, andrew.rybchenko, fengchengwen,
	liudongdong3, liuyonglong, lihuisong

This patchset fix some bugs and support attaching and detaching port
in primary and secondary.

---
 -v6: adjust rte_eth_dev_is_used position based on alphabetical order
      in version.map
 -v5: move 'ALLOCATED' state to the back of 'REMOVED' to avoid abi break.
 -v4: fix a misspelling. 
 -v3:
   #1 merge patch 1/6 and patch 2/6 into patch 1/5, and add modification
      for other bus type.
   #2 add a RTE_ETH_DEV_ALLOCATED state in rte_eth_dev_state to resolve
      the probelm in patch 2/5. 
 -v2: resend due to CI unexplained failure.

Huisong Li (5):
  drivers/bus: restore driver assignment at front of probing
  ethdev: fix skip valid port in probing callback
  app/testpmd: check the validity of the port
  app/testpmd: add attach and detach port for multiple process
  app/testpmd: stop forwarding in new or destroy event

 app/test-pmd/testpmd.c                   | 47 +++++++++++++++---------
 app/test-pmd/testpmd.h                   |  1 -
 drivers/bus/auxiliary/auxiliary_common.c |  9 ++++-
 drivers/bus/dpaa/dpaa_bus.c              |  9 ++++-
 drivers/bus/fslmc/fslmc_bus.c            |  8 +++-
 drivers/bus/ifpga/ifpga_bus.c            | 12 ++++--
 drivers/bus/pci/pci_common.c             |  9 ++++-
 drivers/bus/vdev/vdev.c                  | 10 ++++-
 drivers/bus/vmbus/vmbus_common.c         |  9 ++++-
 drivers/net/bnxt/bnxt_ethdev.c           |  3 +-
 drivers/net/bonding/bonding_testpmd.c    |  1 -
 drivers/net/mlx5/mlx5.c                  |  2 +-
 lib/ethdev/ethdev_driver.c               | 13 +++++--
 lib/ethdev/ethdev_driver.h               | 12 ++++++
 lib/ethdev/ethdev_pci.h                  |  2 +-
 lib/ethdev/rte_class_eth.c               |  2 +-
 lib/ethdev/rte_ethdev.c                  |  4 +-
 lib/ethdev/rte_ethdev.h                  |  4 +-
 lib/ethdev/version.map                   |  1 +
 19 files changed, 114 insertions(+), 44 deletions(-)

-- 
2.22.0


^ permalink raw reply	[relevance 3%]

* [PATCH v2 2/2] kni: remove deprecated kernel network interface
  @ 2023-08-01 16:05  1% ` Stephen Hemminger
  0 siblings, 0 replies; 200+ results
From: Stephen Hemminger @ 2023-08-01 16:05 UTC (permalink / raw)
  To: dev
  Cc: Stephen Hemminger, Thomas Monjalon, Maxime Coquelin, Chenbo Xia,
	Anatoly Burakov, Cristian Dumitrescu, Nithin Dabilpuram,
	Kiran Kumar K, Sunil Kumar Kori, Satha Rao, Bruce Richardson

The KNI driver had design flaws such as calling userspace with kernel
mutex held that made it prone to deadlock. The design also introduced
security risks because the kernel driver trusted that the userspace
(DPDK) kni interface. The kernel driver was never reviewed by
the upstream kernel community and would never have been accepted.

And since the Linux kernel API is not stable, it was a continual
source of maintenance issues especially with distribution kernels.

There are better ways to inject packets into the kernel such as
virtio_user, tap and XDP drivers. All of these do not need out of
tree kernel drivers.

The deprecation was announced in 22.11 release; and users were
directed to alternatives there.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 MAINTAINERS                                   |  10 -
 app/test/meson.build                          |   2 -
 app/test/test_kni.c                           | 740 ---------------
 doc/api/doxy-api-index.md                     |   2 -
 doc/api/doxy-api.conf.in                      |   1 -
 doc/guides/contributing/documentation.rst     |   4 +-
 doc/guides/howto/flow_bifurcation.rst         |   3 +-
 doc/guides/nics/index.rst                     |   1 -
 doc/guides/nics/kni.rst                       | 170 ----
 doc/guides/nics/virtio.rst                    |  92 +-
 .../prog_guide/env_abstraction_layer.rst      |   2 -
 doc/guides/prog_guide/glossary.rst            |   3 -
 doc/guides/prog_guide/index.rst               |   1 -
 .../prog_guide/kernel_nic_interface.rst       | 423 ---------
 doc/guides/prog_guide/packet_framework.rst    |   9 +-
 doc/guides/rel_notes/deprecation.rst          |   9 +-
 doc/guides/rel_notes/release_23_11.rst        |   2 +
 doc/guides/sample_app_ug/ip_pipeline.rst      |  22 -
 drivers/net/cnxk/cnxk_ethdev.c                |   2 +-
 drivers/net/kni/meson.build                   |  11 -
 drivers/net/kni/rte_eth_kni.c                 | 524 -----------
 drivers/net/meson.build                       |   1 -
 examples/ip_pipeline/Makefile                 |   1 -
 examples/ip_pipeline/cli.c                    |  95 --
 examples/ip_pipeline/examples/kni.cli         |  69 --
 examples/ip_pipeline/kni.c                    | 168 ----
 examples/ip_pipeline/kni.h                    |  46 -
 examples/ip_pipeline/main.c                   |  10 -
 examples/ip_pipeline/meson.build              |   1 -
 examples/ip_pipeline/pipeline.c               |  57 --
 examples/ip_pipeline/pipeline.h               |   2 -
 kernel/linux/kni/Kbuild                       |   6 -
 kernel/linux/kni/compat.h                     | 157 ----
 kernel/linux/kni/kni_dev.h                    | 137 ---
 kernel/linux/kni/kni_fifo.h                   |  87 --
 kernel/linux/kni/kni_misc.c                   | 719 --------------
 kernel/linux/kni/kni_net.c                    | 878 ------------------
 kernel/linux/kni/meson.build                  |  41 -
 kernel/linux/meson.build                      |   2 +-
 lib/eal/common/eal_common_log.c               |   1 -
 lib/eal/include/rte_log.h                     |   2 +-
 lib/eal/linux/eal.c                           |  19 -
 lib/kni/meson.build                           |  21 -
 lib/kni/rte_kni.c                             | 843 -----------------
 lib/kni/rte_kni.h                             | 269 ------
 lib/kni/rte_kni_common.h                      | 147 ---
 lib/kni/rte_kni_fifo.h                        | 117 ---
 lib/kni/version.map                           |  24 -
 lib/meson.build                               |   6 -
 lib/port/meson.build                          |   6 -
 lib/port/rte_port_kni.c                       | 515 ----------
 lib/port/rte_port_kni.h                       |  63 --
 lib/port/version.map                          |   3 -
 meson_options.txt                             |   2 +-
 54 files changed, 14 insertions(+), 6534 deletions(-)
 delete mode 100644 app/test/test_kni.c
 delete mode 100644 doc/guides/nics/kni.rst
 delete mode 100644 doc/guides/prog_guide/kernel_nic_interface.rst
 delete mode 100644 drivers/net/kni/meson.build
 delete mode 100644 drivers/net/kni/rte_eth_kni.c
 delete mode 100644 examples/ip_pipeline/examples/kni.cli
 delete mode 100644 examples/ip_pipeline/kni.c
 delete mode 100644 examples/ip_pipeline/kni.h
 delete mode 100644 kernel/linux/kni/Kbuild
 delete mode 100644 kernel/linux/kni/compat.h
 delete mode 100644 kernel/linux/kni/kni_dev.h
 delete mode 100644 kernel/linux/kni/kni_fifo.h
 delete mode 100644 kernel/linux/kni/kni_misc.c
 delete mode 100644 kernel/linux/kni/kni_net.c
 delete mode 100644 kernel/linux/kni/meson.build
 delete mode 100644 lib/kni/meson.build
 delete mode 100644 lib/kni/rte_kni.c
 delete mode 100644 lib/kni/rte_kni.h
 delete mode 100644 lib/kni/rte_kni_common.h
 delete mode 100644 lib/kni/rte_kni_fifo.h
 delete mode 100644 lib/kni/version.map
 delete mode 100644 lib/port/rte_port_kni.c
 delete mode 100644 lib/port/rte_port_kni.h

diff --git a/MAINTAINERS b/MAINTAINERS
index dbb25211c367..6345e7f8a65d 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -617,12 +617,6 @@ F: doc/guides/prog_guide/link_bonding_poll_mode_drv_lib.rst
 F: app/test/test_link_bonding*
 F: examples/bond/
 
-Linux KNI
-F: kernel/linux/kni/
-F: lib/kni/
-F: doc/guides/prog_guide/kernel_nic_interface.rst
-F: app/test/test_kni.c
-
 Linux AF_PACKET
 M: John W. Linville <linville@tuxdriver.com>
 F: drivers/net/af_packet/
@@ -1027,10 +1021,6 @@ F: drivers/net/tap/
 F: doc/guides/nics/tap.rst
 F: doc/guides/nics/features/tap.ini
 
-KNI PMD
-F: drivers/net/kni/
-F: doc/guides/nics/kni.rst
-
 Ring PMD
 M: Bruce Richardson <bruce.richardson@intel.com>
 F: drivers/net/ring/
diff --git a/app/test/meson.build b/app/test/meson.build
index 90a2e350c7ae..66897c14a399 100644
--- a/app/test/meson.build
+++ b/app/test/meson.build
@@ -72,7 +72,6 @@ test_sources = files(
         'test_ipsec.c',
         'test_ipsec_sad.c',
         'test_ipsec_perf.c',
-        'test_kni.c',
         'test_kvargs.c',
         'test_lcores.c',
         'test_logs.c',
@@ -237,7 +236,6 @@ fast_tests = [
         ['fbarray_autotest', true, true],
         ['hash_readwrite_func_autotest', false, true],
         ['ipsec_autotest', true, true],
-        ['kni_autotest', false, true],
         ['kvargs_autotest', true, true],
         ['member_autotest', true, true],
         ['power_cpufreq_autotest', false, true],
diff --git a/app/test/test_kni.c b/app/test/test_kni.c
deleted file mode 100644
index 4039da0b080c..000000000000
--- a/app/test/test_kni.c
+++ /dev/null
@@ -1,740 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2014 Intel Corporation
- */
-
-#include "test.h"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <unistd.h>
-#include <string.h>
-#if !defined(RTE_EXEC_ENV_LINUX) || !defined(RTE_LIB_KNI)
-
-static int
-test_kni(void)
-{
-	printf("KNI not supported, skipping test\n");
-	return TEST_SKIPPED;
-}
-
-#else
-
-#include <sys/wait.h>
-#include <dirent.h>
-
-#include <rte_string_fns.h>
-#include <rte_mempool.h>
-#include <rte_ethdev.h>
-#include <rte_cycles.h>
-#include <rte_kni.h>
-
-#define NB_MBUF          8192
-#define MAX_PACKET_SZ    2048
-#define MBUF_DATA_SZ     (MAX_PACKET_SZ + RTE_PKTMBUF_HEADROOM)
-#define PKT_BURST_SZ     32
-#define MEMPOOL_CACHE_SZ PKT_BURST_SZ
-#define SOCKET           0
-#define NB_RXD           1024
-#define NB_TXD           1024
-#define KNI_TIMEOUT_MS   5000 /* ms */
-
-#define IFCONFIG      "/sbin/ifconfig "
-#define TEST_KNI_PORT "test_kni_port"
-#define KNI_MODULE_PATH "/sys/module/rte_kni"
-#define KNI_MODULE_PARAM_LO KNI_MODULE_PATH"/parameters/lo_mode"
-#define KNI_TEST_MAX_PORTS 4
-/* The threshold number of mbufs to be transmitted or received. */
-#define KNI_NUM_MBUF_THRESHOLD 100
-static int kni_pkt_mtu = 0;
-
-struct test_kni_stats {
-	volatile uint64_t ingress;
-	volatile uint64_t egress;
-};
-
-static const struct rte_eth_rxconf rx_conf = {
-	.rx_thresh = {
-		.pthresh = 8,
-		.hthresh = 8,
-		.wthresh = 4,
-	},
-	.rx_free_thresh = 0,
-};
-
-static const struct rte_eth_txconf tx_conf = {
-	.tx_thresh = {
-		.pthresh = 36,
-		.hthresh = 0,
-		.wthresh = 0,
-	},
-	.tx_free_thresh = 0,
-	.tx_rs_thresh = 0,
-};
-
-static const struct rte_eth_conf port_conf = {
-	.txmode = {
-		.mq_mode = RTE_ETH_MQ_TX_NONE,
-	},
-};
-
-static struct rte_kni_ops kni_ops = {
-	.change_mtu = NULL,
-	.config_network_if = NULL,
-	.config_mac_address = NULL,
-	.config_promiscusity = NULL,
-};
-
-static unsigned int lcore_main, lcore_ingress, lcore_egress;
-static struct rte_kni *test_kni_ctx;
-static struct test_kni_stats stats;
-
-static volatile uint32_t test_kni_processing_flag;
-
-static struct rte_mempool *
-test_kni_create_mempool(void)
-{
-	struct rte_mempool * mp;
-
-	mp = rte_mempool_lookup("kni_mempool");
-	if (!mp)
-		mp = rte_pktmbuf_pool_create("kni_mempool",
-				NB_MBUF,
-				MEMPOOL_CACHE_SZ, 0, MBUF_DATA_SZ,
-				SOCKET);
-
-	return mp;
-}
-
-static struct rte_mempool *
-test_kni_lookup_mempool(void)
-{
-	return rte_mempool_lookup("kni_mempool");
-}
-/* Callback for request of changing MTU */
-static int
-kni_change_mtu(uint16_t port_id, unsigned int new_mtu)
-{
-	printf("Change MTU of port %d to %u\n", port_id, new_mtu);
-	kni_pkt_mtu = new_mtu;
-	printf("Change MTU of port %d to %i successfully.\n",
-					 port_id, kni_pkt_mtu);
-	return 0;
-}
-
-static int
-test_kni_link_change(void)
-{
-	int ret;
-	int pid;
-
-	pid = fork();
-	if (pid < 0) {
-		printf("Error: Failed to fork a process\n");
-		return -1;
-	}
-
-	if (pid == 0) {
-		printf("Starting KNI Link status change tests.\n");
-		if (system(IFCONFIG TEST_KNI_PORT" up") == -1) {
-			ret = -1;
-			goto error;
-		}
-
-		ret = rte_kni_update_link(test_kni_ctx, 1);
-		if (ret < 0) {
-			printf("Failed to change link state to Up ret=%d.\n",
-				ret);
-			goto error;
-		}
-		rte_delay_ms(1000);
-		printf("KNI: Set LINKUP, previous state=%d\n", ret);
-
-		ret = rte_kni_update_link(test_kni_ctx, 0);
-		if (ret != 1) {
-			printf(
-		"Failed! Previous link state should be 1, returned %d.\n",
-				ret);
-			goto error;
-		}
-		rte_delay_ms(1000);
-		printf("KNI: Set LINKDOWN, previous state=%d\n", ret);
-
-		ret = rte_kni_update_link(test_kni_ctx, 1);
-		if (ret != 0) {
-			printf(
-		"Failed! Previous link state should be 0, returned %d.\n",
-				ret);
-			goto error;
-		}
-		printf("KNI: Set LINKUP, previous state=%d\n", ret);
-
-		ret = 0;
-		rte_delay_ms(1000);
-
-error:
-		if (system(IFCONFIG TEST_KNI_PORT" down") == -1)
-			ret = -1;
-
-		printf("KNI: Link status change tests: %s.\n",
-			(ret == 0) ? "Passed" : "Failed");
-		exit(ret);
-	} else {
-		int p_ret, status;
-
-		while (1) {
-			p_ret = waitpid(pid, &status, WNOHANG);
-			if (p_ret != 0) {
-				if (WIFEXITED(status))
-					return WEXITSTATUS(status);
-				return -1;
-			}
-			rte_delay_ms(10);
-			rte_kni_handle_request(test_kni_ctx);
-		}
-	}
-}
-/**
- * This loop fully tests the basic functions of KNI. e.g. transmitting,
- * receiving to, from kernel space, and kernel requests.
- *
- * This is the loop to transmit/receive mbufs to/from kernel interface with
- * supported by KNI kernel module. The ingress lcore will allocate mbufs and
- * transmit them to kernel space; while the egress lcore will receive the mbufs
- * from kernel space and free them.
- * On the main lcore, several commands will be run to check handling the
- * kernel requests. And it will finally set the flag to exit the KNI
- * transmitting/receiving to/from the kernel space.
- *
- * Note: To support this testing, the KNI kernel module needs to be insmodded
- * in one of its loopback modes.
- */
-static int
-test_kni_loop(__rte_unused void *arg)
-{
-	int ret = 0;
-	unsigned nb_rx, nb_tx, num, i;
-	const unsigned lcore_id = rte_lcore_id();
-	struct rte_mbuf *pkts_burst[PKT_BURST_SZ];
-
-	if (lcore_id == lcore_main) {
-		rte_delay_ms(KNI_TIMEOUT_MS);
-		/* tests of handling kernel request */
-		if (system(IFCONFIG TEST_KNI_PORT" up") == -1)
-			ret = -1;
-		if (system(IFCONFIG TEST_KNI_PORT" mtu 1400") == -1)
-			ret = -1;
-		if (system(IFCONFIG TEST_KNI_PORT" down") == -1)
-			ret = -1;
-		rte_delay_ms(KNI_TIMEOUT_MS);
-		test_kni_processing_flag = 1;
-	} else if (lcore_id == lcore_ingress) {
-		struct rte_mempool *mp = test_kni_lookup_mempool();
-
-		if (mp == NULL)
-			return -1;
-
-		while (1) {
-			if (test_kni_processing_flag)
-				break;
-
-			for (nb_rx = 0; nb_rx < PKT_BURST_SZ; nb_rx++) {
-				pkts_burst[nb_rx] = rte_pktmbuf_alloc(mp);
-				if (!pkts_burst[nb_rx])
-					break;
-			}
-
-			num = rte_kni_tx_burst(test_kni_ctx, pkts_burst,
-								nb_rx);
-			stats.ingress += num;
-			rte_kni_handle_request(test_kni_ctx);
-			if (num < nb_rx) {
-				for (i = num; i < nb_rx; i++) {
-					rte_pktmbuf_free(pkts_burst[i]);
-				}
-			}
-			rte_delay_ms(10);
-		}
-	} else if (lcore_id == lcore_egress) {
-		while (1) {
-			if (test_kni_processing_flag)
-				break;
-			num = rte_kni_rx_burst(test_kni_ctx, pkts_burst,
-							PKT_BURST_SZ);
-			stats.egress += num;
-			for (nb_tx = 0; nb_tx < num; nb_tx++)
-				rte_pktmbuf_free(pkts_burst[nb_tx]);
-			rte_delay_ms(10);
-		}
-	}
-
-	return ret;
-}
-
-static int
-test_kni_allocate_lcores(void)
-{
-	unsigned i, count = 0;
-
-	lcore_main = rte_get_main_lcore();
-	printf("main lcore: %u\n", lcore_main);
-	for (i = 0; i < RTE_MAX_LCORE; i++) {
-		if (count >=2 )
-			break;
-		if (rte_lcore_is_enabled(i) && i != lcore_main) {
-			count ++;
-			if (count == 1)
-				lcore_ingress = i;
-			else if (count == 2)
-				lcore_egress = i;
-		}
-	}
-	printf("count: %u\n", count);
-
-	return count == 2 ? 0 : -1;
-}
-
-static int
-test_kni_register_handler_mp(void)
-{
-#define TEST_KNI_HANDLE_REQ_COUNT    10  /* 5s */
-#define TEST_KNI_HANDLE_REQ_INTERVAL 500 /* ms */
-#define TEST_KNI_MTU                 1450
-#define TEST_KNI_MTU_STR             " 1450"
-	int pid;
-
-	pid = fork();
-	if (pid < 0) {
-		printf("Failed to fork a process\n");
-		return -1;
-	} else if (pid == 0) {
-		int i;
-		struct rte_kni *kni = rte_kni_get(TEST_KNI_PORT);
-		struct rte_kni_ops ops = {
-			.change_mtu = kni_change_mtu,
-			.config_network_if = NULL,
-			.config_mac_address = NULL,
-			.config_promiscusity = NULL,
-		};
-
-		if (!kni) {
-			printf("Failed to get KNI named %s\n", TEST_KNI_PORT);
-			exit(-1);
-		}
-
-		kni_pkt_mtu = 0;
-
-		/* Check with the invalid parameters */
-		if (rte_kni_register_handlers(kni, NULL) == 0) {
-			printf("Unexpectedly register successfully "
-					"with NULL ops pointer\n");
-			exit(-1);
-		}
-		if (rte_kni_register_handlers(NULL, &ops) == 0) {
-			printf("Unexpectedly register successfully "
-					"to NULL KNI device pointer\n");
-			exit(-1);
-		}
-
-		if (rte_kni_register_handlers(kni, &ops)) {
-			printf("Fail to register ops\n");
-			exit(-1);
-		}
-
-		/* Check registering again after it has been registered */
-		if (rte_kni_register_handlers(kni, &ops) == 0) {
-			printf("Unexpectedly register successfully after "
-					"it has already been registered\n");
-			exit(-1);
-		}
-
-		/**
-		 * Handle the request of setting MTU,
-		 * with registered handlers.
-		 */
-		for (i = 0; i < TEST_KNI_HANDLE_REQ_COUNT; i++) {
-			rte_kni_handle_request(kni);
-			if (kni_pkt_mtu == TEST_KNI_MTU)
-				break;
-			rte_delay_ms(TEST_KNI_HANDLE_REQ_INTERVAL);
-		}
-		if (i >= TEST_KNI_HANDLE_REQ_COUNT) {
-			printf("MTU has not been set\n");
-			exit(-1);
-		}
-
-		kni_pkt_mtu = 0;
-		if (rte_kni_unregister_handlers(kni) < 0) {
-			printf("Fail to unregister ops\n");
-			exit(-1);
-		}
-
-		/* Check with invalid parameter */
-		if (rte_kni_unregister_handlers(NULL) == 0) {
-			exit(-1);
-		}
-
-		/**
-		 * Handle the request of setting MTU,
-		 * without registered handlers.
-		 */
-		for (i = 0; i < TEST_KNI_HANDLE_REQ_COUNT; i++) {
-			rte_kni_handle_request(kni);
-			if (kni_pkt_mtu != 0)
-				break;
-			rte_delay_ms(TEST_KNI_HANDLE_REQ_INTERVAL);
-		}
-		if (kni_pkt_mtu != 0) {
-			printf("MTU shouldn't be set\n");
-			exit(-1);
-		}
-
-		exit(0);
-	} else {
-		int p_ret, status;
-
-		rte_delay_ms(1000);
-		if (system(IFCONFIG TEST_KNI_PORT " mtu" TEST_KNI_MTU_STR)
-								== -1)
-			return -1;
-
-		rte_delay_ms(1000);
-		if (system(IFCONFIG TEST_KNI_PORT " mtu" TEST_KNI_MTU_STR)
-								== -1)
-			return -1;
-
-		p_ret = wait(&status);
-		if (!WIFEXITED(status)) {
-			printf("Child process (%d) exit abnormally\n", p_ret);
-			return -1;
-		}
-		if (WEXITSTATUS(status) != 0) {
-			printf("Child process exit with failure\n");
-			return -1;
-		}
-	}
-
-	return 0;
-}
-
-static int
-test_kni_processing(uint16_t port_id, struct rte_mempool *mp)
-{
-	int ret = 0;
-	unsigned i;
-	struct rte_kni *kni;
-	struct rte_kni_conf conf;
-	struct rte_eth_dev_info info;
-	struct rte_kni_ops ops;
-
-	if (!mp)
-		return -1;
-
-	memset(&conf, 0, sizeof(conf));
-	memset(&info, 0, sizeof(info));
-	memset(&ops, 0, sizeof(ops));
-
-	ret = rte_eth_dev_info_get(port_id, &info);
-	if (ret != 0) {
-		printf("Error during getting device (port %u) info: %s\n",
-				port_id, strerror(-ret));
-		return -1;
-	}
-
-	snprintf(conf.name, sizeof(conf.name), TEST_KNI_PORT);
-
-	/* core id 1 configured for kernel thread */
-	conf.core_id = 1;
-	conf.force_bind = 1;
-	conf.mbuf_size = MAX_PACKET_SZ;
-	conf.group_id = port_id;
-
-	ops = kni_ops;
-	ops.port_id = port_id;
-
-	/* basic test of kni processing */
-	kni = rte_kni_alloc(mp, &conf, &ops);
-	if (!kni) {
-		printf("fail to create kni\n");
-		return -1;
-	}
-
-	test_kni_ctx = kni;
-	test_kni_processing_flag = 0;
-	stats.ingress = 0;
-	stats.egress = 0;
-
-	/**
-	 * Check multiple processes support on
-	 * registering/unregistering handlers.
-	 */
-	if (test_kni_register_handler_mp() < 0) {
-		printf("fail to check multiple process support\n");
-		ret = -1;
-		goto fail_kni;
-	}
-
-	ret = test_kni_link_change();
-	if (ret != 0)
-		goto fail_kni;
-
-	rte_eal_mp_remote_launch(test_kni_loop, NULL, CALL_MAIN);
-	RTE_LCORE_FOREACH_WORKER(i) {
-		if (rte_eal_wait_lcore(i) < 0) {
-			ret = -1;
-			goto fail_kni;
-		}
-	}
-	/**
-	 * Check if the number of mbufs received from kernel space is equal
-	 * to that of transmitted to kernel space
-	 */
-	if (stats.ingress < KNI_NUM_MBUF_THRESHOLD ||
-		stats.egress < KNI_NUM_MBUF_THRESHOLD) {
-		printf("The ingress/egress number should not be "
-			"less than %u\n", (unsigned)KNI_NUM_MBUF_THRESHOLD);
-		ret = -1;
-		goto fail_kni;
-	}
-
-	if (rte_kni_release(kni) < 0) {
-		printf("fail to release kni\n");
-		return -1;
-	}
-	test_kni_ctx = NULL;
-
-	/* test of reusing memzone */
-	kni = rte_kni_alloc(mp, &conf, &ops);
-	if (!kni) {
-		printf("fail to create kni\n");
-		return -1;
-	}
-
-	/* Release the kni for following testing */
-	if (rte_kni_release(kni) < 0) {
-		printf("fail to release kni\n");
-		return -1;
-	}
-
-	return ret;
-fail_kni:
-	if (rte_kni_release(kni) < 0) {
-		printf("fail to release kni\n");
-		ret = -1;
-	}
-
-	return ret;
-}
-
-static int
-test_kni(void)
-{
-	int ret = -1;
-	uint16_t port_id;
-	struct rte_kni *kni;
-	struct rte_mempool *mp;
-	struct rte_kni_conf conf;
-	struct rte_eth_dev_info info;
-	struct rte_kni_ops ops;
-	FILE *fd;
-	DIR *dir;
-	char buf[16];
-
-	dir = opendir(KNI_MODULE_PATH);
-	if (!dir) {
-		if (errno == ENOENT) {
-			printf("Cannot run UT due to missing rte_kni module\n");
-			return TEST_SKIPPED;
-		}
-		printf("opendir: %s", strerror(errno));
-		return -1;
-	}
-	closedir(dir);
-
-	/* Initialize KNI subsystem */
-	ret = rte_kni_init(KNI_TEST_MAX_PORTS);
-	if (ret < 0) {
-		printf("fail to initialize KNI subsystem\n");
-		return -1;
-	}
-
-	if (test_kni_allocate_lcores() < 0) {
-		printf("No enough lcores for kni processing\n");
-		return -1;
-	}
-
-	mp = test_kni_create_mempool();
-	if (!mp) {
-		printf("fail to create mempool for kni\n");
-		return -1;
-	}
-
-	/* configuring port 0 for the test is enough */
-	port_id = 0;
-	ret = rte_eth_dev_configure(port_id, 1, 1, &port_conf);
-	if (ret < 0) {
-		printf("fail to configure port %d\n", port_id);
-		return -1;
-	}
-
-	ret = rte_eth_rx_queue_setup(port_id, 0, NB_RXD, SOCKET, &rx_conf, mp);
-	if (ret < 0) {
-		printf("fail to setup rx queue for port %d\n", port_id);
-		return -1;
-	}
-
-	ret = rte_eth_tx_queue_setup(port_id, 0, NB_TXD, SOCKET, &tx_conf);
-	if (ret < 0) {
-		printf("fail to setup tx queue for port %d\n", port_id);
-		return -1;
-	}
-
-	ret = rte_eth_dev_start(port_id);
-	if (ret < 0) {
-		printf("fail to start port %d\n", port_id);
-		return -1;
-	}
-	ret = rte_eth_promiscuous_enable(port_id);
-	if (ret != 0) {
-		printf("fail to enable promiscuous mode for port %d: %s\n",
-			port_id, rte_strerror(-ret));
-		return -1;
-	}
-
-	/* basic test of kni processing */
-	fd = fopen(KNI_MODULE_PARAM_LO, "r");
-	if (fd == NULL) {
-		printf("fopen: %s", strerror(errno));
-		return -1;
-	}
-	memset(&buf, 0, sizeof(buf));
-	if (fgets(buf, sizeof(buf), fd)) {
-		if (!strncmp(buf, "lo_mode_fifo", strlen("lo_mode_fifo")) ||
-			!strncmp(buf, "lo_mode_fifo_skb",
-				  strlen("lo_mode_fifo_skb"))) {
-			ret = test_kni_processing(port_id, mp);
-			if (ret < 0) {
-				fclose(fd);
-				goto fail;
-			}
-		} else
-			printf("test_kni_processing skipped because of missing rte_kni module lo_mode argument\n");
-	}
-	fclose(fd);
-
-	/* test of allocating KNI with NULL mempool pointer */
-	memset(&info, 0, sizeof(info));
-	memset(&conf, 0, sizeof(conf));
-	memset(&ops, 0, sizeof(ops));
-
-	ret = rte_eth_dev_info_get(port_id, &info);
-	if (ret != 0) {
-		printf("Error during getting device (port %u) info: %s\n",
-				port_id, strerror(-ret));
-		return -1;
-	}
-
-	conf.group_id = port_id;
-	conf.mbuf_size = MAX_PACKET_SZ;
-
-	ops = kni_ops;
-	ops.port_id = port_id;
-	kni = rte_kni_alloc(NULL, &conf, &ops);
-	if (kni) {
-		ret = -1;
-		printf("unexpectedly creates kni successfully with NULL "
-							"mempool pointer\n");
-		goto fail;
-	}
-
-	/* test of allocating KNI without configurations */
-	kni = rte_kni_alloc(mp, NULL, NULL);
-	if (kni) {
-		ret = -1;
-		printf("Unexpectedly allocate KNI device successfully "
-					"without configurations\n");
-		goto fail;
-	}
-
-	/* test of allocating KNI without a name */
-	memset(&conf, 0, sizeof(conf));
-	memset(&info, 0, sizeof(info));
-	memset(&ops, 0, sizeof(ops));
-
-	ret = rte_eth_dev_info_get(port_id, &info);
-	if (ret != 0) {
-		printf("Error during getting device (port %u) info: %s\n",
-				port_id, strerror(-ret));
-		ret = -1;
-		goto fail;
-	}
-
-	conf.group_id = port_id;
-	conf.mbuf_size = MAX_PACKET_SZ;
-
-	ops = kni_ops;
-	ops.port_id = port_id;
-	kni = rte_kni_alloc(mp, &conf, &ops);
-	if (kni) {
-		ret = -1;
-		printf("Unexpectedly allocate a KNI device successfully "
-						"without a name\n");
-		goto fail;
-	}
-
-	/* test of releasing NULL kni context */
-	ret = rte_kni_release(NULL);
-	if (ret == 0) {
-		ret = -1;
-		printf("unexpectedly release kni successfully\n");
-		goto fail;
-	}
-
-	/* test of handling request on NULL device pointer */
-	ret = rte_kni_handle_request(NULL);
-	if (ret == 0) {
-		ret = -1;
-		printf("Unexpectedly handle request on NULL device pointer\n");
-		goto fail;
-	}
-
-	/* test of getting KNI device with pointer to NULL */
-	kni = rte_kni_get(NULL);
-	if (kni) {
-		ret = -1;
-		printf("Unexpectedly get a KNI device with "
-					"NULL name pointer\n");
-		goto fail;
-	}
-
-	/* test of getting KNI device with an zero length name string */
-	memset(&conf, 0, sizeof(conf));
-	kni = rte_kni_get(conf.name);
-	if (kni) {
-		ret = -1;
-		printf("Unexpectedly get a KNI device with "
-				"zero length name string\n");
-		goto fail;
-	}
-
-	/* test of getting KNI device with an invalid string name */
-	memset(&conf, 0, sizeof(conf));
-	snprintf(conf.name, sizeof(conf.name), "testing");
-	kni = rte_kni_get(conf.name);
-	if (kni) {
-		ret = -1;
-		printf("Unexpectedly get a KNI device with "
-				"a never used name string\n");
-		goto fail;
-	}
-	ret = 0;
-
-fail:
-	if (rte_eth_dev_stop(port_id) != 0)
-		printf("Failed to stop port %u\n", port_id);
-
-	return ret;
-}
-
-#endif
-
-REGISTER_TEST_COMMAND(kni_autotest, test_kni);
diff --git a/doc/api/doxy-api-index.md b/doc/api/doxy-api-index.md
index 5cd8c9de8105..fdeda139329e 100644
--- a/doc/api/doxy-api-index.md
+++ b/doc/api/doxy-api-index.md
@@ -43,7 +43,6 @@ The public API headers are grouped by topics:
   [bond](@ref rte_eth_bond.h),
   [vhost](@ref rte_vhost.h),
   [vdpa](@ref rte_vdpa.h),
-  [KNI](@ref rte_kni.h),
   [ixgbe](@ref rte_pmd_ixgbe.h),
   [i40e](@ref rte_pmd_i40e.h),
   [iavf](@ref rte_pmd_iavf.h),
@@ -177,7 +176,6 @@ The public API headers are grouped by topics:
     [frag](@ref rte_port_frag.h),
     [reass](@ref rte_port_ras.h),
     [sched](@ref rte_port_sched.h),
-    [kni](@ref rte_port_kni.h),
     [src/sink](@ref rte_port_source_sink.h)
   * [table](@ref rte_table.h):
     [lpm IPv4](@ref rte_table_lpm.h),
diff --git a/doc/api/doxy-api.conf.in b/doc/api/doxy-api.conf.in
index 9a9c52e5569c..31885039c768 100644
--- a/doc/api/doxy-api.conf.in
+++ b/doc/api/doxy-api.conf.in
@@ -48,7 +48,6 @@ INPUT                   = @TOPDIR@/doc/api/doxy-api-index.md \
                           @TOPDIR@/lib/ip_frag \
                           @TOPDIR@/lib/ipsec \
                           @TOPDIR@/lib/jobstats \
-                          @TOPDIR@/lib/kni \
                           @TOPDIR@/lib/kvargs \
                           @TOPDIR@/lib/latencystats \
                           @TOPDIR@/lib/lpm \
diff --git a/doc/guides/contributing/documentation.rst b/doc/guides/contributing/documentation.rst
index 7fcbb7fc43b2..38e184a130ee 100644
--- a/doc/guides/contributing/documentation.rst
+++ b/doc/guides/contributing/documentation.rst
@@ -94,8 +94,8 @@ added to by the developer.
 
 * **The Programmers Guide**
 
-  The Programmers Guide explains how the API components of DPDK such as the EAL, Memzone, Rings and the Hash Library work.
-  It also explains how some higher level functionality such as Packet Distributor, Packet Framework and KNI work.
+  The Programmers Guide explains how the API components of the DPDK such as the EAL, Memzone, Rings and the Hash Library work.
+  It also describes how some of the higher level functionality such as Packet Distributor and Packet Framework.
   It also shows the build system and explains how to add applications.
 
   The Programmers Guide should be expanded when new functionality is added to DPDK.
diff --git a/doc/guides/howto/flow_bifurcation.rst b/doc/guides/howto/flow_bifurcation.rst
index 838eb2a4cc89..554dd24c32c5 100644
--- a/doc/guides/howto/flow_bifurcation.rst
+++ b/doc/guides/howto/flow_bifurcation.rst
@@ -7,8 +7,7 @@ Flow Bifurcation How-to Guide
 Flow Bifurcation is a mechanism which uses hardware capable Ethernet devices
 to split traffic between Linux user space and kernel space. Since it is a
 hardware assisted feature this approach can provide line rate processing
-capability. Other than :ref:`KNI <kni>`, the software is just required to
-enable device configuration, there is no need to take care of the packet
+capability. There is no need to take care of the packet
 movement during the traffic split. This can yield better performance with
 less CPU overhead.
 
diff --git a/doc/guides/nics/index.rst b/doc/guides/nics/index.rst
index 31296822e5ec..7bfcac880f44 100644
--- a/doc/guides/nics/index.rst
+++ b/doc/guides/nics/index.rst
@@ -43,7 +43,6 @@ Network Interface Controller Drivers
     ionic
     ipn3ke
     ixgbe
-    kni
     mana
     memif
     mlx4
diff --git a/doc/guides/nics/kni.rst b/doc/guides/nics/kni.rst
deleted file mode 100644
index bd3033bb585c..000000000000
--- a/doc/guides/nics/kni.rst
+++ /dev/null
@@ -1,170 +0,0 @@
-..  SPDX-License-Identifier: BSD-3-Clause
-    Copyright(c) 2017 Intel Corporation.
-
-KNI Poll Mode Driver
-======================
-
-KNI PMD is wrapper to the :ref:`librte_kni <kni>` library.
-
-This PMD enables using KNI without having a KNI specific application,
-any forwarding application can use PMD interface for KNI.
-
-Sending packets to any DPDK controlled interface or sending to the
-Linux networking stack will be transparent to the DPDK application.
-
-To create a KNI device ``net_kni#`` device name should be used, and this
-will create ``kni#`` Linux virtual network interface.
-
-There is no physical device backend for the virtual KNI device.
-
-Packets sent to the KNI Linux interface will be received by the DPDK
-application, and DPDK application may forward packets to a physical NIC
-or to a virtual device (like another KNI interface or PCAP interface).
-
-To forward any traffic from physical NIC to the Linux networking stack,
-an application should control a physical port and create one virtual KNI port,
-and forward between two.
-
-Using this PMD requires KNI kernel module be inserted.
-
-
-Usage
------
-
-EAL ``--vdev`` argument can be used to create KNI device instance, like::
-
-        dpdk-testpmd --vdev=net_kni0 --vdev=net_kni1 -- -i
-
-Above command will create ``kni0`` and ``kni1`` Linux network interfaces,
-those interfaces can be controlled by standard Linux tools.
-
-When testpmd forwarding starts, any packets sent to ``kni0`` interface
-forwarded to the ``kni1`` interface and vice versa.
-
-There is no hard limit on number of interfaces that can be created.
-
-
-Default interface configuration
--------------------------------
-
-``librte_kni`` can create Linux network interfaces with different features,
-feature set controlled by a configuration struct, and KNI PMD uses a fixed
-configuration:
-
-    .. code-block:: console
-
-        Interface name: kni#
-        force bind kernel thread to a core : NO
-        mbuf size: (rte_pktmbuf_data_room_size(pktmbuf_pool) - RTE_PKTMBUF_HEADROOM)
-        mtu: (conf.mbuf_size - RTE_ETHER_HDR_LEN)
-
-KNI control path is not supported with the PMD, since there is no physical
-backend device by default.
-
-
-Runtime Configuration
----------------------
-
-``no_request_thread``, by default PMD creates a pthread for each KNI interface
-to handle Linux network interface control commands, like ``ifconfig kni0 up``
-
-With ``no_request_thread`` option, pthread is not created and control commands
-not handled by PMD.
-
-By default request thread is enabled. And this argument should not be used
-most of the time, unless this PMD used with customized DPDK application to handle
-requests itself.
-
-Argument usage::
-
-        dpdk-testpmd --vdev "net_kni0,no_request_thread=1" -- -i
-
-
-PMD log messages
-----------------
-
-If KNI kernel module (rte_kni.ko) not inserted, following error log printed::
-
-        "KNI: KNI subsystem has not been initialized. Invoke rte_kni_init() first"
-
-
-PMD testing
------------
-
-It is possible to test PMD quickly using KNI kernel module loopback feature:
-
-* Insert KNI kernel module with loopback support:
-
-    .. code-block:: console
-
-        insmod <build_dir>/kernel/linux/kni/rte_kni.ko lo_mode=lo_mode_fifo_skb
-
-* Start testpmd with no physical device but two KNI virtual devices:
-
-    .. code-block:: console
-
-        ./dpdk-testpmd --vdev net_kni0 --vdev net_kni1 -- -i
-
-    .. code-block:: console
-
-        ...
-        Configuring Port 0 (socket 0)
-        KNI: pci: 00:00:00       c580:b8
-        Port 0: 1A:4A:5B:7C:A2:8C
-        Configuring Port 1 (socket 0)
-        KNI: pci: 00:00:00       600:b9
-        Port 1: AE:95:21:07:93:DD
-        Checking link statuses...
-        Port 0 Link Up - speed 10000 Mbps - full-duplex
-        Port 1 Link Up - speed 10000 Mbps - full-duplex
-        Done
-        testpmd>
-
-* Observe Linux interfaces
-
-    .. code-block:: console
-
-        $ ifconfig kni0 && ifconfig kni1
-        kni0: flags=4098<BROADCAST,MULTICAST>  mtu 1500
-                ether ae:8e:79:8e:9b:c8  txqueuelen 1000  (Ethernet)
-                RX packets 0  bytes 0 (0.0 B)
-                RX errors 0  dropped 0  overruns 0  frame 0
-                TX packets 0  bytes 0 (0.0 B)
-                TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
-
-        kni1: flags=4098<BROADCAST,MULTICAST>  mtu 1500
-                ether 9e:76:43:53:3e:9b  txqueuelen 1000  (Ethernet)
-                RX packets 0  bytes 0 (0.0 B)
-                RX errors 0  dropped 0  overruns 0  frame 0
-                TX packets 0  bytes 0 (0.0 B)
-                TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
-
-
-* Start forwarding with tx_first:
-
-    .. code-block:: console
-
-        testpmd> start tx_first
-
-* Quit and check forwarding stats:
-
-    .. code-block:: console
-
-        testpmd> quit
-        Telling cores to stop...
-        Waiting for lcores to finish...
-
-        ---------------------- Forward statistics for port 0  ----------------------
-        RX-packets: 35637905       RX-dropped: 0             RX-total: 35637905
-        TX-packets: 35637947       TX-dropped: 0             TX-total: 35637947
-        ----------------------------------------------------------------------------
-
-        ---------------------- Forward statistics for port 1  ----------------------
-        RX-packets: 35637915       RX-dropped: 0             RX-total: 35637915
-        TX-packets: 35637937       TX-dropped: 0             TX-total: 35637937
-        ----------------------------------------------------------------------------
-
-        +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
-        RX-packets: 71275820       RX-dropped: 0             RX-total: 71275820
-        TX-packets: 71275884       TX-dropped: 0             TX-total: 71275884
-        ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
diff --git a/doc/guides/nics/virtio.rst b/doc/guides/nics/virtio.rst
index f5e54a5e9cfd..ba6247170dbb 100644
--- a/doc/guides/nics/virtio.rst
+++ b/doc/guides/nics/virtio.rst
@@ -10,15 +10,12 @@ we provide a virtio Poll Mode Driver (PMD) as a software solution, comparing to
 for fast guest VM to guest VM communication and guest VM to host communication.
 
 Vhost is a kernel acceleration module for virtio qemu backend.
-The DPDK extends kni to support vhost raw socket interface,
-which enables vhost to directly read/ write packets from/to a physical port.
-With this enhancement, virtio could achieve quite promising performance.
 
 For basic qemu-KVM installation and other Intel EM poll mode driver in guest VM,
 please refer to Chapter "Driver for VM Emulated Devices".
 
 In this chapter, we will demonstrate usage of virtio PMD with two backends,
-standard qemu vhost back end and vhost kni back end.
+standard qemu vhost back end.
 
 Virtio Implementation in DPDK
 -----------------------------
@@ -89,93 +86,6 @@ The following prerequisites apply:
 *   When using legacy interface, ``SYS_RAWIO`` capability is required
     for ``iopl()`` call to enable access to PCI I/O ports.
 
-Virtio with kni vhost Back End
-------------------------------
-
-This section demonstrates kni vhost back end example setup for Phy-VM Communication.
-
-.. _figure_host_vm_comms:
-
-.. figure:: img/host_vm_comms.*
-
-   Host2VM Communication Example Using kni vhost Back End
-
-
-Host2VM communication example
-
-#.  Load the kni kernel module:
-
-    .. code-block:: console
-
-        insmod rte_kni.ko
-
-    Other basic DPDK preparations like hugepage enabling,
-    UIO port binding are not listed here.
-    Please refer to the *DPDK Getting Started Guide* for detailed instructions.
-
-#.  Launch the kni user application:
-
-    .. code-block:: console
-
-        <build_dir>/examples/dpdk-kni -l 0-3 -n 4 -- -p 0x1 -P --config="(0,1,3)"
-
-    This command generates one network device vEth0 for physical port.
-    If specify more physical ports, the generated network device will be vEth1, vEth2, and so on.
-
-    For each physical port, kni creates two user threads.
-    One thread loops to fetch packets from the physical NIC port into the kni receive queue.
-    The other user thread loops to send packets in the kni transmit queue.
-
-    For each physical port, kni also creates a kernel thread that retrieves packets from the kni receive queue,
-    place them onto kni's raw socket's queue and wake up the vhost kernel thread to exchange packets with the virtio virt queue.
-
-    For more details about kni, please refer to :ref:`kni`.
-
-#.  Enable the kni raw socket functionality for the specified physical NIC port,
-    get the generated file descriptor and set it in the qemu command line parameter.
-    Always remember to set ioeventfd_on and vhost_on.
-
-    Example:
-
-    .. code-block:: console
-
-        echo 1 > /sys/class/net/vEth0/sock_en
-        fd=`cat /sys/class/net/vEth0/sock_fd`
-        exec qemu-system-x86_64 -enable-kvm -cpu host \
-        -m 2048 -smp 4 -name dpdk-test1-vm1 \
-        -drive file=/data/DPDKVMS/dpdk-vm.img \
-        -netdev tap, fd=$fd,id=mynet_kni, script=no,vhost=on \
-        -device virtio-net-pci,netdev=mynet_kni,bus=pci.0,addr=0x3,ioeventfd=on \
-        -vnc:1 -daemonize
-
-    In the above example, virtio port 0 in the guest VM will be associated with vEth0, which in turns corresponds to a physical port,
-    which means received packets come from vEth0, and transmitted packets is sent to vEth0.
-
-#.  In the guest, bind the virtio device to the uio_pci_generic kernel module and start the forwarding application.
-    When the virtio port in guest bursts Rx, it is getting packets from the
-    raw socket's receive queue.
-    When the virtio port bursts Tx, it is sending packet to the tx_q.
-
-    .. code-block:: console
-
-        modprobe uio
-        dpdk-hugepages.py --setup 1G
-        modprobe uio_pci_generic
-        ./usertools/dpdk-devbind.py -b uio_pci_generic 00:03.0
-
-    We use testpmd as the forwarding application in this example.
-
-    .. figure:: img/console.*
-
-       Running testpmd
-
-#.  Use IXIA packet generator to inject a packet stream into the KNI physical port.
-
-    The packet reception and transmission flow path is:
-
-    IXIA packet generator->82599 PF->KNI Rx queue->KNI raw socket queue->Guest
-    VM virtio port 0 Rx burst->Guest VM virtio port 0 Tx burst-> KNI Tx queue
-    ->82599 PF-> IXIA packet generator
 
 Virtio with qemu virtio Back End
 --------------------------------
diff --git a/doc/guides/prog_guide/env_abstraction_layer.rst b/doc/guides/prog_guide/env_abstraction_layer.rst
index 93c8a031be56..5d382fdd9032 100644
--- a/doc/guides/prog_guide/env_abstraction_layer.rst
+++ b/doc/guides/prog_guide/env_abstraction_layer.rst
@@ -610,8 +610,6 @@ devices would fail anyway.
     ``RTE_PCI_DRV_NEED_IOVA_AS_VA`` flag is used to dictate that this PCI
     driver can only work in RTE_IOVA_VA mode.
 
-    When the KNI kernel module is detected, RTE_IOVA_PA mode is preferred as a
-    performance penalty is expected in RTE_IOVA_VA mode.
 
 IOVA Mode Configuration
 ~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/doc/guides/prog_guide/glossary.rst b/doc/guides/prog_guide/glossary.rst
index fb0910ba5b3f..8d6349701e43 100644
--- a/doc/guides/prog_guide/glossary.rst
+++ b/doc/guides/prog_guide/glossary.rst
@@ -103,9 +103,6 @@ lcore
    A logical execution unit of the processor, sometimes called a *hardware
    thread*.
 
-KNI
-   Kernel Network Interface
-
 L1
    Layer 1
 
diff --git a/doc/guides/prog_guide/index.rst b/doc/guides/prog_guide/index.rst
index c04847bfa148..2c47d9d010f4 100644
--- a/doc/guides/prog_guide/index.rst
+++ b/doc/guides/prog_guide/index.rst
@@ -53,7 +53,6 @@ Programmer's Guide
     pcapng_lib
     pdump_lib
     multi_proc_support
-    kernel_nic_interface
     thread_safety_dpdk_functions
     eventdev
     event_ethernet_rx_adapter
diff --git a/doc/guides/prog_guide/kernel_nic_interface.rst b/doc/guides/prog_guide/kernel_nic_interface.rst
deleted file mode 100644
index 392e5df75fcf..000000000000
--- a/doc/guides/prog_guide/kernel_nic_interface.rst
+++ /dev/null
@@ -1,423 +0,0 @@
-..  SPDX-License-Identifier: BSD-3-Clause
-    Copyright(c) 2010-2015 Intel Corporation.
-
-.. _kni:
-
-Kernel NIC Interface
-====================
-
-.. note::
-
-   KNI is deprecated and will be removed in future.
-   See :doc:`../rel_notes/deprecation`.
-
-   :ref:`virtio_user_as_exception_path` alternative is the preferred way
-   for interfacing with the Linux network stack
-   as it is an in-kernel solution and has similar performance expectations.
-
-.. note::
-
-   KNI is disabled by default in the DPDK build.
-   To re-enable the library, remove 'kni' from the "disable_libs" meson option when configuring a build.
-
-The DPDK Kernel NIC Interface (KNI) allows userspace applications access to the Linux* control plane.
-
-KNI provides an interface with the kernel network stack
-and allows management of DPDK ports using standard Linux net tools
-such as ``ethtool``, ``iproute2`` and ``tcpdump``.
-
-The main use case of KNI is to get/receive exception packets from/to Linux network stack
-while main datapath IO is done bypassing the networking stack.
-
-There are other alternatives to KNI, all are available in the upstream Linux:
-
-#. :ref:`virtio_user_as_exception_path`
-
-#. :doc:`../nics/tap` as wrapper to `Linux tun/tap
-   <https://www.kernel.org/doc/Documentation/networking/tuntap.txt>`_
-
-The benefits of using the KNI against alternatives are:
-
-*   Faster than existing Linux TUN/TAP interfaces
-    (by eliminating system calls and copy_to_user()/copy_from_user() operations.
-
-The disadvantages of the KNI are:
-
-* It is out-of-tree Linux kernel module
-  which makes updating and distributing the driver more difficult.
-  Most users end up building the KNI driver from source
-  which requires the packages and tools to build kernel modules.
-
-* As it shares memory between userspace and kernelspace,
-  and kernel part directly uses input provided by userspace, it is not safe.
-  This makes hard to upstream the module.
-
-* Requires dedicated kernel cores.
-
-* Only a subset of net devices control commands are supported by KNI.
-
-The components of an application using the DPDK Kernel NIC Interface are shown in :numref:`figure_kernel_nic_intf`.
-
-.. _figure_kernel_nic_intf:
-
-.. figure:: img/kernel_nic_intf.*
-
-   Components of a DPDK KNI Application
-
-
-The DPDK KNI Kernel Module
---------------------------
-
-The KNI kernel loadable module ``rte_kni`` provides the kernel interface
-for DPDK applications.
-
-When the ``rte_kni`` module is loaded, it will create a device ``/dev/kni``
-that is used by the DPDK KNI API functions to control and communicate with
-the kernel module.
-
-The ``rte_kni`` kernel module contains several optional parameters which
-can be specified when the module is loaded to control its behavior:
-
-.. code-block:: console
-
-    # modinfo rte_kni.ko
-    <snip>
-    parm:           lo_mode: KNI loopback mode (default=lo_mode_none):
-                    lo_mode_none        Kernel loopback disabled
-                    lo_mode_fifo        Enable kernel loopback with fifo
-                    lo_mode_fifo_skb    Enable kernel loopback with fifo and skb buffer
-                     (charp)
-    parm:           kthread_mode: Kernel thread mode (default=single):
-                    single    Single kernel thread mode enabled.
-                    multiple  Multiple kernel thread mode enabled.
-                     (charp)
-    parm:           carrier: Default carrier state for KNI interface (default=off):
-                    off   Interfaces will be created with carrier state set to off.
-                    on    Interfaces will be created with carrier state set to on.
-                     (charp)
-    parm:           enable_bifurcated: Enable request processing support for
-                    bifurcated drivers, which means releasing rtnl_lock before calling
-                    userspace callback and supporting async requests (default=off):
-                    on    Enable request processing support for bifurcated drivers.
-                     (charp)
-    parm:           min_scheduling_interval: KNI thread min scheduling interval (default=100 microseconds)
-                     (long)
-    parm:           max_scheduling_interval: KNI thread max scheduling interval (default=200 microseconds)
-                     (long)
-
-
-Loading the ``rte_kni`` kernel module without any optional parameters is
-the typical way a DPDK application gets packets into and out of the kernel
-network stack.  Without any parameters, only one kernel thread is created
-for all KNI devices for packet receiving in kernel side, loopback mode is
-disabled, and the default carrier state of KNI interfaces is set to *off*.
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko
-
-.. _kni_loopback_mode:
-
-Loopback Mode
-~~~~~~~~~~~~~
-
-For testing, the ``rte_kni`` kernel module can be loaded in loopback mode
-by specifying the ``lo_mode`` parameter:
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko lo_mode=lo_mode_fifo
-
-The ``lo_mode_fifo`` loopback option will loop back ring enqueue/dequeue
-operations in kernel space.
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko lo_mode=lo_mode_fifo_skb
-
-The ``lo_mode_fifo_skb`` loopback option will loop back ring enqueue/dequeue
-operations and sk buffer copies in kernel space.
-
-If the ``lo_mode`` parameter is not specified, loopback mode is disabled.
-
-.. _kni_kernel_thread_mode:
-
-Kernel Thread Mode
-~~~~~~~~~~~~~~~~~~
-
-To provide flexibility of performance, the ``rte_kni`` KNI kernel module
-can be loaded with the ``kthread_mode`` parameter.  The ``rte_kni`` kernel
-module supports two options: "single kernel thread" mode and "multiple
-kernel thread" mode.
-
-Single kernel thread mode is enabled as follows:
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko kthread_mode=single
-
-This mode will create only one kernel thread for all KNI interfaces to
-receive data on the kernel side.  By default, this kernel thread is not
-bound to any particular core, but the user can set the core affinity for
-this kernel thread by setting the ``core_id`` and ``force_bind`` parameters
-in ``struct rte_kni_conf`` when the first KNI interface is created:
-
-For optimum performance, the kernel thread should be bound to a core in
-on the same socket as the DPDK lcores used in the application.
-
-The KNI kernel module can also be configured to start a separate kernel
-thread for each KNI interface created by the DPDK application.  Multiple
-kernel thread mode is enabled as follows:
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko kthread_mode=multiple
-
-This mode will create a separate kernel thread for each KNI interface to
-receive data on the kernel side.  The core affinity of each ``kni_thread``
-kernel thread can be specified by setting the ``core_id`` and ``force_bind``
-parameters in ``struct rte_kni_conf`` when each KNI interface is created.
-
-Multiple kernel thread mode can provide scalable higher performance if
-sufficient unused cores are available on the host system.
-
-If the ``kthread_mode`` parameter is not specified, the "single kernel
-thread" mode is used.
-
-.. _kni_default_carrier_state:
-
-Default Carrier State
-~~~~~~~~~~~~~~~~~~~~~
-
-The default carrier state of KNI interfaces created by the ``rte_kni``
-kernel module is controlled via the ``carrier`` option when the module
-is loaded.
-
-If ``carrier=off`` is specified, the kernel module will leave the carrier
-state of the interface *down* when the interface is management enabled.
-The DPDK application can set the carrier state of the KNI interface using the
-``rte_kni_update_link()`` function.  This is useful for DPDK applications
-which require that the carrier state of the KNI interface reflect the
-actual link state of the corresponding physical NIC port.
-
-If ``carrier=on`` is specified, the kernel module will automatically set
-the carrier state of the interface to *up* when the interface is management
-enabled.  This is useful for DPDK applications which use the KNI interface as
-a purely virtual interface that does not correspond to any physical hardware
-and do not wish to explicitly set the carrier state of the interface with
-``rte_kni_update_link()``.  It is also useful for testing in loopback mode
-where the NIC port may not be physically connected to anything.
-
-To set the default carrier state to *on*:
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko carrier=on
-
-To set the default carrier state to *off*:
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko carrier=off
-
-If the ``carrier`` parameter is not specified, the default carrier state
-of KNI interfaces will be set to *off*.
-
-.. _kni_bifurcated_device_support:
-
-Bifurcated Device Support
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-User callbacks are executed while kernel module holds the ``rtnl`` lock, this
-causes a deadlock when callbacks run control commands on another Linux kernel
-network interface.
-
-Bifurcated devices has kernel network driver part and to prevent deadlock for
-them ``enable_bifurcated`` is used.
-
-To enable bifurcated device support:
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko enable_bifurcated=on
-
-Enabling bifurcated device support releases ``rtnl`` lock before calling
-callback and locks it back after callback. Also enables asynchronous request to
-support callbacks that requires rtnl lock to work (interface down).
-
-KNI Kthread Scheduling
-~~~~~~~~~~~~~~~~~~~~~~
-
-The ``min_scheduling_interval`` and ``max_scheduling_interval`` parameters
-control the rescheduling interval of the KNI kthreads.
-
-This might be useful if we have use cases in which we require improved
-latency or performance for control plane traffic.
-
-The implementation is backed by Linux High Precision Timers, and uses ``usleep_range``.
-Hence, it will have the same granularity constraints as this Linux subsystem.
-
-For Linux High Precision Timers, you can check the following resource: `Kernel Timers <http://www.kernel.org/doc/Documentation/timers/timers-howto.txt>`_
-
-To set the ``min_scheduling_interval`` to a value of 100 microseconds:
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko min_scheduling_interval=100
-
-To set the ``max_scheduling_interval`` to a value of 200 microseconds:
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko max_scheduling_interval=200
-
-If the ``min_scheduling_interval`` and ``max_scheduling_interval`` parameters are
-not specified, the default interval limits will be set to *100* and *200* respectively.
-
-KNI Creation and Deletion
--------------------------
-
-Before any KNI interfaces can be created, the ``rte_kni`` kernel module must
-be loaded into the kernel and configured with the ``rte_kni_init()`` function.
-
-The KNI interfaces are created by a DPDK application dynamically via the
-``rte_kni_alloc()`` function.
-
-The ``struct rte_kni_conf`` structure contains fields which allow the
-user to specify the interface name, set the MTU size, set an explicit or
-random MAC address and control the affinity of the kernel Rx thread(s)
-(both single and multi-threaded modes).
-By default the KNI sample example gets the MTU from the matching device,
-and in case of KNI PMD it is derived from mbuf buffer length.
-
-The ``struct rte_kni_ops`` structure contains pointers to functions to
-handle requests from the ``rte_kni`` kernel module.  These functions
-allow DPDK applications to perform actions when the KNI interfaces are
-manipulated by control commands or functions external to the application.
-
-For example, the DPDK application may wish to enabled/disable a physical
-NIC port when a user enabled/disables a KNI interface with ``ip link set
-[up|down] dev <ifaceX>``.  The DPDK application can register a callback for
-``config_network_if`` which will be called when the interface management
-state changes.
-
-There are currently four callbacks for which the user can register
-application functions:
-
-``config_network_if``:
-
-    Called when the management state of the KNI interface changes.
-    For example, when the user runs ``ip link set [up|down] dev <ifaceX>``.
-
-``change_mtu``:
-
-    Called when the user changes the MTU size of the KNI
-    interface.  For example, when the user runs ``ip link set mtu <size>
-    dev <ifaceX>``.
-
-``config_mac_address``:
-
-    Called when the user changes the MAC address of the KNI interface.
-    For example, when the user runs ``ip link set address <MAC>
-    dev <ifaceX>``.  If the user sets this callback function to NULL,
-    but sets the ``port_id`` field to a value other than -1, a default
-    callback handler in the rte_kni library ``kni_config_mac_address()``
-    will be called which calls ``rte_eth_dev_default_mac_addr_set()``
-    on the specified ``port_id``.
-
-``config_promiscusity``:
-
-    Called when the user changes the promiscuity state of the KNI
-    interface.  For example, when the user runs ``ip link set promisc
-    [on|off] dev <ifaceX>``. If the user sets this callback function to
-    NULL, but sets the ``port_id`` field to a value other than -1, a default
-    callback handler in the rte_kni library ``kni_config_promiscusity()``
-    will be called which calls ``rte_eth_promiscuous_<enable|disable>()``
-    on the specified ``port_id``.
-
-``config_allmulticast``:
-
-    Called when the user changes the allmulticast state of the KNI interface.
-    For example, when the user runs ``ifconfig <ifaceX> [-]allmulti``. If the
-    user sets this callback function to NULL, but sets the ``port_id`` field to
-    a value other than -1, a default callback handler in the rte_kni library
-    ``kni_config_allmulticast()`` will be called which calls
-    ``rte_eth_allmulticast_<enable|disable>()`` on the specified ``port_id``.
-
-In order to run these callbacks, the application must periodically call
-the ``rte_kni_handle_request()`` function.  Any user callback function
-registered will be called directly from ``rte_kni_handle_request()`` so
-care must be taken to prevent deadlock and to not block any DPDK fastpath
-tasks.  Typically DPDK applications which use these callbacks will need
-to create a separate thread or secondary process to periodically call
-``rte_kni_handle_request()``.
-
-The KNI interfaces can be deleted by a DPDK application with
-``rte_kni_release()``.  All KNI interfaces not explicitly deleted will be
-deleted when the ``/dev/kni`` device is closed, either explicitly with
-``rte_kni_close()`` or when the DPDK application is closed.
-
-DPDK mbuf Flow
---------------
-
-To minimize the amount of DPDK code running in kernel space, the mbuf mempool is managed in userspace only.
-The kernel module will be aware of mbufs,
-but all mbuf allocation and free operations will be handled by the DPDK application only.
-
-:numref:`figure_pkt_flow_kni` shows a typical scenario with packets sent in both directions.
-
-.. _figure_pkt_flow_kni:
-
-.. figure:: img/pkt_flow_kni.*
-
-   Packet Flow via mbufs in the DPDK KNI
-
-
-Use Case: Ingress
------------------
-
-On the DPDK RX side, the mbuf is allocated by the PMD in the RX thread context.
-This thread will enqueue the mbuf in the rx_q FIFO,
-and the next pointers in mbuf-chain will convert to physical address.
-The KNI thread will poll all KNI active devices for the rx_q.
-If an mbuf is dequeued, it will be converted to a sk_buff and sent to the net stack via netif_rx().
-The dequeued mbuf must be freed, so the same pointer is sent back in the free_q FIFO,
-and next pointers must convert back to virtual address if exists before put in the free_q FIFO.
-
-The RX thread, in the same main loop, polls this FIFO and frees the mbuf after dequeuing it.
-The address conversion of the next pointer is to prevent the chained mbuf
-in different hugepage segments from causing kernel crash.
-
-Use Case: Egress
-----------------
-
-For packet egress the DPDK application must first enqueue several mbufs to create an mbuf cache on the kernel side.
-
-The packet is received from the Linux net stack, by calling the kni_net_tx() callback.
-The mbuf is dequeued (without waiting due the cache) and filled with data from sk_buff.
-The sk_buff is then freed and the mbuf sent in the tx_q FIFO.
-
-The DPDK TX thread dequeues the mbuf and sends it to the PMD via ``rte_eth_tx_burst()``.
-It then puts the mbuf back in the cache.
-
-IOVA = VA: Support
-------------------
-
-KNI operates in IOVA_VA scheme when
-
-- LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0) and
-- EAL option `iova-mode=va` is passed or bus IOVA scheme in the DPDK is selected
-  as RTE_IOVA_VA.
-
-Due to IOVA to KVA address translations, based on the KNI use case there
-can be a performance impact. For mitigation, forcing IOVA to PA via EAL
-"--iova-mode=pa" option can be used, IOVA_DC bus iommu scheme can also
-result in IOVA as PA.
-
-Ethtool
--------
-
-Ethtool is a Linux-specific tool with corresponding support in the kernel.
-The current version of kni provides minimal ethtool functionality
-including querying version and link state. It does not support link
-control, statistics, or dumping device registers.
diff --git a/doc/guides/prog_guide/packet_framework.rst b/doc/guides/prog_guide/packet_framework.rst
index 3d4e3b66cc5c..ebc69d8c3e75 100644
--- a/doc/guides/prog_guide/packet_framework.rst
+++ b/doc/guides/prog_guide/packet_framework.rst
@@ -87,18 +87,15 @@ Port Types
    |   |                  | management and hierarchical scheduling according to pre-defined SLAs.                 |
    |   |                  |                                                                                       |
    +---+------------------+---------------------------------------------------------------------------------------+
-   | 6 | KNI              | Send/receive packets to/from Linux kernel space.                                      |
-   |   |                  |                                                                                       |
-   +---+------------------+---------------------------------------------------------------------------------------+
-   | 7 | Source           | Input port used as packet generator. Similar to Linux kernel /dev/zero character      |
+   | 6 | Source           | Input port used as packet generator. Similar to Linux kernel /dev/zero character      |
    |   |                  | device.                                                                               |
    |   |                  |                                                                                       |
    +---+------------------+---------------------------------------------------------------------------------------+
-   | 8 | Sink             | Output port used to drop all input packets. Similar to Linux kernel /dev/null         |
+   | 7 | Sink             | Output port used to drop all input packets. Similar to Linux kernel /dev/null         |
    |   |                  | character device.                                                                     |
    |   |                  |                                                                                       |
    +---+------------------+---------------------------------------------------------------------------------------+
-   | 9 | Sym_crypto       | Output port used to extract DPDK Cryptodev operations from a fixed offset of the      |
+   | 8 | Sym_crypto       | Output port used to extract DPDK Cryptodev operations from a fixed offset of the      |
    |   |                  | packet and then enqueue to the Cryptodev PMD. Input port used to dequeue the          |
    |   |                  | Cryptodev operations from the Cryptodev PMD and then retrieve the packets from them.  |
    +---+------------------+---------------------------------------------------------------------------------------+
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index ce5a8f0361cb..bb5d23c87669 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -35,7 +35,7 @@ Deprecation Notices
     which also added support for standard atomics
     (Ref: https://releases.llvm.org/3.6.0/tools/clang/docs/ReleaseNotes.html)
 
-* build: Enabling deprecated libraries (``kni``)
+* build: Enabling deprecated libraries
   won't be possible anymore through the use of the ``disable_libs`` build option.
   A new build option for deprecated libraries will be introduced instead.
 
@@ -78,13 +78,6 @@ Deprecation Notices
   ``__atomic_thread_fence`` must be used for patches that need to be merged in
   20.08 onwards. This change will not introduce any performance degradation.
 
-* kni: The KNI kernel module and library are not recommended for use by new
-  applications - other technologies such as virtio-user are recommended instead.
-  Following the DPDK technical board
-  `decision <https://mails.dpdk.org/archives/dev/2021-January/197077.html>`_
-  and `refinement <https://mails.dpdk.org/archives/dev/2022-June/243596.html>`_,
-  the KNI kernel module, library and PMD will be removed from the DPDK 23.11 release.
-
 * lib: will fix extending some enum/define breaking the ABI. There are multiple
   samples in DPDK that enum/define terminated with a ``.*MAX.*`` value which is
   used by iterators, and arrays holding these values are sized with this
diff --git a/doc/guides/rel_notes/release_23_11.rst b/doc/guides/rel_notes/release_23_11.rst
index 9d96dbdcd302..0d5c4a60d020 100644
--- a/doc/guides/rel_notes/release_23_11.rst
+++ b/doc/guides/rel_notes/release_23_11.rst
@@ -70,6 +70,8 @@ Removed Items
 
 * flow_classify: Removed flow classification library and examples.
 
+* kni: Removed the Kernel Network Interface (KNI) library and driver.
+
 
 API Changes
 -----------
diff --git a/doc/guides/sample_app_ug/ip_pipeline.rst b/doc/guides/sample_app_ug/ip_pipeline.rst
index b521d3b8be20..f30ac5e19db7 100644
--- a/doc/guides/sample_app_ug/ip_pipeline.rst
+++ b/doc/guides/sample_app_ug/ip_pipeline.rst
@@ -164,15 +164,6 @@ Examples
    |                       |                      |                | 8. Pipeline table rule add default |
    |                       |                      |                | 9. Pipeline table rule add         |
    +-----------------------+----------------------+----------------+------------------------------------+
-   | KNI                   | Stub                 | Forward        | 1. Mempool create                  |
-   |                       |                      |                | 2. Link create                     |
-   |                       |                      |                | 3. Pipeline create                 |
-   |                       |                      |                | 4. Pipeline port in/out            |
-   |                       |                      |                | 5. Pipeline table                  |
-   |                       |                      |                | 6. Pipeline port in table          |
-   |                       |                      |                | 7. Pipeline enable                 |
-   |                       |                      |                | 8. Pipeline table rule add         |
-   +-----------------------+----------------------+----------------+------------------------------------+
    | Firewall              | ACL                  | Allow/Drop     | 1. Mempool create                  |
    |                       |                      |                | 2. Link create                     |
    |                       | * Key = n-tuple      |                | 3. Pipeline create                 |
@@ -297,17 +288,6 @@ Tap
   tap <name>
 
 
-Kni
-~~~
-
-  Create kni port ::
-
-   kni <kni_name>
-    link <link_name>
-    mempool <mempool_name>
-    [thread <thread_id>]
-
-
 Cryptodev
 ~~~~~~~~~
 
@@ -366,7 +346,6 @@ Create pipeline input port ::
    | swq <swq_name>
    | tmgr <tmgr_name>
    | tap <tap_name> mempool <mempool_name> mtu <mtu>
-   | kni <kni_name>
    | source mempool <mempool_name> file <file_name> bpp <n_bytes_per_pkt>
    [action <port_in_action_profile_name>]
    [disabled]
@@ -379,7 +358,6 @@ Create pipeline output port ::
    | swq <swq_name>
    | tmgr <tmgr_name>
    | tap <tap_name>
-   | kni <kni_name>
    | sink [file <file_name> pkts <max_n_pkts>]
 
 Create pipeline table ::
diff --git a/drivers/net/cnxk/cnxk_ethdev.c b/drivers/net/cnxk/cnxk_ethdev.c
index 4b98faa72980..01b707b6c4ac 100644
--- a/drivers/net/cnxk/cnxk_ethdev.c
+++ b/drivers/net/cnxk/cnxk_ethdev.c
@@ -1130,7 +1130,7 @@ nix_set_nop_rxtx_function(struct rte_eth_dev *eth_dev)
 {
 	/* These dummy functions are required for supporting
 	 * some applications which reconfigure queues without
-	 * stopping tx burst and rx burst threads(eg kni app)
+	 * stopping tx burst and rx burst threads.
 	 * When the queues context is saved, txq/rxqs are released
 	 * which caused app crash since rx/tx burst is still
 	 * on different lcores
diff --git a/drivers/net/kni/meson.build b/drivers/net/kni/meson.build
deleted file mode 100644
index 2acc98969426..000000000000
--- a/drivers/net/kni/meson.build
+++ /dev/null
@@ -1,11 +0,0 @@
-# SPDX-License-Identifier: BSD-3-Clause
-# Copyright(c) 2018 Intel Corporation
-
-if is_windows
-    build = false
-    reason = 'not supported on Windows'
-    subdir_done()
-endif
-
-deps += 'kni'
-sources = files('rte_eth_kni.c')
diff --git a/drivers/net/kni/rte_eth_kni.c b/drivers/net/kni/rte_eth_kni.c
deleted file mode 100644
index c0e1f8db409e..000000000000
--- a/drivers/net/kni/rte_eth_kni.c
+++ /dev/null
@@ -1,524 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2017 Intel Corporation
- */
-
-#include <fcntl.h>
-#include <pthread.h>
-#include <unistd.h>
-
-#include <rte_string_fns.h>
-#include <ethdev_driver.h>
-#include <ethdev_vdev.h>
-#include <rte_kni.h>
-#include <rte_kvargs.h>
-#include <rte_malloc.h>
-#include <bus_vdev_driver.h>
-
-/* Only single queue supported */
-#define KNI_MAX_QUEUE_PER_PORT 1
-
-#define MAX_KNI_PORTS 8
-
-#define KNI_ETHER_MTU(mbuf_size)       \
-	((mbuf_size) - RTE_ETHER_HDR_LEN) /**< Ethernet MTU. */
-
-#define ETH_KNI_NO_REQUEST_THREAD_ARG	"no_request_thread"
-static const char * const valid_arguments[] = {
-	ETH_KNI_NO_REQUEST_THREAD_ARG,
-	NULL
-};
-
-struct eth_kni_args {
-	int no_request_thread;
-};
-
-struct pmd_queue_stats {
-	uint64_t pkts;
-	uint64_t bytes;
-};
-
-struct pmd_queue {
-	struct pmd_internals *internals;
-	struct rte_mempool *mb_pool;
-
-	struct pmd_queue_stats rx;
-	struct pmd_queue_stats tx;
-};
-
-struct pmd_internals {
-	struct rte_kni *kni;
-	uint16_t port_id;
-	int is_kni_started;
-
-	pthread_t thread;
-	int stop_thread;
-	int no_request_thread;
-
-	struct rte_ether_addr eth_addr;
-
-	struct pmd_queue rx_queues[KNI_MAX_QUEUE_PER_PORT];
-	struct pmd_queue tx_queues[KNI_MAX_QUEUE_PER_PORT];
-};
-
-static const struct rte_eth_link pmd_link = {
-		.link_speed = RTE_ETH_SPEED_NUM_10G,
-		.link_duplex = RTE_ETH_LINK_FULL_DUPLEX,
-		.link_status = RTE_ETH_LINK_DOWN,
-		.link_autoneg = RTE_ETH_LINK_FIXED,
-};
-static int is_kni_initialized;
-
-RTE_LOG_REGISTER_DEFAULT(eth_kni_logtype, NOTICE);
-
-#define PMD_LOG(level, fmt, args...) \
-	rte_log(RTE_LOG_ ## level, eth_kni_logtype, \
-		"%s(): " fmt "\n", __func__, ##args)
-static uint16_t
-eth_kni_rx(void *q, struct rte_mbuf **bufs, uint16_t nb_bufs)
-{
-	struct pmd_queue *kni_q = q;
-	struct rte_kni *kni = kni_q->internals->kni;
-	uint16_t nb_pkts;
-	int i;
-
-	nb_pkts = rte_kni_rx_burst(kni, bufs, nb_bufs);
-	for (i = 0; i < nb_pkts; i++)
-		bufs[i]->port = kni_q->internals->port_id;
-
-	kni_q->rx.pkts += nb_pkts;
-
-	return nb_pkts;
-}
-
-static uint16_t
-eth_kni_tx(void *q, struct rte_mbuf **bufs, uint16_t nb_bufs)
-{
-	struct pmd_queue *kni_q = q;
-	struct rte_kni *kni = kni_q->internals->kni;
-	uint16_t nb_pkts;
-
-	nb_pkts =  rte_kni_tx_burst(kni, bufs, nb_bufs);
-
-	kni_q->tx.pkts += nb_pkts;
-
-	return nb_pkts;
-}
-
-static void *
-kni_handle_request(void *param)
-{
-	struct pmd_internals *internals = param;
-#define MS 1000
-
-	while (!internals->stop_thread) {
-		rte_kni_handle_request(internals->kni);
-		usleep(500 * MS);
-	}
-
-	return param;
-}
-
-static int
-eth_kni_start(struct rte_eth_dev *dev)
-{
-	struct pmd_internals *internals = dev->data->dev_private;
-	uint16_t port_id = dev->data->port_id;
-	struct rte_mempool *mb_pool;
-	struct rte_kni_conf conf = {{0}};
-	const char *name = dev->device->name + 4; /* remove net_ */
-
-	mb_pool = internals->rx_queues[0].mb_pool;
-	strlcpy(conf.name, name, RTE_KNI_NAMESIZE);
-	conf.force_bind = 0;
-	conf.group_id = port_id;
-	conf.mbuf_size =
-		rte_pktmbuf_data_room_size(mb_pool) - RTE_PKTMBUF_HEADROOM;
-	conf.mtu = KNI_ETHER_MTU(conf.mbuf_size);
-
-	internals->kni = rte_kni_alloc(mb_pool, &conf, NULL);
-	if (internals->kni == NULL) {
-		PMD_LOG(ERR,
-			"Fail to create kni interface for port: %d",
-			port_id);
-		return -1;
-	}
-
-	return 0;
-}
-
-static int
-eth_kni_dev_start(struct rte_eth_dev *dev)
-{
-	struct pmd_internals *internals = dev->data->dev_private;
-	int ret;
-
-	if (internals->is_kni_started == 0) {
-		ret = eth_kni_start(dev);
-		if (ret)
-			return -1;
-		internals->is_kni_started = 1;
-	}
-
-	if (internals->no_request_thread == 0) {
-		internals->stop_thread = 0;
-
-		ret = rte_ctrl_thread_create(&internals->thread,
-			"kni_handle_req", NULL,
-			kni_handle_request, internals);
-		if (ret) {
-			PMD_LOG(ERR,
-				"Fail to create kni request thread");
-			return -1;
-		}
-	}
-
-	dev->data->dev_link.link_status = 1;
-
-	return 0;
-}
-
-static int
-eth_kni_dev_stop(struct rte_eth_dev *dev)
-{
-	struct pmd_internals *internals = dev->data->dev_private;
-	int ret;
-
-	if (internals->no_request_thread == 0 && internals->stop_thread == 0) {
-		internals->stop_thread = 1;
-
-		ret = pthread_cancel(internals->thread);
-		if (ret)
-			PMD_LOG(ERR, "Can't cancel the thread");
-
-		ret = pthread_join(internals->thread, NULL);
-		if (ret)
-			PMD_LOG(ERR, "Can't join the thread");
-	}
-
-	dev->data->dev_link.link_status = 0;
-	dev->data->dev_started = 0;
-
-	return 0;
-}
-
-static int
-eth_kni_close(struct rte_eth_dev *eth_dev)
-{
-	struct pmd_internals *internals;
-	int ret;
-
-	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
-		return 0;
-
-	ret = eth_kni_dev_stop(eth_dev);
-	if (ret)
-		PMD_LOG(WARNING, "Not able to stop kni for %s",
-			eth_dev->data->name);
-
-	/* mac_addrs must not be freed alone because part of dev_private */
-	eth_dev->data->mac_addrs = NULL;
-
-	internals = eth_dev->data->dev_private;
-	ret = rte_kni_release(internals->kni);
-	if (ret)
-		PMD_LOG(WARNING, "Not able to release kni for %s",
-			eth_dev->data->name);
-
-	return ret;
-}
-
-static int
-eth_kni_dev_configure(struct rte_eth_dev *dev __rte_unused)
-{
-	return 0;
-}
-
-static int
-eth_kni_dev_info(struct rte_eth_dev *dev __rte_unused,
-		struct rte_eth_dev_info *dev_info)
-{
-	dev_info->max_mac_addrs = 1;
-	dev_info->max_rx_pktlen = UINT32_MAX;
-	dev_info->max_rx_queues = KNI_MAX_QUEUE_PER_PORT;
-	dev_info->max_tx_queues = KNI_MAX_QUEUE_PER_PORT;
-	dev_info->min_rx_bufsize = 0;
-
-	return 0;
-}
-
-static int
-eth_kni_rx_queue_setup(struct rte_eth_dev *dev,
-		uint16_t rx_queue_id,
-		uint16_t nb_rx_desc __rte_unused,
-		unsigned int socket_id __rte_unused,
-		const struct rte_eth_rxconf *rx_conf __rte_unused,
-		struct rte_mempool *mb_pool)
-{
-	struct pmd_internals *internals = dev->data->dev_private;
-	struct pmd_queue *q;
-
-	q = &internals->rx_queues[rx_queue_id];
-	q->internals = internals;
-	q->mb_pool = mb_pool;
-
-	dev->data->rx_queues[rx_queue_id] = q;
-
-	return 0;
-}
-
-static int
-eth_kni_tx_queue_setup(struct rte_eth_dev *dev,
-		uint16_t tx_queue_id,
-		uint16_t nb_tx_desc __rte_unused,
-		unsigned int socket_id __rte_unused,
-		const struct rte_eth_txconf *tx_conf __rte_unused)
-{
-	struct pmd_internals *internals = dev->data->dev_private;
-	struct pmd_queue *q;
-
-	q = &internals->tx_queues[tx_queue_id];
-	q->internals = internals;
-
-	dev->data->tx_queues[tx_queue_id] = q;
-
-	return 0;
-}
-
-static int
-eth_kni_link_update(struct rte_eth_dev *dev __rte_unused,
-		int wait_to_complete __rte_unused)
-{
-	return 0;
-}
-
-static int
-eth_kni_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
-{
-	unsigned long rx_packets_total = 0, rx_bytes_total = 0;
-	unsigned long tx_packets_total = 0, tx_bytes_total = 0;
-	struct rte_eth_dev_data *data = dev->data;
-	unsigned int i, num_stats;
-	struct pmd_queue *q;
-
-	num_stats = RTE_MIN((unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS,
-			data->nb_rx_queues);
-	for (i = 0; i < num_stats; i++) {
-		q = data->rx_queues[i];
-		stats->q_ipackets[i] = q->rx.pkts;
-		stats->q_ibytes[i] = q->rx.bytes;
-		rx_packets_total += stats->q_ipackets[i];
-		rx_bytes_total += stats->q_ibytes[i];
-	}
-
-	num_stats = RTE_MIN((unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS,
-			data->nb_tx_queues);
-	for (i = 0; i < num_stats; i++) {
-		q = data->tx_queues[i];
-		stats->q_opackets[i] = q->tx.pkts;
-		stats->q_obytes[i] = q->tx.bytes;
-		tx_packets_total += stats->q_opackets[i];
-		tx_bytes_total += stats->q_obytes[i];
-	}
-
-	stats->ipackets = rx_packets_total;
-	stats->ibytes = rx_bytes_total;
-	stats->opackets = tx_packets_total;
-	stats->obytes = tx_bytes_total;
-
-	return 0;
-}
-
-static int
-eth_kni_stats_reset(struct rte_eth_dev *dev)
-{
-	struct rte_eth_dev_data *data = dev->data;
-	struct pmd_queue *q;
-	unsigned int i;
-
-	for (i = 0; i < data->nb_rx_queues; i++) {
-		q = data->rx_queues[i];
-		q->rx.pkts = 0;
-		q->rx.bytes = 0;
-	}
-	for (i = 0; i < data->nb_tx_queues; i++) {
-		q = data->tx_queues[i];
-		q->tx.pkts = 0;
-		q->tx.bytes = 0;
-	}
-
-	return 0;
-}
-
-static const struct eth_dev_ops eth_kni_ops = {
-	.dev_start = eth_kni_dev_start,
-	.dev_stop = eth_kni_dev_stop,
-	.dev_close = eth_kni_close,
-	.dev_configure = eth_kni_dev_configure,
-	.dev_infos_get = eth_kni_dev_info,
-	.rx_queue_setup = eth_kni_rx_queue_setup,
-	.tx_queue_setup = eth_kni_tx_queue_setup,
-	.link_update = eth_kni_link_update,
-	.stats_get = eth_kni_stats_get,
-	.stats_reset = eth_kni_stats_reset,
-};
-
-static struct rte_eth_dev *
-eth_kni_create(struct rte_vdev_device *vdev,
-		struct eth_kni_args *args,
-		unsigned int numa_node)
-{
-	struct pmd_internals *internals;
-	struct rte_eth_dev_data *data;
-	struct rte_eth_dev *eth_dev;
-
-	PMD_LOG(INFO, "Creating kni ethdev on numa socket %u",
-			numa_node);
-
-	/* reserve an ethdev entry */
-	eth_dev = rte_eth_vdev_allocate(vdev, sizeof(*internals));
-	if (!eth_dev)
-		return NULL;
-
-	internals = eth_dev->data->dev_private;
-	internals->port_id = eth_dev->data->port_id;
-	data = eth_dev->data;
-	data->nb_rx_queues = 1;
-	data->nb_tx_queues = 1;
-	data->dev_link = pmd_link;
-	data->mac_addrs = &internals->eth_addr;
-	data->promiscuous = 1;
-	data->all_multicast = 1;
-	data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
-
-	rte_eth_random_addr(internals->eth_addr.addr_bytes);
-
-	eth_dev->dev_ops = &eth_kni_ops;
-
-	internals->no_request_thread = args->no_request_thread;
-
-	return eth_dev;
-}
-
-static int
-kni_init(void)
-{
-	int ret;
-
-	if (is_kni_initialized == 0) {
-		ret = rte_kni_init(MAX_KNI_PORTS);
-		if (ret < 0)
-			return ret;
-	}
-
-	is_kni_initialized++;
-
-	return 0;
-}
-
-static int
-eth_kni_kvargs_process(struct eth_kni_args *args, const char *params)
-{
-	struct rte_kvargs *kvlist;
-
-	kvlist = rte_kvargs_parse(params, valid_arguments);
-	if (kvlist == NULL)
-		return -1;
-
-	memset(args, 0, sizeof(struct eth_kni_args));
-
-	if (rte_kvargs_count(kvlist, ETH_KNI_NO_REQUEST_THREAD_ARG) == 1)
-		args->no_request_thread = 1;
-
-	rte_kvargs_free(kvlist);
-
-	return 0;
-}
-
-static int
-eth_kni_probe(struct rte_vdev_device *vdev)
-{
-	struct rte_eth_dev *eth_dev;
-	struct eth_kni_args args;
-	const char *name;
-	const char *params;
-	int ret;
-
-	name = rte_vdev_device_name(vdev);
-	params = rte_vdev_device_args(vdev);
-	PMD_LOG(INFO, "Initializing eth_kni for %s", name);
-
-	if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
-		eth_dev = rte_eth_dev_attach_secondary(name);
-		if (!eth_dev) {
-			PMD_LOG(ERR, "Failed to probe %s", name);
-			return -1;
-		}
-		/* TODO: request info from primary to set up Rx and Tx */
-		eth_dev->dev_ops = &eth_kni_ops;
-		eth_dev->device = &vdev->device;
-		rte_eth_dev_probing_finish(eth_dev);
-		return 0;
-	}
-
-	ret = eth_kni_kvargs_process(&args, params);
-	if (ret < 0)
-		return ret;
-
-	ret = kni_init();
-	if (ret < 0)
-		return ret;
-
-	eth_dev = eth_kni_create(vdev, &args, rte_socket_id());
-	if (eth_dev == NULL)
-		goto kni_uninit;
-
-	eth_dev->rx_pkt_burst = eth_kni_rx;
-	eth_dev->tx_pkt_burst = eth_kni_tx;
-
-	rte_eth_dev_probing_finish(eth_dev);
-	return 0;
-
-kni_uninit:
-	is_kni_initialized--;
-	if (is_kni_initialized == 0)
-		rte_kni_close();
-	return -1;
-}
-
-static int
-eth_kni_remove(struct rte_vdev_device *vdev)
-{
-	struct rte_eth_dev *eth_dev;
-	const char *name;
-	int ret;
-
-	name = rte_vdev_device_name(vdev);
-	PMD_LOG(INFO, "Un-Initializing eth_kni for %s", name);
-
-	/* find the ethdev entry */
-	eth_dev = rte_eth_dev_allocated(name);
-	if (eth_dev != NULL) {
-		if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
-			ret = eth_kni_dev_stop(eth_dev);
-			if (ret != 0)
-				return ret;
-			return rte_eth_dev_release_port(eth_dev);
-		}
-		eth_kni_close(eth_dev);
-		rte_eth_dev_release_port(eth_dev);
-	}
-
-	is_kni_initialized--;
-	if (is_kni_initialized == 0)
-		rte_kni_close();
-
-	return 0;
-}
-
-static struct rte_vdev_driver eth_kni_drv = {
-	.probe = eth_kni_probe,
-	.remove = eth_kni_remove,
-};
-
-RTE_PMD_REGISTER_VDEV(net_kni, eth_kni_drv);
-RTE_PMD_REGISTER_PARAM_STRING(net_kni, ETH_KNI_NO_REQUEST_THREAD_ARG "=<int>");
diff --git a/drivers/net/meson.build b/drivers/net/meson.build
index f68bbc27a784..bd38b533c573 100644
--- a/drivers/net/meson.build
+++ b/drivers/net/meson.build
@@ -35,7 +35,6 @@ drivers = [
         'ionic',
         'ipn3ke',
         'ixgbe',
-        'kni',
         'mana',
         'memif',
         'mlx4',
diff --git a/examples/ip_pipeline/Makefile b/examples/ip_pipeline/Makefile
index 785c7ee38ce5..bc5e0a9f1800 100644
--- a/examples/ip_pipeline/Makefile
+++ b/examples/ip_pipeline/Makefile
@@ -8,7 +8,6 @@ APP = ip_pipeline
 SRCS-y := action.c
 SRCS-y += cli.c
 SRCS-y += conn.c
-SRCS-y += kni.c
 SRCS-y += link.c
 SRCS-y += main.c
 SRCS-y += mempool.c
diff --git a/examples/ip_pipeline/cli.c b/examples/ip_pipeline/cli.c
index c918f30e06f3..e8269ea90c11 100644
--- a/examples/ip_pipeline/cli.c
+++ b/examples/ip_pipeline/cli.c
@@ -14,7 +14,6 @@
 #include "cli.h"
 
 #include "cryptodev.h"
-#include "kni.h"
 #include "link.h"
 #include "mempool.h"
 #include "parser.h"
@@ -728,65 +727,6 @@ cmd_tap(char **tokens,
 	}
 }
 
-static const char cmd_kni_help[] =
-"kni <kni_name>\n"
-"   link <link_name>\n"
-"   mempool <mempool_name>\n"
-"   [thread <thread_id>]\n";
-
-static void
-cmd_kni(char **tokens,
-	uint32_t n_tokens,
-	char *out,
-	size_t out_size)
-{
-	struct kni_params p;
-	char *name;
-	struct kni *kni;
-
-	memset(&p, 0, sizeof(p));
-	if ((n_tokens != 6) && (n_tokens != 8)) {
-		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
-		return;
-	}
-
-	name = tokens[1];
-
-	if (strcmp(tokens[2], "link") != 0) {
-		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "link");
-		return;
-	}
-
-	p.link_name = tokens[3];
-
-	if (strcmp(tokens[4], "mempool") != 0) {
-		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "mempool");
-		return;
-	}
-
-	p.mempool_name = tokens[5];
-
-	if (n_tokens == 8) {
-		if (strcmp(tokens[6], "thread") != 0) {
-			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "thread");
-			return;
-		}
-
-		if (parser_read_uint32(&p.thread_id, tokens[7]) != 0) {
-			snprintf(out, out_size, MSG_ARG_INVALID, "thread_id");
-			return;
-		}
-
-		p.force_bind = 1;
-	} else
-		p.force_bind = 0;
-
-	kni = kni_create(name, &p);
-	if (kni == NULL) {
-		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
-		return;
-	}
-}
 
 static const char cmd_cryptodev_help[] =
 "cryptodev <cryptodev_name>\n"
@@ -1541,7 +1481,6 @@ static const char cmd_pipeline_port_in_help[] =
 "   | swq <swq_name>\n"
 "   | tmgr <tmgr_name>\n"
 "   | tap <tap_name> mempool <mempool_name> mtu <mtu>\n"
-"   | kni <kni_name>\n"
 "   | source mempool <mempool_name> file <file_name> bpp <n_bytes_per_pkt>\n"
 "   | cryptodev <cryptodev_name> rxq <queue_id>\n"
 "   [action <port_in_action_profile_name>]\n"
@@ -1664,18 +1603,6 @@ cmd_pipeline_port_in(char **tokens,
 		}
 
 		t0 += 6;
-	} else if (strcmp(tokens[t0], "kni") == 0) {
-		if (n_tokens < t0 + 2) {
-			snprintf(out, out_size, MSG_ARG_MISMATCH,
-				"pipeline port in kni");
-			return;
-		}
-
-		p.type = PORT_IN_KNI;
-
-		p.dev_name = tokens[t0 + 1];
-
-		t0 += 2;
 	} else if (strcmp(tokens[t0], "source") == 0) {
 		if (n_tokens < t0 + 6) {
 			snprintf(out, out_size, MSG_ARG_MISMATCH,
@@ -1781,7 +1708,6 @@ static const char cmd_pipeline_port_out_help[] =
 "   | swq <swq_name>\n"
 "   | tmgr <tmgr_name>\n"
 "   | tap <tap_name>\n"
-"   | kni <kni_name>\n"
 "   | sink [file <file_name> pkts <max_n_pkts>]\n"
 "   | cryptodev <cryptodev_name> txq <txq_id> offset <crypto_op_offset>\n";
 
@@ -1873,16 +1799,6 @@ cmd_pipeline_port_out(char **tokens,
 
 		p.type = PORT_OUT_TAP;
 
-		p.dev_name = tokens[7];
-	} else if (strcmp(tokens[6], "kni") == 0) {
-		if (n_tokens != 8) {
-			snprintf(out, out_size, MSG_ARG_MISMATCH,
-				"pipeline port out kni");
-			return;
-		}
-
-		p.type = PORT_OUT_KNI;
-
 		p.dev_name = tokens[7];
 	} else if (strcmp(tokens[6], "sink") == 0) {
 		if ((n_tokens != 7) && (n_tokens != 11)) {
@@ -6038,7 +5954,6 @@ cmd_help(char **tokens, uint32_t n_tokens, char *out, size_t out_size)
 			"\ttmgr subport\n"
 			"\ttmgr subport pipe\n"
 			"\ttap\n"
-			"\tkni\n"
 			"\tport in action profile\n"
 			"\ttable action profile\n"
 			"\tpipeline\n"
@@ -6124,11 +6039,6 @@ cmd_help(char **tokens, uint32_t n_tokens, char *out, size_t out_size)
 		return;
 	}
 
-	if (strcmp(tokens[0], "kni") == 0) {
-		snprintf(out, out_size, "\n%s\n", cmd_kni_help);
-		return;
-	}
-
 	if (strcmp(tokens[0], "cryptodev") == 0) {
 		snprintf(out, out_size, "\n%s\n", cmd_cryptodev_help);
 		return;
@@ -6436,11 +6346,6 @@ cli_process(char *in, char *out, size_t out_size)
 		return;
 	}
 
-	if (strcmp(tokens[0], "kni") == 0) {
-		cmd_kni(tokens, n_tokens, out, out_size);
-		return;
-	}
-
 	if (strcmp(tokens[0], "cryptodev") == 0) {
 		cmd_cryptodev(tokens, n_tokens, out, out_size);
 		return;
diff --git a/examples/ip_pipeline/examples/kni.cli b/examples/ip_pipeline/examples/kni.cli
deleted file mode 100644
index 143834093d4d..000000000000
--- a/examples/ip_pipeline/examples/kni.cli
+++ /dev/null
@@ -1,69 +0,0 @@
-; SPDX-License-Identifier: BSD-3-Clause
-; Copyright(c) 2010-2018 Intel Corporation
-
-;                 _______________          ______________________
-;                |               |  KNI0  |                      |
-; LINK0 RXQ0 --->|...............|------->|--+                   |
-;                |               |  KNI1  |  | br0               |
-; LINK1 TXQ0 <---|...............|<-------|<-+                   |
-;                |               |        |     Linux Kernel     |
-;                |   PIPELINE0   |        |     Network Stack    |
-;                |               |  KNI1  |                      |
-; LINK1 RXQ0 --->|...............|------->|--+                   |
-;                |               |  KNI0  |  | br0               |
-; LINK0 TXQ0 <---|...............|<-------|<-+                   |
-;                |_______________|        |______________________|
-;
-; Insert Linux kernel KNI module:
-;    [Linux]$ insmod rte_kni.ko
-;
-; Configure Linux kernel bridge between KNI0 and KNI1 interfaces:
-;    [Linux]$ brctl addbr br0
-;    [Linux]$ brctl addif br0 KNI0
-;    [Linux]$ brctl addif br0 KNI1
-;    [Linux]$ ifconfig br0 up
-;    [Linux]$ ifconfig KNI0 up
-;    [Linux]$ ifconfig KNI1 up
-;
-; Monitor packet forwarding performed by Linux kernel between KNI0 and KNI1:
-;    [Linux]$ tcpdump -i KNI0
-;    [Linux]$ tcpdump -i KNI1
-
-mempool MEMPOOL0 buffer 2304 pool 32K cache 256 cpu 0
-
-link LINK0 dev 0000:02:00.0 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-link LINK1 dev 0000:02:00.1 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-
-kni KNI0 link LINK0 mempool MEMPOOL0
-kni KNI1 link LINK1 mempool MEMPOOL0
-
-table action profile AP0 ipv4 offset 270 fwd
-
-pipeline PIPELINE0 period 10 offset_port_id 0 cpu 0
-
-pipeline PIPELINE0 port in bsz 32 link LINK0 rxq 0
-pipeline PIPELINE0 port in bsz 32 kni KNI1
-pipeline PIPELINE0 port in bsz 32 link LINK1 rxq 0
-pipeline PIPELINE0 port in bsz 32 kni KNI0
-
-pipeline PIPELINE0 port out bsz 32 kni KNI0
-pipeline PIPELINE0 port out bsz 32 link LINK1 txq 0
-pipeline PIPELINE0 port out bsz 32 kni KNI1
-pipeline PIPELINE0 port out bsz 32 link LINK0 txq 0
-
-pipeline PIPELINE0 table match stub action AP0
-pipeline PIPELINE0 table match stub action AP0
-pipeline PIPELINE0 table match stub action AP0
-pipeline PIPELINE0 table match stub action AP0
-
-pipeline PIPELINE0 port in 0 table 0
-pipeline PIPELINE0 port in 1 table 1
-pipeline PIPELINE0 port in 2 table 2
-pipeline PIPELINE0 port in 3 table 3
-
-thread 1 pipeline PIPELINE0 enable
-
-pipeline PIPELINE0 table 0 rule add match default action fwd port 0
-pipeline PIPELINE0 table 1 rule add match default action fwd port 1
-pipeline PIPELINE0 table 2 rule add match default action fwd port 2
-pipeline PIPELINE0 table 3 rule add match default action fwd port 3
diff --git a/examples/ip_pipeline/kni.c b/examples/ip_pipeline/kni.c
deleted file mode 100644
index cd02c3947827..000000000000
--- a/examples/ip_pipeline/kni.c
+++ /dev/null
@@ -1,168 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <rte_ethdev.h>
-#include <rte_string_fns.h>
-
-#include "kni.h"
-#include "mempool.h"
-#include "link.h"
-
-static struct kni_list kni_list;
-
-#ifndef KNI_MAX
-#define KNI_MAX                                            16
-#endif
-
-int
-kni_init(void)
-{
-	TAILQ_INIT(&kni_list);
-
-#ifdef RTE_LIB_KNI
-	rte_kni_init(KNI_MAX);
-#endif
-
-	return 0;
-}
-
-struct kni *
-kni_find(const char *name)
-{
-	struct kni *kni;
-
-	if (name == NULL)
-		return NULL;
-
-	TAILQ_FOREACH(kni, &kni_list, node)
-		if (strcmp(kni->name, name) == 0)
-			return kni;
-
-	return NULL;
-}
-
-#ifndef RTE_LIB_KNI
-
-struct kni *
-kni_create(const char *name __rte_unused,
-	struct kni_params *params __rte_unused)
-{
-	return NULL;
-}
-
-void
-kni_handle_request(void)
-{
-	return;
-}
-
-#else
-
-static int
-kni_config_network_interface(uint16_t port_id, uint8_t if_up)
-{
-	int ret = 0;
-
-	if (!rte_eth_dev_is_valid_port(port_id))
-		return -EINVAL;
-
-	ret = (if_up) ?
-		rte_eth_dev_set_link_up(port_id) :
-		rte_eth_dev_set_link_down(port_id);
-
-	return ret;
-}
-
-static int
-kni_change_mtu(uint16_t port_id, unsigned int new_mtu)
-{
-	int ret;
-
-	if (!rte_eth_dev_is_valid_port(port_id))
-		return -EINVAL;
-
-	if (new_mtu > RTE_ETHER_MAX_LEN)
-		return -EINVAL;
-
-	/* Set new MTU */
-	ret = rte_eth_dev_set_mtu(port_id, new_mtu);
-	if (ret < 0)
-		return ret;
-
-	return 0;
-}
-
-struct kni *
-kni_create(const char *name, struct kni_params *params)
-{
-	struct rte_eth_dev_info dev_info;
-	struct rte_kni_conf kni_conf;
-	struct rte_kni_ops kni_ops;
-	struct kni *kni;
-	struct mempool *mempool;
-	struct link *link;
-	struct rte_kni *k;
-	int ret;
-
-	/* Check input params */
-	if ((name == NULL) ||
-		kni_find(name) ||
-		(params == NULL))
-		return NULL;
-
-	mempool = mempool_find(params->mempool_name);
-	link = link_find(params->link_name);
-	if ((mempool == NULL) ||
-		(link == NULL))
-		return NULL;
-
-	/* Resource create */
-	ret = rte_eth_dev_info_get(link->port_id, &dev_info);
-	if (ret != 0)
-		return NULL;
-
-	memset(&kni_conf, 0, sizeof(kni_conf));
-	strlcpy(kni_conf.name, name, RTE_KNI_NAMESIZE);
-	kni_conf.force_bind = params->force_bind;
-	kni_conf.core_id = params->thread_id;
-	kni_conf.group_id = link->port_id;
-	kni_conf.mbuf_size = mempool->buffer_size;
-
-	memset(&kni_ops, 0, sizeof(kni_ops));
-	kni_ops.port_id = link->port_id;
-	kni_ops.config_network_if = kni_config_network_interface;
-	kni_ops.change_mtu = kni_change_mtu;
-
-	k = rte_kni_alloc(mempool->m, &kni_conf, &kni_ops);
-	if (k == NULL)
-		return NULL;
-
-	/* Node allocation */
-	kni = calloc(1, sizeof(struct kni));
-	if (kni == NULL)
-		return NULL;
-
-	/* Node fill in */
-	strlcpy(kni->name, name, sizeof(kni->name));
-	kni->k = k;
-
-	/* Node add to list */
-	TAILQ_INSERT_TAIL(&kni_list, kni, node);
-
-	return kni;
-}
-
-void
-kni_handle_request(void)
-{
-	struct kni *kni;
-
-	TAILQ_FOREACH(kni, &kni_list, node)
-		rte_kni_handle_request(kni->k);
-}
-
-#endif
diff --git a/examples/ip_pipeline/kni.h b/examples/ip_pipeline/kni.h
deleted file mode 100644
index 118f48df73d8..000000000000
--- a/examples/ip_pipeline/kni.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#ifndef _INCLUDE_KNI_H_
-#define _INCLUDE_KNI_H_
-
-#include <stdint.h>
-#include <sys/queue.h>
-
-#ifdef RTE_LIB_KNI
-#include <rte_kni.h>
-#endif
-
-#include "common.h"
-
-struct kni {
-	TAILQ_ENTRY(kni) node;
-	char name[NAME_SIZE];
-#ifdef RTE_LIB_KNI
-	struct rte_kni *k;
-#endif
-};
-
-TAILQ_HEAD(kni_list, kni);
-
-int
-kni_init(void);
-
-struct kni *
-kni_find(const char *name);
-
-struct kni_params {
-	const char *link_name;
-	const char *mempool_name;
-	int force_bind;
-	uint32_t thread_id;
-};
-
-struct kni *
-kni_create(const char *name, struct kni_params *params);
-
-void
-kni_handle_request(void);
-
-#endif /* _INCLUDE_KNI_H_ */
diff --git a/examples/ip_pipeline/main.c b/examples/ip_pipeline/main.c
index e35d9bce3984..663f538f024a 100644
--- a/examples/ip_pipeline/main.c
+++ b/examples/ip_pipeline/main.c
@@ -14,7 +14,6 @@
 
 #include "cli.h"
 #include "conn.h"
-#include "kni.h"
 #include "cryptodev.h"
 #include "link.h"
 #include "mempool.h"
@@ -205,13 +204,6 @@ main(int argc, char **argv)
 		return status;
 	}
 
-	/* KNI */
-	status = kni_init();
-	if (status) {
-		printf("Error: KNI initialization failed (%d)\n", status);
-		return status;
-	}
-
 	/* Sym Crypto */
 	status = cryptodev_init();
 	if (status) {
@@ -264,7 +256,5 @@ main(int argc, char **argv)
 		conn_poll_for_conn(conn);
 
 		conn_poll_for_msg(conn);
-
-		kni_handle_request();
 	}
 }
diff --git a/examples/ip_pipeline/meson.build b/examples/ip_pipeline/meson.build
index 57f522c24cf9..68049157e429 100644
--- a/examples/ip_pipeline/meson.build
+++ b/examples/ip_pipeline/meson.build
@@ -18,7 +18,6 @@ sources = files(
         'cli.c',
         'conn.c',
         'cryptodev.c',
-        'kni.c',
         'link.c',
         'main.c',
         'mempool.c',
diff --git a/examples/ip_pipeline/pipeline.c b/examples/ip_pipeline/pipeline.c
index 7ebabcae984d..63352257c6e9 100644
--- a/examples/ip_pipeline/pipeline.c
+++ b/examples/ip_pipeline/pipeline.c
@@ -11,9 +11,6 @@
 
 #include <rte_string_fns.h>
 #include <rte_port_ethdev.h>
-#ifdef RTE_LIB_KNI
-#include <rte_port_kni.h>
-#endif
 #include <rte_port_ring.h>
 #include <rte_port_source_sink.h>
 #include <rte_port_fd.h>
@@ -28,9 +25,6 @@
 #include <rte_table_lpm_ipv6.h>
 #include <rte_table_stub.h>
 
-#ifdef RTE_LIB_KNI
-#include "kni.h"
-#endif
 #include "link.h"
 #include "mempool.h"
 #include "pipeline.h"
@@ -160,9 +154,6 @@ pipeline_port_in_create(const char *pipeline_name,
 		struct rte_port_ring_reader_params ring;
 		struct rte_port_sched_reader_params sched;
 		struct rte_port_fd_reader_params fd;
-#ifdef RTE_LIB_KNI
-		struct rte_port_kni_reader_params kni;
-#endif
 		struct rte_port_source_params source;
 		struct rte_port_sym_crypto_reader_params sym_crypto;
 	} pp;
@@ -264,22 +255,6 @@ pipeline_port_in_create(const char *pipeline_name,
 		break;
 	}
 
-#ifdef RTE_LIB_KNI
-	case PORT_IN_KNI:
-	{
-		struct kni *kni;
-
-		kni = kni_find(params->dev_name);
-		if (kni == NULL)
-			return -1;
-
-		pp.kni.kni = kni->k;
-
-		p.ops = &rte_port_kni_reader_ops;
-		p.arg_create = &pp.kni;
-		break;
-	}
-#endif
 
 	case PORT_IN_SOURCE:
 	{
@@ -404,9 +379,6 @@ pipeline_port_out_create(const char *pipeline_name,
 		struct rte_port_ring_writer_params ring;
 		struct rte_port_sched_writer_params sched;
 		struct rte_port_fd_writer_params fd;
-#ifdef RTE_LIB_KNI
-		struct rte_port_kni_writer_params kni;
-#endif
 		struct rte_port_sink_params sink;
 		struct rte_port_sym_crypto_writer_params sym_crypto;
 	} pp;
@@ -415,9 +387,6 @@ pipeline_port_out_create(const char *pipeline_name,
 		struct rte_port_ethdev_writer_nodrop_params ethdev;
 		struct rte_port_ring_writer_nodrop_params ring;
 		struct rte_port_fd_writer_nodrop_params fd;
-#ifdef RTE_LIB_KNI
-		struct rte_port_kni_writer_nodrop_params kni;
-#endif
 		struct rte_port_sym_crypto_writer_nodrop_params sym_crypto;
 	} pp_nodrop;
 
@@ -537,32 +506,6 @@ pipeline_port_out_create(const char *pipeline_name,
 		break;
 	}
 
-#ifdef RTE_LIB_KNI
-	case PORT_OUT_KNI:
-	{
-		struct kni *kni;
-
-		kni = kni_find(params->dev_name);
-		if (kni == NULL)
-			return -1;
-
-		pp.kni.kni = kni->k;
-		pp.kni.tx_burst_sz = params->burst_size;
-
-		pp_nodrop.kni.kni = kni->k;
-		pp_nodrop.kni.tx_burst_sz = params->burst_size;
-		pp_nodrop.kni.n_retries = params->n_retries;
-
-		if (params->retry == 0) {
-			p.ops = &rte_port_kni_writer_ops;
-			p.arg_create = &pp.kni;
-		} else {
-			p.ops = &rte_port_kni_writer_nodrop_ops;
-			p.arg_create = &pp_nodrop.kni;
-		}
-		break;
-	}
-#endif
 
 	case PORT_OUT_SINK:
 	{
diff --git a/examples/ip_pipeline/pipeline.h b/examples/ip_pipeline/pipeline.h
index 4d2ee29a54c7..083d5e852421 100644
--- a/examples/ip_pipeline/pipeline.h
+++ b/examples/ip_pipeline/pipeline.h
@@ -25,7 +25,6 @@ enum port_in_type {
 	PORT_IN_SWQ,
 	PORT_IN_TMGR,
 	PORT_IN_TAP,
-	PORT_IN_KNI,
 	PORT_IN_SOURCE,
 	PORT_IN_CRYPTODEV,
 };
@@ -67,7 +66,6 @@ enum port_out_type {
 	PORT_OUT_SWQ,
 	PORT_OUT_TMGR,
 	PORT_OUT_TAP,
-	PORT_OUT_KNI,
 	PORT_OUT_SINK,
 	PORT_OUT_CRYPTODEV,
 };
diff --git a/kernel/linux/kni/Kbuild b/kernel/linux/kni/Kbuild
deleted file mode 100644
index e5452d6c00db..000000000000
--- a/kernel/linux/kni/Kbuild
+++ /dev/null
@@ -1,6 +0,0 @@
-# SPDX-License-Identifier: BSD-3-Clause
-# Copyright(c) 2018 Luca Boccassi <bluca@debian.org>
-
-ccflags-y := $(MODULE_CFLAGS)
-obj-m := rte_kni.o
-rte_kni-y := $(patsubst $(src)/%.c,%.o,$(wildcard $(src)/*.c))
diff --git a/kernel/linux/kni/compat.h b/kernel/linux/kni/compat.h
deleted file mode 100644
index 8beb67046577..000000000000
--- a/kernel/linux/kni/compat.h
+++ /dev/null
@@ -1,157 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Minimal wrappers to allow compiling kni on older kernels.
- */
-
-#include <linux/version.h>
-
-#ifndef RHEL_RELEASE_VERSION
-#define RHEL_RELEASE_VERSION(a, b) (((a) << 8) + (b))
-#endif
-
-/* SuSE version macro is the same as Linux kernel version */
-#ifndef SLE_VERSION
-#define SLE_VERSION(a, b, c) KERNEL_VERSION(a, b, c)
-#endif
-#ifdef CONFIG_SUSE_KERNEL
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 57))
-/* SLES12SP3 is at least 4.4.57+ based */
-#define SLE_VERSION_CODE SLE_VERSION(12, 3, 0)
-#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 12, 28))
-/* SLES12 is at least 3.12.28+ based */
-#define SLE_VERSION_CODE SLE_VERSION(12, 0, 0)
-#elif ((LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 61)) && \
-	(LINUX_VERSION_CODE < KERNEL_VERSION(3, 1, 0)))
-/* SLES11 SP3 is at least 3.0.61+ based */
-#define SLE_VERSION_CODE SLE_VERSION(11, 3, 0)
-#elif (LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 32))
-/* SLES11 SP1 is 2.6.32 based */
-#define SLE_VERSION_CODE SLE_VERSION(11, 1, 0)
-#elif (LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 27))
-/* SLES11 GA is 2.6.27 based */
-#define SLE_VERSION_CODE SLE_VERSION(11, 0, 0)
-#endif /* LINUX_VERSION_CODE == KERNEL_VERSION(x,y,z) */
-#endif /* CONFIG_SUSE_KERNEL */
-#ifndef SLE_VERSION_CODE
-#define SLE_VERSION_CODE 0
-#endif /* SLE_VERSION_CODE */
-
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 39) && \
-	(!(defined(RHEL_RELEASE_CODE) && \
-	   RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6, 4)))
-
-#define kstrtoul strict_strtoul
-
-#endif /* < 2.6.39 */
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 33)
-#define HAVE_SIMPLIFIED_PERNET_OPERATIONS
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 35)
-#define sk_sleep(s) ((s)->sk_sleep)
-#else
-#define HAVE_SOCKET_WQ
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0)
-#define HAVE_STATIC_SOCK_MAP_FD
-#else
-#define kni_sock_map_fd(s) sock_map_fd(s, 0)
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
-#define HAVE_CHANGE_CARRIER_CB
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)
-#define ether_addr_copy(dst, src) memcpy(dst, src, ETH_ALEN)
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)
-#define HAVE_IOV_ITER_MSGHDR
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 1, 0)
-#define HAVE_KIOCB_MSG_PARAM
-#define HAVE_REBUILD_HEADER
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
-#define HAVE_SK_ALLOC_KERN_PARAM
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0) || \
-	(defined(RHEL_RELEASE_CODE) && \
-	 RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7, 4)) || \
-	(SLE_VERSION_CODE && SLE_VERSION_CODE == SLE_VERSION(12, 3, 0))
-#define HAVE_TRANS_START_HELPER
-#endif
-
-/*
- * KNI uses NET_NAME_UNKNOWN macro to select correct version of alloc_netdev()
- * For old kernels just backported the commit that enables the macro
- * (685343fc3ba6) but still uses old API, it is required to undefine macro to
- * select correct version of API, this is safe since KNI doesn't use the value.
- * This fix is specific to RedHat/CentOS kernels.
- */
-#if (defined(RHEL_RELEASE_CODE) && \
-	(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6, 8)) && \
-	(LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 34)))
-#undef NET_NAME_UNKNOWN
-#endif
-
-/*
- * RHEL has two different version with different kernel version:
- * 3.10 is for AMD, Intel, IBM POWER7 and POWER8;
- * 4.14 is for ARM and IBM POWER9
- */
-#if (defined(RHEL_RELEASE_CODE) && \
-	(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7, 5)) && \
-	(RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(8, 0)) && \
-	(LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 0)))
-#define ndo_change_mtu ndo_change_mtu_rh74
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0)
-#define HAVE_MAX_MTU_PARAM
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
-#define HAVE_SIGNAL_FUNCTIONS_OWN_HEADER
-#endif
-
-/*
- * iova to kva mapping support can be provided since 4.6.0, but required
- * kernel version increased to >= 4.10.0 because of the updates in
- * get_user_pages_remote() kernel API
- */
-#if KERNEL_VERSION(4, 10, 0) <= LINUX_VERSION_CODE
-#define HAVE_IOVA_TO_KVA_MAPPING_SUPPORT
-#endif
-
-#if KERNEL_VERSION(5, 6, 0) <= LINUX_VERSION_CODE || \
-	(defined(RHEL_RELEASE_CODE) && \
-	 RHEL_RELEASE_VERSION(8, 3) <= RHEL_RELEASE_CODE) || \
-	 (defined(CONFIG_SUSE_KERNEL) && defined(HAVE_ARG_TX_QUEUE))
-#define HAVE_TX_TIMEOUT_TXQUEUE
-#endif
-
-#if KERNEL_VERSION(5, 9, 0) > LINUX_VERSION_CODE
-#define HAVE_TSK_IN_GUP
-#endif
-
-#if KERNEL_VERSION(5, 15, 0) <= LINUX_VERSION_CODE
-#define HAVE_ETH_HW_ADDR_SET
-#endif
-
-#if KERNEL_VERSION(5, 18, 0) > LINUX_VERSION_CODE && \
-	(!(defined(RHEL_RELEASE_CODE) && \
-	 RHEL_RELEASE_VERSION(9, 1) <= RHEL_RELEASE_CODE))
-#define HAVE_NETIF_RX_NI
-#endif
-
-#if KERNEL_VERSION(6, 5, 0) > LINUX_VERSION_CODE
-#define HAVE_VMA_IN_GUP
-#endif
diff --git a/kernel/linux/kni/kni_dev.h b/kernel/linux/kni/kni_dev.h
deleted file mode 100644
index 975379825b2d..000000000000
--- a/kernel/linux/kni/kni_dev.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright(c) 2010-2014 Intel Corporation.
- */
-
-#ifndef _KNI_DEV_H_
-#define _KNI_DEV_H_
-
-#ifdef pr_fmt
-#undef pr_fmt
-#endif
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
-#define KNI_VERSION	"1.0"
-
-#include "compat.h"
-
-#include <linux/if.h>
-#include <linux/wait.h>
-#ifdef HAVE_SIGNAL_FUNCTIONS_OWN_HEADER
-#include <linux/sched/signal.h>
-#else
-#include <linux/sched.h>
-#endif
-#include <linux/netdevice.h>
-#include <linux/spinlock.h>
-#include <linux/list.h>
-
-#include <rte_kni_common.h>
-#define KNI_KTHREAD_MAX_RESCHEDULE_INTERVAL 1000000 /* us */
-
-#define MBUF_BURST_SZ 32
-
-/* Default carrier state for created KNI network interfaces */
-extern uint32_t kni_dflt_carrier;
-
-/* Request processing support for bifurcated drivers. */
-extern uint32_t bifurcated_support;
-
-/**
- * A structure describing the private information for a kni device.
- */
-struct kni_dev {
-	/* kni list */
-	struct list_head list;
-
-	uint8_t iova_mode;
-
-	uint32_t core_id;            /* Core ID to bind */
-	char name[RTE_KNI_NAMESIZE]; /* Network device name */
-	struct task_struct *pthread;
-
-	/* wait queue for req/resp */
-	wait_queue_head_t wq;
-	struct mutex sync_lock;
-
-	/* kni device */
-	struct net_device *net_dev;
-
-	/* queue for packets to be sent out */
-	struct rte_kni_fifo *tx_q;
-
-	/* queue for the packets received */
-	struct rte_kni_fifo *rx_q;
-
-	/* queue for the allocated mbufs those can be used to save sk buffs */
-	struct rte_kni_fifo *alloc_q;
-
-	/* free queue for the mbufs to be freed */
-	struct rte_kni_fifo *free_q;
-
-	/* request queue */
-	struct rte_kni_fifo *req_q;
-
-	/* response queue */
-	struct rte_kni_fifo *resp_q;
-
-	void *sync_kva;
-	void *sync_va;
-
-	void *mbuf_kva;
-	void *mbuf_va;
-
-	/* mbuf size */
-	uint32_t mbuf_size;
-
-	/* buffers */
-	void *pa[MBUF_BURST_SZ];
-	void *va[MBUF_BURST_SZ];
-	void *alloc_pa[MBUF_BURST_SZ];
-	void *alloc_va[MBUF_BURST_SZ];
-
-	struct task_struct *usr_tsk;
-};
-
-#ifdef HAVE_IOVA_TO_KVA_MAPPING_SUPPORT
-static inline phys_addr_t iova_to_phys(struct task_struct *tsk,
-				       unsigned long iova)
-{
-	phys_addr_t offset, phys_addr;
-	struct page *page = NULL;
-	long ret;
-
-	offset = iova & (PAGE_SIZE - 1);
-
-	/* Read one page struct info */
-#ifdef HAVE_TSK_IN_GUP
-	ret = get_user_pages_remote(tsk, tsk->mm, iova, 1, 0, &page, NULL, NULL);
-#else
-  #ifdef HAVE_VMA_IN_GUP
-	ret = get_user_pages_remote(tsk->mm, iova, 1, 0, &page, NULL, NULL);
-  #else
-	ret = get_user_pages_remote(tsk->mm, iova, 1, 0, &page, NULL);
-  #endif
-#endif
-	if (ret < 0)
-		return 0;
-
-	phys_addr = page_to_phys(page) | offset;
-	put_page(page);
-
-	return phys_addr;
-}
-
-static inline void *iova_to_kva(struct task_struct *tsk, unsigned long iova)
-{
-	return phys_to_virt(iova_to_phys(tsk, iova));
-}
-#endif
-
-void kni_net_release_fifo_phy(struct kni_dev *kni);
-void kni_net_rx(struct kni_dev *kni);
-void kni_net_init(struct net_device *dev);
-void kni_net_config_lo_mode(char *lo_str);
-void kni_net_poll_resp(struct kni_dev *kni);
-
-#endif
diff --git a/kernel/linux/kni/kni_fifo.h b/kernel/linux/kni/kni_fifo.h
deleted file mode 100644
index 1ba5172002b6..000000000000
--- a/kernel/linux/kni/kni_fifo.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright(c) 2010-2014 Intel Corporation.
- */
-
-#ifndef _KNI_FIFO_H_
-#define _KNI_FIFO_H_
-
-#include <rte_kni_common.h>
-
-/* Skip some memory barriers on Linux < 3.14 */
-#ifndef smp_load_acquire
-#define smp_load_acquire(a) (*(a))
-#endif
-#ifndef smp_store_release
-#define smp_store_release(a, b) *(a) = (b)
-#endif
-
-/**
- * Adds num elements into the fifo. Return the number actually written
- */
-static inline uint32_t
-kni_fifo_put(struct rte_kni_fifo *fifo, void **data, uint32_t num)
-{
-	uint32_t i = 0;
-	uint32_t fifo_write = fifo->write;
-	uint32_t fifo_read = smp_load_acquire(&fifo->read);
-	uint32_t new_write = fifo_write;
-
-	for (i = 0; i < num; i++) {
-		new_write = (new_write + 1) & (fifo->len - 1);
-
-		if (new_write == fifo_read)
-			break;
-		fifo->buffer[fifo_write] = data[i];
-		fifo_write = new_write;
-	}
-	smp_store_release(&fifo->write, fifo_write);
-
-	return i;
-}
-
-/**
- * Get up to num elements from the FIFO. Return the number actually read
- */
-static inline uint32_t
-kni_fifo_get(struct rte_kni_fifo *fifo, void **data, uint32_t num)
-{
-	uint32_t i = 0;
-	uint32_t new_read = fifo->read;
-	uint32_t fifo_write = smp_load_acquire(&fifo->write);
-
-	for (i = 0; i < num; i++) {
-		if (new_read == fifo_write)
-			break;
-
-		data[i] = fifo->buffer[new_read];
-		new_read = (new_read + 1) & (fifo->len - 1);
-	}
-	smp_store_release(&fifo->read, new_read);
-
-	return i;
-}
-
-/**
- * Get the num of elements in the fifo
- */
-static inline uint32_t
-kni_fifo_count(struct rte_kni_fifo *fifo)
-{
-	uint32_t fifo_write = smp_load_acquire(&fifo->write);
-	uint32_t fifo_read = smp_load_acquire(&fifo->read);
-	return (fifo->len + fifo_write - fifo_read) & (fifo->len - 1);
-}
-
-/**
- * Get the num of available elements in the fifo
- */
-static inline uint32_t
-kni_fifo_free_count(struct rte_kni_fifo *fifo)
-{
-	uint32_t fifo_write = smp_load_acquire(&fifo->write);
-	uint32_t fifo_read = smp_load_acquire(&fifo->read);
-	return (fifo_read - fifo_write - 1) & (fifo->len - 1);
-}
-
-#endif /* _KNI_FIFO_H_ */
diff --git a/kernel/linux/kni/kni_misc.c b/kernel/linux/kni/kni_misc.c
deleted file mode 100644
index 0c3a86ee352e..000000000000
--- a/kernel/linux/kni/kni_misc.c
+++ /dev/null
@@ -1,719 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright(c) 2010-2014 Intel Corporation.
- */
-
-#include <linux/version.h>
-#include <linux/module.h>
-#include <linux/miscdevice.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/pci.h>
-#include <linux/kthread.h>
-#include <linux/rwsem.h>
-#include <linux/mutex.h>
-#include <linux/nsproxy.h>
-#include <net/net_namespace.h>
-#include <net/netns/generic.h>
-
-#include <rte_kni_common.h>
-
-#include "compat.h"
-#include "kni_dev.h"
-
-MODULE_VERSION(KNI_VERSION);
-MODULE_LICENSE("Dual BSD/GPL");
-MODULE_AUTHOR("Intel Corporation");
-MODULE_DESCRIPTION("Kernel Module for managing kni devices");
-
-#define KNI_RX_LOOP_NUM 1000
-
-#define KNI_MAX_DEVICES 32
-
-/* loopback mode */
-static char *lo_mode;
-
-/* Kernel thread mode */
-static char *kthread_mode;
-static uint32_t multiple_kthread_on;
-
-/* Default carrier state for created KNI network interfaces */
-static char *carrier;
-uint32_t kni_dflt_carrier;
-
-/* Request processing support for bifurcated drivers. */
-static char *enable_bifurcated;
-uint32_t bifurcated_support;
-
-/* KNI thread scheduling interval */
-static long min_scheduling_interval = 100; /* us */
-static long max_scheduling_interval = 200; /* us */
-
-#define KNI_DEV_IN_USE_BIT_NUM 0 /* Bit number for device in use */
-
-static int kni_net_id;
-
-struct kni_net {
-	unsigned long device_in_use; /* device in use flag */
-	struct mutex kni_kthread_lock;
-	struct task_struct *kni_kthread;
-	struct rw_semaphore kni_list_lock;
-	struct list_head kni_list_head;
-};
-
-static int __net_init
-kni_init_net(struct net *net)
-{
-#ifdef HAVE_SIMPLIFIED_PERNET_OPERATIONS
-	struct kni_net *knet = net_generic(net, kni_net_id);
-
-	memset(knet, 0, sizeof(*knet));
-#else
-	struct kni_net *knet;
-	int ret;
-
-	knet = kzalloc(sizeof(struct kni_net), GFP_KERNEL);
-	if (!knet) {
-		ret = -ENOMEM;
-		return ret;
-	}
-#endif
-
-	/* Clear the bit of device in use */
-	clear_bit(KNI_DEV_IN_USE_BIT_NUM, &knet->device_in_use);
-
-	mutex_init(&knet->kni_kthread_lock);
-
-	init_rwsem(&knet->kni_list_lock);
-	INIT_LIST_HEAD(&knet->kni_list_head);
-
-#ifdef HAVE_SIMPLIFIED_PERNET_OPERATIONS
-	return 0;
-#else
-	ret = net_assign_generic(net, kni_net_id, knet);
-	if (ret < 0)
-		kfree(knet);
-
-	return ret;
-#endif
-}
-
-static void __net_exit
-kni_exit_net(struct net *net)
-{
-	struct kni_net *knet __maybe_unused;
-
-	knet = net_generic(net, kni_net_id);
-	mutex_destroy(&knet->kni_kthread_lock);
-
-#ifndef HAVE_SIMPLIFIED_PERNET_OPERATIONS
-	kfree(knet);
-#endif
-}
-
-static struct pernet_operations kni_net_ops = {
-	.init = kni_init_net,
-	.exit = kni_exit_net,
-#ifdef HAVE_SIMPLIFIED_PERNET_OPERATIONS
-	.id   = &kni_net_id,
-	.size = sizeof(struct kni_net),
-#endif
-};
-
-static int
-kni_thread_single(void *data)
-{
-	struct kni_net *knet = data;
-	int j;
-	struct kni_dev *dev;
-
-	while (!kthread_should_stop()) {
-		down_read(&knet->kni_list_lock);
-		for (j = 0; j < KNI_RX_LOOP_NUM; j++) {
-			list_for_each_entry(dev, &knet->kni_list_head, list) {
-				kni_net_rx(dev);
-				kni_net_poll_resp(dev);
-			}
-		}
-		up_read(&knet->kni_list_lock);
-		/* reschedule out for a while */
-		usleep_range(min_scheduling_interval, max_scheduling_interval);
-	}
-
-	return 0;
-}
-
-static int
-kni_thread_multiple(void *param)
-{
-	int j;
-	struct kni_dev *dev = param;
-
-	while (!kthread_should_stop()) {
-		for (j = 0; j < KNI_RX_LOOP_NUM; j++) {
-			kni_net_rx(dev);
-			kni_net_poll_resp(dev);
-		}
-		usleep_range(min_scheduling_interval, max_scheduling_interval);
-	}
-
-	return 0;
-}
-
-static int
-kni_open(struct inode *inode, struct file *file)
-{
-	struct net *net = current->nsproxy->net_ns;
-	struct kni_net *knet = net_generic(net, kni_net_id);
-
-	/* kni device can be opened by one user only per netns */
-	if (test_and_set_bit(KNI_DEV_IN_USE_BIT_NUM, &knet->device_in_use))
-		return -EBUSY;
-
-	file->private_data = get_net(net);
-	pr_debug("/dev/kni opened\n");
-
-	return 0;
-}
-
-static int
-kni_dev_remove(struct kni_dev *dev)
-{
-	if (!dev)
-		return -ENODEV;
-
-	/*
-	 * The memory of kni device is allocated and released together
-	 * with net device. Release mbuf before freeing net device.
-	 */
-	kni_net_release_fifo_phy(dev);
-
-	if (dev->net_dev) {
-		unregister_netdev(dev->net_dev);
-		free_netdev(dev->net_dev);
-	}
-
-	return 0;
-}
-
-static int
-kni_release(struct inode *inode, struct file *file)
-{
-	struct net *net = file->private_data;
-	struct kni_net *knet = net_generic(net, kni_net_id);
-	struct kni_dev *dev, *n;
-
-	/* Stop kernel thread for single mode */
-	if (multiple_kthread_on == 0) {
-		mutex_lock(&knet->kni_kthread_lock);
-		/* Stop kernel thread */
-		if (knet->kni_kthread != NULL) {
-			kthread_stop(knet->kni_kthread);
-			knet->kni_kthread = NULL;
-		}
-		mutex_unlock(&knet->kni_kthread_lock);
-	}
-
-	down_write(&knet->kni_list_lock);
-	list_for_each_entry_safe(dev, n, &knet->kni_list_head, list) {
-		/* Stop kernel thread for multiple mode */
-		if (multiple_kthread_on && dev->pthread != NULL) {
-			kthread_stop(dev->pthread);
-			dev->pthread = NULL;
-		}
-
-		list_del(&dev->list);
-		kni_dev_remove(dev);
-	}
-	up_write(&knet->kni_list_lock);
-
-	/* Clear the bit of device in use */
-	clear_bit(KNI_DEV_IN_USE_BIT_NUM, &knet->device_in_use);
-
-	put_net(net);
-	pr_debug("/dev/kni closed\n");
-
-	return 0;
-}
-
-static int
-kni_check_param(struct kni_dev *kni, struct rte_kni_device_info *dev)
-{
-	if (!kni || !dev)
-		return -1;
-
-	/* Check if network name has been used */
-	if (!strncmp(kni->name, dev->name, RTE_KNI_NAMESIZE)) {
-		pr_err("KNI name %s duplicated\n", dev->name);
-		return -1;
-	}
-
-	return 0;
-}
-
-static int
-kni_run_thread(struct kni_net *knet, struct kni_dev *kni, uint8_t force_bind)
-{
-	/**
-	 * Create a new kernel thread for multiple mode, set its core affinity,
-	 * and finally wake it up.
-	 */
-	if (multiple_kthread_on) {
-		kni->pthread = kthread_create(kni_thread_multiple,
-			(void *)kni, "kni_%s", kni->name);
-		if (IS_ERR(kni->pthread)) {
-			kni_dev_remove(kni);
-			return -ECANCELED;
-		}
-
-		if (force_bind)
-			kthread_bind(kni->pthread, kni->core_id);
-		wake_up_process(kni->pthread);
-	} else {
-		mutex_lock(&knet->kni_kthread_lock);
-
-		if (knet->kni_kthread == NULL) {
-			knet->kni_kthread = kthread_create(kni_thread_single,
-				(void *)knet, "kni_single");
-			if (IS_ERR(knet->kni_kthread)) {
-				mutex_unlock(&knet->kni_kthread_lock);
-				kni_dev_remove(kni);
-				return -ECANCELED;
-			}
-
-			if (force_bind)
-				kthread_bind(knet->kni_kthread, kni->core_id);
-			wake_up_process(knet->kni_kthread);
-		}
-
-		mutex_unlock(&knet->kni_kthread_lock);
-	}
-
-	return 0;
-}
-
-static int
-kni_ioctl_create(struct net *net, uint32_t ioctl_num,
-		unsigned long ioctl_param)
-{
-	struct kni_net *knet = net_generic(net, kni_net_id);
-	int ret;
-	struct rte_kni_device_info dev_info;
-	struct net_device *net_dev = NULL;
-	struct kni_dev *kni, *dev, *n;
-
-	pr_info("Creating kni...\n");
-	/* Check the buffer size, to avoid warning */
-	if (_IOC_SIZE(ioctl_num) > sizeof(dev_info))
-		return -EINVAL;
-
-	/* Copy kni info from user space */
-	if (copy_from_user(&dev_info, (void *)ioctl_param, sizeof(dev_info)))
-		return -EFAULT;
-
-	/* Check if name is zero-ended */
-	if (strnlen(dev_info.name, sizeof(dev_info.name)) == sizeof(dev_info.name)) {
-		pr_err("kni.name not zero-terminated");
-		return -EINVAL;
-	}
-
-	/**
-	 * Check if the cpu core id is valid for binding.
-	 */
-	if (dev_info.force_bind && !cpu_online(dev_info.core_id)) {
-		pr_err("cpu %u is not online\n", dev_info.core_id);
-		return -EINVAL;
-	}
-
-	/* Check if it has been created */
-	down_read(&knet->kni_list_lock);
-	list_for_each_entry_safe(dev, n, &knet->kni_list_head, list) {
-		if (kni_check_param(dev, &dev_info) < 0) {
-			up_read(&knet->kni_list_lock);
-			return -EINVAL;
-		}
-	}
-	up_read(&knet->kni_list_lock);
-
-	net_dev = alloc_netdev(sizeof(struct kni_dev), dev_info.name,
-#ifdef NET_NAME_USER
-							NET_NAME_USER,
-#endif
-							kni_net_init);
-	if (net_dev == NULL) {
-		pr_err("error allocating device \"%s\"\n", dev_info.name);
-		return -EBUSY;
-	}
-
-	dev_net_set(net_dev, net);
-
-	kni = netdev_priv(net_dev);
-
-	kni->net_dev = net_dev;
-	kni->core_id = dev_info.core_id;
-	strncpy(kni->name, dev_info.name, RTE_KNI_NAMESIZE);
-
-	/* Translate user space info into kernel space info */
-	if (dev_info.iova_mode) {
-#ifdef HAVE_IOVA_TO_KVA_MAPPING_SUPPORT
-		kni->tx_q = iova_to_kva(current, dev_info.tx_phys);
-		kni->rx_q = iova_to_kva(current, dev_info.rx_phys);
-		kni->alloc_q = iova_to_kva(current, dev_info.alloc_phys);
-		kni->free_q = iova_to_kva(current, dev_info.free_phys);
-
-		kni->req_q = iova_to_kva(current, dev_info.req_phys);
-		kni->resp_q = iova_to_kva(current, dev_info.resp_phys);
-		kni->sync_va = dev_info.sync_va;
-		kni->sync_kva = iova_to_kva(current, dev_info.sync_phys);
-		kni->usr_tsk = current;
-		kni->iova_mode = 1;
-#else
-		pr_err("KNI module does not support IOVA to VA translation\n");
-		return -EINVAL;
-#endif
-	} else {
-
-		kni->tx_q = phys_to_virt(dev_info.tx_phys);
-		kni->rx_q = phys_to_virt(dev_info.rx_phys);
-		kni->alloc_q = phys_to_virt(dev_info.alloc_phys);
-		kni->free_q = phys_to_virt(dev_info.free_phys);
-
-		kni->req_q = phys_to_virt(dev_info.req_phys);
-		kni->resp_q = phys_to_virt(dev_info.resp_phys);
-		kni->sync_va = dev_info.sync_va;
-		kni->sync_kva = phys_to_virt(dev_info.sync_phys);
-		kni->iova_mode = 0;
-	}
-
-	kni->mbuf_size = dev_info.mbuf_size;
-
-	pr_debug("tx_phys:      0x%016llx, tx_q addr:      0x%p\n",
-		(unsigned long long) dev_info.tx_phys, kni->tx_q);
-	pr_debug("rx_phys:      0x%016llx, rx_q addr:      0x%p\n",
-		(unsigned long long) dev_info.rx_phys, kni->rx_q);
-	pr_debug("alloc_phys:   0x%016llx, alloc_q addr:   0x%p\n",
-		(unsigned long long) dev_info.alloc_phys, kni->alloc_q);
-	pr_debug("free_phys:    0x%016llx, free_q addr:    0x%p\n",
-		(unsigned long long) dev_info.free_phys, kni->free_q);
-	pr_debug("req_phys:     0x%016llx, req_q addr:     0x%p\n",
-		(unsigned long long) dev_info.req_phys, kni->req_q);
-	pr_debug("resp_phys:    0x%016llx, resp_q addr:    0x%p\n",
-		(unsigned long long) dev_info.resp_phys, kni->resp_q);
-	pr_debug("mbuf_size:    %u\n", kni->mbuf_size);
-
-	/* if user has provided a valid mac address */
-	if (is_valid_ether_addr(dev_info.mac_addr)) {
-#ifdef HAVE_ETH_HW_ADDR_SET
-		eth_hw_addr_set(net_dev, dev_info.mac_addr);
-#else
-		memcpy(net_dev->dev_addr, dev_info.mac_addr, ETH_ALEN);
-#endif
-	} else {
-		/* Assign random MAC address. */
-		eth_hw_addr_random(net_dev);
-	}
-
-	if (dev_info.mtu)
-		net_dev->mtu = dev_info.mtu;
-#ifdef HAVE_MAX_MTU_PARAM
-	net_dev->max_mtu = net_dev->mtu;
-
-	if (dev_info.min_mtu)
-		net_dev->min_mtu = dev_info.min_mtu;
-
-	if (dev_info.max_mtu)
-		net_dev->max_mtu = dev_info.max_mtu;
-#endif
-
-	ret = register_netdev(net_dev);
-	if (ret) {
-		pr_err("error %i registering device \"%s\"\n",
-					ret, dev_info.name);
-		kni->net_dev = NULL;
-		kni_dev_remove(kni);
-		free_netdev(net_dev);
-		return -ENODEV;
-	}
-
-	netif_carrier_off(net_dev);
-
-	ret = kni_run_thread(knet, kni, dev_info.force_bind);
-	if (ret != 0)
-		return ret;
-
-	down_write(&knet->kni_list_lock);
-	list_add(&kni->list, &knet->kni_list_head);
-	up_write(&knet->kni_list_lock);
-
-	return 0;
-}
-
-static int
-kni_ioctl_release(struct net *net, uint32_t ioctl_num,
-		unsigned long ioctl_param)
-{
-	struct kni_net *knet = net_generic(net, kni_net_id);
-	int ret = -EINVAL;
-	struct kni_dev *dev, *n;
-	struct rte_kni_device_info dev_info;
-
-	if (_IOC_SIZE(ioctl_num) > sizeof(dev_info))
-		return -EINVAL;
-
-	if (copy_from_user(&dev_info, (void *)ioctl_param, sizeof(dev_info)))
-		return -EFAULT;
-
-	/* Release the network device according to its name */
-	if (strlen(dev_info.name) == 0)
-		return -EINVAL;
-
-	down_write(&knet->kni_list_lock);
-	list_for_each_entry_safe(dev, n, &knet->kni_list_head, list) {
-		if (strncmp(dev->name, dev_info.name, RTE_KNI_NAMESIZE) != 0)
-			continue;
-
-		if (multiple_kthread_on && dev->pthread != NULL) {
-			kthread_stop(dev->pthread);
-			dev->pthread = NULL;
-		}
-
-		list_del(&dev->list);
-		kni_dev_remove(dev);
-		ret = 0;
-		break;
-	}
-	up_write(&knet->kni_list_lock);
-	pr_info("%s release kni named %s\n",
-		(ret == 0 ? "Successfully" : "Unsuccessfully"), dev_info.name);
-
-	return ret;
-}
-
-static long
-kni_ioctl(struct file *file, unsigned int ioctl_num, unsigned long ioctl_param)
-{
-	long ret = -EINVAL;
-	struct net *net = current->nsproxy->net_ns;
-
-	pr_debug("IOCTL num=0x%0x param=0x%0lx\n", ioctl_num, ioctl_param);
-
-	/*
-	 * Switch according to the ioctl called
-	 */
-	switch (_IOC_NR(ioctl_num)) {
-	case _IOC_NR(RTE_KNI_IOCTL_TEST):
-		/* For test only, not used */
-		break;
-	case _IOC_NR(RTE_KNI_IOCTL_CREATE):
-		ret = kni_ioctl_create(net, ioctl_num, ioctl_param);
-		break;
-	case _IOC_NR(RTE_KNI_IOCTL_RELEASE):
-		ret = kni_ioctl_release(net, ioctl_num, ioctl_param);
-		break;
-	default:
-		pr_debug("IOCTL default\n");
-		break;
-	}
-
-	return ret;
-}
-
-static long
-kni_compat_ioctl(struct file *file, unsigned int ioctl_num,
-		unsigned long ioctl_param)
-{
-	/* 32 bits app on 64 bits OS to be supported later */
-	pr_debug("Not implemented.\n");
-
-	return -EINVAL;
-}
-
-static const struct file_operations kni_fops = {
-	.owner = THIS_MODULE,
-	.open = kni_open,
-	.release = kni_release,
-	.unlocked_ioctl = kni_ioctl,
-	.compat_ioctl = kni_compat_ioctl,
-};
-
-static struct miscdevice kni_misc = {
-	.minor = MISC_DYNAMIC_MINOR,
-	.name = KNI_DEVICE,
-	.fops = &kni_fops,
-};
-
-static int __init
-kni_parse_kthread_mode(void)
-{
-	if (!kthread_mode)
-		return 0;
-
-	if (strcmp(kthread_mode, "single") == 0)
-		return 0;
-	else if (strcmp(kthread_mode, "multiple") == 0)
-		multiple_kthread_on = 1;
-	else
-		return -1;
-
-	return 0;
-}
-
-static int __init
-kni_parse_carrier_state(void)
-{
-	if (!carrier) {
-		kni_dflt_carrier = 0;
-		return 0;
-	}
-
-	if (strcmp(carrier, "off") == 0)
-		kni_dflt_carrier = 0;
-	else if (strcmp(carrier, "on") == 0)
-		kni_dflt_carrier = 1;
-	else
-		return -1;
-
-	return 0;
-}
-
-static int __init
-kni_parse_bifurcated_support(void)
-{
-	if (!enable_bifurcated) {
-		bifurcated_support = 0;
-		return 0;
-	}
-
-	if (strcmp(enable_bifurcated, "on") == 0)
-		bifurcated_support = 1;
-	else
-		return -1;
-
-	return 0;
-}
-
-static int __init
-kni_init(void)
-{
-	int rc;
-
-	if (kni_parse_kthread_mode() < 0) {
-		pr_err("Invalid parameter for kthread_mode\n");
-		return -EINVAL;
-	}
-
-	if (multiple_kthread_on == 0)
-		pr_debug("Single kernel thread for all KNI devices\n");
-	else
-		pr_debug("Multiple kernel thread mode enabled\n");
-
-	if (kni_parse_carrier_state() < 0) {
-		pr_err("Invalid parameter for carrier\n");
-		return -EINVAL;
-	}
-
-	if (kni_dflt_carrier == 0)
-		pr_debug("Default carrier state set to off.\n");
-	else
-		pr_debug("Default carrier state set to on.\n");
-
-	if (kni_parse_bifurcated_support() < 0) {
-		pr_err("Invalid parameter for bifurcated support\n");
-		return -EINVAL;
-	}
-	if (bifurcated_support == 1)
-		pr_debug("bifurcated support is enabled.\n");
-
-	if (min_scheduling_interval < 0 || max_scheduling_interval < 0 ||
-		min_scheduling_interval > KNI_KTHREAD_MAX_RESCHEDULE_INTERVAL ||
-		max_scheduling_interval > KNI_KTHREAD_MAX_RESCHEDULE_INTERVAL ||
-		min_scheduling_interval >= max_scheduling_interval) {
-		pr_err("Invalid parameters for scheduling interval\n");
-		return -EINVAL;
-	}
-
-#ifdef HAVE_SIMPLIFIED_PERNET_OPERATIONS
-	rc = register_pernet_subsys(&kni_net_ops);
-#else
-	rc = register_pernet_gen_subsys(&kni_net_id, &kni_net_ops);
-#endif
-	if (rc)
-		return -EPERM;
-
-	rc = misc_register(&kni_misc);
-	if (rc != 0) {
-		pr_err("Misc registration failed\n");
-		goto out;
-	}
-
-	/* Configure the lo mode according to the input parameter */
-	kni_net_config_lo_mode(lo_mode);
-
-	return 0;
-
-out:
-#ifdef HAVE_SIMPLIFIED_PERNET_OPERATIONS
-	unregister_pernet_subsys(&kni_net_ops);
-#else
-	unregister_pernet_gen_subsys(kni_net_id, &kni_net_ops);
-#endif
-	return rc;
-}
-
-static void __exit
-kni_exit(void)
-{
-	misc_deregister(&kni_misc);
-#ifdef HAVE_SIMPLIFIED_PERNET_OPERATIONS
-	unregister_pernet_subsys(&kni_net_ops);
-#else
-	unregister_pernet_gen_subsys(kni_net_id, &kni_net_ops);
-#endif
-}
-
-module_init(kni_init);
-module_exit(kni_exit);
-
-module_param(lo_mode, charp, 0644);
-MODULE_PARM_DESC(lo_mode,
-"KNI loopback mode (default=lo_mode_none):\n"
-"\t\tlo_mode_none        Kernel loopback disabled\n"
-"\t\tlo_mode_fifo        Enable kernel loopback with fifo\n"
-"\t\tlo_mode_fifo_skb    Enable kernel loopback with fifo and skb buffer\n"
-"\t\t"
-);
-
-module_param(kthread_mode, charp, 0644);
-MODULE_PARM_DESC(kthread_mode,
-"Kernel thread mode (default=single):\n"
-"\t\tsingle    Single kernel thread mode enabled.\n"
-"\t\tmultiple  Multiple kernel thread mode enabled.\n"
-"\t\t"
-);
-
-module_param(carrier, charp, 0644);
-MODULE_PARM_DESC(carrier,
-"Default carrier state for KNI interface (default=off):\n"
-"\t\toff   Interfaces will be created with carrier state set to off.\n"
-"\t\ton    Interfaces will be created with carrier state set to on.\n"
-"\t\t"
-);
-
-module_param(enable_bifurcated, charp, 0644);
-MODULE_PARM_DESC(enable_bifurcated,
-"Enable request processing support for bifurcated drivers, "
-"which means releasing rtnl_lock before calling userspace callback and "
-"supporting async requests (default=off):\n"
-"\t\ton    Enable request processing support for bifurcated drivers.\n"
-"\t\t"
-);
-
-module_param(min_scheduling_interval, long, 0644);
-MODULE_PARM_DESC(min_scheduling_interval,
-"KNI thread min scheduling interval (default=100 microseconds)"
-);
-
-module_param(max_scheduling_interval, long, 0644);
-MODULE_PARM_DESC(max_scheduling_interval,
-"KNI thread max scheduling interval (default=200 microseconds)"
-);
diff --git a/kernel/linux/kni/kni_net.c b/kernel/linux/kni/kni_net.c
deleted file mode 100644
index 779ee3451a4c..000000000000
--- a/kernel/linux/kni/kni_net.c
+++ /dev/null
@@ -1,878 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright(c) 2010-2014 Intel Corporation.
- */
-
-/*
- * This code is inspired from the book "Linux Device Drivers" by
- * Alessandro Rubini and Jonathan Corbet, published by O'Reilly & Associates
- */
-
-#include <linux/device.h>
-#include <linux/module.h>
-#include <linux/version.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h> /* eth_type_trans */
-#include <linux/ethtool.h>
-#include <linux/skbuff.h>
-#include <linux/kthread.h>
-#include <linux/delay.h>
-#include <linux/rtnetlink.h>
-
-#include <rte_kni_common.h>
-#include <kni_fifo.h>
-
-#include "compat.h"
-#include "kni_dev.h"
-
-#define WD_TIMEOUT 5 /*jiffies */
-
-#define KNI_WAIT_RESPONSE_TIMEOUT 300 /* 3 seconds */
-
-/* typedef for rx function */
-typedef void (*kni_net_rx_t)(struct kni_dev *kni);
-
-static void kni_net_rx_normal(struct kni_dev *kni);
-
-/* kni rx function pointer, with default to normal rx */
-static kni_net_rx_t kni_net_rx_func = kni_net_rx_normal;
-
-#ifdef HAVE_IOVA_TO_KVA_MAPPING_SUPPORT
-/* iova to kernel virtual address */
-static inline void *
-iova2kva(struct kni_dev *kni, void *iova)
-{
-	return phys_to_virt(iova_to_phys(kni->usr_tsk, (unsigned long)iova));
-}
-
-static inline void *
-iova2data_kva(struct kni_dev *kni, struct rte_kni_mbuf *m)
-{
-	return phys_to_virt(iova_to_phys(kni->usr_tsk, m->buf_iova) +
-			    m->data_off);
-}
-#endif
-
-/* physical address to kernel virtual address */
-static void *
-pa2kva(void *pa)
-{
-	return phys_to_virt((unsigned long)pa);
-}
-
-/* physical address to virtual address */
-static void *
-pa2va(void *pa, struct rte_kni_mbuf *m)
-{
-	void *va;
-
-	va = (void *)((unsigned long)pa +
-			(unsigned long)m->buf_addr -
-			(unsigned long)m->buf_iova);
-	return va;
-}
-
-/* mbuf data kernel virtual address from mbuf kernel virtual address */
-static void *
-kva2data_kva(struct rte_kni_mbuf *m)
-{
-	return phys_to_virt(m->buf_iova + m->data_off);
-}
-
-static inline void *
-get_kva(struct kni_dev *kni, void *pa)
-{
-#ifdef HAVE_IOVA_TO_KVA_MAPPING_SUPPORT
-	if (kni->iova_mode == 1)
-		return iova2kva(kni, pa);
-#endif
-	return pa2kva(pa);
-}
-
-static inline void *
-get_data_kva(struct kni_dev *kni, void *pkt_kva)
-{
-#ifdef HAVE_IOVA_TO_KVA_MAPPING_SUPPORT
-	if (kni->iova_mode == 1)
-		return iova2data_kva(kni, pkt_kva);
-#endif
-	return kva2data_kva(pkt_kva);
-}
-
-/*
- * It can be called to process the request.
- */
-static int
-kni_net_process_request(struct net_device *dev, struct rte_kni_request *req)
-{
-	struct kni_dev *kni = netdev_priv(dev);
-	int ret = -1;
-	void *resp_va;
-	uint32_t num;
-	int ret_val;
-
-	ASSERT_RTNL();
-
-	if (bifurcated_support) {
-		/* If we need to wait and RTNL mutex is held
-		 * drop the mutex and hold reference to keep device
-		 */
-		if (req->async == 0) {
-			dev_hold(dev);
-			rtnl_unlock();
-		}
-	}
-
-	mutex_lock(&kni->sync_lock);
-
-	/* Construct data */
-	memcpy(kni->sync_kva, req, sizeof(struct rte_kni_request));
-	num = kni_fifo_put(kni->req_q, &kni->sync_va, 1);
-	if (num < 1) {
-		pr_err("Cannot send to req_q\n");
-		ret = -EBUSY;
-		goto fail;
-	}
-
-	if (bifurcated_support) {
-		/* No result available since request is handled
-		 * asynchronously. set response to success.
-		 */
-		if (req->async != 0) {
-			req->result = 0;
-			goto async;
-		}
-	}
-
-	ret_val = wait_event_interruptible_timeout(kni->wq,
-			kni_fifo_count(kni->resp_q), 3 * HZ);
-	if (signal_pending(current) || ret_val <= 0) {
-		ret = -ETIME;
-		goto fail;
-	}
-	num = kni_fifo_get(kni->resp_q, (void **)&resp_va, 1);
-	if (num != 1 || resp_va != kni->sync_va) {
-		/* This should never happen */
-		pr_err("No data in resp_q\n");
-		ret = -ENODATA;
-		goto fail;
-	}
-
-	memcpy(req, kni->sync_kva, sizeof(struct rte_kni_request));
-async:
-	ret = 0;
-
-fail:
-	mutex_unlock(&kni->sync_lock);
-	if (bifurcated_support) {
-		if (req->async == 0) {
-			rtnl_lock();
-			dev_put(dev);
-		}
-	}
-	return ret;
-}
-
-/*
- * Open and close
- */
-static int
-kni_net_open(struct net_device *dev)
-{
-	int ret;
-	struct rte_kni_request req;
-
-	netif_start_queue(dev);
-	if (kni_dflt_carrier == 1)
-		netif_carrier_on(dev);
-	else
-		netif_carrier_off(dev);
-
-	memset(&req, 0, sizeof(req));
-	req.req_id = RTE_KNI_REQ_CFG_NETWORK_IF;
-
-	/* Setting if_up to non-zero means up */
-	req.if_up = 1;
-	ret = kni_net_process_request(dev, &req);
-
-	return (ret == 0) ? req.result : ret;
-}
-
-static int
-kni_net_release(struct net_device *dev)
-{
-	int ret;
-	struct rte_kni_request req;
-
-	netif_stop_queue(dev); /* can't transmit any more */
-	netif_carrier_off(dev);
-
-	memset(&req, 0, sizeof(req));
-	req.req_id = RTE_KNI_REQ_CFG_NETWORK_IF;
-
-	/* Setting if_up to 0 means down */
-	req.if_up = 0;
-
-	if (bifurcated_support) {
-		/* request async because of the deadlock problem */
-		req.async = 1;
-	}
-
-	ret = kni_net_process_request(dev, &req);
-
-	return (ret == 0) ? req.result : ret;
-}
-
-static void
-kni_fifo_trans_pa2va(struct kni_dev *kni,
-	struct rte_kni_fifo *src_pa, struct rte_kni_fifo *dst_va)
-{
-	uint32_t ret, i, num_dst, num_rx;
-	struct rte_kni_mbuf *kva, *prev_kva;
-	int nb_segs;
-	int kva_nb_segs;
-
-	do {
-		num_dst = kni_fifo_free_count(dst_va);
-		if (num_dst == 0)
-			return;
-
-		num_rx = min_t(uint32_t, num_dst, MBUF_BURST_SZ);
-
-		num_rx = kni_fifo_get(src_pa, kni->pa, num_rx);
-		if (num_rx == 0)
-			return;
-
-		for (i = 0; i < num_rx; i++) {
-			kva = get_kva(kni, kni->pa[i]);
-			kni->va[i] = pa2va(kni->pa[i], kva);
-
-			kva_nb_segs = kva->nb_segs;
-			for (nb_segs = 0; nb_segs < kva_nb_segs; nb_segs++) {
-				if (!kva->next)
-					break;
-
-				prev_kva = kva;
-				kva = get_kva(kni, kva->next);
-				/* Convert physical address to virtual address */
-				prev_kva->next = pa2va(prev_kva->next, kva);
-			}
-		}
-
-		ret = kni_fifo_put(dst_va, kni->va, num_rx);
-		if (ret != num_rx) {
-			/* Failing should not happen */
-			pr_err("Fail to enqueue entries into dst_va\n");
-			return;
-		}
-	} while (1);
-}
-
-/* Try to release mbufs when kni release */
-void kni_net_release_fifo_phy(struct kni_dev *kni)
-{
-	/* release rx_q first, because it can't release in userspace */
-	kni_fifo_trans_pa2va(kni, kni->rx_q, kni->free_q);
-	/* release alloc_q for speeding up kni release in userspace */
-	kni_fifo_trans_pa2va(kni, kni->alloc_q, kni->free_q);
-}
-
-/*
- * Configuration changes (passed on by ifconfig)
- */
-static int
-kni_net_config(struct net_device *dev, struct ifmap *map)
-{
-	if (dev->flags & IFF_UP) /* can't act on a running interface */
-		return -EBUSY;
-
-	/* ignore other fields */
-	return 0;
-}
-
-/*
- * Transmit a packet (called by the kernel)
- */
-static int
-kni_net_tx(struct sk_buff *skb, struct net_device *dev)
-{
-	int len = 0;
-	uint32_t ret;
-	struct kni_dev *kni = netdev_priv(dev);
-	struct rte_kni_mbuf *pkt_kva = NULL;
-	void *pkt_pa = NULL;
-	void *pkt_va = NULL;
-
-	/* save the timestamp */
-#ifdef HAVE_TRANS_START_HELPER
-	netif_trans_update(dev);
-#else
-	dev->trans_start = jiffies;
-#endif
-
-	/* Check if the length of skb is less than mbuf size */
-	if (skb->len > kni->mbuf_size)
-		goto drop;
-
-	/**
-	 * Check if it has at least one free entry in tx_q and
-	 * one entry in alloc_q.
-	 */
-	if (kni_fifo_free_count(kni->tx_q) == 0 ||
-			kni_fifo_count(kni->alloc_q) == 0) {
-		/**
-		 * If no free entry in tx_q or no entry in alloc_q,
-		 * drops skb and goes out.
-		 */
-		goto drop;
-	}
-
-	/* dequeue a mbuf from alloc_q */
-	ret = kni_fifo_get(kni->alloc_q, &pkt_pa, 1);
-	if (likely(ret == 1)) {
-		void *data_kva;
-
-		pkt_kva = get_kva(kni, pkt_pa);
-		data_kva = get_data_kva(kni, pkt_kva);
-		pkt_va = pa2va(pkt_pa, pkt_kva);
-
-		len = skb->len;
-		memcpy(data_kva, skb->data, len);
-		if (unlikely(len < ETH_ZLEN)) {
-			memset(data_kva + len, 0, ETH_ZLEN - len);
-			len = ETH_ZLEN;
-		}
-		pkt_kva->pkt_len = len;
-		pkt_kva->data_len = len;
-
-		/* enqueue mbuf into tx_q */
-		ret = kni_fifo_put(kni->tx_q, &pkt_va, 1);
-		if (unlikely(ret != 1)) {
-			/* Failing should not happen */
-			pr_err("Fail to enqueue mbuf into tx_q\n");
-			goto drop;
-		}
-	} else {
-		/* Failing should not happen */
-		pr_err("Fail to dequeue mbuf from alloc_q\n");
-		goto drop;
-	}
-
-	/* Free skb and update statistics */
-	dev_kfree_skb(skb);
-	dev->stats.tx_bytes += len;
-	dev->stats.tx_packets++;
-
-	return NETDEV_TX_OK;
-
-drop:
-	/* Free skb and update statistics */
-	dev_kfree_skb(skb);
-	dev->stats.tx_dropped++;
-
-	return NETDEV_TX_OK;
-}
-
-/*
- * RX: normal working mode
- */
-static void
-kni_net_rx_normal(struct kni_dev *kni)
-{
-	uint32_t ret;
-	uint32_t len;
-	uint32_t i, num_rx, num_fq;
-	struct rte_kni_mbuf *kva, *prev_kva;
-	void *data_kva;
-	struct sk_buff *skb;
-	struct net_device *dev = kni->net_dev;
-
-	/* Get the number of free entries in free_q */
-	num_fq = kni_fifo_free_count(kni->free_q);
-	if (num_fq == 0) {
-		/* No room on the free_q, bail out */
-		return;
-	}
-
-	/* Calculate the number of entries to dequeue from rx_q */
-	num_rx = min_t(uint32_t, num_fq, MBUF_BURST_SZ);
-
-	/* Burst dequeue from rx_q */
-	num_rx = kni_fifo_get(kni->rx_q, kni->pa, num_rx);
-	if (num_rx == 0)
-		return;
-
-	/* Transfer received packets to netif */
-	for (i = 0; i < num_rx; i++) {
-		kva = get_kva(kni, kni->pa[i]);
-		len = kva->pkt_len;
-		data_kva = get_data_kva(kni, kva);
-		kni->va[i] = pa2va(kni->pa[i], kva);
-
-		skb = netdev_alloc_skb(dev, len);
-		if (!skb) {
-			/* Update statistics */
-			dev->stats.rx_dropped++;
-			continue;
-		}
-
-		if (kva->nb_segs == 1) {
-			memcpy(skb_put(skb, len), data_kva, len);
-		} else {
-			int nb_segs;
-			int kva_nb_segs = kva->nb_segs;
-
-			for (nb_segs = 0; nb_segs < kva_nb_segs; nb_segs++) {
-				memcpy(skb_put(skb, kva->data_len),
-					data_kva, kva->data_len);
-
-				if (!kva->next)
-					break;
-
-				prev_kva = kva;
-				kva = get_kva(kni, kva->next);
-				data_kva = kva2data_kva(kva);
-				/* Convert physical address to virtual address */
-				prev_kva->next = pa2va(prev_kva->next, kva);
-			}
-		}
-
-		skb->protocol = eth_type_trans(skb, dev);
-		skb->ip_summed = CHECKSUM_UNNECESSARY;
-
-		/* Call netif interface */
-#ifdef HAVE_NETIF_RX_NI
-		netif_rx_ni(skb);
-#else
-		netif_rx(skb);
-#endif
-
-		/* Update statistics */
-		dev->stats.rx_bytes += len;
-		dev->stats.rx_packets++;
-	}
-
-	/* Burst enqueue mbufs into free_q */
-	ret = kni_fifo_put(kni->free_q, kni->va, num_rx);
-	if (ret != num_rx)
-		/* Failing should not happen */
-		pr_err("Fail to enqueue entries into free_q\n");
-}
-
-/*
- * RX: loopback with enqueue/dequeue fifos.
- */
-static void
-kni_net_rx_lo_fifo(struct kni_dev *kni)
-{
-	uint32_t ret;
-	uint32_t len;
-	uint32_t i, num, num_rq, num_tq, num_aq, num_fq;
-	struct rte_kni_mbuf *kva, *next_kva;
-	void *data_kva;
-	struct rte_kni_mbuf *alloc_kva;
-	void *alloc_data_kva;
-	struct net_device *dev = kni->net_dev;
-
-	/* Get the number of entries in rx_q */
-	num_rq = kni_fifo_count(kni->rx_q);
-
-	/* Get the number of free entries in tx_q */
-	num_tq = kni_fifo_free_count(kni->tx_q);
-
-	/* Get the number of entries in alloc_q */
-	num_aq = kni_fifo_count(kni->alloc_q);
-
-	/* Get the number of free entries in free_q */
-	num_fq = kni_fifo_free_count(kni->free_q);
-
-	/* Calculate the number of entries to be dequeued from rx_q */
-	num = min(num_rq, num_tq);
-	num = min(num, num_aq);
-	num = min(num, num_fq);
-	num = min_t(uint32_t, num, MBUF_BURST_SZ);
-
-	/* Return if no entry to dequeue from rx_q */
-	if (num == 0)
-		return;
-
-	/* Burst dequeue from rx_q */
-	ret = kni_fifo_get(kni->rx_q, kni->pa, num);
-	if (ret == 0)
-		return; /* Failing should not happen */
-
-	/* Dequeue entries from alloc_q */
-	ret = kni_fifo_get(kni->alloc_q, kni->alloc_pa, num);
-	if (ret) {
-		num = ret;
-		/* Copy mbufs */
-		for (i = 0; i < num; i++) {
-			kva = get_kva(kni, kni->pa[i]);
-			len = kva->data_len;
-			data_kva = get_data_kva(kni, kva);
-			kni->va[i] = pa2va(kni->pa[i], kva);
-
-			while (kva->next) {
-				next_kva = get_kva(kni, kva->next);
-				/* Convert physical address to virtual address */
-				kva->next = pa2va(kva->next, next_kva);
-				kva = next_kva;
-			}
-
-			alloc_kva = get_kva(kni, kni->alloc_pa[i]);
-			alloc_data_kva = get_data_kva(kni, alloc_kva);
-			kni->alloc_va[i] = pa2va(kni->alloc_pa[i], alloc_kva);
-
-			memcpy(alloc_data_kva, data_kva, len);
-			alloc_kva->pkt_len = len;
-			alloc_kva->data_len = len;
-
-			dev->stats.tx_bytes += len;
-			dev->stats.rx_bytes += len;
-		}
-
-		/* Burst enqueue mbufs into tx_q */
-		ret = kni_fifo_put(kni->tx_q, kni->alloc_va, num);
-		if (ret != num)
-			/* Failing should not happen */
-			pr_err("Fail to enqueue mbufs into tx_q\n");
-	}
-
-	/* Burst enqueue mbufs into free_q */
-	ret = kni_fifo_put(kni->free_q, kni->va, num);
-	if (ret != num)
-		/* Failing should not happen */
-		pr_err("Fail to enqueue mbufs into free_q\n");
-
-	/**
-	 * Update statistic, and enqueue/dequeue failure is impossible,
-	 * as all queues are checked at first.
-	 */
-	dev->stats.tx_packets += num;
-	dev->stats.rx_packets += num;
-}
-
-/*
- * RX: loopback with enqueue/dequeue fifos and sk buffer copies.
- */
-static void
-kni_net_rx_lo_fifo_skb(struct kni_dev *kni)
-{
-	uint32_t ret;
-	uint32_t len;
-	uint32_t i, num_rq, num_fq, num;
-	struct rte_kni_mbuf *kva, *prev_kva;
-	void *data_kva;
-	struct sk_buff *skb;
-	struct net_device *dev = kni->net_dev;
-
-	/* Get the number of entries in rx_q */
-	num_rq = kni_fifo_count(kni->rx_q);
-
-	/* Get the number of free entries in free_q */
-	num_fq = kni_fifo_free_count(kni->free_q);
-
-	/* Calculate the number of entries to dequeue from rx_q */
-	num = min(num_rq, num_fq);
-	num = min_t(uint32_t, num, MBUF_BURST_SZ);
-
-	/* Return if no entry to dequeue from rx_q */
-	if (num == 0)
-		return;
-
-	/* Burst dequeue mbufs from rx_q */
-	ret = kni_fifo_get(kni->rx_q, kni->pa, num);
-	if (ret == 0)
-		return;
-
-	/* Copy mbufs to sk buffer and then call tx interface */
-	for (i = 0; i < num; i++) {
-		kva = get_kva(kni, kni->pa[i]);
-		len = kva->pkt_len;
-		data_kva = get_data_kva(kni, kva);
-		kni->va[i] = pa2va(kni->pa[i], kva);
-
-		skb = netdev_alloc_skb(dev, len);
-		if (skb) {
-			memcpy(skb_put(skb, len), data_kva, len);
-			skb->ip_summed = CHECKSUM_UNNECESSARY;
-			dev_kfree_skb(skb);
-		}
-
-		/* Simulate real usage, allocate/copy skb twice */
-		skb = netdev_alloc_skb(dev, len);
-		if (skb == NULL) {
-			dev->stats.rx_dropped++;
-			continue;
-		}
-
-		if (kva->nb_segs == 1) {
-			memcpy(skb_put(skb, len), data_kva, len);
-		} else {
-			int nb_segs;
-			int kva_nb_segs = kva->nb_segs;
-
-			for (nb_segs = 0; nb_segs < kva_nb_segs; nb_segs++) {
-				memcpy(skb_put(skb, kva->data_len),
-					data_kva, kva->data_len);
-
-				if (!kva->next)
-					break;
-
-				prev_kva = kva;
-				kva = get_kva(kni, kva->next);
-				data_kva = get_data_kva(kni, kva);
-				/* Convert physical address to virtual address */
-				prev_kva->next = pa2va(prev_kva->next, kva);
-			}
-		}
-
-		skb->ip_summed = CHECKSUM_UNNECESSARY;
-
-		dev->stats.rx_bytes += len;
-		dev->stats.rx_packets++;
-
-		/* call tx interface */
-		kni_net_tx(skb, dev);
-	}
-
-	/* enqueue all the mbufs from rx_q into free_q */
-	ret = kni_fifo_put(kni->free_q, kni->va, num);
-	if (ret != num)
-		/* Failing should not happen */
-		pr_err("Fail to enqueue mbufs into free_q\n");
-}
-
-/* rx interface */
-void
-kni_net_rx(struct kni_dev *kni)
-{
-	/**
-	 * It doesn't need to check if it is NULL pointer,
-	 * as it has a default value
-	 */
-	(*kni_net_rx_func)(kni);
-}
-
-/*
- * Deal with a transmit timeout.
- */
-#ifdef HAVE_TX_TIMEOUT_TXQUEUE
-static void
-kni_net_tx_timeout(struct net_device *dev, unsigned int txqueue)
-#else
-static void
-kni_net_tx_timeout(struct net_device *dev)
-#endif
-{
-	pr_debug("Transmit timeout at %ld, latency %ld\n", jiffies,
-			jiffies - dev_trans_start(dev));
-
-	dev->stats.tx_errors++;
-	netif_wake_queue(dev);
-}
-
-static int
-kni_net_change_mtu(struct net_device *dev, int new_mtu)
-{
-	int ret;
-	struct rte_kni_request req;
-
-	pr_debug("kni_net_change_mtu new mtu %d to be set\n", new_mtu);
-
-	memset(&req, 0, sizeof(req));
-	req.req_id = RTE_KNI_REQ_CHANGE_MTU;
-	req.new_mtu = new_mtu;
-	ret = kni_net_process_request(dev, &req);
-	if (ret == 0 && req.result == 0)
-		dev->mtu = new_mtu;
-
-	return (ret == 0) ? req.result : ret;
-}
-
-static void
-kni_net_change_rx_flags(struct net_device *netdev, int flags)
-{
-	struct rte_kni_request req;
-
-	memset(&req, 0, sizeof(req));
-
-	if (flags & IFF_ALLMULTI) {
-		req.req_id = RTE_KNI_REQ_CHANGE_ALLMULTI;
-
-		if (netdev->flags & IFF_ALLMULTI)
-			req.allmulti = 1;
-		else
-			req.allmulti = 0;
-	}
-
-	if (flags & IFF_PROMISC) {
-		req.req_id = RTE_KNI_REQ_CHANGE_PROMISC;
-
-		if (netdev->flags & IFF_PROMISC)
-			req.promiscusity = 1;
-		else
-			req.promiscusity = 0;
-	}
-
-	kni_net_process_request(netdev, &req);
-}
-
-/*
- * Checks if the user space application provided the resp message
- */
-void
-kni_net_poll_resp(struct kni_dev *kni)
-{
-	if (kni_fifo_count(kni->resp_q))
-		wake_up_interruptible(&kni->wq);
-}
-
-/*
- *  Fill the eth header
- */
-static int
-kni_net_header(struct sk_buff *skb, struct net_device *dev,
-		unsigned short type, const void *daddr,
-		const void *saddr, uint32_t len)
-{
-	struct ethhdr *eth = (struct ethhdr *) skb_push(skb, ETH_HLEN);
-
-	memcpy(eth->h_source, saddr ? saddr : dev->dev_addr, dev->addr_len);
-	memcpy(eth->h_dest,   daddr ? daddr : dev->dev_addr, dev->addr_len);
-	eth->h_proto = htons(type);
-
-	return dev->hard_header_len;
-}
-
-/*
- * Re-fill the eth header
- */
-#ifdef HAVE_REBUILD_HEADER
-static int
-kni_net_rebuild_header(struct sk_buff *skb)
-{
-	struct net_device *dev = skb->dev;
-	struct ethhdr *eth = (struct ethhdr *) skb->data;
-
-	memcpy(eth->h_source, dev->dev_addr, dev->addr_len);
-	memcpy(eth->h_dest, dev->dev_addr, dev->addr_len);
-
-	return 0;
-}
-#endif /* < 4.1.0  */
-
-/**
- * kni_net_set_mac - Change the Ethernet Address of the KNI NIC
- * @netdev: network interface device structure
- * @p: pointer to an address structure
- *
- * Returns 0 on success, negative on failure
- **/
-static int
-kni_net_set_mac(struct net_device *netdev, void *p)
-{
-	int ret;
-	struct rte_kni_request req;
-	struct sockaddr *addr = p;
-
-	memset(&req, 0, sizeof(req));
-	req.req_id = RTE_KNI_REQ_CHANGE_MAC_ADDR;
-
-	if (!is_valid_ether_addr((unsigned char *)(addr->sa_data)))
-		return -EADDRNOTAVAIL;
-
-	memcpy(req.mac_addr, addr->sa_data, netdev->addr_len);
-#ifdef HAVE_ETH_HW_ADDR_SET
-	eth_hw_addr_set(netdev, addr->sa_data);
-#else
-	memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
-#endif
-
-	ret = kni_net_process_request(netdev, &req);
-
-	return (ret == 0 ? req.result : ret);
-}
-
-#ifdef HAVE_CHANGE_CARRIER_CB
-static int
-kni_net_change_carrier(struct net_device *dev, bool new_carrier)
-{
-	if (new_carrier)
-		netif_carrier_on(dev);
-	else
-		netif_carrier_off(dev);
-	return 0;
-}
-#endif
-
-static const struct header_ops kni_net_header_ops = {
-	.create  = kni_net_header,
-	.parse   = eth_header_parse,
-#ifdef HAVE_REBUILD_HEADER
-	.rebuild = kni_net_rebuild_header,
-#endif /* < 4.1.0  */
-	.cache   = NULL,  /* disable caching */
-};
-
-static const struct net_device_ops kni_net_netdev_ops = {
-	.ndo_open = kni_net_open,
-	.ndo_stop = kni_net_release,
-	.ndo_set_config = kni_net_config,
-	.ndo_change_rx_flags = kni_net_change_rx_flags,
-	.ndo_start_xmit = kni_net_tx,
-	.ndo_change_mtu = kni_net_change_mtu,
-	.ndo_tx_timeout = kni_net_tx_timeout,
-	.ndo_set_mac_address = kni_net_set_mac,
-#ifdef HAVE_CHANGE_CARRIER_CB
-	.ndo_change_carrier = kni_net_change_carrier,
-#endif
-};
-
-static void kni_get_drvinfo(struct net_device *dev,
-			    struct ethtool_drvinfo *info)
-{
-	strlcpy(info->version, KNI_VERSION, sizeof(info->version));
-	strlcpy(info->driver, "kni", sizeof(info->driver));
-}
-
-static const struct ethtool_ops kni_net_ethtool_ops = {
-	.get_drvinfo	= kni_get_drvinfo,
-	.get_link	= ethtool_op_get_link,
-};
-
-void
-kni_net_init(struct net_device *dev)
-{
-	struct kni_dev *kni = netdev_priv(dev);
-
-	init_waitqueue_head(&kni->wq);
-	mutex_init(&kni->sync_lock);
-
-	ether_setup(dev); /* assign some of the fields */
-	dev->netdev_ops      = &kni_net_netdev_ops;
-	dev->header_ops      = &kni_net_header_ops;
-	dev->ethtool_ops     = &kni_net_ethtool_ops;
-	dev->watchdog_timeo = WD_TIMEOUT;
-}
-
-void
-kni_net_config_lo_mode(char *lo_str)
-{
-	if (!lo_str) {
-		pr_debug("loopback disabled");
-		return;
-	}
-
-	if (!strcmp(lo_str, "lo_mode_none"))
-		pr_debug("loopback disabled");
-	else if (!strcmp(lo_str, "lo_mode_fifo")) {
-		pr_debug("loopback mode=lo_mode_fifo enabled");
-		kni_net_rx_func = kni_net_rx_lo_fifo;
-	} else if (!strcmp(lo_str, "lo_mode_fifo_skb")) {
-		pr_debug("loopback mode=lo_mode_fifo_skb enabled");
-		kni_net_rx_func = kni_net_rx_lo_fifo_skb;
-	} else {
-		pr_debug("Unknown loopback parameter, disabled");
-	}
-}
diff --git a/kernel/linux/kni/meson.build b/kernel/linux/kni/meson.build
deleted file mode 100644
index 4c90069e9989..000000000000
--- a/kernel/linux/kni/meson.build
+++ /dev/null
@@ -1,41 +0,0 @@
-# SPDX-License-Identifier: BSD-3-Clause
-# Copyright(c) 2018 Luca Boccassi <bluca@debian.org>
-
-# For SUSE build check function arguments of ndo_tx_timeout API
-# Ref: https://jira.devtools.intel.com/browse/DPDK-29263
-kmod_cflags = ''
-file_path = kernel_source_dir + '/include/linux/netdevice.h'
-run_cmd = run_command('grep', 'ndo_tx_timeout', file_path, check: false)
-
-if run_cmd.stdout().contains('txqueue') == true
-   kmod_cflags = '-DHAVE_ARG_TX_QUEUE'
-endif
-
-
-kni_mkfile = custom_target('rte_kni_makefile',
-        output: 'Makefile',
-        command: ['touch', '@OUTPUT@'])
-
-kni_sources = files(
-        'kni_misc.c',
-        'kni_net.c',
-        'Kbuild',
-)
-
-custom_target('rte_kni',
-        input: kni_sources,
-        output: 'rte_kni.ko',
-        command: ['make', '-j4', '-C', kernel_build_dir,
-            'M=' + meson.current_build_dir(),
-            'src=' + meson.current_source_dir(),
-            ' '.join(['MODULE_CFLAGS=', kmod_cflags,'-include '])
-            + dpdk_source_root + '/config/rte_config.h' +
-            ' -I' + dpdk_source_root + '/lib/eal/include' +
-            ' -I' + dpdk_source_root + '/lib/kni' +
-            ' -I' + dpdk_build_root +
-            ' -I' + meson.current_source_dir(),
-            'modules'] + cross_args,
-        depends: kni_mkfile,
-        install: install,
-        install_dir: kernel_install_dir,
-        build_by_default: get_option('enable_kmods'))
diff --git a/kernel/linux/meson.build b/kernel/linux/meson.build
index 16a094899446..8d47074621f7 100644
--- a/kernel/linux/meson.build
+++ b/kernel/linux/meson.build
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2018 Intel Corporation
 
-subdirs = ['kni']
+subdirs = []
 
 kernel_build_dir = get_option('kernel_dir')
 kernel_source_dir = get_option('kernel_dir')
diff --git a/lib/eal/common/eal_common_log.c b/lib/eal/common/eal_common_log.c
index bd7b188ceb4a..0a1d219d6924 100644
--- a/lib/eal/common/eal_common_log.c
+++ b/lib/eal/common/eal_common_log.c
@@ -356,7 +356,6 @@ static const struct logtype logtype_strings[] = {
 	{RTE_LOGTYPE_PMD,        "pmd"},
 	{RTE_LOGTYPE_HASH,       "lib.hash"},
 	{RTE_LOGTYPE_LPM,        "lib.lpm"},
-	{RTE_LOGTYPE_KNI,        "lib.kni"},
 	{RTE_LOGTYPE_ACL,        "lib.acl"},
 	{RTE_LOGTYPE_POWER,      "lib.power"},
 	{RTE_LOGTYPE_METER,      "lib.meter"},
diff --git a/lib/eal/include/rte_log.h b/lib/eal/include/rte_log.h
index 6d2b0856a565..bdefff2a5933 100644
--- a/lib/eal/include/rte_log.h
+++ b/lib/eal/include/rte_log.h
@@ -34,7 +34,7 @@ extern "C" {
 #define RTE_LOGTYPE_PMD        5 /**< Log related to poll mode driver. */
 #define RTE_LOGTYPE_HASH       6 /**< Log related to hash table. */
 #define RTE_LOGTYPE_LPM        7 /**< Log related to LPM. */
-#define RTE_LOGTYPE_KNI        8 /**< Log related to KNI. */
+				 /* was RTE_LOGTYPE_KNI */
 #define RTE_LOGTYPE_ACL        9 /**< Log related to ACL. */
 #define RTE_LOGTYPE_POWER     10 /**< Log related to power. */
 #define RTE_LOGTYPE_METER     11 /**< Log related to QoS meter. */
diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c
index c6efd920145c..a1fefcd9d83a 100644
--- a/lib/eal/linux/eal.c
+++ b/lib/eal/linux/eal.c
@@ -1084,11 +1084,6 @@ rte_eal_init(int argc, char **argv)
 				 */
 				iova_mode = RTE_IOVA_VA;
 				RTE_LOG(DEBUG, EAL, "Physical addresses are unavailable, selecting IOVA as VA mode.\n");
-#if defined(RTE_LIB_KNI) && LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0)
-			} else if (rte_eal_check_module("rte_kni") == 1) {
-				iova_mode = RTE_IOVA_PA;
-				RTE_LOG(DEBUG, EAL, "KNI is loaded, selecting IOVA as PA mode for better KNI performance.\n");
-#endif
 			} else if (is_iommu_enabled()) {
 				/* we have an IOMMU, pick IOVA as VA mode */
 				iova_mode = RTE_IOVA_VA;
@@ -1101,20 +1096,6 @@ rte_eal_init(int argc, char **argv)
 				RTE_LOG(DEBUG, EAL, "IOMMU is not available, selecting IOVA as PA mode.\n");
 			}
 		}
-#if defined(RTE_LIB_KNI) && LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0)
-		/* Workaround for KNI which requires physical address to work
-		 * in kernels < 4.10
-		 */
-		if (iova_mode == RTE_IOVA_VA &&
-				rte_eal_check_module("rte_kni") == 1) {
-			if (phys_addrs) {
-				iova_mode = RTE_IOVA_PA;
-				RTE_LOG(WARNING, EAL, "Forcing IOVA as 'PA' because KNI module is loaded\n");
-			} else {
-				RTE_LOG(DEBUG, EAL, "KNI can not work since physical addresses are unavailable\n");
-			}
-		}
-#endif
 		rte_eal_get_configuration()->iova_mode = iova_mode;
 	} else {
 		rte_eal_get_configuration()->iova_mode =
diff --git a/lib/kni/meson.build b/lib/kni/meson.build
deleted file mode 100644
index 5ce410f7f2d2..000000000000
--- a/lib/kni/meson.build
+++ /dev/null
@@ -1,21 +0,0 @@
-# SPDX-License-Identifier: BSD-3-Clause
-# Copyright(c) 2017 Intel Corporation
-
-if is_windows
-    build = false
-    reason = 'not supported on Windows'
-    subdir_done()
-endif
-
-if dpdk_conf.get('RTE_IOVA_IN_MBUF') == 0
-    build = false
-    reason = 'requires IOVA in mbuf (set enable_iova_as_pa option)'
-endif
-
-if not is_linux or not dpdk_conf.get('RTE_ARCH_64')
-    build = false
-    reason = 'only supported on 64-bit Linux'
-endif
-sources = files('rte_kni.c')
-headers = files('rte_kni.h', 'rte_kni_common.h')
-deps += ['ethdev', 'pci']
diff --git a/lib/kni/rte_kni.c b/lib/kni/rte_kni.c
deleted file mode 100644
index bfa6a001ff59..000000000000
--- a/lib/kni/rte_kni.c
+++ /dev/null
@@ -1,843 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2014 Intel Corporation
- */
-
-#ifndef RTE_EXEC_ENV_LINUX
-#error "KNI is not supported"
-#endif
-
-#include <string.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <sys/ioctl.h>
-#include <linux/version.h>
-
-#include <rte_string_fns.h>
-#include <rte_ethdev.h>
-#include <rte_malloc.h>
-#include <rte_log.h>
-#include <rte_kni.h>
-#include <rte_memzone.h>
-#include <rte_tailq.h>
-#include <rte_eal_memconfig.h>
-#include <rte_kni_common.h>
-#include "rte_kni_fifo.h"
-
-#define MAX_MBUF_BURST_NUM            32
-
-/* Maximum number of ring entries */
-#define KNI_FIFO_COUNT_MAX     1024
-#define KNI_FIFO_SIZE          (KNI_FIFO_COUNT_MAX * sizeof(void *) + \
-					sizeof(struct rte_kni_fifo))
-
-#define KNI_REQUEST_MBUF_NUM_MAX      32
-
-#define KNI_MEM_CHECK(cond, fail) do { if (cond) goto fail; } while (0)
-
-#define KNI_MZ_NAME_FMT			"kni_info_%s"
-#define KNI_TX_Q_MZ_NAME_FMT		"kni_tx_%s"
-#define KNI_RX_Q_MZ_NAME_FMT		"kni_rx_%s"
-#define KNI_ALLOC_Q_MZ_NAME_FMT		"kni_alloc_%s"
-#define KNI_FREE_Q_MZ_NAME_FMT		"kni_free_%s"
-#define KNI_REQ_Q_MZ_NAME_FMT		"kni_req_%s"
-#define KNI_RESP_Q_MZ_NAME_FMT		"kni_resp_%s"
-#define KNI_SYNC_ADDR_MZ_NAME_FMT	"kni_sync_%s"
-
-TAILQ_HEAD(rte_kni_list, rte_tailq_entry);
-
-static struct rte_tailq_elem rte_kni_tailq = {
-	.name = "RTE_KNI",
-};
-EAL_REGISTER_TAILQ(rte_kni_tailq)
-
-/**
- * KNI context
- */
-struct rte_kni {
-	char name[RTE_KNI_NAMESIZE];        /**< KNI interface name */
-	uint16_t group_id;                  /**< Group ID of KNI devices */
-	uint32_t slot_id;                   /**< KNI pool slot ID */
-	struct rte_mempool *pktmbuf_pool;   /**< pkt mbuf mempool */
-	unsigned int mbuf_size;                 /**< mbuf size */
-
-	const struct rte_memzone *m_tx_q;   /**< TX queue memzone */
-	const struct rte_memzone *m_rx_q;   /**< RX queue memzone */
-	const struct rte_memzone *m_alloc_q;/**< Alloc queue memzone */
-	const struct rte_memzone *m_free_q; /**< Free queue memzone */
-
-	struct rte_kni_fifo *tx_q;          /**< TX queue */
-	struct rte_kni_fifo *rx_q;          /**< RX queue */
-	struct rte_kni_fifo *alloc_q;       /**< Allocated mbufs queue */
-	struct rte_kni_fifo *free_q;        /**< To be freed mbufs queue */
-
-	const struct rte_memzone *m_req_q;  /**< Request queue memzone */
-	const struct rte_memzone *m_resp_q; /**< Response queue memzone */
-	const struct rte_memzone *m_sync_addr;/**< Sync addr memzone */
-
-	/* For request & response */
-	struct rte_kni_fifo *req_q;         /**< Request queue */
-	struct rte_kni_fifo *resp_q;        /**< Response queue */
-	void *sync_addr;                   /**< Req/Resp Mem address */
-
-	struct rte_kni_ops ops;             /**< operations for request */
-};
-
-enum kni_ops_status {
-	KNI_REQ_NO_REGISTER = 0,
-	KNI_REQ_REGISTERED,
-};
-
-static void kni_free_mbufs(struct rte_kni *kni);
-static void kni_allocate_mbufs(struct rte_kni *kni);
-
-static volatile int kni_fd = -1;
-
-/* Shall be called before any allocation happens */
-int
-rte_kni_init(unsigned int max_kni_ifaces __rte_unused)
-{
-	RTE_LOG(WARNING, KNI, "WARNING: KNI is deprecated and will be removed in DPDK 23.11\n");
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0)
-	if (rte_eal_iova_mode() != RTE_IOVA_PA) {
-		RTE_LOG(ERR, KNI, "KNI requires IOVA as PA\n");
-		return -1;
-	}
-#endif
-
-	/* Check FD and open */
-	if (kni_fd < 0) {
-		kni_fd = open("/dev/" KNI_DEVICE, O_RDWR);
-		if (kni_fd < 0) {
-			RTE_LOG(ERR, KNI,
-				"Can not open /dev/%s\n", KNI_DEVICE);
-			return -1;
-		}
-	}
-
-	return 0;
-}
-
-static struct rte_kni *
-__rte_kni_get(const char *name)
-{
-	struct rte_kni *kni;
-	struct rte_tailq_entry *te;
-	struct rte_kni_list *kni_list;
-
-	kni_list = RTE_TAILQ_CAST(rte_kni_tailq.head, rte_kni_list);
-
-	TAILQ_FOREACH(te, kni_list, next) {
-		kni = te->data;
-		if (strncmp(name, kni->name, RTE_KNI_NAMESIZE) == 0)
-			break;
-	}
-
-	if (te == NULL)
-		kni = NULL;
-
-	return kni;
-}
-
-static int
-kni_reserve_mz(struct rte_kni *kni)
-{
-	char mz_name[RTE_MEMZONE_NAMESIZE];
-
-	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, KNI_TX_Q_MZ_NAME_FMT, kni->name);
-	kni->m_tx_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY,
-			RTE_MEMZONE_IOVA_CONTIG);
-	KNI_MEM_CHECK(kni->m_tx_q == NULL, tx_q_fail);
-
-	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, KNI_RX_Q_MZ_NAME_FMT, kni->name);
-	kni->m_rx_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY,
-			RTE_MEMZONE_IOVA_CONTIG);
-	KNI_MEM_CHECK(kni->m_rx_q == NULL, rx_q_fail);
-
-	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, KNI_ALLOC_Q_MZ_NAME_FMT, kni->name);
-	kni->m_alloc_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY,
-			RTE_MEMZONE_IOVA_CONTIG);
-	KNI_MEM_CHECK(kni->m_alloc_q == NULL, alloc_q_fail);
-
-	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, KNI_FREE_Q_MZ_NAME_FMT, kni->name);
-	kni->m_free_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY,
-			RTE_MEMZONE_IOVA_CONTIG);
-	KNI_MEM_CHECK(kni->m_free_q == NULL, free_q_fail);
-
-	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, KNI_REQ_Q_MZ_NAME_FMT, kni->name);
-	kni->m_req_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY,
-			RTE_MEMZONE_IOVA_CONTIG);
-	KNI_MEM_CHECK(kni->m_req_q == NULL, req_q_fail);
-
-	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, KNI_RESP_Q_MZ_NAME_FMT, kni->name);
-	kni->m_resp_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY,
-			RTE_MEMZONE_IOVA_CONTIG);
-	KNI_MEM_CHECK(kni->m_resp_q == NULL, resp_q_fail);
-
-	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, KNI_SYNC_ADDR_MZ_NAME_FMT, kni->name);
-	kni->m_sync_addr = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY,
-			RTE_MEMZONE_IOVA_CONTIG);
-	KNI_MEM_CHECK(kni->m_sync_addr == NULL, sync_addr_fail);
-
-	return 0;
-
-sync_addr_fail:
-	rte_memzone_free(kni->m_resp_q);
-resp_q_fail:
-	rte_memzone_free(kni->m_req_q);
-req_q_fail:
-	rte_memzone_free(kni->m_free_q);
-free_q_fail:
-	rte_memzone_free(kni->m_alloc_q);
-alloc_q_fail:
-	rte_memzone_free(kni->m_rx_q);
-rx_q_fail:
-	rte_memzone_free(kni->m_tx_q);
-tx_q_fail:
-	return -1;
-}
-
-static void
-kni_release_mz(struct rte_kni *kni)
-{
-	rte_memzone_free(kni->m_tx_q);
-	rte_memzone_free(kni->m_rx_q);
-	rte_memzone_free(kni->m_alloc_q);
-	rte_memzone_free(kni->m_free_q);
-	rte_memzone_free(kni->m_req_q);
-	rte_memzone_free(kni->m_resp_q);
-	rte_memzone_free(kni->m_sync_addr);
-}
-
-struct rte_kni *
-rte_kni_alloc(struct rte_mempool *pktmbuf_pool,
-	      const struct rte_kni_conf *conf,
-	      struct rte_kni_ops *ops)
-{
-	int ret;
-	struct rte_kni_device_info dev_info;
-	struct rte_kni *kni;
-	struct rte_tailq_entry *te;
-	struct rte_kni_list *kni_list;
-
-	if (!pktmbuf_pool || !conf || !conf->name[0])
-		return NULL;
-
-	/* Check if KNI subsystem has been initialized */
-	if (kni_fd < 0) {
-		RTE_LOG(ERR, KNI, "KNI subsystem has not been initialized. Invoke rte_kni_init() first\n");
-		return NULL;
-	}
-
-	rte_mcfg_tailq_write_lock();
-
-	kni = __rte_kni_get(conf->name);
-	if (kni != NULL) {
-		RTE_LOG(ERR, KNI, "KNI already exists\n");
-		goto unlock;
-	}
-
-	te = rte_zmalloc("KNI_TAILQ_ENTRY", sizeof(*te), 0);
-	if (te == NULL) {
-		RTE_LOG(ERR, KNI, "Failed to allocate tailq entry\n");
-		goto unlock;
-	}
-
-	kni = rte_zmalloc("KNI", sizeof(struct rte_kni), RTE_CACHE_LINE_SIZE);
-	if (kni == NULL) {
-		RTE_LOG(ERR, KNI, "KNI memory allocation failed\n");
-		goto kni_fail;
-	}
-
-	strlcpy(kni->name, conf->name, RTE_KNI_NAMESIZE);
-
-	if (ops)
-		memcpy(&kni->ops, ops, sizeof(struct rte_kni_ops));
-	else
-		kni->ops.port_id = UINT16_MAX;
-
-	memset(&dev_info, 0, sizeof(dev_info));
-	dev_info.core_id = conf->core_id;
-	dev_info.force_bind = conf->force_bind;
-	dev_info.group_id = conf->group_id;
-	dev_info.mbuf_size = conf->mbuf_size;
-	dev_info.mtu = conf->mtu;
-	dev_info.min_mtu = conf->min_mtu;
-	dev_info.max_mtu = conf->max_mtu;
-
-	memcpy(dev_info.mac_addr, conf->mac_addr, RTE_ETHER_ADDR_LEN);
-
-	strlcpy(dev_info.name, conf->name, RTE_KNI_NAMESIZE);
-
-	ret = kni_reserve_mz(kni);
-	if (ret < 0)
-		goto mz_fail;
-
-	/* TX RING */
-	kni->tx_q = kni->m_tx_q->addr;
-	kni_fifo_init(kni->tx_q, KNI_FIFO_COUNT_MAX);
-	dev_info.tx_phys = kni->m_tx_q->iova;
-
-	/* RX RING */
-	kni->rx_q = kni->m_rx_q->addr;
-	kni_fifo_init(kni->rx_q, KNI_FIFO_COUNT_MAX);
-	dev_info.rx_phys = kni->m_rx_q->iova;
-
-	/* ALLOC RING */
-	kni->alloc_q = kni->m_alloc_q->addr;
-	kni_fifo_init(kni->alloc_q, KNI_FIFO_COUNT_MAX);
-	dev_info.alloc_phys = kni->m_alloc_q->iova;
-
-	/* FREE RING */
-	kni->free_q = kni->m_free_q->addr;
-	kni_fifo_init(kni->free_q, KNI_FIFO_COUNT_MAX);
-	dev_info.free_phys = kni->m_free_q->iova;
-
-	/* Request RING */
-	kni->req_q = kni->m_req_q->addr;
-	kni_fifo_init(kni->req_q, KNI_FIFO_COUNT_MAX);
-	dev_info.req_phys = kni->m_req_q->iova;
-
-	/* Response RING */
-	kni->resp_q = kni->m_resp_q->addr;
-	kni_fifo_init(kni->resp_q, KNI_FIFO_COUNT_MAX);
-	dev_info.resp_phys = kni->m_resp_q->iova;
-
-	/* Req/Resp sync mem area */
-	kni->sync_addr = kni->m_sync_addr->addr;
-	dev_info.sync_va = kni->m_sync_addr->addr;
-	dev_info.sync_phys = kni->m_sync_addr->iova;
-
-	kni->pktmbuf_pool = pktmbuf_pool;
-	kni->group_id = conf->group_id;
-	kni->mbuf_size = conf->mbuf_size;
-
-	dev_info.iova_mode = (rte_eal_iova_mode() == RTE_IOVA_VA) ? 1 : 0;
-
-	ret = ioctl(kni_fd, RTE_KNI_IOCTL_CREATE, &dev_info);
-	if (ret < 0)
-		goto ioctl_fail;
-
-	te->data = kni;
-
-	kni_list = RTE_TAILQ_CAST(rte_kni_tailq.head, rte_kni_list);
-	TAILQ_INSERT_TAIL(kni_list, te, next);
-
-	rte_mcfg_tailq_write_unlock();
-
-	/* Allocate mbufs and then put them into alloc_q */
-	kni_allocate_mbufs(kni);
-
-	return kni;
-
-ioctl_fail:
-	kni_release_mz(kni);
-mz_fail:
-	rte_free(kni);
-kni_fail:
-	rte_free(te);
-unlock:
-	rte_mcfg_tailq_write_unlock();
-
-	return NULL;
-}
-
-static void
-kni_free_fifo(struct rte_kni_fifo *fifo)
-{
-	int ret;
-	struct rte_mbuf *pkt;
-
-	do {
-		ret = kni_fifo_get(fifo, (void **)&pkt, 1);
-		if (ret)
-			rte_pktmbuf_free(pkt);
-	} while (ret);
-}
-
-static void *
-va2pa(struct rte_mbuf *m)
-{
-	return (void *)((unsigned long)m -
-			((unsigned long)m->buf_addr - (unsigned long)rte_mbuf_iova_get(m)));
-}
-
-static void *
-va2pa_all(struct rte_mbuf *mbuf)
-{
-	void *phy_mbuf = va2pa(mbuf);
-	struct rte_mbuf *next = mbuf->next;
-	while (next) {
-		mbuf->next = va2pa(next);
-		mbuf = next;
-		next = mbuf->next;
-	}
-	return phy_mbuf;
-}
-
-static void
-obj_free(struct rte_mempool *mp __rte_unused, void *opaque, void *obj,
-		unsigned obj_idx __rte_unused)
-{
-	struct rte_mbuf *m = obj;
-	void *mbuf_phys = opaque;
-
-	if (va2pa(m) == mbuf_phys)
-		rte_pktmbuf_free(m);
-}
-
-static void
-kni_free_fifo_phy(struct rte_mempool *mp, struct rte_kni_fifo *fifo)
-{
-	void *mbuf_phys;
-	int ret;
-
-	do {
-		ret = kni_fifo_get(fifo, &mbuf_phys, 1);
-		if (ret)
-			rte_mempool_obj_iter(mp, obj_free, mbuf_phys);
-	} while (ret);
-}
-
-int
-rte_kni_release(struct rte_kni *kni)
-{
-	struct rte_tailq_entry *te;
-	struct rte_kni_list *kni_list;
-	struct rte_kni_device_info dev_info;
-	uint32_t retry = 5;
-
-	if (!kni)
-		return -1;
-
-	kni_list = RTE_TAILQ_CAST(rte_kni_tailq.head, rte_kni_list);
-
-	rte_mcfg_tailq_write_lock();
-
-	TAILQ_FOREACH(te, kni_list, next) {
-		if (te->data == kni)
-			break;
-	}
-
-	if (te == NULL)
-		goto unlock;
-
-	strlcpy(dev_info.name, kni->name, sizeof(dev_info.name));
-	if (ioctl(kni_fd, RTE_KNI_IOCTL_RELEASE, &dev_info) < 0) {
-		RTE_LOG(ERR, KNI, "Fail to release kni device\n");
-		goto unlock;
-	}
-
-	TAILQ_REMOVE(kni_list, te, next);
-
-	rte_mcfg_tailq_write_unlock();
-
-	/* mbufs in all fifo should be released, except request/response */
-
-	/* wait until all rxq packets processed by kernel */
-	while (kni_fifo_count(kni->rx_q) && retry--)
-		usleep(1000);
-
-	if (kni_fifo_count(kni->rx_q))
-		RTE_LOG(ERR, KNI, "Fail to free all Rx-q items\n");
-
-	kni_free_fifo_phy(kni->pktmbuf_pool, kni->alloc_q);
-	kni_free_fifo(kni->tx_q);
-	kni_free_fifo(kni->free_q);
-
-	kni_release_mz(kni);
-
-	rte_free(kni);
-
-	rte_free(te);
-
-	return 0;
-
-unlock:
-	rte_mcfg_tailq_write_unlock();
-
-	return -1;
-}
-
-/* default callback for request of configuring device mac address */
-static int
-kni_config_mac_address(uint16_t port_id, uint8_t mac_addr[])
-{
-	int ret = 0;
-
-	if (!rte_eth_dev_is_valid_port(port_id)) {
-		RTE_LOG(ERR, KNI, "Invalid port id %d\n", port_id);
-		return -EINVAL;
-	}
-
-	RTE_LOG(INFO, KNI, "Configure mac address of %d", port_id);
-
-	ret = rte_eth_dev_default_mac_addr_set(port_id,
-					(struct rte_ether_addr *)mac_addr);
-	if (ret < 0)
-		RTE_LOG(ERR, KNI, "Failed to config mac_addr for port %d\n",
-			port_id);
-
-	return ret;
-}
-
-/* default callback for request of configuring promiscuous mode */
-static int
-kni_config_promiscusity(uint16_t port_id, uint8_t to_on)
-{
-	int ret;
-
-	if (!rte_eth_dev_is_valid_port(port_id)) {
-		RTE_LOG(ERR, KNI, "Invalid port id %d\n", port_id);
-		return -EINVAL;
-	}
-
-	RTE_LOG(INFO, KNI, "Configure promiscuous mode of %d to %d\n",
-		port_id, to_on);
-
-	if (to_on)
-		ret = rte_eth_promiscuous_enable(port_id);
-	else
-		ret = rte_eth_promiscuous_disable(port_id);
-
-	if (ret != 0)
-		RTE_LOG(ERR, KNI,
-			"Failed to %s promiscuous mode for port %u: %s\n",
-			to_on ? "enable" : "disable", port_id,
-			rte_strerror(-ret));
-
-	return ret;
-}
-
-/* default callback for request of configuring allmulticast mode */
-static int
-kni_config_allmulticast(uint16_t port_id, uint8_t to_on)
-{
-	int ret;
-
-	if (!rte_eth_dev_is_valid_port(port_id)) {
-		RTE_LOG(ERR, KNI, "Invalid port id %d\n", port_id);
-		return -EINVAL;
-	}
-
-	RTE_LOG(INFO, KNI, "Configure allmulticast mode of %d to %d\n",
-		port_id, to_on);
-
-	if (to_on)
-		ret = rte_eth_allmulticast_enable(port_id);
-	else
-		ret = rte_eth_allmulticast_disable(port_id);
-	if (ret != 0)
-		RTE_LOG(ERR, KNI,
-			"Failed to %s allmulticast mode for port %u: %s\n",
-			to_on ? "enable" : "disable", port_id,
-			rte_strerror(-ret));
-
-	return ret;
-}
-
-int
-rte_kni_handle_request(struct rte_kni *kni)
-{
-	unsigned int ret;
-	struct rte_kni_request *req = NULL;
-
-	if (kni == NULL)
-		return -1;
-
-	/* Get request mbuf */
-	ret = kni_fifo_get(kni->req_q, (void **)&req, 1);
-	if (ret != 1)
-		return 0; /* It is OK of can not getting the request mbuf */
-
-	if (req != kni->sync_addr) {
-		RTE_LOG(ERR, KNI, "Wrong req pointer %p\n", req);
-		return -1;
-	}
-
-	/* Analyze the request and call the relevant actions for it */
-	switch (req->req_id) {
-	case RTE_KNI_REQ_CHANGE_MTU: /* Change MTU */
-		if (kni->ops.change_mtu)
-			req->result = kni->ops.change_mtu(kni->ops.port_id,
-							req->new_mtu);
-		break;
-	case RTE_KNI_REQ_CFG_NETWORK_IF: /* Set network interface up/down */
-		if (kni->ops.config_network_if)
-			req->result = kni->ops.config_network_if(kni->ops.port_id,
-								 req->if_up);
-		break;
-	case RTE_KNI_REQ_CHANGE_MAC_ADDR: /* Change MAC Address */
-		if (kni->ops.config_mac_address)
-			req->result = kni->ops.config_mac_address(
-					kni->ops.port_id, req->mac_addr);
-		else if (kni->ops.port_id != UINT16_MAX)
-			req->result = kni_config_mac_address(
-					kni->ops.port_id, req->mac_addr);
-		break;
-	case RTE_KNI_REQ_CHANGE_PROMISC: /* Change PROMISCUOUS MODE */
-		if (kni->ops.config_promiscusity)
-			req->result = kni->ops.config_promiscusity(
-					kni->ops.port_id, req->promiscusity);
-		else if (kni->ops.port_id != UINT16_MAX)
-			req->result = kni_config_promiscusity(
-					kni->ops.port_id, req->promiscusity);
-		break;
-	case RTE_KNI_REQ_CHANGE_ALLMULTI: /* Change ALLMULTICAST MODE */
-		if (kni->ops.config_allmulticast)
-			req->result = kni->ops.config_allmulticast(
-					kni->ops.port_id, req->allmulti);
-		else if (kni->ops.port_id != UINT16_MAX)
-			req->result = kni_config_allmulticast(
-					kni->ops.port_id, req->allmulti);
-		break;
-	default:
-		RTE_LOG(ERR, KNI, "Unknown request id %u\n", req->req_id);
-		req->result = -EINVAL;
-		break;
-	}
-
-	/* if needed, construct response buffer and put it back to resp_q */
-	if (!req->async)
-		ret = kni_fifo_put(kni->resp_q, (void **)&req, 1);
-	else
-		ret = 1;
-	if (ret != 1) {
-		RTE_LOG(ERR, KNI, "Fail to put the muf back to resp_q\n");
-		return -1; /* It is an error of can't putting the mbuf back */
-	}
-
-	return 0;
-}
-
-unsigned
-rte_kni_tx_burst(struct rte_kni *kni, struct rte_mbuf **mbufs, unsigned int num)
-{
-	num = RTE_MIN(kni_fifo_free_count(kni->rx_q), num);
-	void *phy_mbufs[num];
-	unsigned int ret;
-	unsigned int i;
-
-	for (i = 0; i < num; i++)
-		phy_mbufs[i] = va2pa_all(mbufs[i]);
-
-	ret = kni_fifo_put(kni->rx_q, phy_mbufs, num);
-
-	/* Get mbufs from free_q and then free them */
-	kni_free_mbufs(kni);
-
-	return ret;
-}
-
-unsigned
-rte_kni_rx_burst(struct rte_kni *kni, struct rte_mbuf **mbufs, unsigned int num)
-{
-	unsigned int ret = kni_fifo_get(kni->tx_q, (void **)mbufs, num);
-
-	/* If buffers removed or alloc_q is empty, allocate mbufs and then put them into alloc_q */
-	if (ret || (kni_fifo_count(kni->alloc_q) == 0))
-		kni_allocate_mbufs(kni);
-
-	return ret;
-}
-
-static void
-kni_free_mbufs(struct rte_kni *kni)
-{
-	int i, ret;
-	struct rte_mbuf *pkts[MAX_MBUF_BURST_NUM];
-
-	ret = kni_fifo_get(kni->free_q, (void **)pkts, MAX_MBUF_BURST_NUM);
-	if (likely(ret > 0)) {
-		for (i = 0; i < ret; i++)
-			rte_pktmbuf_free(pkts[i]);
-	}
-}
-
-static void
-kni_allocate_mbufs(struct rte_kni *kni)
-{
-	int i, ret;
-	struct rte_mbuf *pkts[MAX_MBUF_BURST_NUM];
-	void *phys[MAX_MBUF_BURST_NUM];
-	int allocq_free;
-
-	RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, pool) !=
-			 offsetof(struct rte_kni_mbuf, pool));
-	RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, buf_addr) !=
-			 offsetof(struct rte_kni_mbuf, buf_addr));
-	RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, next) !=
-			 offsetof(struct rte_kni_mbuf, next));
-	RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, data_off) !=
-			 offsetof(struct rte_kni_mbuf, data_off));
-	RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, data_len) !=
-			 offsetof(struct rte_kni_mbuf, data_len));
-	RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, pkt_len) !=
-			 offsetof(struct rte_kni_mbuf, pkt_len));
-	RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, ol_flags) !=
-			 offsetof(struct rte_kni_mbuf, ol_flags));
-
-	/* Check if pktmbuf pool has been configured */
-	if (kni->pktmbuf_pool == NULL) {
-		RTE_LOG(ERR, KNI, "No valid mempool for allocating mbufs\n");
-		return;
-	}
-
-	allocq_free = kni_fifo_free_count(kni->alloc_q);
-	allocq_free = (allocq_free > MAX_MBUF_BURST_NUM) ?
-		MAX_MBUF_BURST_NUM : allocq_free;
-	for (i = 0; i < allocq_free; i++) {
-		pkts[i] = rte_pktmbuf_alloc(kni->pktmbuf_pool);
-		if (unlikely(pkts[i] == NULL)) {
-			/* Out of memory */
-			RTE_LOG(ERR, KNI, "Out of memory\n");
-			break;
-		}
-		phys[i] = va2pa(pkts[i]);
-	}
-
-	/* No pkt mbuf allocated */
-	if (i <= 0)
-		return;
-
-	ret = kni_fifo_put(kni->alloc_q, phys, i);
-
-	/* Check if any mbufs not put into alloc_q, and then free them */
-	if (ret >= 0 && ret < i && ret < MAX_MBUF_BURST_NUM) {
-		int j;
-
-		for (j = ret; j < i; j++)
-			rte_pktmbuf_free(pkts[j]);
-	}
-}
-
-struct rte_kni *
-rte_kni_get(const char *name)
-{
-	struct rte_kni *kni;
-
-	if (name == NULL || name[0] == '\0')
-		return NULL;
-
-	rte_mcfg_tailq_read_lock();
-
-	kni = __rte_kni_get(name);
-
-	rte_mcfg_tailq_read_unlock();
-
-	return kni;
-}
-
-const char *
-rte_kni_get_name(const struct rte_kni *kni)
-{
-	return kni->name;
-}
-
-static enum kni_ops_status
-kni_check_request_register(struct rte_kni_ops *ops)
-{
-	/* check if KNI request ops has been registered*/
-	if (ops == NULL)
-		return KNI_REQ_NO_REGISTER;
-
-	if (ops->change_mtu == NULL
-	    && ops->config_network_if == NULL
-	    && ops->config_mac_address == NULL
-	    && ops->config_promiscusity == NULL
-	    && ops->config_allmulticast == NULL)
-		return KNI_REQ_NO_REGISTER;
-
-	return KNI_REQ_REGISTERED;
-}
-
-int
-rte_kni_register_handlers(struct rte_kni *kni, struct rte_kni_ops *ops)
-{
-	enum kni_ops_status req_status;
-
-	if (ops == NULL) {
-		RTE_LOG(ERR, KNI, "Invalid KNI request operation.\n");
-		return -1;
-	}
-
-	if (kni == NULL) {
-		RTE_LOG(ERR, KNI, "Invalid kni info.\n");
-		return -1;
-	}
-
-	req_status = kni_check_request_register(&kni->ops);
-	if (req_status == KNI_REQ_REGISTERED) {
-		RTE_LOG(ERR, KNI, "The KNI request operation has already registered.\n");
-		return -1;
-	}
-
-	memcpy(&kni->ops, ops, sizeof(struct rte_kni_ops));
-	return 0;
-}
-
-int
-rte_kni_unregister_handlers(struct rte_kni *kni)
-{
-	if (kni == NULL) {
-		RTE_LOG(ERR, KNI, "Invalid kni info.\n");
-		return -1;
-	}
-
-	memset(&kni->ops, 0, sizeof(struct rte_kni_ops));
-
-	return 0;
-}
-
-int
-rte_kni_update_link(struct rte_kni *kni, unsigned int linkup)
-{
-	char path[64];
-	char old_carrier[2];
-	const char *new_carrier;
-	int old_linkup;
-	int fd, ret;
-
-	if (kni == NULL)
-		return -1;
-
-	snprintf(path, sizeof(path), "/sys/devices/virtual/net/%s/carrier",
-		kni->name);
-
-	fd = open(path, O_RDWR);
-	if (fd == -1) {
-		RTE_LOG(ERR, KNI, "Failed to open file: %s.\n", path);
-		return -1;
-	}
-
-	ret = read(fd, old_carrier, 2);
-	if (ret < 1) {
-		close(fd);
-		return -1;
-	}
-	old_linkup = (old_carrier[0] == '1');
-
-	if (old_linkup == (int)linkup)
-		goto out;
-
-	new_carrier = linkup ? "1" : "0";
-	ret = write(fd, new_carrier, 1);
-	if (ret < 1) {
-		RTE_LOG(ERR, KNI, "Failed to write file: %s.\n", path);
-		close(fd);
-		return -1;
-	}
-out:
-	close(fd);
-	return old_linkup;
-}
-
-void
-rte_kni_close(void)
-{
-	if (kni_fd < 0)
-		return;
-
-	close(kni_fd);
-	kni_fd = -1;
-}
diff --git a/lib/kni/rte_kni.h b/lib/kni/rte_kni.h
deleted file mode 100644
index 1e508acc829b..000000000000
--- a/lib/kni/rte_kni.h
+++ /dev/null
@@ -1,269 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2014 Intel Corporation
- */
-
-#ifndef _RTE_KNI_H_
-#define _RTE_KNI_H_
-
-/**
- * @file
- * RTE KNI
- *
- * The KNI library provides the ability to create and destroy kernel NIC
- * interfaces that may be used by the RTE application to receive/transmit
- * packets from/to Linux kernel net interfaces.
- *
- * This library provides two APIs to burst receive packets from KNI interfaces,
- * and burst transmit packets to KNI interfaces.
- */
-
-#include <rte_compat.h>
-#include <rte_pci.h>
-#include <rte_ether.h>
-
-#include <rte_kni_common.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct rte_kni;
-struct rte_mbuf;
-
-/**
- * Structure which has the function pointers for KNI interface.
- */
-struct rte_kni_ops {
-	uint16_t port_id; /* Port ID */
-
-	/* Pointer to function of changing MTU */
-	int (*change_mtu)(uint16_t port_id, unsigned int new_mtu);
-
-	/* Pointer to function of configuring network interface */
-	int (*config_network_if)(uint16_t port_id, uint8_t if_up);
-
-	/* Pointer to function of configuring mac address */
-	int (*config_mac_address)(uint16_t port_id, uint8_t mac_addr[]);
-
-	/* Pointer to function of configuring promiscuous mode */
-	int (*config_promiscusity)(uint16_t port_id, uint8_t to_on);
-
-	/* Pointer to function of configuring allmulticast mode */
-	int (*config_allmulticast)(uint16_t port_id, uint8_t to_on);
-};
-
-/**
- * Structure for configuring KNI device.
- */
-struct rte_kni_conf {
-	/*
-	 * KNI name which will be used in relevant network device.
-	 * Let the name as short as possible, as it will be part of
-	 * memzone name.
-	 */
-	char name[RTE_KNI_NAMESIZE];
-	uint32_t core_id;   /* Core ID to bind kernel thread on */
-	uint16_t group_id;  /* Group ID */
-	unsigned mbuf_size; /* mbuf size */
-	struct rte_pci_addr addr; /* deprecated */
-	struct rte_pci_id id; /* deprecated */
-
-	__extension__
-	uint8_t force_bind : 1; /* Flag to bind kernel thread */
-	uint8_t mac_addr[RTE_ETHER_ADDR_LEN]; /* MAC address assigned to KNI */
-	uint16_t mtu;
-	uint16_t min_mtu;
-	uint16_t max_mtu;
-};
-
-/**
- * Initialize and preallocate KNI subsystem
- *
- * This function is to be executed on the main lcore only, after EAL
- * initialization and before any KNI interface is attempted to be
- * allocated
- *
- * @param max_kni_ifaces
- *  The maximum number of KNI interfaces that can coexist concurrently
- *
- * @return
- *  - 0 indicates success.
- *  - negative value indicates failure.
- */
-int rte_kni_init(unsigned int max_kni_ifaces);
-
-
-/**
- * Allocate KNI interface according to the port id, mbuf size, mbuf pool,
- * configurations and callbacks for kernel requests.The KNI interface created
- * in the kernel space is the net interface the traditional Linux application
- * talking to.
- *
- * The rte_kni_alloc shall not be called before rte_kni_init() has been
- * called. rte_kni_alloc is thread safe.
- *
- * The mempool should have capacity of more than "2 x KNI_FIFO_COUNT_MAX"
- * elements for each KNI interface allocated.
- *
- * @param pktmbuf_pool
- *  The mempool for allocating mbufs for packets.
- * @param conf
- *  The pointer to the configurations of the KNI device.
- * @param ops
- *  The pointer to the callbacks for the KNI kernel requests.
- *
- * @return
- *  - The pointer to the context of a KNI interface.
- *  - NULL indicate error.
- */
-struct rte_kni *rte_kni_alloc(struct rte_mempool *pktmbuf_pool,
-		const struct rte_kni_conf *conf, struct rte_kni_ops *ops);
-
-/**
- * Release KNI interface according to the context. It will also release the
- * paired KNI interface in kernel space. All processing on the specific KNI
- * context need to be stopped before calling this interface.
- *
- * rte_kni_release is thread safe.
- *
- * @param kni
- *  The pointer to the context of an existent KNI interface.
- *
- * @return
- *  - 0 indicates success.
- *  - negative value indicates failure.
- */
-int rte_kni_release(struct rte_kni *kni);
-
-/**
- * It is used to handle the request mbufs sent from kernel space.
- * Then analyzes it and calls the specific actions for the specific requests.
- * Finally constructs the response mbuf and puts it back to the resp_q.
- *
- * @param kni
- *  The pointer to the context of an existent KNI interface.
- *
- * @return
- *  - 0
- *  - negative value indicates failure.
- */
-int rte_kni_handle_request(struct rte_kni *kni);
-
-/**
- * Retrieve a burst of packets from a KNI interface. The retrieved packets are
- * stored in rte_mbuf structures whose pointers are supplied in the array of
- * mbufs, and the maximum number is indicated by num. It handles allocating
- * the mbufs for KNI interface alloc queue.
- *
- * @param kni
- *  The KNI interface context.
- * @param mbufs
- *  The array to store the pointers of mbufs.
- * @param num
- *  The maximum number per burst.
- *
- * @return
- *  The actual number of packets retrieved.
- */
-unsigned rte_kni_rx_burst(struct rte_kni *kni, struct rte_mbuf **mbufs,
-		unsigned num);
-
-/**
- * Send a burst of packets to a KNI interface. The packets to be sent out are
- * stored in rte_mbuf structures whose pointers are supplied in the array of
- * mbufs, and the maximum number is indicated by num. It handles the freeing of
- * the mbufs in the free queue of KNI interface.
- *
- * @param kni
- *  The KNI interface context.
- * @param mbufs
- *  The array to store the pointers of mbufs.
- * @param num
- *  The maximum number per burst.
- *
- * @return
- *  The actual number of packets sent.
- */
-unsigned rte_kni_tx_burst(struct rte_kni *kni, struct rte_mbuf **mbufs,
-		unsigned num);
-
-/**
- * Get the KNI context of its name.
- *
- * @param name
- *  pointer to the KNI device name.
- *
- * @return
- *  On success: Pointer to KNI interface.
- *  On failure: NULL.
- */
-struct rte_kni *rte_kni_get(const char *name);
-
-/**
- * Get the name given to a KNI device
- *
- * @param kni
- *   The KNI instance to query
- * @return
- *   The pointer to the KNI name
- */
-const char *rte_kni_get_name(const struct rte_kni *kni);
-
-/**
- * Register KNI request handling for a specified port,and it can
- * be called by primary process or secondary process.
- *
- * @param kni
- *  pointer to struct rte_kni.
- * @param ops
- *  pointer to struct rte_kni_ops.
- *
- * @return
- *  On success: 0
- *  On failure: -1
- */
-int rte_kni_register_handlers(struct rte_kni *kni, struct rte_kni_ops *ops);
-
-/**
- *  Unregister KNI request handling for a specified port.
- *
- *  @param kni
- *   pointer to struct rte_kni.
- *
- *  @return
- *   On success: 0
- *   On failure: -1
- */
-int rte_kni_unregister_handlers(struct rte_kni *kni);
-
-/**
- * Update link carrier state for KNI port.
- *
- * Update the linkup/linkdown state of a KNI interface in the kernel.
- *
- * @param kni
- *  pointer to struct rte_kni.
- * @param linkup
- *  New link state:
- *  0 for linkdown.
- *  > 0 for linkup.
- *
- * @return
- *  On failure: -1
- *  Previous link state == linkdown: 0
- *  Previous link state == linkup: 1
- */
-__rte_experimental
-int
-rte_kni_update_link(struct rte_kni *kni, unsigned int linkup);
-
-/**
- *  Close KNI device.
- */
-void rte_kni_close(void);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _RTE_KNI_H_ */
diff --git a/lib/kni/rte_kni_common.h b/lib/kni/rte_kni_common.h
deleted file mode 100644
index 8d3ee0fa4fc2..000000000000
--- a/lib/kni/rte_kni_common.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/* SPDX-License-Identifier: (BSD-3-Clause OR LGPL-2.1) */
-/*
- * Copyright(c) 2007-2014 Intel Corporation.
- */
-
-#ifndef _RTE_KNI_COMMON_H_
-#define _RTE_KNI_COMMON_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef __KERNEL__
-#include <linux/if.h>
-#include <asm/barrier.h>
-#define RTE_STD_C11
-#else
-#include <rte_common.h>
-#include <rte_config.h>
-#endif
-
-/*
- * KNI name is part of memzone name. Must not exceed IFNAMSIZ.
- */
-#define RTE_KNI_NAMESIZE 16
-
-#define RTE_CACHE_LINE_MIN_SIZE 64
-
-/*
- * Request id.
- */
-enum rte_kni_req_id {
-	RTE_KNI_REQ_UNKNOWN = 0,
-	RTE_KNI_REQ_CHANGE_MTU,
-	RTE_KNI_REQ_CFG_NETWORK_IF,
-	RTE_KNI_REQ_CHANGE_MAC_ADDR,
-	RTE_KNI_REQ_CHANGE_PROMISC,
-	RTE_KNI_REQ_CHANGE_ALLMULTI,
-	RTE_KNI_REQ_MAX,
-};
-
-/*
- * Structure for KNI request.
- */
-struct rte_kni_request {
-	uint32_t req_id;             /**< Request id */
-	RTE_STD_C11
-	union {
-		uint32_t new_mtu;    /**< New MTU */
-		uint8_t if_up;       /**< 1: interface up, 0: interface down */
-		uint8_t mac_addr[6]; /**< MAC address for interface */
-		uint8_t promiscusity;/**< 1: promisc mode enable, 0: disable */
-		uint8_t allmulti;    /**< 1: all-multicast mode enable, 0: disable */
-	};
-	int32_t async : 1;            /**< 1: request is asynchronous */
-	int32_t result;               /**< Result for processing request */
-} __attribute__((__packed__));
-
-/*
- * Fifo struct mapped in a shared memory. It describes a circular buffer FIFO
- * Write and read should wrap around. Fifo is empty when write == read
- * Writing should never overwrite the read position
- */
-struct rte_kni_fifo {
-#ifdef RTE_USE_C11_MEM_MODEL
-	unsigned write;              /**< Next position to be written*/
-	unsigned read;               /**< Next position to be read */
-#else
-	volatile unsigned write;     /**< Next position to be written*/
-	volatile unsigned read;      /**< Next position to be read */
-#endif
-	unsigned len;                /**< Circular buffer length */
-	unsigned elem_size;          /**< Pointer size - for 32/64 bit OS */
-	void *volatile buffer[];     /**< The buffer contains mbuf pointers */
-};
-
-/*
- * The kernel image of the rte_mbuf struct, with only the relevant fields.
- * Padding is necessary to assure the offsets of these fields
- */
-struct rte_kni_mbuf {
-	void *buf_addr __attribute__((__aligned__(RTE_CACHE_LINE_SIZE)));
-	uint64_t buf_iova;
-	uint16_t data_off;      /**< Start address of data in segment buffer. */
-	char pad1[2];
-	uint16_t nb_segs;       /**< Number of segments. */
-	char pad4[2];
-	uint64_t ol_flags;      /**< Offload features. */
-	char pad2[4];
-	uint32_t pkt_len;       /**< Total pkt len: sum of all segment data_len. */
-	uint16_t data_len;      /**< Amount of data in segment buffer. */
-	char pad3[14];
-	void *pool;
-
-	/* fields on second cache line */
-	__attribute__((__aligned__(RTE_CACHE_LINE_MIN_SIZE)))
-	void *next;             /**< Physical address of next mbuf in kernel. */
-};
-
-/*
- * Struct used to create a KNI device. Passed to the kernel in IOCTL call
- */
-
-struct rte_kni_device_info {
-	char name[RTE_KNI_NAMESIZE];  /**< Network device name for KNI */
-
-	phys_addr_t tx_phys;
-	phys_addr_t rx_phys;
-	phys_addr_t alloc_phys;
-	phys_addr_t free_phys;
-
-	/* Used by Ethtool */
-	phys_addr_t req_phys;
-	phys_addr_t resp_phys;
-	phys_addr_t sync_phys;
-	void * sync_va;
-
-	/* mbuf mempool */
-	void * mbuf_va;
-	phys_addr_t mbuf_phys;
-
-	uint16_t group_id;            /**< Group ID */
-	uint32_t core_id;             /**< core ID to bind for kernel thread */
-
-	__extension__
-	uint8_t force_bind : 1;       /**< Flag for kernel thread binding */
-
-	/* mbuf size */
-	unsigned mbuf_size;
-	unsigned int mtu;
-	unsigned int min_mtu;
-	unsigned int max_mtu;
-	uint8_t mac_addr[6];
-	uint8_t iova_mode;
-};
-
-#define KNI_DEVICE "kni"
-
-#define RTE_KNI_IOCTL_TEST    _IOWR(0, 1, int)
-#define RTE_KNI_IOCTL_CREATE  _IOWR(0, 2, struct rte_kni_device_info)
-#define RTE_KNI_IOCTL_RELEASE _IOWR(0, 3, struct rte_kni_device_info)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _RTE_KNI_COMMON_H_ */
diff --git a/lib/kni/rte_kni_fifo.h b/lib/kni/rte_kni_fifo.h
deleted file mode 100644
index d2ec82fe87fc..000000000000
--- a/lib/kni/rte_kni_fifo.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2014 Intel Corporation
- */
-
-
-
-/**
- * @internal when c11 memory model enabled use c11 atomic memory barrier.
- * when under non c11 memory model use rte_smp_* memory barrier.
- *
- * @param src
- *   Pointer to the source data.
- * @param dst
- *   Pointer to the destination data.
- * @param value
- *   Data value.
- */
-#ifdef RTE_USE_C11_MEM_MODEL
-#define __KNI_LOAD_ACQUIRE(src) ({                         \
-		__atomic_load_n((src), __ATOMIC_ACQUIRE);           \
-	})
-#define __KNI_STORE_RELEASE(dst, value) do {               \
-		__atomic_store_n((dst), value, __ATOMIC_RELEASE);   \
-	} while(0)
-#else
-#define __KNI_LOAD_ACQUIRE(src) ({                         \
-		typeof (*(src)) val = *(src);                       \
-		rte_smp_rmb();                                      \
-		val;                                                \
-	})
-#define __KNI_STORE_RELEASE(dst, value) do {               \
-		*(dst) = value;                                     \
-		rte_smp_wmb();                                      \
-	} while(0)
-#endif
-
-/**
- * Initializes the kni fifo structure
- */
-static void
-kni_fifo_init(struct rte_kni_fifo *fifo, unsigned size)
-{
-	/* Ensure size is power of 2 */
-	if (size & (size - 1))
-		rte_panic("KNI fifo size must be power of 2\n");
-
-	fifo->write = 0;
-	fifo->read = 0;
-	fifo->len = size;
-	fifo->elem_size = sizeof(void *);
-}
-
-/**
- * Adds num elements into the fifo. Return the number actually written
- */
-static inline unsigned
-kni_fifo_put(struct rte_kni_fifo *fifo, void **data, unsigned num)
-{
-	unsigned i = 0;
-	unsigned fifo_write = fifo->write;
-	unsigned new_write = fifo_write;
-	unsigned fifo_read = __KNI_LOAD_ACQUIRE(&fifo->read);
-
-	for (i = 0; i < num; i++) {
-		new_write = (new_write + 1) & (fifo->len - 1);
-
-		if (new_write == fifo_read)
-			break;
-		fifo->buffer[fifo_write] = data[i];
-		fifo_write = new_write;
-	}
-	__KNI_STORE_RELEASE(&fifo->write, fifo_write);
-	return i;
-}
-
-/**
- * Get up to num elements from the fifo. Return the number actually read
- */
-static inline unsigned
-kni_fifo_get(struct rte_kni_fifo *fifo, void **data, unsigned num)
-{
-	unsigned i = 0;
-	unsigned new_read = fifo->read;
-	unsigned fifo_write = __KNI_LOAD_ACQUIRE(&fifo->write);
-
-	for (i = 0; i < num; i++) {
-		if (new_read == fifo_write)
-			break;
-
-		data[i] = fifo->buffer[new_read];
-		new_read = (new_read + 1) & (fifo->len - 1);
-	}
-	__KNI_STORE_RELEASE(&fifo->read, new_read);
-	return i;
-}
-
-/**
- * Get the num of elements in the fifo
- */
-static inline uint32_t
-kni_fifo_count(struct rte_kni_fifo *fifo)
-{
-	unsigned fifo_write = __KNI_LOAD_ACQUIRE(&fifo->write);
-	unsigned fifo_read = __KNI_LOAD_ACQUIRE(&fifo->read);
-	return (fifo->len + fifo_write - fifo_read) & (fifo->len - 1);
-}
-
-/**
- * Get the num of available elements in the fifo
- */
-static inline uint32_t
-kni_fifo_free_count(struct rte_kni_fifo *fifo)
-{
-	uint32_t fifo_write = __KNI_LOAD_ACQUIRE(&fifo->write);
-	uint32_t fifo_read = __KNI_LOAD_ACQUIRE(&fifo->read);
-	return (fifo_read - fifo_write - 1) & (fifo->len - 1);
-}
diff --git a/lib/kni/version.map b/lib/kni/version.map
deleted file mode 100644
index 13ffaa5bfd65..000000000000
--- a/lib/kni/version.map
+++ /dev/null
@@ -1,24 +0,0 @@
-DPDK_24 {
-	global:
-
-	rte_kni_alloc;
-	rte_kni_close;
-	rte_kni_get;
-	rte_kni_get_name;
-	rte_kni_handle_request;
-	rte_kni_init;
-	rte_kni_register_handlers;
-	rte_kni_release;
-	rte_kni_rx_burst;
-	rte_kni_tx_burst;
-	rte_kni_unregister_handlers;
-
-	local: *;
-};
-
-EXPERIMENTAL {
-	global:
-
-	# updated in v21.08
-	rte_kni_update_link;
-};
diff --git a/lib/meson.build b/lib/meson.build
index ecac701161c8..bbfa28ba86dd 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -39,7 +39,6 @@ libraries = [
         'gso',
         'ip_frag',
         'jobstats',
-        'kni',
         'latencystats',
         'lpm',
         'member',
@@ -73,7 +72,6 @@ optional_libs = [
         'graph',
         'gro',
         'gso',
-        'kni',
         'jobstats',
         'latencystats',
         'metrics',
@@ -86,10 +84,6 @@ optional_libs = [
         'vhost',
 ]
 
-dpdk_libs_deprecated += [
-        'kni',
-]
-
 disabled_libs = []
 opt_disabled_libs = run_command(list_dir_globs, get_option('disable_libs'),
         check: true).stdout().split()
diff --git a/lib/port/meson.build b/lib/port/meson.build
index 3ab37e2cb4b7..b0af2b185b39 100644
--- a/lib/port/meson.build
+++ b/lib/port/meson.build
@@ -45,9 +45,3 @@ if dpdk_conf.has('RTE_HAS_LIBPCAP')
     dpdk_conf.set('RTE_PORT_PCAP', 1)
     ext_deps += pcap_dep # dependency provided in config/meson.build
 endif
-
-if dpdk_conf.has('RTE_LIB_KNI')
-    sources += files('rte_port_kni.c')
-    headers += files('rte_port_kni.h')
-    deps += 'kni'
-endif
diff --git a/lib/port/rte_port_kni.c b/lib/port/rte_port_kni.c
deleted file mode 100644
index 1c7a6cb200ea..000000000000
--- a/lib/port/rte_port_kni.c
+++ /dev/null
@@ -1,515 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2016 Ethan Zhuang <zhuangwj@gmail.com>.
- * Copyright(c) 2016 Intel Corporation.
- */
-#include <string.h>
-
-#include <rte_malloc.h>
-#include <rte_kni.h>
-
-#include "rte_port_kni.h"
-
-/*
- * Port KNI Reader
- */
-#ifdef RTE_PORT_STATS_COLLECT
-
-#define RTE_PORT_KNI_READER_STATS_PKTS_IN_ADD(port, val) \
-	port->stats.n_pkts_in += val
-#define RTE_PORT_KNI_READER_STATS_PKTS_DROP_ADD(port, val) \
-	port->stats.n_pkts_drop += val
-
-#else
-
-#define RTE_PORT_KNI_READER_STATS_PKTS_IN_ADD(port, val)
-#define RTE_PORT_KNI_READER_STATS_PKTS_DROP_ADD(port, val)
-
-#endif
-
-struct rte_port_kni_reader {
-	struct rte_port_in_stats stats;
-
-	struct rte_kni *kni;
-};
-
-static void *
-rte_port_kni_reader_create(void *params, int socket_id)
-{
-	struct rte_port_kni_reader_params *conf =
-			params;
-	struct rte_port_kni_reader *port;
-
-	/* Check input parameters */
-	if (conf == NULL) {
-		RTE_LOG(ERR, PORT, "%s: params is NULL\n", __func__);
-		return NULL;
-	}
-
-	/* Memory allocation */
-	port = rte_zmalloc_socket("PORT", sizeof(*port),
-		RTE_CACHE_LINE_SIZE, socket_id);
-	if (port == NULL) {
-		RTE_LOG(ERR, PORT, "%s: Failed to allocate port\n", __func__);
-		return NULL;
-	}
-
-	/* Initialization */
-	port->kni = conf->kni;
-
-	return port;
-}
-
-static int
-rte_port_kni_reader_rx(void *port, struct rte_mbuf **pkts, uint32_t n_pkts)
-{
-	struct rte_port_kni_reader *p =
-			port;
-	uint16_t rx_pkt_cnt;
-
-	rx_pkt_cnt = rte_kni_rx_burst(p->kni, pkts, n_pkts);
-	RTE_PORT_KNI_READER_STATS_PKTS_IN_ADD(p, rx_pkt_cnt);
-	return rx_pkt_cnt;
-}
-
-static int
-rte_port_kni_reader_free(void *port)
-{
-	if (port == NULL) {
-		RTE_LOG(ERR, PORT, "%s: port is NULL\n", __func__);
-		return -EINVAL;
-	}
-
-	rte_free(port);
-
-	return 0;
-}
-
-static int rte_port_kni_reader_stats_read(void *port,
-	struct rte_port_in_stats *stats, int clear)
-{
-	struct rte_port_kni_reader *p =
-			port;
-
-	if (stats != NULL)
-		memcpy(stats, &p->stats, sizeof(p->stats));
-
-	if (clear)
-		memset(&p->stats, 0, sizeof(p->stats));
-
-	return 0;
-}
-
-/*
- * Port KNI Writer
- */
-#ifdef RTE_PORT_STATS_COLLECT
-
-#define RTE_PORT_KNI_WRITER_STATS_PKTS_IN_ADD(port, val) \
-	port->stats.n_pkts_in += val
-#define RTE_PORT_KNI_WRITER_STATS_PKTS_DROP_ADD(port, val) \
-	port->stats.n_pkts_drop += val
-
-#else
-
-#define RTE_PORT_KNI_WRITER_STATS_PKTS_IN_ADD(port, val)
-#define RTE_PORT_KNI_WRITER_STATS_PKTS_DROP_ADD(port, val)
-
-#endif
-
-struct rte_port_kni_writer {
-	struct rte_port_out_stats stats;
-
-	struct rte_mbuf *tx_buf[2 * RTE_PORT_IN_BURST_SIZE_MAX];
-	uint32_t tx_burst_sz;
-	uint32_t tx_buf_count;
-	uint64_t bsz_mask;
-	struct rte_kni *kni;
-};
-
-static void *
-rte_port_kni_writer_create(void *params, int socket_id)
-{
-	struct rte_port_kni_writer_params *conf =
-			params;
-	struct rte_port_kni_writer *port;
-
-	/* Check input parameters */
-	if ((conf == NULL) ||
-		(conf->tx_burst_sz == 0) ||
-		(conf->tx_burst_sz > RTE_PORT_IN_BURST_SIZE_MAX) ||
-		(!rte_is_power_of_2(conf->tx_burst_sz))) {
-		RTE_LOG(ERR, PORT, "%s: Invalid input parameters\n", __func__);
-		return NULL;
-	}
-
-	/* Memory allocation */
-	port = rte_zmalloc_socket("PORT", sizeof(*port),
-		RTE_CACHE_LINE_SIZE, socket_id);
-	if (port == NULL) {
-		RTE_LOG(ERR, PORT, "%s: Failed to allocate port\n", __func__);
-		return NULL;
-	}
-
-	/* Initialization */
-	port->kni = conf->kni;
-	port->tx_burst_sz = conf->tx_burst_sz;
-	port->tx_buf_count = 0;
-	port->bsz_mask = 1LLU << (conf->tx_burst_sz - 1);
-
-	return port;
-}
-
-static inline void
-send_burst(struct rte_port_kni_writer *p)
-{
-	uint32_t nb_tx;
-
-	nb_tx = rte_kni_tx_burst(p->kni, p->tx_buf, p->tx_buf_count);
-
-	RTE_PORT_KNI_WRITER_STATS_PKTS_DROP_ADD(p, p->tx_buf_count - nb_tx);
-	for (; nb_tx < p->tx_buf_count; nb_tx++)
-		rte_pktmbuf_free(p->tx_buf[nb_tx]);
-
-	p->tx_buf_count = 0;
-}
-
-static int
-rte_port_kni_writer_tx(void *port, struct rte_mbuf *pkt)
-{
-	struct rte_port_kni_writer *p =
-			port;
-
-	p->tx_buf[p->tx_buf_count++] = pkt;
-	RTE_PORT_KNI_WRITER_STATS_PKTS_IN_ADD(p, 1);
-	if (p->tx_buf_count >= p->tx_burst_sz)
-		send_burst(p);
-
-	return 0;
-}
-
-static int
-rte_port_kni_writer_tx_bulk(void *port,
-	struct rte_mbuf **pkts,
-	uint64_t pkts_mask)
-{
-	struct rte_port_kni_writer *p =
-			port;
-	uint64_t bsz_mask = p->bsz_mask;
-	uint32_t tx_buf_count = p->tx_buf_count;
-	uint64_t expr = (pkts_mask & (pkts_mask + 1)) |
-					((pkts_mask & bsz_mask) ^ bsz_mask);
-
-	if (expr == 0) {
-		uint64_t n_pkts = __builtin_popcountll(pkts_mask);
-		uint32_t n_pkts_ok;
-
-		if (tx_buf_count)
-			send_burst(p);
-
-		RTE_PORT_KNI_WRITER_STATS_PKTS_IN_ADD(p, n_pkts);
-		n_pkts_ok = rte_kni_tx_burst(p->kni, pkts, n_pkts);
-
-		RTE_PORT_KNI_WRITER_STATS_PKTS_DROP_ADD(p, n_pkts - n_pkts_ok);
-		for (; n_pkts_ok < n_pkts; n_pkts_ok++) {
-			struct rte_mbuf *pkt = pkts[n_pkts_ok];
-
-			rte_pktmbuf_free(pkt);
-		}
-	} else {
-		for (; pkts_mask;) {
-			uint32_t pkt_index = __builtin_ctzll(pkts_mask);
-			uint64_t pkt_mask = 1LLU << pkt_index;
-			struct rte_mbuf *pkt = pkts[pkt_index];
-
-			p->tx_buf[tx_buf_count++] = pkt;
-			RTE_PORT_KNI_WRITER_STATS_PKTS_IN_ADD(p, 1);
-			pkts_mask &= ~pkt_mask;
-		}
-
-		p->tx_buf_count = tx_buf_count;
-		if (tx_buf_count >= p->tx_burst_sz)
-			send_burst(p);
-	}
-
-	return 0;
-}
-
-static int
-rte_port_kni_writer_flush(void *port)
-{
-	struct rte_port_kni_writer *p =
-			port;
-
-	if (p->tx_buf_count > 0)
-		send_burst(p);
-
-	return 0;
-}
-
-static int
-rte_port_kni_writer_free(void *port)
-{
-	if (port == NULL) {
-		RTE_LOG(ERR, PORT, "%s: Port is NULL\n", __func__);
-		return -EINVAL;
-	}
-
-	rte_port_kni_writer_flush(port);
-	rte_free(port);
-
-	return 0;
-}
-
-static int rte_port_kni_writer_stats_read(void *port,
-	struct rte_port_out_stats *stats, int clear)
-{
-	struct rte_port_kni_writer *p =
-			port;
-
-	if (stats != NULL)
-		memcpy(stats, &p->stats, sizeof(p->stats));
-
-	if (clear)
-		memset(&p->stats, 0, sizeof(p->stats));
-
-	return 0;
-}
-
-/*
- * Port KNI Writer Nodrop
- */
-#ifdef RTE_PORT_STATS_COLLECT
-
-#define RTE_PORT_KNI_WRITER_NODROP_STATS_PKTS_IN_ADD(port, val) \
-	port->stats.n_pkts_in += val
-#define RTE_PORT_KNI_WRITER_NODROP_STATS_PKTS_DROP_ADD(port, val) \
-	port->stats.n_pkts_drop += val
-
-#else
-
-#define RTE_PORT_KNI_WRITER_NODROP_STATS_PKTS_IN_ADD(port, val)
-#define RTE_PORT_KNI_WRITER_NODROP_STATS_PKTS_DROP_ADD(port, val)
-
-#endif
-
-struct rte_port_kni_writer_nodrop {
-	struct rte_port_out_stats stats;
-
-	struct rte_mbuf *tx_buf[2 * RTE_PORT_IN_BURST_SIZE_MAX];
-	uint32_t tx_burst_sz;
-	uint32_t tx_buf_count;
-	uint64_t bsz_mask;
-	uint64_t n_retries;
-	struct rte_kni *kni;
-};
-
-static void *
-rte_port_kni_writer_nodrop_create(void *params, int socket_id)
-{
-	struct rte_port_kni_writer_nodrop_params *conf =
-		params;
-	struct rte_port_kni_writer_nodrop *port;
-
-	/* Check input parameters */
-	if ((conf == NULL) ||
-		(conf->tx_burst_sz == 0) ||
-		(conf->tx_burst_sz > RTE_PORT_IN_BURST_SIZE_MAX) ||
-		(!rte_is_power_of_2(conf->tx_burst_sz))) {
-		RTE_LOG(ERR, PORT, "%s: Invalid input parameters\n", __func__);
-		return NULL;
-	}
-
-	/* Memory allocation */
-	port = rte_zmalloc_socket("PORT", sizeof(*port),
-		RTE_CACHE_LINE_SIZE, socket_id);
-	if (port == NULL) {
-		RTE_LOG(ERR, PORT, "%s: Failed to allocate port\n", __func__);
-		return NULL;
-	}
-
-	/* Initialization */
-	port->kni = conf->kni;
-	port->tx_burst_sz = conf->tx_burst_sz;
-	port->tx_buf_count = 0;
-	port->bsz_mask = 1LLU << (conf->tx_burst_sz - 1);
-
-	/*
-	 * When n_retries is 0 it means that we should wait for every packet to
-	 * send no matter how many retries should it take. To limit number of
-	 * branches in fast path, we use UINT64_MAX instead of branching.
-	 */
-	port->n_retries = (conf->n_retries == 0) ? UINT64_MAX : conf->n_retries;
-
-	return port;
-}
-
-static inline void
-send_burst_nodrop(struct rte_port_kni_writer_nodrop *p)
-{
-	uint32_t nb_tx = 0, i;
-
-	nb_tx = rte_kni_tx_burst(p->kni, p->tx_buf, p->tx_buf_count);
-
-	/* We sent all the packets in a first try */
-	if (nb_tx >= p->tx_buf_count) {
-		p->tx_buf_count = 0;
-		return;
-	}
-
-	for (i = 0; i < p->n_retries; i++) {
-		nb_tx += rte_kni_tx_burst(p->kni,
-			p->tx_buf + nb_tx,
-			p->tx_buf_count - nb_tx);
-
-		/* We sent all the packets in more than one try */
-		if (nb_tx >= p->tx_buf_count) {
-			p->tx_buf_count = 0;
-			return;
-		}
-	}
-
-	/* We didn't send the packets in maximum allowed attempts */
-	RTE_PORT_KNI_WRITER_NODROP_STATS_PKTS_DROP_ADD(p, p->tx_buf_count - nb_tx);
-	for ( ; nb_tx < p->tx_buf_count; nb_tx++)
-		rte_pktmbuf_free(p->tx_buf[nb_tx]);
-
-	p->tx_buf_count = 0;
-}
-
-static int
-rte_port_kni_writer_nodrop_tx(void *port, struct rte_mbuf *pkt)
-{
-	struct rte_port_kni_writer_nodrop *p =
-			port;
-
-	p->tx_buf[p->tx_buf_count++] = pkt;
-	RTE_PORT_KNI_WRITER_STATS_PKTS_IN_ADD(p, 1);
-	if (p->tx_buf_count >= p->tx_burst_sz)
-		send_burst_nodrop(p);
-
-	return 0;
-}
-
-static int
-rte_port_kni_writer_nodrop_tx_bulk(void *port,
-	struct rte_mbuf **pkts,
-	uint64_t pkts_mask)
-{
-	struct rte_port_kni_writer_nodrop *p =
-			port;
-
-	uint64_t bsz_mask = p->bsz_mask;
-	uint32_t tx_buf_count = p->tx_buf_count;
-	uint64_t expr = (pkts_mask & (pkts_mask + 1)) |
-					((pkts_mask & bsz_mask) ^ bsz_mask);
-
-	if (expr == 0) {
-		uint64_t n_pkts = __builtin_popcountll(pkts_mask);
-		uint32_t n_pkts_ok;
-
-		if (tx_buf_count)
-			send_burst_nodrop(p);
-
-		RTE_PORT_KNI_WRITER_NODROP_STATS_PKTS_IN_ADD(p, n_pkts);
-		n_pkts_ok = rte_kni_tx_burst(p->kni, pkts, n_pkts);
-
-		if (n_pkts_ok >= n_pkts)
-			return 0;
-
-		/*
-		 * If we didn't manage to send all packets in single burst, move
-		 * remaining packets to the buffer and call send burst.
-		 */
-		for (; n_pkts_ok < n_pkts; n_pkts_ok++) {
-			struct rte_mbuf *pkt = pkts[n_pkts_ok];
-			p->tx_buf[p->tx_buf_count++] = pkt;
-		}
-		send_burst_nodrop(p);
-	} else {
-		for ( ; pkts_mask; ) {
-			uint32_t pkt_index = __builtin_ctzll(pkts_mask);
-			uint64_t pkt_mask = 1LLU << pkt_index;
-			struct rte_mbuf *pkt = pkts[pkt_index];
-
-			p->tx_buf[tx_buf_count++] = pkt;
-			RTE_PORT_KNI_WRITER_NODROP_STATS_PKTS_IN_ADD(p, 1);
-			pkts_mask &= ~pkt_mask;
-		}
-
-		p->tx_buf_count = tx_buf_count;
-		if (tx_buf_count >= p->tx_burst_sz)
-			send_burst_nodrop(p);
-	}
-
-	return 0;
-}
-
-static int
-rte_port_kni_writer_nodrop_flush(void *port)
-{
-	struct rte_port_kni_writer_nodrop *p =
-		port;
-
-	if (p->tx_buf_count > 0)
-		send_burst_nodrop(p);
-
-	return 0;
-}
-
-static int
-rte_port_kni_writer_nodrop_free(void *port)
-{
-	if (port == NULL) {
-		RTE_LOG(ERR, PORT, "%s: Port is NULL\n", __func__);
-		return -EINVAL;
-	}
-
-	rte_port_kni_writer_nodrop_flush(port);
-	rte_free(port);
-
-	return 0;
-}
-
-static int rte_port_kni_writer_nodrop_stats_read(void *port,
-	struct rte_port_out_stats *stats, int clear)
-{
-	struct rte_port_kni_writer_nodrop *p =
-			port;
-
-	if (stats != NULL)
-		memcpy(stats, &p->stats, sizeof(p->stats));
-
-	if (clear)
-		memset(&p->stats, 0, sizeof(p->stats));
-
-	return 0;
-}
-
-
-/*
- * Summary of port operations
- */
-struct rte_port_in_ops rte_port_kni_reader_ops = {
-	.f_create = rte_port_kni_reader_create,
-	.f_free = rte_port_kni_reader_free,
-	.f_rx = rte_port_kni_reader_rx,
-	.f_stats = rte_port_kni_reader_stats_read,
-};
-
-struct rte_port_out_ops rte_port_kni_writer_ops = {
-	.f_create = rte_port_kni_writer_create,
-	.f_free = rte_port_kni_writer_free,
-	.f_tx = rte_port_kni_writer_tx,
-	.f_tx_bulk = rte_port_kni_writer_tx_bulk,
-	.f_flush = rte_port_kni_writer_flush,
-	.f_stats = rte_port_kni_writer_stats_read,
-};
-
-struct rte_port_out_ops rte_port_kni_writer_nodrop_ops = {
-	.f_create = rte_port_kni_writer_nodrop_create,
-	.f_free = rte_port_kni_writer_nodrop_free,
-	.f_tx = rte_port_kni_writer_nodrop_tx,
-	.f_tx_bulk = rte_port_kni_writer_nodrop_tx_bulk,
-	.f_flush = rte_port_kni_writer_nodrop_flush,
-	.f_stats = rte_port_kni_writer_nodrop_stats_read,
-};
diff --git a/lib/port/rte_port_kni.h b/lib/port/rte_port_kni.h
deleted file mode 100644
index 280f58c121e2..000000000000
--- a/lib/port/rte_port_kni.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2016 Ethan Zhuang <zhuangwj@gmail.com>.
- * Copyright(c) 2016 Intel Corporation.
- */
-
-#ifndef __INCLUDE_RTE_PORT_KNI_H__
-#define __INCLUDE_RTE_PORT_KNI_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @file
- * RTE Port KNI Interface
- *
- * kni_reader: input port built on top of pre-initialized KNI interface
- * kni_writer: output port built on top of pre-initialized KNI interface
- */
-
-#include <stdint.h>
-
-#include "rte_port.h"
-
-/** kni_reader port parameters */
-struct rte_port_kni_reader_params {
-	/** KNI interface reference */
-	struct rte_kni *kni;
-};
-
-/** kni_reader port operations */
-extern struct rte_port_in_ops rte_port_kni_reader_ops;
-
-
-/** kni_writer port parameters */
-struct rte_port_kni_writer_params {
-	/** KNI interface reference */
-	struct rte_kni *kni;
-	/** Burst size to KNI interface. */
-	uint32_t tx_burst_sz;
-};
-
-/** kni_writer port operations */
-extern struct rte_port_out_ops rte_port_kni_writer_ops;
-
-/** kni_writer_nodrop port parameters */
-struct rte_port_kni_writer_nodrop_params {
-	/** KNI interface reference */
-	struct rte_kni *kni;
-	/** Burst size to KNI interface. */
-	uint32_t tx_burst_sz;
-	/** Maximum number of retries, 0 for no limit */
-	uint32_t n_retries;
-};
-
-/** kni_writer_nodrop port operations */
-extern struct rte_port_out_ops rte_port_kni_writer_nodrop_ops;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/lib/port/version.map b/lib/port/version.map
index 83dbec7b01d2..fefcf29063f6 100644
--- a/lib/port/version.map
+++ b/lib/port/version.map
@@ -7,9 +7,6 @@ DPDK_24 {
 	rte_port_fd_reader_ops;
 	rte_port_fd_writer_nodrop_ops;
 	rte_port_fd_writer_ops;
-	rte_port_kni_reader_ops;
-	rte_port_kni_writer_nodrop_ops;
-	rte_port_kni_writer_ops;
 	rte_port_ring_multi_reader_ops;
 	rte_port_ring_multi_writer_nodrop_ops;
 	rte_port_ring_multi_writer_ops;
diff --git a/meson_options.txt b/meson_options.txt
index 95e22e0ce70c..621e1ca9ba8c 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -10,7 +10,7 @@ option('disable_apps', type: 'string', value: '', description:
        'Comma-separated list of apps to explicitly disable.')
 option('disable_drivers', type: 'string', value: '', description:
        'Comma-separated list of drivers to explicitly disable.')
-option('disable_libs', type: 'string', value: 'kni', description:
+option('disable_libs', type: 'string', value: '', description:
        'Comma-separated list of libraries to explicitly disable. [NOTE: not all libs can be disabled]')
 option('drivers_install_subdir', type: 'string', value: 'dpdk/pmds-<VERSION>', description:
        'Subdirectory of libdir where to install PMDs. Defaults to using a versioned subdirectory.')
-- 
2.39.2


^ permalink raw reply	[relevance 1%]

* [PATCH v4] build: update DPDK to use C11 standard
  2023-07-31 10:38  4% [PATCH] build: update DPDK to use C11 standard Bruce Richardson
  2023-07-31 15:58  4% ` [PATCH v2] " Bruce Richardson
  2023-07-31 16:58  4% ` [PATCH v3] " Bruce Richardson
@ 2023-08-01 13:15  4% ` Bruce Richardson
  2023-08-02 12:31  4% ` [PATCH v5] " Bruce Richardson
  3 siblings, 0 replies; 200+ results
From: Bruce Richardson @ 2023-08-01 13:15 UTC (permalink / raw)
  To: dev; +Cc: Bruce Richardson, Morten Brørup, Tyler Retzlaff

As previously announced, DPDK 23.11 will require a C11 supporting
compiler and will use the C11 standard in all builds.

Forcing use of the C standard, rather than the standard with
GNU extensions, means that some posix definitions which are not in
the C standard are unavailable by default. We fix this by ensuring
the correct defines or cflags are passed to the components that
need them.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
Acked-by: Tyler Retzlaff <roretzla@linux.microsoft.com>
---
V4:
* pass cflags to the structure and definition checks in mlx* drivers
  to ensure posix definitions - as well as C-standard ones - are
  available.

V3:
* remove (now unneeded) use of -std=gnu99 in failsafe net driver.

V2:
* Resubmit now that 23.11-rc0 patch applied
* Add _POSIX_C_SOURCE macro to eal_common_errno.c to get POSIX
  definition of strerror_r() with c11 standard.
---
 doc/guides/linux_gsg/sys_reqs.rst      |  3 ++-
 doc/guides/rel_notes/deprecation.rst   | 18 ------------------
 doc/guides/rel_notes/release_23_11.rst | 17 +++++++++++++++++
 drivers/common/mlx5/linux/meson.build  |  5 +++--
 drivers/net/failsafe/meson.build       |  1 -
 drivers/net/mlx4/meson.build           |  4 ++--
 lib/eal/common/eal_common_errno.c      |  1 +
 meson.build                            |  1 +
 8 files changed, 26 insertions(+), 24 deletions(-)

diff --git a/doc/guides/linux_gsg/sys_reqs.rst b/doc/guides/linux_gsg/sys_reqs.rst
index dfeaf4e1c5..13be715933 100644
--- a/doc/guides/linux_gsg/sys_reqs.rst
+++ b/doc/guides/linux_gsg/sys_reqs.rst
@@ -27,7 +27,8 @@ Compilation of the DPDK
     The setup commands and installed packages needed on various systems may be different.
     For details on Linux distributions and the versions tested, please consult the DPDK Release Notes.
 
-*   General development tools including a supported C compiler such as gcc (version 4.9+) or clang (version 3.4+),
+*   General development tools including a C compiler supporting the C11 standard,
+    including standard atomics, for example: GCC (version 5.0+) or Clang (version 3.6+),
     and ``pkg-config`` or ``pkgconf`` to be used when building end-user binaries against DPDK.
 
     * For RHEL/Fedora systems these can be installed using ``dnf groupinstall "Development Tools"``
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 494b401cda..cc939d3c67 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -17,24 +17,6 @@ Other API and ABI deprecation notices are to be posted below.
 Deprecation Notices
 -------------------
 
-* C Compiler: From DPDK 23.11 onwards,
-  building DPDK will require a C compiler which supports the C11 standard,
-  including support for C11 standard atomics.
-
-  More specifically, the requirements will be:
-
-  * Support for flag "-std=c11" (or similar)
-  * __STDC_NO_ATOMICS__ is *not defined* when using c11 flag
-
-  Please note:
-
-  * C11, including standard atomics, is supported from GCC version 5 onwards,
-    and is the default language version in that release
-    (Ref: https://gcc.gnu.org/gcc-5/changes.html)
-  * C11 is the default compilation mode in Clang from version 3.6,
-    which also added support for standard atomics
-    (Ref: https://releases.llvm.org/3.6.0/tools/clang/docs/ReleaseNotes.html)
-
 * build: Enabling deprecated libraries (``flow_classify``, ``kni``)
   won't be possible anymore through the use of the ``disable_libs`` build option.
   A new build option for deprecated libraries will be introduced instead.
diff --git a/doc/guides/rel_notes/release_23_11.rst b/doc/guides/rel_notes/release_23_11.rst
index 6b4dd21fd0..c8b9ed456c 100644
--- a/doc/guides/rel_notes/release_23_11.rst
+++ b/doc/guides/rel_notes/release_23_11.rst
@@ -20,6 +20,23 @@ DPDK Release 23.11
       ninja -C build doc
       xdg-open build/doc/guides/html/rel_notes/release_23_11.html
 
+* Build Requirements: From DPDK 23.11 onwards,
+  building DPDK will require a C compiler which supports the C11 standard,
+  including support for C11 standard atomics.
+
+  More specifically, the requirements will be:
+
+  * Support for flag "-std=c11" (or similar)
+  * __STDC_NO_ATOMICS__ is *not defined* when using c11 flag
+
+  Please note:
+
+  * C11, including standard atomics, is supported from GCC version 5 onwards,
+    and is the default language version in that release
+    (Ref: https://gcc.gnu.org/gcc-5/changes.html)
+  * C11 is the default compilation mode in Clang from version 3.6,
+    which also added support for standard atomics
+    (Ref: https://releases.llvm.org/3.6.0/tools/clang/docs/ReleaseNotes.html)
 
 New Features
 ------------
diff --git a/drivers/common/mlx5/linux/meson.build b/drivers/common/mlx5/linux/meson.build
index 15edc13041..b3a64547c5 100644
--- a/drivers/common/mlx5/linux/meson.build
+++ b/drivers/common/mlx5/linux/meson.build
@@ -231,11 +231,12 @@ if  libmtcr_ul_found
 endif
 
 foreach arg:has_sym_args
-    mlx5_config.set(arg[0], cc.has_header_symbol(arg[1], arg[2], dependencies: libs))
+    mlx5_config.set(arg[0], cc.has_header_symbol(arg[1], arg[2], dependencies: libs, args: cflags))
 endforeach
 foreach arg:has_member_args
     file_prefix = '#include <' + arg[1] + '>'
-    mlx5_config.set(arg[0], cc.has_member(arg[2], arg[3], prefix : file_prefix, dependencies: libs))
+    mlx5_config.set(arg[0],
+            cc.has_member(arg[2], arg[3], prefix : file_prefix, dependencies: libs, args: cflags))
 endforeach
 
 # Build Glue Library
diff --git a/drivers/net/failsafe/meson.build b/drivers/net/failsafe/meson.build
index 6013e13722..c1d361083b 100644
--- a/drivers/net/failsafe/meson.build
+++ b/drivers/net/failsafe/meson.build
@@ -7,7 +7,6 @@ if is_windows
     subdir_done()
 endif
 
-cflags += '-std=gnu99'
 cflags += '-D_DEFAULT_SOURCE'
 cflags += '-D_XOPEN_SOURCE=700'
 cflags += '-pedantic'
diff --git a/drivers/net/mlx4/meson.build b/drivers/net/mlx4/meson.build
index a038c1ec1b..3c5ee24186 100644
--- a/drivers/net/mlx4/meson.build
+++ b/drivers/net/mlx4/meson.build
@@ -103,12 +103,12 @@ has_sym_args = [
 config = configuration_data()
 foreach arg:has_sym_args
     config.set(arg[0], cc.has_header_symbol(arg[1], arg[2],
-        dependencies: libs))
+        dependencies: libs, args: cflags))
 endforeach
 foreach arg:has_member_args
     file_prefix = '#include <' + arg[1] + '>'
     config.set(arg[0], cc.has_member(arg[2], arg[3],
-        prefix: file_prefix, dependencies: libs))
+        prefix: file_prefix, dependencies: libs, args: cflags))
 endforeach
 configure_file(output : 'mlx4_autoconf.h', configuration : config)
 
diff --git a/lib/eal/common/eal_common_errno.c b/lib/eal/common/eal_common_errno.c
index ef8f782abb..b30e2f0ad4 100644
--- a/lib/eal/common/eal_common_errno.c
+++ b/lib/eal/common/eal_common_errno.c
@@ -4,6 +4,7 @@
 
 /* Use XSI-compliant portable version of strerror_r() */
 #undef _GNU_SOURCE
+#define _POSIX_C_SOURCE 200809L
 
 #include <stdio.h>
 #include <string.h>
diff --git a/meson.build b/meson.build
index 39cb73846d..70b54f0c98 100644
--- a/meson.build
+++ b/meson.build
@@ -9,6 +9,7 @@ project('DPDK', 'c',
         license: 'BSD',
         default_options: [
             'buildtype=release',
+            'c_std=c11',
             'default_library=static',
             'warning_level=2',
         ],
-- 
2.39.2


^ permalink raw reply	[relevance 4%]

* RE: [PATCH] doc: announce ethdev operation struct changes
  2023-07-28 15:55  0%           ` Morten Brørup
@ 2023-08-01  3:19  0%             ` Feifei Wang
  0 siblings, 0 replies; 200+ results
From: Feifei Wang @ 2023-08-01  3:19 UTC (permalink / raw)
  To: Morten Brørup, thomas
  Cc: dev, nd, Honnappa Nagarahalli, Ruifeng Wang, ferruh.yigit,
	konstantin.ananyev, andrew.rybchenko, nd



> -----Original Message-----
> From: Morten Brørup <mb@smartsharesystems.com>
> Sent: Friday, July 28, 2023 11:55 PM
> To: thomas@monjalon.net
> Cc: dev@dpdk.org; nd <nd@arm.com>; Honnappa Nagarahalli
> <Honnappa.Nagarahalli@arm.com>; Feifei Wang <Feifei.Wang2@arm.com>;
> Ruifeng Wang <Ruifeng.Wang@arm.com>; Feifei Wang
> <Feifei.Wang2@arm.com>; ferruh.yigit@amd.com;
> konstantin.ananyev@huawei.com; andrew.rybchenko@oktetlabs.ru
> Subject: RE: [PATCH] doc: announce ethdev operation struct changes
> 
> > From: Thomas Monjalon [mailto:thomas@monjalon.net]
> > Sent: Friday, 28 July 2023 17.38
> >
> > 28/07/2023 17:33, Morten Brørup:
> > > > From: Thomas Monjalon [mailto:thomas@monjalon.net]
> > > > Sent: Friday, 28 July 2023 17.20
> > > >
> > > > 28/07/2023 17:08, Morten Brørup:
> > > > > > From: Thomas Monjalon [mailto:thomas@monjalon.net]
> > > > > > Sent: Friday, 28 July 2023 16.57
> > > > > >
> > > > > > 04/07/2023 10:10, Feifei Wang:
> > > > > > > To support mbufs recycle mode, announce the coming ABI
> > > > > > > changes from DPDK 23.11.
> > > > > > >
> > > > > > > Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
> > > > > > > Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
> > > > > > > ---
> > > > > > >  doc/guides/rel_notes/deprecation.rst | 4 ++++
> > > > > > >  1 file changed, 4 insertions(+)
> > > > > > >
> > > > > > > diff --git a/doc/guides/rel_notes/deprecation.rst
> > > > > > b/doc/guides/rel_notes/deprecation.rst
> > > > > > > index 66431789b0..c7e1ffafb2 100644
> > > > > > > --- a/doc/guides/rel_notes/deprecation.rst
> > > > > > > +++ b/doc/guides/rel_notes/deprecation.rst
> > > > > > > @@ -118,6 +118,10 @@ Deprecation Notices
> > > > > > >    The legacy actions should be removed
> > > > > > >    once ``MODIFY_FIELD`` alternative is implemented in drivers.
> > > > > > >
> > > > > > > +* ethdev: The Ethernet device data structure ``struct
> > > > > > > +rte_eth_dev``
> > and
> > > > > > > +  the fast-path ethdev flat array ``struct rte_eth_fp_ops``
> > > > > > > + will be
> > > > updated
> > > > > > > +  with new fields to support mbufs recycle mode from DPDK 23.11.
> > > > >
> > > > > Existing fields will also be moved around [1]:
> > > > >
> > > > > @@ -83,15 +90,17 @@  struct rte_eth_fp_ops {
> > > > >  	 * Rx fast-path functions and related data.
> > > > >  	 * 64-bit systems: occupies first 64B line
> > > > >  	 */
> > > > > +	/** Rx queues data. */
> > > > > +	struct rte_ethdev_qdata rxq;
> > > > >  	/** PMD receive function. */
> > > > >  	eth_rx_burst_t rx_pkt_burst;
> > > > >  	/** Get the number of used Rx descriptors. */
> > > > >  	eth_rx_queue_count_t rx_queue_count;
> > > > >  	/** Check the status of a Rx descriptor. */
> > > > >  	eth_rx_descriptor_status_t rx_descriptor_status;
> > > > > -	/** Rx queues data. */
> > > > > -	struct rte_ethdev_qdata rxq;
> > > > > -	uintptr_t reserved1[3];
> > > > > +	/** Refill Rx descriptors with the recycling mbufs. */
> > > > > +	eth_recycle_rx_descriptors_refill_t
> > recycle_rx_descriptors_refill;
> > > > > +	uintptr_t reserved1[2];
> > > > >  	/**@}*/
> > > > >
> > > > >  	/**@{*/
> > > > > @@ -99,15 +108,17 @@  struct rte_eth_fp_ops {
> > > > >  	 * Tx fast-path functions and related data.
> > > > >  	 * 64-bit systems: occupies second 64B line
> > > > >  	 */
> > > > > +	/** Tx queues data. */
> > > > > +	struct rte_ethdev_qdata txq;
> > > > >  	/** PMD transmit function. */
> > > > >  	eth_tx_burst_t tx_pkt_burst;
> > > > >  	/** PMD transmit prepare function. */
> > > > >  	eth_tx_prep_t tx_pkt_prepare;
> > > > >  	/** Check the status of a Tx descriptor. */
> > > > >  	eth_tx_descriptor_status_t tx_descriptor_status;
> > > > > -	/** Tx queues data. */
> > > > > -	struct rte_ethdev_qdata txq;
> > > > > -	uintptr_t reserved2[3];
> > > > > +	/** Copy used mbufs from Tx mbuf ring into Rx. */
> > > > > +	eth_recycle_tx_mbufs_reuse_t recycle_tx_mbufs_reuse;
> > > > > +	uintptr_t reserved2[2];
> > > > >  	/**@}*/
> > > >
> > > > Removing existing fields should be announced explicitly.
> > >
> > > Agreed. And the patch misses this. The "rxq" and "txq" fields are
> > > not being
> > removed, they are being moved up in the structures. Your comment about
> > explicit mentioning still applies!
> > >
> > > If there's no time to wait for a new patch version from Feifei,
> > > perhaps you
> > improve the description while merging.
> >
> > If it's only moving fields, we can skip.
> 
> OK. Thank you for elaborating.
> 
> > The real change is the size of the reserved fields, so it looks
> > acceptable without notice.
> 
> Agree.

Sorry for my late. Agree with this change. And then, I will update a new version
of recycle mbufs mode for dpdk 23.11

> 
> Thoughts for later: We should perhaps document that changing the size of
> reserved fields is acceptable. And with that, if completely removing a reserved
> field is also acceptable or not.


^ permalink raw reply	[relevance 0%]

* Re: [PATCH 1/3] version: 23.11-rc0
  2023-07-31  9:43 12% ` [PATCH 1/3] " David Marchand
  2023-07-31 10:00  0%   ` Bruce Richardson
@ 2023-07-31 19:03  0%   ` Aaron Conole
  1 sibling, 0 replies; 200+ results
From: Aaron Conole @ 2023-07-31 19:03 UTC (permalink / raw)
  To: David Marchand
  Cc: dev, thomas, Michael Santana, Nicolas Chautru, Hemant Agrawal,
	Sachin Saxena, Chenbo Xia, Nipun Gupta, Tomasz Duszynski,
	Long Li, Anoob Joseph, Kai Ji, Gagandeep Singh, Timothy McDaniel,
	Ashwin Sekhar T K, Pavan Nikhilesh, Igor Russkikh, Ajit Khaparde,
	Somnath Kotur, Chas Williams, Min Hu (Connor),
	Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao,
	Yuying Zhang, Beilei Xing, Jingjing Wu, Qiming Yang, Qi Zhang,
	Rosen Xu, Wenjun Wu, Matan Azrad, Viacheslav Ovsiienko, Ori Kam,
	Suanming Mou, Harman Kalra, Bruce Richardson,
	Cristian Dumitrescu, Maxime Coquelin, Tianfei Zhang,
	Konstantin Ananyev, Olivier Matz, Akhil Goyal, Fan Zhang,
	David Hunt, Byron Marohn, Yipeng Wang, Ferruh Yigit,
	Andrew Rybchenko, Jerin Jacob, Vladimir Medvedkin, Jiayu Hu,
	Sameh Gobriel, Reshma Pattan, Gaetan Rivet, Stephen Hemminger,
	Anatoly Burakov, Honnappa Nagarahalli, Volodymyr Fialko,
	Erik Gabriel Carrillo

David Marchand <david.marchand@redhat.com> writes:

> Start a new release cycle with empty release notes.
>
> The ABI version becomes 24.0.
> The map files are updated to the new ABI major number (24).
> The ABI exceptions are dropped and CI ABI checks are disabled because
> compatibility is not preserved.
>
> The telemetry and vhost libraries compat code is cleaned up in next
> commits.
>
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> ---

Acked-by: Aaron Conole <aconole@redhat.com>


^ permalink raw reply	[relevance 0%]

* [PATCH v3] build: update DPDK to use C11 standard
  2023-07-31 10:38  4% [PATCH] build: update DPDK to use C11 standard Bruce Richardson
  2023-07-31 15:58  4% ` [PATCH v2] " Bruce Richardson
@ 2023-07-31 16:58  4% ` Bruce Richardson
  2023-08-01 13:15  4% ` [PATCH v4] " Bruce Richardson
  2023-08-02 12:31  4% ` [PATCH v5] " Bruce Richardson
  3 siblings, 0 replies; 200+ results
From: Bruce Richardson @ 2023-07-31 16:58 UTC (permalink / raw)
  To: dev; +Cc: Bruce Richardson, Morten Brørup, Tyler Retzlaff

As previously announced, DPDK 23.11 will require a C11 supporting
compiler and will use the C11 standard in all builds.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
Acked-by: Tyler Retzlaff <roretzla@linux.microsoft.com>

---
V3:
* remove (now unneeded) use of -std=gnu99 in failsafe net driver.

V2:
* Resubmit now that 23.11-rc0 patch applied
* Add _POSIX_C_SOURCE macro to eal_common_errno.c to get POSIX
  definition of strerror_r() with c11 standard.
---
 doc/guides/linux_gsg/sys_reqs.rst      |  3 ++-
 doc/guides/rel_notes/deprecation.rst   | 18 ------------------
 doc/guides/rel_notes/release_23_11.rst | 17 +++++++++++++++++
 drivers/net/failsafe/meson.build       |  1 -
 lib/eal/common/eal_common_errno.c      |  1 +
 meson.build                            |  1 +
 6 files changed, 21 insertions(+), 20 deletions(-)

diff --git a/doc/guides/linux_gsg/sys_reqs.rst b/doc/guides/linux_gsg/sys_reqs.rst
index dfeaf4e1c5..13be715933 100644
--- a/doc/guides/linux_gsg/sys_reqs.rst
+++ b/doc/guides/linux_gsg/sys_reqs.rst
@@ -27,7 +27,8 @@ Compilation of the DPDK
     The setup commands and installed packages needed on various systems may be different.
     For details on Linux distributions and the versions tested, please consult the DPDK Release Notes.
 
-*   General development tools including a supported C compiler such as gcc (version 4.9+) or clang (version 3.4+),
+*   General development tools including a C compiler supporting the C11 standard,
+    including standard atomics, for example: GCC (version 5.0+) or Clang (version 3.6+),
     and ``pkg-config`` or ``pkgconf`` to be used when building end-user binaries against DPDK.
 
     * For RHEL/Fedora systems these can be installed using ``dnf groupinstall "Development Tools"``
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 494b401cda..cc939d3c67 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -17,24 +17,6 @@ Other API and ABI deprecation notices are to be posted below.
 Deprecation Notices
 -------------------
 
-* C Compiler: From DPDK 23.11 onwards,
-  building DPDK will require a C compiler which supports the C11 standard,
-  including support for C11 standard atomics.
-
-  More specifically, the requirements will be:
-
-  * Support for flag "-std=c11" (or similar)
-  * __STDC_NO_ATOMICS__ is *not defined* when using c11 flag
-
-  Please note:
-
-  * C11, including standard atomics, is supported from GCC version 5 onwards,
-    and is the default language version in that release
-    (Ref: https://gcc.gnu.org/gcc-5/changes.html)
-  * C11 is the default compilation mode in Clang from version 3.6,
-    which also added support for standard atomics
-    (Ref: https://releases.llvm.org/3.6.0/tools/clang/docs/ReleaseNotes.html)
-
 * build: Enabling deprecated libraries (``flow_classify``, ``kni``)
   won't be possible anymore through the use of the ``disable_libs`` build option.
   A new build option for deprecated libraries will be introduced instead.
diff --git a/doc/guides/rel_notes/release_23_11.rst b/doc/guides/rel_notes/release_23_11.rst
index 6b4dd21fd0..c8b9ed456c 100644
--- a/doc/guides/rel_notes/release_23_11.rst
+++ b/doc/guides/rel_notes/release_23_11.rst
@@ -20,6 +20,23 @@ DPDK Release 23.11
       ninja -C build doc
       xdg-open build/doc/guides/html/rel_notes/release_23_11.html
 
+* Build Requirements: From DPDK 23.11 onwards,
+  building DPDK will require a C compiler which supports the C11 standard,
+  including support for C11 standard atomics.
+
+  More specifically, the requirements will be:
+
+  * Support for flag "-std=c11" (or similar)
+  * __STDC_NO_ATOMICS__ is *not defined* when using c11 flag
+
+  Please note:
+
+  * C11, including standard atomics, is supported from GCC version 5 onwards,
+    and is the default language version in that release
+    (Ref: https://gcc.gnu.org/gcc-5/changes.html)
+  * C11 is the default compilation mode in Clang from version 3.6,
+    which also added support for standard atomics
+    (Ref: https://releases.llvm.org/3.6.0/tools/clang/docs/ReleaseNotes.html)
 
 New Features
 ------------
diff --git a/drivers/net/failsafe/meson.build b/drivers/net/failsafe/meson.build
index 6013e13722..c1d361083b 100644
--- a/drivers/net/failsafe/meson.build
+++ b/drivers/net/failsafe/meson.build
@@ -7,7 +7,6 @@ if is_windows
     subdir_done()
 endif
 
-cflags += '-std=gnu99'
 cflags += '-D_DEFAULT_SOURCE'
 cflags += '-D_XOPEN_SOURCE=700'
 cflags += '-pedantic'
diff --git a/lib/eal/common/eal_common_errno.c b/lib/eal/common/eal_common_errno.c
index ef8f782abb..b30e2f0ad4 100644
--- a/lib/eal/common/eal_common_errno.c
+++ b/lib/eal/common/eal_common_errno.c
@@ -4,6 +4,7 @@
 
 /* Use XSI-compliant portable version of strerror_r() */
 #undef _GNU_SOURCE
+#define _POSIX_C_SOURCE 200809L
 
 #include <stdio.h>
 #include <string.h>
diff --git a/meson.build b/meson.build
index 39cb73846d..70b54f0c98 100644
--- a/meson.build
+++ b/meson.build
@@ -9,6 +9,7 @@ project('DPDK', 'c',
         license: 'BSD',
         default_options: [
             'buildtype=release',
+            'c_std=c11',
             'default_library=static',
             'warning_level=2',
         ],
-- 
2.39.2


^ permalink raw reply	[relevance 4%]

* Re: [PATCH v2] build: update DPDK to use C11 standard
  2023-07-31 15:58  4% ` [PATCH v2] " Bruce Richardson
@ 2023-07-31 16:42  0%   ` Tyler Retzlaff
  0 siblings, 0 replies; 200+ results
From: Tyler Retzlaff @ 2023-07-31 16:42 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: dev, Morten Brørup

On Mon, Jul 31, 2023 at 04:58:02PM +0100, Bruce Richardson wrote:
> As previously announced, DPDK 23.11 will require a C11 supporting
> compiler and will use the C11 standard in all builds.
> 
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> Acked-by: Morten Brørup <mb@smartsharesystems.com>
> 
> ---
> V2:
> * Resubmit now that 23.11-rc0 patch applied
> * Add _POSIX_C_SOURCE macro to eal_common_errno.c to get POSIX
>   definition of strerror_r() with c11 standard.
> ---
>  doc/guides/linux_gsg/sys_reqs.rst      |  3 ++-
>  doc/guides/rel_notes/deprecation.rst   | 18 ------------------
>  doc/guides/rel_notes/release_23_11.rst | 17 +++++++++++++++++
>  lib/eal/common/eal_common_errno.c      |  1 +
>  meson.build                            |  1 +
>  5 files changed, 21 insertions(+), 19 deletions(-)
> 
> diff --git a/doc/guides/linux_gsg/sys_reqs.rst b/doc/guides/linux_gsg/sys_reqs.rst
> index dfeaf4e1c5..13be715933 100644
> --- a/doc/guides/linux_gsg/sys_reqs.rst
> +++ b/doc/guides/linux_gsg/sys_reqs.rst
> @@ -27,7 +27,8 @@ Compilation of the DPDK
>      The setup commands and installed packages needed on various systems may be different.
>      For details on Linux distributions and the versions tested, please consult the DPDK Release Notes.
>  
> -*   General development tools including a supported C compiler such as gcc (version 4.9+) or clang (version 3.4+),
> +*   General development tools including a C compiler supporting the C11 standard,
> +    including standard atomics, for example: GCC (version 5.0+) or Clang (version 3.6+),
>      and ``pkg-config`` or ``pkgconf`` to be used when building end-user binaries against DPDK.
>  
>      * For RHEL/Fedora systems these can be installed using ``dnf groupinstall "Development Tools"``
> diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
> index 494b401cda..cc939d3c67 100644
> --- a/doc/guides/rel_notes/deprecation.rst
> +++ b/doc/guides/rel_notes/deprecation.rst
> @@ -17,24 +17,6 @@ Other API and ABI deprecation notices are to be posted below.
>  Deprecation Notices
>  -------------------
>  
> -* C Compiler: From DPDK 23.11 onwards,
> -  building DPDK will require a C compiler which supports the C11 standard,
> -  including support for C11 standard atomics.
> -
> -  More specifically, the requirements will be:
> -
> -  * Support for flag "-std=c11" (or similar)
> -  * __STDC_NO_ATOMICS__ is *not defined* when using c11 flag
> -
> -  Please note:
> -
> -  * C11, including standard atomics, is supported from GCC version 5 onwards,
> -    and is the default language version in that release
> -    (Ref: https://gcc.gnu.org/gcc-5/changes.html)
> -  * C11 is the default compilation mode in Clang from version 3.6,
> -    which also added support for standard atomics
> -    (Ref: https://releases.llvm.org/3.6.0/tools/clang/docs/ReleaseNotes.html)
> -
>  * build: Enabling deprecated libraries (``flow_classify``, ``kni``)
>    won't be possible anymore through the use of the ``disable_libs`` build option.
>    A new build option for deprecated libraries will be introduced instead.
> diff --git a/doc/guides/rel_notes/release_23_11.rst b/doc/guides/rel_notes/release_23_11.rst
> index 6b4dd21fd0..c8b9ed456c 100644
> --- a/doc/guides/rel_notes/release_23_11.rst
> +++ b/doc/guides/rel_notes/release_23_11.rst
> @@ -20,6 +20,23 @@ DPDK Release 23.11
>        ninja -C build doc
>        xdg-open build/doc/guides/html/rel_notes/release_23_11.html
>  
> +* Build Requirements: From DPDK 23.11 onwards,
> +  building DPDK will require a C compiler which supports the C11 standard,
> +  including support for C11 standard atomics.
> +
> +  More specifically, the requirements will be:
> +
> +  * Support for flag "-std=c11" (or similar)
> +  * __STDC_NO_ATOMICS__ is *not defined* when using c11 flag
> +
> +  Please note:
> +
> +  * C11, including standard atomics, is supported from GCC version 5 onwards,
> +    and is the default language version in that release
> +    (Ref: https://gcc.gnu.org/gcc-5/changes.html)
> +  * C11 is the default compilation mode in Clang from version 3.6,
> +    which also added support for standard atomics
> +    (Ref: https://releases.llvm.org/3.6.0/tools/clang/docs/ReleaseNotes.html)
>  
>  New Features
>  ------------
> diff --git a/lib/eal/common/eal_common_errno.c b/lib/eal/common/eal_common_errno.c
> index ef8f782abb..b30e2f0ad4 100644
> --- a/lib/eal/common/eal_common_errno.c
> +++ b/lib/eal/common/eal_common_errno.c
> @@ -4,6 +4,7 @@
>  
>  /* Use XSI-compliant portable version of strerror_r() */
>  #undef _GNU_SOURCE
> +#define _POSIX_C_SOURCE 200809L
>  
>  #include <stdio.h>
>  #include <string.h>
> diff --git a/meson.build b/meson.build
> index 39cb73846d..70b54f0c98 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -9,6 +9,7 @@ project('DPDK', 'c',
>          license: 'BSD',
>          default_options: [
>              'buildtype=release',
> +            'c_std=c11',
>              'default_library=static',
>              'warning_level=2',
>          ],
> -- 

oh I acked v2 (and you can maintain that ack) but one additional removal
of forced -std=gnu99 is maybe necessary?

drivers/net/failsafe/meson.build
    probably should remove cflags += '-std=gnu99'

if we remove it we inherit the -std=c11 from meson project configuration
and define a _POSIX_C_SOURCE narrowly where necessary (if it is needed).

^ permalink raw reply	[relevance 0%]

* [PATCH v2] build: update DPDK to use C11 standard
  2023-07-31 10:38  4% [PATCH] build: update DPDK to use C11 standard Bruce Richardson
@ 2023-07-31 15:58  4% ` Bruce Richardson
  2023-07-31 16:42  0%   ` Tyler Retzlaff
  2023-07-31 16:58  4% ` [PATCH v3] " Bruce Richardson
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 200+ results
From: Bruce Richardson @ 2023-07-31 15:58 UTC (permalink / raw)
  To: dev; +Cc: Bruce Richardson, Morten Brørup

As previously announced, DPDK 23.11 will require a C11 supporting
compiler and will use the C11 standard in all builds.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>

---
V2:
* Resubmit now that 23.11-rc0 patch applied
* Add _POSIX_C_SOURCE macro to eal_common_errno.c to get POSIX
  definition of strerror_r() with c11 standard.
---
 doc/guides/linux_gsg/sys_reqs.rst      |  3 ++-
 doc/guides/rel_notes/deprecation.rst   | 18 ------------------
 doc/guides/rel_notes/release_23_11.rst | 17 +++++++++++++++++
 lib/eal/common/eal_common_errno.c      |  1 +
 meson.build                            |  1 +
 5 files changed, 21 insertions(+), 19 deletions(-)

diff --git a/doc/guides/linux_gsg/sys_reqs.rst b/doc/guides/linux_gsg/sys_reqs.rst
index dfeaf4e1c5..13be715933 100644
--- a/doc/guides/linux_gsg/sys_reqs.rst
+++ b/doc/guides/linux_gsg/sys_reqs.rst
@@ -27,7 +27,8 @@ Compilation of the DPDK
     The setup commands and installed packages needed on various systems may be different.
     For details on Linux distributions and the versions tested, please consult the DPDK Release Notes.
 
-*   General development tools including a supported C compiler such as gcc (version 4.9+) or clang (version 3.4+),
+*   General development tools including a C compiler supporting the C11 standard,
+    including standard atomics, for example: GCC (version 5.0+) or Clang (version 3.6+),
     and ``pkg-config`` or ``pkgconf`` to be used when building end-user binaries against DPDK.
 
     * For RHEL/Fedora systems these can be installed using ``dnf groupinstall "Development Tools"``
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 494b401cda..cc939d3c67 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -17,24 +17,6 @@ Other API and ABI deprecation notices are to be posted below.
 Deprecation Notices
 -------------------
 
-* C Compiler: From DPDK 23.11 onwards,
-  building DPDK will require a C compiler which supports the C11 standard,
-  including support for C11 standard atomics.
-
-  More specifically, the requirements will be:
-
-  * Support for flag "-std=c11" (or similar)
-  * __STDC_NO_ATOMICS__ is *not defined* when using c11 flag
-
-  Please note:
-
-  * C11, including standard atomics, is supported from GCC version 5 onwards,
-    and is the default language version in that release
-    (Ref: https://gcc.gnu.org/gcc-5/changes.html)
-  * C11 is the default compilation mode in Clang from version 3.6,
-    which also added support for standard atomics
-    (Ref: https://releases.llvm.org/3.6.0/tools/clang/docs/ReleaseNotes.html)
-
 * build: Enabling deprecated libraries (``flow_classify``, ``kni``)
   won't be possible anymore through the use of the ``disable_libs`` build option.
   A new build option for deprecated libraries will be introduced instead.
diff --git a/doc/guides/rel_notes/release_23_11.rst b/doc/guides/rel_notes/release_23_11.rst
index 6b4dd21fd0..c8b9ed456c 100644
--- a/doc/guides/rel_notes/release_23_11.rst
+++ b/doc/guides/rel_notes/release_23_11.rst
@@ -20,6 +20,23 @@ DPDK Release 23.11
       ninja -C build doc
       xdg-open build/doc/guides/html/rel_notes/release_23_11.html
 
+* Build Requirements: From DPDK 23.11 onwards,
+  building DPDK will require a C compiler which supports the C11 standard,
+  including support for C11 standard atomics.
+
+  More specifically, the requirements will be:
+
+  * Support for flag "-std=c11" (or similar)
+  * __STDC_NO_ATOMICS__ is *not defined* when using c11 flag
+
+  Please note:
+
+  * C11, including standard atomics, is supported from GCC version 5 onwards,
+    and is the default language version in that release
+    (Ref: https://gcc.gnu.org/gcc-5/changes.html)
+  * C11 is the default compilation mode in Clang from version 3.6,
+    which also added support for standard atomics
+    (Ref: https://releases.llvm.org/3.6.0/tools/clang/docs/ReleaseNotes.html)
 
 New Features
 ------------
diff --git a/lib/eal/common/eal_common_errno.c b/lib/eal/common/eal_common_errno.c
index ef8f782abb..b30e2f0ad4 100644
--- a/lib/eal/common/eal_common_errno.c
+++ b/lib/eal/common/eal_common_errno.c
@@ -4,6 +4,7 @@
 
 /* Use XSI-compliant portable version of strerror_r() */
 #undef _GNU_SOURCE
+#define _POSIX_C_SOURCE 200809L
 
 #include <stdio.h>
 #include <string.h>
diff --git a/meson.build b/meson.build
index 39cb73846d..70b54f0c98 100644
--- a/meson.build
+++ b/meson.build
@@ -9,6 +9,7 @@ project('DPDK', 'c',
         license: 'BSD',
         default_options: [
             'buildtype=release',
+            'c_std=c11',
             'default_library=static',
             'warning_level=2',
         ],
-- 
2.39.2


^ permalink raw reply	[relevance 4%]

* cmdline programmer documentation
@ 2023-07-31 15:41  3% Stephen Hemminger
  0 siblings, 0 replies; 200+ results
From: Stephen Hemminger @ 2023-07-31 15:41 UTC (permalink / raw)
  To: Olivier Matz; +Cc: dev

Noticed that the cmdline library is missing from programmers guide.
The only documentation for it is in the examples.
Should it be made part of the guide?

Is it really a stable ABI at this point - probably yes.
Although the API is awkward to use, and not a lot of tests,
it does work and has been used for years.

^ permalink raw reply	[relevance 3%]

* [PATCH v7 0/3] Split logging functionality out of EAL
    2023-07-31 10:17  3% ` [PATCH v6 0/3] Split logging functionality " Bruce Richardson
@ 2023-07-31 15:38  4% ` Bruce Richardson
  1 sibling, 0 replies; 200+ results
From: Bruce Richardson @ 2023-07-31 15:38 UTC (permalink / raw)
  To: dev; +Cc: Bruce Richardson

There is a general desire to reduce the size and scope of EAL. To this
end, this patchset makes a (very) small step in that direction by taking
the logging functionality out of EAL and putting it into its own library
that can be built and maintained separately.

As with the first RFC for this, the main obstacle is the "fnmatch"
function which is needed by both EAL and the new log function when
building on windows. While the function cannot stay in EAL - or we would
have a circular dependency, moving it to a new library or just putting
it in the log library have the disadvantages that it then "leaks" into
the public namespace without an rte_prefix, which could cause issues.
Since only a single function is involved, subsequent versions take a
different approach to v1, and just moves the offending function to be a
static function in a header file. This allows use by multiple libs
without conflicting names or making it public.

The other complication, as explained in v1 RFC was that of multiple
implementations for different OS's. This is solved here in the same
way as v1, by including the OS in the name and having meson pick the
correct file for each build. Since only one file is involved, there
seemed little need for replicating EAL's separate subdirectories
per-OS.

V7:
* re-submit to re-run CI with ABI checks disabled

v6:
* Updated ABI version to DPDK_24 for new log library for 23.11 release.

v5:
* rebased to latest main branch
* fixed trailing whitespace issues in new doc section

v4:
* Fixed windows build error, due to missing strdup (_strdup on windows)
* Added doc updates to programmers guide.

v3:
* Fixed missing log file for BSD
* Removed "eal" from the filenames of files in the log directory
* added prefixes to elements in the fnmatch header to avoid conflicts
* fixed space indentation in new lines in telemetry.c (checkpatch)
* removed "extern int logtype" definition in telemetry.c (checkpatch)
* added log directory to list for doxygen scanning

Bruce Richardson (3):
  eal/windows: move fnmatch function to header file
  log: separate logging functions out of EAL
  telemetry: use standard logging

 doc/api/doxy-api.conf.in                      |   1 +
 .../prog_guide/env_abstraction_layer.rst      |   4 +-
 doc/guides/prog_guide/index.rst               |   1 +
 doc/guides/prog_guide/log_lib.rst             | 115 ++++++++++++
 lib/eal/common/eal_common_options.c           |   2 +-
 lib/eal/common/eal_private.h                  |   7 -
 lib/eal/common/meson.build                    |   1 -
 lib/eal/freebsd/eal.c                         |   6 +-
 lib/eal/include/meson.build                   |   1 -
 lib/eal/linux/eal.c                           |   8 +-
 lib/eal/linux/meson.build                     |   1 -
 lib/eal/meson.build                           |   2 +-
 lib/eal/version.map                           |  17 --
 lib/eal/windows/eal.c                         |   2 +-
 lib/eal/windows/fnmatch.c                     | 172 -----------------
 lib/eal/windows/include/fnmatch.h             | 175 ++++++++++++++++--
 lib/eal/windows/meson.build                   |   2 -
 lib/kvargs/meson.build                        |   3 +-
 .../common/eal_common_log.c => log/log.c}     |   7 +-
 lib/log/log_freebsd.c                         |  12 ++
 .../common/eal_log.h => log/log_internal.h}   |  18 +-
 lib/{eal/linux/eal_log.c => log/log_linux.c}  |   2 +-
 .../windows/eal_log.c => log/log_windows.c}   |   2 +-
 lib/log/meson.build                           |   9 +
 lib/{eal/include => log}/rte_log.h            |   0
 lib/log/version.map                           |  34 ++++
 lib/meson.build                               |   1 +
 lib/telemetry/meson.build                     |   3 +-
 lib/telemetry/telemetry.c                     |  11 +-
 lib/telemetry/telemetry_internal.h            |   3 +-
 30 files changed, 370 insertions(+), 252 deletions(-)
 create mode 100644 doc/guides/prog_guide/log_lib.rst
 delete mode 100644 lib/eal/windows/fnmatch.c
 rename lib/{eal/common/eal_common_log.c => log/log.c} (99%)
 create mode 100644 lib/log/log_freebsd.c
 rename lib/{eal/common/eal_log.h => log/log_internal.h} (69%)
 rename lib/{eal/linux/eal_log.c => log/log_linux.c} (97%)
 rename lib/{eal/windows/eal_log.c => log/log_windows.c} (93%)
 create mode 100644 lib/log/meson.build
 rename lib/{eal/include => log}/rte_log.h (100%)
 create mode 100644 lib/log/version.map

--
2.39.2


^ permalink raw reply	[relevance 4%]

* Re: [PATCH v2] kni: remove deprecated kernel network interface
  2023-07-31 15:13  3%       ` Stephen Hemminger
@ 2023-07-31 15:21  4%         ` David Marchand
  0 siblings, 0 replies; 200+ results
From: David Marchand @ 2023-07-31 15:21 UTC (permalink / raw)
  To: Stephen Hemminger
  Cc: Thomas Monjalon, dev, Maxime Coquelin, Chenbo Xia,
	Anatoly Burakov, Cristian Dumitrescu, Nithin Dabilpuram,
	Kiran Kumar K, Sunil Kumar Kori, Satha Rao, Bruce Richardson

On Mon, Jul 31, 2023 at 5:13 PM Stephen Hemminger
<stephen@networkplumber.org> wrote:
> > > 2. The OVSrobot is looking into the port library to see the kni symbols.
> > > But port is marked as deprecated already.
> > > Perhaps we should just pull out port first?
> >
> > No we must support it until it is removed.
> > You should either disable or remove KNI from the port library.
>
> The patch removed from port library and it builds but the ABI
> robot was looking for symbols.

The ABI check was still active by the time you submitted this series.
Please resend it now that the ABI check is disabled with rc0 merged.


-- 
David Marchand


^ permalink raw reply	[relevance 4%]

* Re: [PATCH v2] kni: remove deprecated kernel network interface
  @ 2023-07-31 15:13  3%       ` Stephen Hemminger
  2023-07-31 15:21  4%         ` David Marchand
  0 siblings, 1 reply; 200+ results
From: Stephen Hemminger @ 2023-07-31 15:13 UTC (permalink / raw)
  To: Thomas Monjalon
  Cc: dev, Maxime Coquelin, Chenbo Xia, Anatoly Burakov,
	Cristian Dumitrescu, Nithin Dabilpuram, Kiran Kumar K,
	Sunil Kumar Kori, Satha Rao, Bruce Richardson, david.marchand

On Mon, 31 Jul 2023 10:40:35 +0200
Thomas Monjalon <thomas@monjalon.net> wrote:

> 30/07/2023 19:12, Stephen Hemminger:
> > On Sat, 29 Jul 2023 19:12:05 -0700
> > Stephen Hemminger <stephen@networkplumber.org> wrote:
> >   
> > > Deprecation and removal was announced in 22.11.
> > > Make it so.  
> 
> Would be good to summarize the reason here,
> and name replacements.
> 
> Also it should not be completely removed.
> I think we were supposed to move KNI into the kmod repository?

The decision I remember was to remove it completely.
KNI has several issues which make it unstable and even a potential
security problem. Moving it doesn't stop usage.

> > > Leave kernel/linux with empty directory because
> > > CI is trying to directly build it. At some later date,
> > > kernel/linux can be removed.
> > > 
> > > Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> > > ---  
> > 
> > Want suggestions on this.
> > 1. The release notes gets coding style warning because checkpatch
> > is checking that release note matches current release, and release number
> > hasn't change yet.  Should I just wait?  
> 
> Yes the release notes file for 23.11 should be created today.
> 
> 
> > 2. The OVSrobot is looking into the port library to see the kni symbols.
> > But port is marked as deprecated already.
> > Perhaps we should just pull out port first?  
> 
> No we must support it until it is removed.
> You should either disable or remove KNI from the port library.

The patch removed from port library and it builds but the ABI
robot was looking for symbols.

Will just remove port library first.

^ permalink raw reply	[relevance 3%]

* [PATCH] build: update DPDK to use C11 standard
@ 2023-07-31 10:38  4% Bruce Richardson
  2023-07-31 15:58  4% ` [PATCH v2] " Bruce Richardson
                   ` (3 more replies)
  0 siblings, 4 replies; 200+ results
From: Bruce Richardson @ 2023-07-31 10:38 UTC (permalink / raw)
  To: dev; +Cc: Bruce Richardson

As previously announced, DPDK 23.11 will require a C11 supporting
compiler and will use the C11 standard in all builds.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>

---

When moving the information about the new requirement to the release
notes, a change like this doesn't seem to fit into any existing section.
Given its global scope and importance, I've therefore just put it on
top of the file, rather than in any section.
---
 doc/guides/linux_gsg/sys_reqs.rst      |  3 ++-
 doc/guides/rel_notes/deprecation.rst   | 18 ------------------
 doc/guides/rel_notes/release_23_11.rst | 17 +++++++++++++++++
 meson.build                            |  1 +
 4 files changed, 20 insertions(+), 19 deletions(-)

diff --git a/doc/guides/linux_gsg/sys_reqs.rst b/doc/guides/linux_gsg/sys_reqs.rst
index dfeaf4e1c5..13be715933 100644
--- a/doc/guides/linux_gsg/sys_reqs.rst
+++ b/doc/guides/linux_gsg/sys_reqs.rst
@@ -27,7 +27,8 @@ Compilation of the DPDK
     The setup commands and installed packages needed on various systems may be different.
     For details on Linux distributions and the versions tested, please consult the DPDK Release Notes.
 
-*   General development tools including a supported C compiler such as gcc (version 4.9+) or clang (version 3.4+),
+*   General development tools including a C compiler supporting the C11 standard,
+    including standard atomics, for example: GCC (version 5.0+) or Clang (version 3.6+),
     and ``pkg-config`` or ``pkgconf`` to be used when building end-user binaries against DPDK.
 
     * For RHEL/Fedora systems these can be installed using ``dnf groupinstall "Development Tools"``
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 494b401cda..cc939d3c67 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -17,24 +17,6 @@ Other API and ABI deprecation notices are to be posted below.
 Deprecation Notices
 -------------------
 
-* C Compiler: From DPDK 23.11 onwards,
-  building DPDK will require a C compiler which supports the C11 standard,
-  including support for C11 standard atomics.
-
-  More specifically, the requirements will be:
-
-  * Support for flag "-std=c11" (or similar)
-  * __STDC_NO_ATOMICS__ is *not defined* when using c11 flag
-
-  Please note:
-
-  * C11, including standard atomics, is supported from GCC version 5 onwards,
-    and is the default language version in that release
-    (Ref: https://gcc.gnu.org/gcc-5/changes.html)
-  * C11 is the default compilation mode in Clang from version 3.6,
-    which also added support for standard atomics
-    (Ref: https://releases.llvm.org/3.6.0/tools/clang/docs/ReleaseNotes.html)
-
 * build: Enabling deprecated libraries (``flow_classify``, ``kni``)
   won't be possible anymore through the use of the ``disable_libs`` build option.
   A new build option for deprecated libraries will be introduced instead.
diff --git a/doc/guides/rel_notes/release_23_11.rst b/doc/guides/rel_notes/release_23_11.rst
index 6b4dd21fd0..c8b9ed456c 100644
--- a/doc/guides/rel_notes/release_23_11.rst
+++ b/doc/guides/rel_notes/release_23_11.rst
@@ -20,6 +20,23 @@ DPDK Release 23.11
       ninja -C build doc
       xdg-open build/doc/guides/html/rel_notes/release_23_11.html
 
+* Build Requirements: From DPDK 23.11 onwards,
+  building DPDK will require a C compiler which supports the C11 standard,
+  including support for C11 standard atomics.
+
+  More specifically, the requirements will be:
+
+  * Support for flag "-std=c11" (or similar)
+  * __STDC_NO_ATOMICS__ is *not defined* when using c11 flag
+
+  Please note:
+
+  * C11, including standard atomics, is supported from GCC version 5 onwards,
+    and is the default language version in that release
+    (Ref: https://gcc.gnu.org/gcc-5/changes.html)
+  * C11 is the default compilation mode in Clang from version 3.6,
+    which also added support for standard atomics
+    (Ref: https://releases.llvm.org/3.6.0/tools/clang/docs/ReleaseNotes.html)
 
 New Features
 ------------
diff --git a/meson.build b/meson.build
index 39cb73846d..70b54f0c98 100644
--- a/meson.build
+++ b/meson.build
@@ -9,6 +9,7 @@ project('DPDK', 'c',
         license: 'BSD',
         default_options: [
             'buildtype=release',
+            'c_std=c11',
             'default_library=static',
             'warning_level=2',
         ],
-- 
2.39.2


^ permalink raw reply	[relevance 4%]

* [PATCH v6 0/3] Split logging functionality out of EAL
  @ 2023-07-31 10:17  3% ` Bruce Richardson
  2023-07-31 15:38  4% ` [PATCH v7 " Bruce Richardson
  1 sibling, 0 replies; 200+ results
From: Bruce Richardson @ 2023-07-31 10:17 UTC (permalink / raw)
  To: dev; +Cc: Bruce Richardson

There is a general desire to reduce the size and scope of EAL. To this
end, this patchset makes a (very) small step in that direction by taking
the logging functionality out of EAL and putting it into its own library
that can be built and maintained separately.

As with the first RFC for this, the main obstacle is the "fnmatch"
function which is needed by both EAL and the new log function when
building on windows. While the function cannot stay in EAL - or we would
have a circular dependency, moving it to a new library or just putting
it in the log library have the disadvantages that it then "leaks" into
the public namespace without an rte_prefix, which could cause issues.
Since only a single function is involved, subsequent versions take a
different approach to v1, and just moves the offending function to be a
static function in a header file. This allows use by multiple libs
without conflicting names or making it public.

The other complication, as explained in v1 RFC was that of multiple
implementations for different OS's. This is solved here in the same
way as v1, by including the OS in the name and having meson pick the
correct file for each build. Since only one file is involved, there
seemed little need for replicating EAL's separate subdirectories
per-OS.

v6:
* Updated ABI version to DPDK_24 for new log library for 23.11 release.

v5:
* rebased to latest main branch
* fixed trailing whitespace issues in new doc section

v4:
* Fixed windows build error, due to missing strdup (_strdup on windows)
* Added doc updates to programmers guide.

v3:
* Fixed missing log file for BSD
* Removed "eal" from the filenames of files in the log directory
* added prefixes to elements in the fnmatch header to avoid conflicts
* fixed space indentation in new lines in telemetry.c (checkpatch)
* removed "extern int logtype" definition in telemetry.c (checkpatch)
* added log directory to list for doxygen scanning

Bruce Richardson (3):
  eal/windows: move fnmatch function to header file
  log: separate logging functions out of EAL
  telemetry: use standard logging

 doc/api/doxy-api.conf.in                      |   1 +
 .../prog_guide/env_abstraction_layer.rst      |   4 +-
 doc/guides/prog_guide/index.rst               |   1 +
 doc/guides/prog_guide/log_lib.rst             | 115 ++++++++++++
 lib/eal/common/eal_common_options.c           |   2 +-
 lib/eal/common/eal_private.h                  |   7 -
 lib/eal/common/meson.build                    |   1 -
 lib/eal/freebsd/eal.c                         |   6 +-
 lib/eal/include/meson.build                   |   1 -
 lib/eal/linux/eal.c                           |   8 +-
 lib/eal/linux/meson.build                     |   1 -
 lib/eal/meson.build                           |   2 +-
 lib/eal/version.map                           |  17 --
 lib/eal/windows/eal.c                         |   2 +-
 lib/eal/windows/fnmatch.c                     | 172 -----------------
 lib/eal/windows/include/fnmatch.h             | 175 ++++++++++++++++--
 lib/eal/windows/meson.build                   |   2 -
 lib/kvargs/meson.build                        |   3 +-
 .../common/eal_common_log.c => log/log.c}     |   7 +-
 lib/log/log_freebsd.c                         |  12 ++
 .../common/eal_log.h => log/log_internal.h}   |  18 +-
 lib/{eal/linux/eal_log.c => log/log_linux.c}  |   2 +-
 .../windows/eal_log.c => log/log_windows.c}   |   2 +-
 lib/log/meson.build                           |   9 +
 lib/{eal/include => log}/rte_log.h            |   0
 lib/log/version.map                           |  34 ++++
 lib/meson.build                               |   1 +
 lib/telemetry/meson.build                     |   3 +-
 lib/telemetry/telemetry.c                     |  11 +-
 lib/telemetry/telemetry_internal.h            |   3 +-
 30 files changed, 370 insertions(+), 252 deletions(-)
 create mode 100644 doc/guides/prog_guide/log_lib.rst
 delete mode 100644 lib/eal/windows/fnmatch.c
 rename lib/{eal/common/eal_common_log.c => log/log.c} (99%)
 create mode 100644 lib/log/log_freebsd.c
 rename lib/{eal/common/eal_log.h => log/log_internal.h} (69%)
 rename lib/{eal/linux/eal_log.c => log/log_linux.c} (97%)
 rename lib/{eal/windows/eal_log.c => log/log_windows.c} (93%)
 create mode 100644 lib/log/meson.build
 rename lib/{eal/include => log}/rte_log.h (100%)
 create mode 100644 lib/log/version.map

--
2.39.2


^ permalink raw reply	[relevance 3%]

* Re: [PATCH 2/3] telemetry: remove v23 ABI compatibility
  2023-07-31  9:43  8% ` [PATCH 2/3] telemetry: remove v23 ABI compatibility David Marchand
@ 2023-07-31 10:01  4%   ` Bruce Richardson
  0 siblings, 0 replies; 200+ results
From: Bruce Richardson @ 2023-07-31 10:01 UTC (permalink / raw)
  To: David Marchand; +Cc: dev, thomas, Ciara Power

On Mon, Jul 31, 2023 at 11:43:54AM +0200, David Marchand wrote:
> v23.11 is a ABI breaking release, remove compatibility code for the
> previous major ABI version.
> 
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> ---
Acked-by: Bruce Richardson <bruce.richardson@intel.com>

^ permalink raw reply	[relevance 4%]

* Re: [PATCH 1/3] version: 23.11-rc0
  2023-07-31  9:43 12% ` [PATCH 1/3] " David Marchand
@ 2023-07-31 10:00  0%   ` Bruce Richardson
  2023-07-31 19:03  0%   ` Aaron Conole
  1 sibling, 0 replies; 200+ results
From: Bruce Richardson @ 2023-07-31 10:00 UTC (permalink / raw)
  To: David Marchand
  Cc: dev, thomas, Aaron Conole, Michael Santana, Nicolas Chautru,
	Hemant Agrawal, Sachin Saxena, Chenbo Xia, Nipun Gupta,
	Tomasz Duszynski, Long Li, Anoob Joseph, Kai Ji, Gagandeep Singh,
	Timothy McDaniel, Ashwin Sekhar T K, Pavan Nikhilesh,
	Igor Russkikh, Ajit Khaparde, Somnath Kotur, Chas Williams,
	Min Hu (Connor),
	Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao,
	Yuying Zhang, Beilei Xing, Jingjing Wu, Qiming Yang, Qi Zhang,
	Rosen Xu, Wenjun Wu, Matan Azrad, Viacheslav Ovsiienko, Ori Kam,
	Suanming Mou, Harman Kalra, Cristian Dumitrescu, Maxime Coquelin,
	Tianfei Zhang, Konstantin Ananyev, Olivier Matz, Akhil Goyal,
	Fan Zhang, David Hunt, Byron Marohn, Yipeng Wang, Ferruh Yigit,
	Andrew Rybchenko, Jerin Jacob, Vladimir Medvedkin, Jiayu Hu,
	Sameh Gobriel, Reshma Pattan, Gaetan Rivet, Stephen Hemminger,
	Anatoly Burakov, Honnappa Nagarahalli, Volodymyr Fialko,
	Erik Gabriel Carrillo

On Mon, Jul 31, 2023 at 11:43:53AM +0200, David Marchand wrote:
> Start a new release cycle with empty release notes.
> 
> The ABI version becomes 24.0.
> The map files are updated to the new ABI major number (24).
> The ABI exceptions are dropped and CI ABI checks are disabled because
> compatibility is not preserved.
> 
> The telemetry and vhost libraries compat code is cleaned up in next
> commits.
> 
> Signed-off-by: David Marchand <david.marchand@redhat.com>

Acked-by: Bruce Richardson <bruce.richardson@intel.com>


^ permalink raw reply	[relevance 0%]

* [PATCH 3/3] vhost: remove v23 ABI compatibility
  2023-07-31  9:43  4% [PATCH 0/3] version: 23.11-rc0 David Marchand
  2023-07-31  9:43 12% ` [PATCH 1/3] " David Marchand
  2023-07-31  9:43  8% ` [PATCH 2/3] telemetry: remove v23 ABI compatibility David Marchand
@ 2023-07-31  9:43  8% ` David Marchand
  2 siblings, 0 replies; 200+ results
From: David Marchand @ 2023-07-31  9:43 UTC (permalink / raw)
  To: dev; +Cc: thomas, Maxime Coquelin, Chenbo Xia

v23.11 is a ABI breaking release, remove compatibility code for the
previous major ABI version.

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
 lib/vhost/meson.build |  2 --
 lib/vhost/socket.c    | 59 +++----------------------------------------
 lib/vhost/version.map |  8 +-----
 lib/vhost/vhost.h     |  6 -----
 4 files changed, 5 insertions(+), 70 deletions(-)

diff --git a/lib/vhost/meson.build b/lib/vhost/meson.build
index 94f3d2535e..41b622a9be 100644
--- a/lib/vhost/meson.build
+++ b/lib/vhost/meson.build
@@ -43,5 +43,3 @@ driver_sdk_headers = files(
         'vdpa_driver.h',
 )
 deps += ['ethdev', 'cryptodev', 'hash', 'pci', 'dmadev']
-
-use_function_versioning = true
diff --git a/lib/vhost/socket.c b/lib/vhost/socket.c
index 033f4b3b75..fefe60fae6 100644
--- a/lib/vhost/socket.c
+++ b/lib/vhost/socket.c
@@ -15,7 +15,6 @@
 #include <fcntl.h>
 #include <pthread.h>
 
-#include <rte_function_versioning.h>
 #include <rte_log.h>
 
 #include "fd_man.h"
@@ -64,7 +63,6 @@ struct vhost_user_socket {
 	struct rte_vdpa_device *vdpa_dev;
 
 	struct rte_vhost_device_ops const *notify_ops;
-	struct rte_vhost_device_ops *malloc_notify_ops;
 };
 
 struct vhost_user_connection {
@@ -880,7 +878,6 @@ vhost_user_socket_mem_free(struct vhost_user_socket *vsocket)
 		return;
 
 	free(vsocket->path);
-	free(vsocket->malloc_notify_ops);
 	free(vsocket);
 }
 
@@ -1146,69 +1143,21 @@ rte_vhost_driver_unregister(const char *path)
 /*
  * Register ops so that we can add/remove device to data core.
  */
-static int
-vhost_driver_callback_register(const char *path,
-	struct rte_vhost_device_ops const * const ops,
-	struct rte_vhost_device_ops *malloc_ops)
+int
+rte_vhost_driver_callback_register(const char *path,
+	struct rte_vhost_device_ops const * const ops)
 {
 	struct vhost_user_socket *vsocket;
 
 	pthread_mutex_lock(&vhost_user.mutex);
 	vsocket = find_vhost_user_socket(path);
-	if (vsocket) {
+	if (vsocket)
 		vsocket->notify_ops = ops;
-		free(vsocket->malloc_notify_ops);
-		vsocket->malloc_notify_ops = malloc_ops;
-	}
 	pthread_mutex_unlock(&vhost_user.mutex);
 
 	return vsocket ? 0 : -1;
 }
 
-int __vsym
-rte_vhost_driver_callback_register_v24(const char *path,
-	struct rte_vhost_device_ops const * const ops)
-{
-	return vhost_driver_callback_register(path, ops, NULL);
-}
-
-int __vsym
-rte_vhost_driver_callback_register_v23(const char *path,
-	struct rte_vhost_device_ops const * const ops)
-{
-	int ret;
-
-	/*
-	 * Although the ops structure is a const structure, we do need to
-	 * override the guest_notify operation. This is because with the
-	 * previous APIs it was "reserved" and if any garbage value was passed,
-	 * it could crash the application.
-	 */
-	if (ops && !ops->guest_notify) {
-		struct rte_vhost_device_ops *new_ops;
-
-		new_ops = malloc(sizeof(*new_ops));
-		if (new_ops == NULL)
-			return -1;
-
-		memcpy(new_ops, ops, sizeof(*new_ops));
-		new_ops->guest_notify = NULL;
-
-		ret = vhost_driver_callback_register(path, new_ops, new_ops);
-	} else {
-		ret = vhost_driver_callback_register(path, ops, NULL);
-	}
-
-	return ret;
-}
-
-/* Mark the v23 function as the old version, and v24 as the default version. */
-VERSION_SYMBOL(rte_vhost_driver_callback_register, _v23, 23);
-BIND_DEFAULT_SYMBOL(rte_vhost_driver_callback_register, _v24, 24);
-MAP_STATIC_SYMBOL(int rte_vhost_driver_callback_register(const char *path,
-		struct rte_vhost_device_ops const * const ops),
-		rte_vhost_driver_callback_register_v24);
-
 struct rte_vhost_device_ops const *
 vhost_driver_callback_get(const char *path)
 {
diff --git a/lib/vhost/version.map b/lib/vhost/version.map
index f5d9d68e2c..5bc133dafd 100644
--- a/lib/vhost/version.map
+++ b/lib/vhost/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_vdpa_find_device_by_name;
@@ -64,12 +64,6 @@ DPDK_23 {
 	local: *;
 };
 
-DPDK_24 {
-	global:
-
-	rte_vhost_driver_callback_register;
-} DPDK_23;
-
 EXPERIMENTAL {
 	global:
 
diff --git a/lib/vhost/vhost.h b/lib/vhost/vhost.h
index f49ce943b0..9723429b1c 100644
--- a/lib/vhost/vhost.h
+++ b/lib/vhost/vhost.h
@@ -1046,10 +1046,4 @@ mbuf_is_consumed(struct rte_mbuf *m)
 
 void mem_set_dump(void *ptr, size_t size, bool enable, uint64_t alignment);
 
-/* Versioned functions */
-int rte_vhost_driver_callback_register_v23(const char *path,
-	struct rte_vhost_device_ops const * const ops);
-int rte_vhost_driver_callback_register_v24(const char *path,
-	struct rte_vhost_device_ops const * const ops);
-
 #endif /* _VHOST_NET_CDEV_H_ */
-- 
2.41.0


^ permalink raw reply	[relevance 8%]

* [PATCH 2/3] telemetry: remove v23 ABI compatibility
  2023-07-31  9:43  4% [PATCH 0/3] version: 23.11-rc0 David Marchand
  2023-07-31  9:43 12% ` [PATCH 1/3] " David Marchand
@ 2023-07-31  9:43  8% ` David Marchand
  2023-07-31 10:01  4%   ` Bruce Richardson
  2023-07-31  9:43  8% ` [PATCH 3/3] vhost: " David Marchand
  2 siblings, 1 reply; 200+ results
From: David Marchand @ 2023-07-31  9:43 UTC (permalink / raw)
  To: dev; +Cc: thomas, Ciara Power

v23.11 is a ABI breaking release, remove compatibility code for the
previous major ABI version.

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
 lib/telemetry/meson.build      |  1 -
 lib/telemetry/telemetry_data.c | 33 ++++-----------------------------
 lib/telemetry/telemetry_data.h |  6 ------
 lib/telemetry/version.map      |  9 +--------
 4 files changed, 5 insertions(+), 44 deletions(-)

diff --git a/lib/telemetry/meson.build b/lib/telemetry/meson.build
index 73750d9ef4..f84c9aa3be 100644
--- a/lib/telemetry/meson.build
+++ b/lib/telemetry/meson.build
@@ -6,4 +6,3 @@ includes = [global_inc]
 sources = files('telemetry.c', 'telemetry_data.c', 'telemetry_legacy.c')
 headers = files('rte_telemetry.h')
 includes += include_directories('../metrics')
-use_function_versioning = true
diff --git a/lib/telemetry/telemetry_data.c b/lib/telemetry/telemetry_data.c
index 0c7187bec1..3b1a2408df 100644
--- a/lib/telemetry/telemetry_data.c
+++ b/lib/telemetry/telemetry_data.c
@@ -10,7 +10,6 @@
 #undef RTE_USE_LIBBSD
 #include <stdbool.h>
 
-#include <rte_function_versioning.h>
 #include <rte_string_fns.h>
 
 #include "telemetry_data.h"
@@ -63,8 +62,8 @@ rte_tel_data_add_array_string(struct rte_tel_data *d, const char *str)
 	return bytes < RTE_TEL_MAX_STRING_LEN ? 0 : E2BIG;
 }
 
-int __vsym
-rte_tel_data_add_array_int_v24(struct rte_tel_data *d, int64_t x)
+int
+rte_tel_data_add_array_int(struct rte_tel_data *d, int64_t x)
 {
 	if (d->type != TEL_ARRAY_INT)
 		return -EINVAL;
@@ -74,18 +73,6 @@ rte_tel_data_add_array_int_v24(struct rte_tel_data *d, int64_t x)
 	return 0;
 }
 
-int __vsym
-rte_tel_data_add_array_int_v23(struct rte_tel_data *d, int x)
-{
-	return rte_tel_data_add_array_int_v24(d, x);
-}
-
-/* mark the v23 function as the older version, and v24 as the default version */
-VERSION_SYMBOL(rte_tel_data_add_array_int, _v23, 23);
-BIND_DEFAULT_SYMBOL(rte_tel_data_add_array_int, _v24, 24);
-MAP_STATIC_SYMBOL(int rte_tel_data_add_array_int(struct rte_tel_data *d,
-		int64_t x), rte_tel_data_add_array_int_v24);
-
 int
 rte_tel_data_add_array_uint(struct rte_tel_data *d, uint64_t x)
 {
@@ -190,8 +177,8 @@ rte_tel_data_add_dict_string(struct rte_tel_data *d, const char *name,
 	return 0;
 }
 
-int __vsym
-rte_tel_data_add_dict_int_v24(struct rte_tel_data *d, const char *name, int64_t val)
+int
+rte_tel_data_add_dict_int(struct rte_tel_data *d, const char *name, int64_t val)
 {
 	struct tel_dict_entry *e = &d->data.dict[d->data_len];
 	if (d->type != TEL_DICT)
@@ -209,18 +196,6 @@ rte_tel_data_add_dict_int_v24(struct rte_tel_data *d, const char *name, int64_t
 	return bytes < RTE_TEL_MAX_STRING_LEN ? 0 : E2BIG;
 }
 
-int __vsym
-rte_tel_data_add_dict_int_v23(struct rte_tel_data *d, const char *name, int val)
-{
-	return rte_tel_data_add_dict_int_v24(d, name, val);
-}
-
-/* mark the v23 function as the older version, and v24 as the default version */
-VERSION_SYMBOL(rte_tel_data_add_dict_int, _v23, 23);
-BIND_DEFAULT_SYMBOL(rte_tel_data_add_dict_int, _v24, 24);
-MAP_STATIC_SYMBOL(int rte_tel_data_add_dict_int(struct rte_tel_data *d,
-		const char *name, int64_t val), rte_tel_data_add_dict_int_v24);
-
 int
 rte_tel_data_add_dict_uint(struct rte_tel_data *d,
 		const char *name, uint64_t val)
diff --git a/lib/telemetry/telemetry_data.h b/lib/telemetry/telemetry_data.h
index 53e4cabea5..205509c5a2 100644
--- a/lib/telemetry/telemetry_data.h
+++ b/lib/telemetry/telemetry_data.h
@@ -49,10 +49,4 @@ struct rte_tel_data {
 	} data; /* data container */
 };
 
-/* versioned functions */
-int rte_tel_data_add_array_int_v23(struct rte_tel_data *d, int val);
-int rte_tel_data_add_array_int_v24(struct rte_tel_data *d, int64_t val);
-int rte_tel_data_add_dict_int_v23(struct rte_tel_data *d, const char *name, int val);
-int rte_tel_data_add_dict_int_v24(struct rte_tel_data *d, const char *name, int64_t val);
-
 #endif
diff --git a/lib/telemetry/version.map b/lib/telemetry/version.map
index af978b883d..7d12c92905 100644
--- a/lib/telemetry/version.map
+++ b/lib/telemetry/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_tel_data_add_array_container;
@@ -31,13 +31,6 @@ EXPERIMENTAL {
 	local: *;
 };
 
-DPDK_24 {
-	global:
-
-	rte_tel_data_add_array_int;
-	rte_tel_data_add_dict_int;
-} DPDK_23;
-
 INTERNAL {
 	rte_telemetry_legacy_register;
 	rte_telemetry_init;
-- 
2.41.0


^ permalink raw reply	[relevance 8%]

* [PATCH 1/3] version: 23.11-rc0
  2023-07-31  9:43  4% [PATCH 0/3] version: 23.11-rc0 David Marchand
@ 2023-07-31  9:43 12% ` David Marchand
  2023-07-31 10:00  0%   ` Bruce Richardson
  2023-07-31 19:03  0%   ` Aaron Conole
  2023-07-31  9:43  8% ` [PATCH 2/3] telemetry: remove v23 ABI compatibility David Marchand
  2023-07-31  9:43  8% ` [PATCH 3/3] vhost: " David Marchand
  2 siblings, 2 replies; 200+ results
From: David Marchand @ 2023-07-31  9:43 UTC (permalink / raw)
  To: dev
  Cc: thomas, Aaron Conole, Michael Santana, Nicolas Chautru,
	Hemant Agrawal, Sachin Saxena, Chenbo Xia, Nipun Gupta,
	Tomasz Duszynski, Long Li, Anoob Joseph, Kai Ji, Gagandeep Singh,
	Timothy McDaniel, Ashwin Sekhar T K, Pavan Nikhilesh,
	Igor Russkikh, Ajit Khaparde, Somnath Kotur, Chas Williams,
	Min Hu (Connor),
	Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao,
	Yuying Zhang, Beilei Xing, Jingjing Wu, Qiming Yang, Qi Zhang,
	Rosen Xu, Wenjun Wu, Matan Azrad, Viacheslav Ovsiienko, Ori Kam,
	Suanming Mou, Harman Kalra, Bruce Richardson,
	Cristian Dumitrescu, Maxime Coquelin, Tianfei Zhang,
	Konstantin Ananyev, Olivier Matz, Akhil Goyal, Fan Zhang,
	David Hunt, Byron Marohn, Yipeng Wang, Ferruh Yigit,
	Andrew Rybchenko, Jerin Jacob, Vladimir Medvedkin, Jiayu Hu,
	Sameh Gobriel, Reshma Pattan, Gaetan Rivet, Stephen Hemminger,
	Anatoly Burakov, Honnappa Nagarahalli, Volodymyr Fialko,
	Erik Gabriel Carrillo

Start a new release cycle with empty release notes.

The ABI version becomes 24.0.
The map files are updated to the new ABI major number (24).
The ABI exceptions are dropped and CI ABI checks are disabled because
compatibility is not preserved.

The telemetry and vhost libraries compat code is cleaned up in next
commits.

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
 .github/workflows/build.yml                |   4 +-
 ABI_VERSION                                |   2 +-
 VERSION                                    |   2 +-
 devtools/libabigail.abignore               |   5 -
 doc/guides/rel_notes/index.rst             |   1 +
 doc/guides/rel_notes/release_23_11.rst     | 136 +++++++++++++++++++++
 drivers/baseband/acc/version.map           |   2 +-
 drivers/baseband/fpga_5gnr_fec/version.map |   2 +-
 drivers/baseband/fpga_lte_fec/version.map  |   2 +-
 drivers/bus/fslmc/version.map              |   2 +-
 drivers/bus/pci/version.map                |   2 +-
 drivers/bus/platform/version.map           |   2 +-
 drivers/bus/vdev/version.map               |   2 +-
 drivers/bus/vmbus/version.map              |   2 +-
 drivers/crypto/octeontx/version.map        |   2 +-
 drivers/crypto/scheduler/version.map       |   2 +-
 drivers/dma/dpaa2/version.map              |   2 +-
 drivers/event/dlb2/version.map             |   2 +-
 drivers/mempool/cnxk/version.map           |   8 +-
 drivers/mempool/dpaa2/version.map          |   2 +-
 drivers/net/atlantic/version.map           |   2 +-
 drivers/net/bnxt/version.map               |   2 +-
 drivers/net/bonding/version.map            |   2 +-
 drivers/net/cnxk/version.map               |   2 +-
 drivers/net/dpaa/version.map               |   2 +-
 drivers/net/dpaa2/version.map              |   2 +-
 drivers/net/i40e/version.map               |   2 +-
 drivers/net/iavf/version.map               |   2 +-
 drivers/net/ice/version.map                |   2 +-
 drivers/net/ipn3ke/version.map             |   2 +-
 drivers/net/ixgbe/version.map              |   2 +-
 drivers/net/mlx5/version.map               |   2 +-
 drivers/net/octeontx/version.map           |   2 +-
 drivers/net/ring/version.map               |   2 +-
 drivers/net/softnic/version.map            |   2 +-
 drivers/net/vhost/version.map              |   2 +-
 drivers/raw/ifpga/version.map              |   2 +-
 drivers/version.map                        |   2 +-
 lib/acl/version.map                        |   2 +-
 lib/bbdev/version.map                      |   2 +-
 lib/bitratestats/version.map               |   2 +-
 lib/bpf/version.map                        |   2 +-
 lib/cfgfile/version.map                    |   2 +-
 lib/cmdline/version.map                    |   2 +-
 lib/cryptodev/version.map                  |   2 +-
 lib/distributor/version.map                |   2 +-
 lib/eal/version.map                        |   2 +-
 lib/efd/version.map                        |   2 +-
 lib/ethdev/version.map                     |   2 +-
 lib/eventdev/version.map                   |   2 +-
 lib/fib/version.map                        |   2 +-
 lib/gro/version.map                        |   2 +-
 lib/gso/version.map                        |   2 +-
 lib/hash/version.map                       |   2 +-
 lib/ip_frag/version.map                    |   2 +-
 lib/ipsec/version.map                      |   2 +-
 lib/jobstats/version.map                   |   2 +-
 lib/kni/version.map                        |   2 +-
 lib/kvargs/version.map                     |   2 +-
 lib/latencystats/version.map               |   2 +-
 lib/lpm/version.map                        |   2 +-
 lib/mbuf/version.map                       |   2 +-
 lib/member/version.map                     |   2 +-
 lib/mempool/version.map                    |   2 +-
 lib/meter/version.map                      |   2 +-
 lib/metrics/version.map                    |   2 +-
 lib/net/version.map                        |   2 +-
 lib/pci/version.map                        |   2 +-
 lib/pdump/version.map                      |   2 +-
 lib/pipeline/version.map                   |   2 +-
 lib/port/version.map                       |   2 +-
 lib/power/version.map                      |   2 +-
 lib/rawdev/version.map                     |   2 +-
 lib/rcu/version.map                        |   2 +-
 lib/reorder/version.map                    |   2 +-
 lib/rib/version.map                        |   2 +-
 lib/ring/version.map                       |   2 +-
 lib/sched/version.map                      |   2 +-
 lib/security/version.map                   |   2 +-
 lib/stack/version.map                      |   2 +-
 lib/table/version.map                      |   2 +-
 lib/timer/version.map                      |   2 +-
 82 files changed, 220 insertions(+), 88 deletions(-)
 create mode 100644 doc/guides/rel_notes/release_23_11.rst

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index d3bcb160cf..2c1eda9b18 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -27,7 +27,7 @@ jobs:
       MINGW: ${{ matrix.config.cross == 'mingw' }}
       MINI: ${{ matrix.config.mini != '' }}
       PPC64LE: ${{ matrix.config.cross == 'ppc64le' }}
-      REF_GIT_TAG: v23.03
+      REF_GIT_TAG: none
       RISCV64: ${{ matrix.config.cross == 'riscv64' }}
       RUN_TESTS: ${{ contains(matrix.config.checks, 'tests') }}
 
@@ -40,7 +40,7 @@ jobs:
             mini: mini
           - os: ubuntu-20.04
             compiler: gcc
-            checks: abi+debug+doc+examples+tests
+            checks: debug+doc+examples+tests
           - os: ubuntu-20.04
             compiler: clang
             checks: asan+doc+tests
diff --git a/ABI_VERSION b/ABI_VERSION
index 3c8ce91a46..d9133a54b6 100644
--- a/ABI_VERSION
+++ b/ABI_VERSION
@@ -1 +1 @@
-23.2
+24.0
diff --git a/VERSION b/VERSION
index 942d403ae8..1d4e4e7927 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-23.07.0
+23.11.0-rc0
diff --git a/devtools/libabigail.abignore b/devtools/libabigail.abignore
index 03bfbce259..3ff51509de 100644
--- a/devtools/libabigail.abignore
+++ b/devtools/libabigail.abignore
@@ -25,7 +25,6 @@
 ;
 ; SKIP_LIBRARY=librte_common_mlx5_glue
 ; SKIP_LIBRARY=librte_net_mlx4_glue
-; SKIP_LIBRARY=librte_net_liquidio
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; Experimental APIs exceptions ;
@@ -41,7 +40,3 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; Temporary exceptions till next major ABI version ;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-; Ignore changes to rte_security_ops which are internal to PMD.
-[suppress_type]
-        name = rte_security_ops
diff --git a/doc/guides/rel_notes/index.rst b/doc/guides/rel_notes/index.rst
index d8dfa621ec..d072815279 100644
--- a/doc/guides/rel_notes/index.rst
+++ b/doc/guides/rel_notes/index.rst
@@ -8,6 +8,7 @@ Release Notes
     :maxdepth: 1
     :numbered:
 
+    release_23_11
     release_23_07
     release_23_03
     release_22_11
diff --git a/doc/guides/rel_notes/release_23_11.rst b/doc/guides/rel_notes/release_23_11.rst
new file mode 100644
index 0000000000..6b4dd21fd0
--- /dev/null
+++ b/doc/guides/rel_notes/release_23_11.rst
@@ -0,0 +1,136 @@
+.. SPDX-License-Identifier: BSD-3-Clause
+   Copyright 2023 The DPDK contributors
+
+.. include:: <isonum.txt>
+
+DPDK Release 23.11
+==================
+
+.. **Read this first.**
+
+   The text in the sections below explains how to update the release notes.
+
+   Use proper spelling, capitalization and punctuation in all sections.
+
+   Variable and config names should be quoted as fixed width text:
+   ``LIKE_THIS``.
+
+   Build the docs and view the output file to ensure the changes are correct::
+
+      ninja -C build doc
+      xdg-open build/doc/guides/html/rel_notes/release_23_11.html
+
+
+New Features
+------------
+
+.. This section should contain new features added in this release.
+   Sample format:
+
+   * **Add a title in the past tense with a full stop.**
+
+     Add a short 1-2 sentence description in the past tense.
+     The description should be enough to allow someone scanning
+     the release notes to understand the new feature.
+
+     If the feature adds a lot of sub-features you can use a bullet list
+     like this:
+
+     * Added feature foo to do something.
+     * Enhanced feature bar to do something else.
+
+     Refer to the previous release notes for examples.
+
+     Suggested order in release notes items:
+     * Core libs (EAL, mempool, ring, mbuf, buses)
+     * Device abstraction libs and PMDs (ordered alphabetically by vendor name)
+       - ethdev (lib, PMDs)
+       - cryptodev (lib, PMDs)
+       - eventdev (lib, PMDs)
+       - etc
+     * Other libs
+     * Apps, Examples, Tools (if significant)
+
+     This section is a comment. Do not overwrite or remove it.
+     Also, make sure to start the actual text at the margin.
+     =======================================================
+
+
+Removed Items
+-------------
+
+.. This section should contain removed items in this release. Sample format:
+
+   * Add a short 1-2 sentence description of the removed item
+     in the past tense.
+
+   This section is a comment. Do not overwrite or remove it.
+   Also, make sure to start the actual text at the margin.
+   =======================================================
+
+
+API Changes
+-----------
+
+.. This section should contain API changes. Sample format:
+
+   * sample: Add a short 1-2 sentence description of the API change
+     which was announced in the previous releases and made in this release.
+     Start with a scope label like "ethdev:".
+     Use fixed width quotes for ``function_names`` or ``struct_names``.
+     Use the past tense.
+
+   This section is a comment. Do not overwrite or remove it.
+   Also, make sure to start the actual text at the margin.
+   =======================================================
+
+
+ABI Changes
+-----------
+
+.. This section should contain ABI changes. Sample format:
+
+   * sample: Add a short 1-2 sentence description of the ABI change
+     which was announced in the previous releases and made in this release.
+     Start with a scope label like "ethdev:".
+     Use fixed width quotes for ``function_names`` or ``struct_names``.
+     Use the past tense.
+
+   This section is a comment. Do not overwrite or remove it.
+   Also, make sure to start the actual text at the margin.
+   =======================================================
+
+
+Known Issues
+------------
+
+.. This section should contain new known issues in this release. Sample format:
+
+   * **Add title in present tense with full stop.**
+
+     Add a short 1-2 sentence description of the known issue
+     in the present tense. Add information on any known workarounds.
+
+   This section is a comment. Do not overwrite or remove it.
+   Also, make sure to start the actual text at the margin.
+   =======================================================
+
+
+Tested Platforms
+----------------
+
+.. This section should contain a list of platforms that were tested
+   with this release.
+
+   The format is:
+
+   * <vendor> platform with <vendor> <type of devices> combinations
+
+     * List of CPU
+     * List of OS
+     * List of devices
+     * Other relevant details...
+
+   This section is a comment. Do not overwrite or remove it.
+   Also, make sure to start the actual text at the margin.
+   =======================================================
diff --git a/drivers/baseband/acc/version.map b/drivers/baseband/acc/version.map
index 95ae74dd35..1b6b1cd10d 100644
--- a/drivers/baseband/acc/version.map
+++ b/drivers/baseband/acc/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	local: *;
 };
 
diff --git a/drivers/baseband/fpga_5gnr_fec/version.map b/drivers/baseband/fpga_5gnr_fec/version.map
index 6b191cf330..2da20cabc1 100644
--- a/drivers/baseband/fpga_5gnr_fec/version.map
+++ b/drivers/baseband/fpga_5gnr_fec/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	local: *;
 };
 
diff --git a/drivers/baseband/fpga_lte_fec/version.map b/drivers/baseband/fpga_lte_fec/version.map
index aab28a9976..83f3a8a267 100644
--- a/drivers/baseband/fpga_lte_fec/version.map
+++ b/drivers/baseband/fpga_lte_fec/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	local: *;
 };
 
diff --git a/drivers/bus/fslmc/version.map b/drivers/bus/fslmc/version.map
index a25a9e8ca0..f6bdf877bf 100644
--- a/drivers/bus/fslmc/version.map
+++ b/drivers/bus/fslmc/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_fslmc_vfio_mem_dmamap;
diff --git a/drivers/bus/pci/version.map b/drivers/bus/pci/version.map
index 92fcaca094..a0000f7938 100644
--- a/drivers/bus/pci/version.map
+++ b/drivers/bus/pci/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_pci_dump;
diff --git a/drivers/bus/platform/version.map b/drivers/bus/platform/version.map
index bacce4da08..9e7111dd38 100644
--- a/drivers/bus/platform/version.map
+++ b/drivers/bus/platform/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	local: *;
 };
 
diff --git a/drivers/bus/vdev/version.map b/drivers/bus/vdev/version.map
index 594c48c3db..16f187734b 100644
--- a/drivers/bus/vdev/version.map
+++ b/drivers/bus/vdev/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_vdev_add_custom_scan;
diff --git a/drivers/bus/vmbus/version.map b/drivers/bus/vmbus/version.map
index 430781b29b..08b008b311 100644
--- a/drivers/bus/vmbus/version.map
+++ b/drivers/bus/vmbus/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_vmbus_chan_close;
diff --git a/drivers/crypto/octeontx/version.map b/drivers/crypto/octeontx/version.map
index cc4b6b0970..54a0912e76 100644
--- a/drivers/crypto/octeontx/version.map
+++ b/drivers/crypto/octeontx/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	local: *;
 };
 
diff --git a/drivers/crypto/scheduler/version.map b/drivers/crypto/scheduler/version.map
index 74491beabb..23380fb3c5 100644
--- a/drivers/crypto/scheduler/version.map
+++ b/drivers/crypto/scheduler/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_cryptodev_scheduler_load_user_scheduler;
diff --git a/drivers/dma/dpaa2/version.map b/drivers/dma/dpaa2/version.map
index 0c020e5249..7dc2d6e185 100644
--- a/drivers/dma/dpaa2/version.map
+++ b/drivers/dma/dpaa2/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	local: *;
 };
 
diff --git a/drivers/event/dlb2/version.map b/drivers/event/dlb2/version.map
index 1327e3e335..8aabf8b727 100644
--- a/drivers/event/dlb2/version.map
+++ b/drivers/event/dlb2/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	local: *;
 };
 
diff --git a/drivers/mempool/cnxk/version.map b/drivers/mempool/cnxk/version.map
index 755731e3b5..775d46d934 100644
--- a/drivers/mempool/cnxk/version.map
+++ b/drivers/mempool/cnxk/version.map
@@ -1,10 +1,10 @@
- DPDK_23 {
+DPDK_24 {
 	local: *;
- };
+};
 
- EXPERIMENTAL {
+EXPERIMENTAL {
 	global:
 	rte_pmd_cnxk_mempool_is_hwpool;
 	rte_pmd_cnxk_mempool_mbuf_exchange;
 	rte_pmd_cnxk_mempool_range_check_disable;
- };
+};
diff --git a/drivers/mempool/dpaa2/version.map b/drivers/mempool/dpaa2/version.map
index 0023765843..b2bf63eb79 100644
--- a/drivers/mempool/dpaa2/version.map
+++ b/drivers/mempool/dpaa2/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_dpaa2_mbuf_from_buf_addr;
diff --git a/drivers/net/atlantic/version.map b/drivers/net/atlantic/version.map
index e301b105fe..b063baa7a4 100644
--- a/drivers/net/atlantic/version.map
+++ b/drivers/net/atlantic/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	local: *;
 };
 
diff --git a/drivers/net/bnxt/version.map b/drivers/net/bnxt/version.map
index 075bb37a36..ff82396ca1 100644
--- a/drivers/net/bnxt/version.map
+++ b/drivers/net/bnxt/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_pmd_bnxt_get_vf_rx_status;
diff --git a/drivers/net/bonding/version.map b/drivers/net/bonding/version.map
index 9333923b4e..bd28ee78a5 100644
--- a/drivers/net/bonding/version.map
+++ b/drivers/net/bonding/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_eth_bond_8023ad_agg_selection_get;
diff --git a/drivers/net/cnxk/version.map b/drivers/net/cnxk/version.map
index 3ef3e76bb0..7ae6d80bf0 100644
--- a/drivers/net/cnxk/version.map
+++ b/drivers/net/cnxk/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	local: *;
 };
 
diff --git a/drivers/net/dpaa/version.map b/drivers/net/dpaa/version.map
index 5268d39ef6..c06f4a56de 100644
--- a/drivers/net/dpaa/version.map
+++ b/drivers/net/dpaa/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_pmd_dpaa_set_tx_loopback;
diff --git a/drivers/net/dpaa2/version.map b/drivers/net/dpaa2/version.map
index d6535343b1..283bcb42c1 100644
--- a/drivers/net/dpaa2/version.map
+++ b/drivers/net/dpaa2/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_pmd_dpaa2_mux_flow_create;
diff --git a/drivers/net/i40e/version.map b/drivers/net/i40e/version.map
index 4d1ac59226..3ba31f4768 100644
--- a/drivers/net/i40e/version.map
+++ b/drivers/net/i40e/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_pmd_i40e_add_vf_mac_addr;
diff --git a/drivers/net/iavf/version.map b/drivers/net/iavf/version.map
index 4796c2884f..135a4ccd3d 100644
--- a/drivers/net/iavf/version.map
+++ b/drivers/net/iavf/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	local: *;
 };
 
diff --git a/drivers/net/ice/version.map b/drivers/net/ice/version.map
index d70c250e9a..4e924c8f4d 100644
--- a/drivers/net/ice/version.map
+++ b/drivers/net/ice/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	local: *;
 };
 
diff --git a/drivers/net/ipn3ke/version.map b/drivers/net/ipn3ke/version.map
index 4c48499993..4a8f5e499a 100644
--- a/drivers/net/ipn3ke/version.map
+++ b/drivers/net/ipn3ke/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	local: *;
 };
 
diff --git a/drivers/net/ixgbe/version.map b/drivers/net/ixgbe/version.map
index 94693ccc1a..2c9d977f5c 100644
--- a/drivers/net/ixgbe/version.map
+++ b/drivers/net/ixgbe/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_pmd_ixgbe_bypass_event_show;
diff --git a/drivers/net/mlx5/version.map b/drivers/net/mlx5/version.map
index 7ef598027b..99f5ab754a 100644
--- a/drivers/net/mlx5/version.map
+++ b/drivers/net/mlx5/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	local: *;
 };
 
diff --git a/drivers/net/octeontx/version.map b/drivers/net/octeontx/version.map
index ae37d32d04..219933550d 100644
--- a/drivers/net/octeontx/version.map
+++ b/drivers/net/octeontx/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_octeontx_pchan_map;
diff --git a/drivers/net/ring/version.map b/drivers/net/ring/version.map
index 84e52064e0..62d9a77f9c 100644
--- a/drivers/net/ring/version.map
+++ b/drivers/net/ring/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_eth_from_ring;
diff --git a/drivers/net/softnic/version.map b/drivers/net/softnic/version.map
index 4dac46ecd5..f67475684c 100644
--- a/drivers/net/softnic/version.map
+++ b/drivers/net/softnic/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_pmd_softnic_manage;
diff --git a/drivers/net/vhost/version.map b/drivers/net/vhost/version.map
index e42c89f1eb..4825afd411 100644
--- a/drivers/net/vhost/version.map
+++ b/drivers/net/vhost/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_eth_vhost_get_queue_event;
diff --git a/drivers/raw/ifpga/version.map b/drivers/raw/ifpga/version.map
index 916da8a4f2..7fc1b5e8ae 100644
--- a/drivers/raw/ifpga/version.map
+++ b/drivers/raw/ifpga/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_pmd_ifpga_cleanup;
diff --git a/drivers/version.map b/drivers/version.map
index 78c3585d7c..5535c79061 100644
--- a/drivers/version.map
+++ b/drivers/version.map
@@ -1,3 +1,3 @@
-DPDK_23 {
+DPDK_24 {
 	local: *;
 };
diff --git a/lib/acl/version.map b/lib/acl/version.map
index 4c15dbbb36..fe3127a3a9 100644
--- a/lib/acl/version.map
+++ b/lib/acl/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_acl_add_rules;
diff --git a/lib/bbdev/version.map b/lib/bbdev/version.map
index d0bb835255..4f4bfbbd5e 100644
--- a/lib/bbdev/version.map
+++ b/lib/bbdev/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_bbdev_allocate;
diff --git a/lib/bitratestats/version.map b/lib/bitratestats/version.map
index dc110440e0..08831a62f4 100644
--- a/lib/bitratestats/version.map
+++ b/lib/bitratestats/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_stats_bitrate_calc;
diff --git a/lib/bpf/version.map b/lib/bpf/version.map
index 04bd657a85..c49bf1701f 100644
--- a/lib/bpf/version.map
+++ b/lib/bpf/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_bpf_destroy;
diff --git a/lib/cfgfile/version.map b/lib/cfgfile/version.map
index fdb0f13040..a3fe9b62f3 100644
--- a/lib/cfgfile/version.map
+++ b/lib/cfgfile/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_cfgfile_add_entry;
diff --git a/lib/cmdline/version.map b/lib/cmdline/version.map
index e3d59aaf8d..db4d904ffb 100644
--- a/lib/cmdline/version.map
+++ b/lib/cmdline/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	cirbuf_add_buf_head;
diff --git a/lib/cryptodev/version.map b/lib/cryptodev/version.map
index 24ff90799c..209806cf24 100644
--- a/lib/cryptodev/version.map
+++ b/lib/cryptodev/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_crypto_aead_algorithm_strings;
diff --git a/lib/distributor/version.map b/lib/distributor/version.map
index 7a34dfa2f2..2670c4201c 100644
--- a/lib/distributor/version.map
+++ b/lib/distributor/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_distributor_clear_returns;
diff --git a/lib/eal/version.map b/lib/eal/version.map
index ea1b1a7d0a..bdb98cf479 100644
--- a/lib/eal/version.map
+++ b/lib/eal/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	__rte_panic;
diff --git a/lib/efd/version.map b/lib/efd/version.map
index 67886414ab..baac60f7bc 100644
--- a/lib/efd/version.map
+++ b/lib/efd/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_efd_create;
diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map
index fc492ee839..b965d6aa52 100644
--- a/lib/ethdev/version.map
+++ b/lib/ethdev/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_eth_add_first_rx_callback;
diff --git a/lib/eventdev/version.map b/lib/eventdev/version.map
index 89068a5713..b03c10d99f 100644
--- a/lib/eventdev/version.map
+++ b/lib/eventdev/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	__rte_eventdev_trace_crypto_adapter_enqueue;
diff --git a/lib/fib/version.map b/lib/fib/version.map
index a867d2b7d8..62dbada6bc 100644
--- a/lib/fib/version.map
+++ b/lib/fib/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_fib6_add;
diff --git a/lib/gro/version.map b/lib/gro/version.map
index 105aa64ca3..13803ec814 100644
--- a/lib/gro/version.map
+++ b/lib/gro/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_gro_ctx_create;
diff --git a/lib/gso/version.map b/lib/gso/version.map
index f6b552de6d..f159b3f199 100644
--- a/lib/gso/version.map
+++ b/lib/gso/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_gso_segment;
diff --git a/lib/hash/version.map b/lib/hash/version.map
index bdcebd19c2..daaa9a8901 100644
--- a/lib/hash/version.map
+++ b/lib/hash/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_fbk_hash_create;
diff --git a/lib/ip_frag/version.map b/lib/ip_frag/version.map
index 8aad83957d..7ba446c993 100644
--- a/lib/ip_frag/version.map
+++ b/lib/ip_frag/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_ip_frag_free_death_row;
diff --git a/lib/ipsec/version.map b/lib/ipsec/version.map
index f17a49dd26..f0063af354 100644
--- a/lib/ipsec/version.map
+++ b/lib/ipsec/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_ipsec_pkt_crypto_group;
diff --git a/lib/jobstats/version.map b/lib/jobstats/version.map
index bca7480afb..3b8f9d6ac4 100644
--- a/lib/jobstats/version.map
+++ b/lib/jobstats/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_jobstats_abort;
diff --git a/lib/kni/version.map b/lib/kni/version.map
index 83bbbe880f..13ffaa5bfd 100644
--- a/lib/kni/version.map
+++ b/lib/kni/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_kni_alloc;
diff --git a/lib/kvargs/version.map b/lib/kvargs/version.map
index 781f71cf23..387a94e725 100644
--- a/lib/kvargs/version.map
+++ b/lib/kvargs/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_kvargs_count;
diff --git a/lib/latencystats/version.map b/lib/latencystats/version.map
index 79b8395f12..86ded322cb 100644
--- a/lib/latencystats/version.map
+++ b/lib/latencystats/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_latencystats_get;
diff --git a/lib/lpm/version.map b/lib/lpm/version.map
index e1a7aaedbb..9ba73b2f93 100644
--- a/lib/lpm/version.map
+++ b/lib/lpm/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_lpm6_add;
diff --git a/lib/mbuf/version.map b/lib/mbuf/version.map
index ed486ed14e..f010d4692e 100644
--- a/lib/mbuf/version.map
+++ b/lib/mbuf/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	__rte_pktmbuf_linearize;
diff --git a/lib/member/version.map b/lib/member/version.map
index 35199270ff..9be5068d68 100644
--- a/lib/member/version.map
+++ b/lib/member/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_member_add;
diff --git a/lib/mempool/version.map b/lib/mempool/version.map
index dff2d1cb55..d0bfedd1d8 100644
--- a/lib/mempool/version.map
+++ b/lib/mempool/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_mempool_audit;
diff --git a/lib/meter/version.map b/lib/meter/version.map
index b10b544641..9628bd8cd9 100644
--- a/lib/meter/version.map
+++ b/lib/meter/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_meter_srtcm_config;
diff --git a/lib/metrics/version.map b/lib/metrics/version.map
index 89ffa9be80..4763ac6b8b 100644
--- a/lib/metrics/version.map
+++ b/lib/metrics/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_metrics_deinit;
diff --git a/lib/net/version.map b/lib/net/version.map
index e8fe2b7635..3e293c4715 100644
--- a/lib/net/version.map
+++ b/lib/net/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_eth_random_addr;
diff --git a/lib/pci/version.map b/lib/pci/version.map
index e9282ff49c..aeca8a1c9e 100644
--- a/lib/pci/version.map
+++ b/lib/pci/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_pci_addr_cmp;
diff --git a/lib/pdump/version.map b/lib/pdump/version.map
index 25df5a82c2..225830dc85 100644
--- a/lib/pdump/version.map
+++ b/lib/pdump/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_pdump_disable;
diff --git a/lib/pipeline/version.map b/lib/pipeline/version.map
index 3a4488cd0e..6e3f5b7e80 100644
--- a/lib/pipeline/version.map
+++ b/lib/pipeline/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_pipeline_ah_packet_drop;
diff --git a/lib/port/version.map b/lib/port/version.map
index af6cf696fd..83dbec7b01 100644
--- a/lib/port/version.map
+++ b/lib/port/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_port_ethdev_reader_ops;
diff --git a/lib/power/version.map b/lib/power/version.map
index 05d544e947..b8b54f768e 100644
--- a/lib/power/version.map
+++ b/lib/power/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_power_exit;
diff --git a/lib/rawdev/version.map b/lib/rawdev/version.map
index 8278aacdea..21064a889b 100644
--- a/lib/rawdev/version.map
+++ b/lib/rawdev/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_rawdev_close;
diff --git a/lib/rcu/version.map b/lib/rcu/version.map
index cabed64fca..9218ed1f33 100644
--- a/lib/rcu/version.map
+++ b/lib/rcu/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_rcu_log_type;
diff --git a/lib/reorder/version.map b/lib/reorder/version.map
index 0b3d4d5685..ea60759106 100644
--- a/lib/reorder/version.map
+++ b/lib/reorder/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_reorder_create;
diff --git a/lib/rib/version.map b/lib/rib/version.map
index ca2815e44b..39da637f75 100644
--- a/lib/rib/version.map
+++ b/lib/rib/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_rib6_create;
diff --git a/lib/ring/version.map b/lib/ring/version.map
index 4d7c27a6d9..9eb6e254c8 100644
--- a/lib/ring/version.map
+++ b/lib/ring/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_ring_create;
diff --git a/lib/sched/version.map b/lib/sched/version.map
index 2f64834c8f..d9ce68be14 100644
--- a/lib/sched/version.map
+++ b/lib/sched/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_approx;
diff --git a/lib/security/version.map b/lib/security/version.map
index 07dcce9ffb..b2097a969d 100644
--- a/lib/security/version.map
+++ b/lib/security/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_security_capabilities_get;
diff --git a/lib/stack/version.map b/lib/stack/version.map
index c0250f5cdf..d191ef7791 100644
--- a/lib/stack/version.map
+++ b/lib/stack/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_stack_create;
diff --git a/lib/table/version.map b/lib/table/version.map
index e32e15a5fc..05ed820119 100644
--- a/lib/table/version.map
+++ b/lib/table/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_table_acl_ops;
diff --git a/lib/timer/version.map b/lib/timer/version.map
index 101f5c18b5..e3d5a04303 100644
--- a/lib/timer/version.map
+++ b/lib/timer/version.map
@@ -1,4 +1,4 @@
-DPDK_23 {
+DPDK_24 {
 	global:
 
 	rte_timer_alt_dump_stats;
-- 
2.41.0


^ permalink raw reply	[relevance 12%]

* [PATCH 0/3] version: 23.11-rc0
@ 2023-07-31  9:43  4% David Marchand
  2023-07-31  9:43 12% ` [PATCH 1/3] " David Marchand
                   ` (2 more replies)
  0 siblings, 3 replies; 200+ results
From: David Marchand @ 2023-07-31  9:43 UTC (permalink / raw)
  To: dev; +Cc: thomas

Prepare the new release.

I chose to separate the compat code cleanup in the telemetry and vhost
libraries for making it easier to review, though the 3 patches could be
squashed in a single change.


-- 
David Marchand

David Marchand (3):
  version: 23.11-rc0
  telemetry: remove v23 ABI compatibility
  vhost: remove v23 ABI compatibility

 .github/workflows/build.yml                |   4 +-
 ABI_VERSION                                |   2 +-
 VERSION                                    |   2 +-
 devtools/libabigail.abignore               |   5 -
 doc/guides/rel_notes/index.rst             |   1 +
 doc/guides/rel_notes/release_23_11.rst     | 136 +++++++++++++++++++++
 drivers/baseband/acc/version.map           |   2 +-
 drivers/baseband/fpga_5gnr_fec/version.map |   2 +-
 drivers/baseband/fpga_lte_fec/version.map  |   2 +-
 drivers/bus/fslmc/version.map              |   2 +-
 drivers/bus/pci/version.map                |   2 +-
 drivers/bus/platform/version.map           |   2 +-
 drivers/bus/vdev/version.map               |   2 +-
 drivers/bus/vmbus/version.map              |   2 +-
 drivers/crypto/octeontx/version.map        |   2 +-
 drivers/crypto/scheduler/version.map       |   2 +-
 drivers/dma/dpaa2/version.map              |   2 +-
 drivers/event/dlb2/version.map             |   2 +-
 drivers/mempool/cnxk/version.map           |   8 +-
 drivers/mempool/dpaa2/version.map          |   2 +-
 drivers/net/atlantic/version.map           |   2 +-
 drivers/net/bnxt/version.map               |   2 +-
 drivers/net/bonding/version.map            |   2 +-
 drivers/net/cnxk/version.map               |   2 +-
 drivers/net/dpaa/version.map               |   2 +-
 drivers/net/dpaa2/version.map              |   2 +-
 drivers/net/i40e/version.map               |   2 +-
 drivers/net/iavf/version.map               |   2 +-
 drivers/net/ice/version.map                |   2 +-
 drivers/net/ipn3ke/version.map             |   2 +-
 drivers/net/ixgbe/version.map              |   2 +-
 drivers/net/mlx5/version.map               |   2 +-
 drivers/net/octeontx/version.map           |   2 +-
 drivers/net/ring/version.map               |   2 +-
 drivers/net/softnic/version.map            |   2 +-
 drivers/net/vhost/version.map              |   2 +-
 drivers/raw/ifpga/version.map              |   2 +-
 drivers/version.map                        |   2 +-
 lib/acl/version.map                        |   2 +-
 lib/bbdev/version.map                      |   2 +-
 lib/bitratestats/version.map               |   2 +-
 lib/bpf/version.map                        |   2 +-
 lib/cfgfile/version.map                    |   2 +-
 lib/cmdline/version.map                    |   2 +-
 lib/cryptodev/version.map                  |   2 +-
 lib/distributor/version.map                |   2 +-
 lib/eal/version.map                        |   2 +-
 lib/efd/version.map                        |   2 +-
 lib/ethdev/version.map                     |   2 +-
 lib/eventdev/version.map                   |   2 +-
 lib/fib/version.map                        |   2 +-
 lib/gro/version.map                        |   2 +-
 lib/gso/version.map                        |   2 +-
 lib/hash/version.map                       |   2 +-
 lib/ip_frag/version.map                    |   2 +-
 lib/ipsec/version.map                      |   2 +-
 lib/jobstats/version.map                   |   2 +-
 lib/kni/version.map                        |   2 +-
 lib/kvargs/version.map                     |   2 +-
 lib/latencystats/version.map               |   2 +-
 lib/lpm/version.map                        |   2 +-
 lib/mbuf/version.map                       |   2 +-
 lib/member/version.map                     |   2 +-
 lib/mempool/version.map                    |   2 +-
 lib/meter/version.map                      |   2 +-
 lib/metrics/version.map                    |   2 +-
 lib/net/version.map                        |   2 +-
 lib/pci/version.map                        |   2 +-
 lib/pdump/version.map                      |   2 +-
 lib/pipeline/version.map                   |   2 +-
 lib/port/version.map                       |   2 +-
 lib/power/version.map                      |   2 +-
 lib/rawdev/version.map                     |   2 +-
 lib/rcu/version.map                        |   2 +-
 lib/reorder/version.map                    |   2 +-
 lib/rib/version.map                        |   2 +-
 lib/ring/version.map                       |   2 +-
 lib/sched/version.map                      |   2 +-
 lib/security/version.map                   |   2 +-
 lib/stack/version.map                      |   2 +-
 lib/table/version.map                      |   2 +-
 lib/telemetry/meson.build                  |   1 -
 lib/telemetry/telemetry_data.c             |  33 +----
 lib/telemetry/telemetry_data.h             |   6 -
 lib/telemetry/version.map                  |   9 +-
 lib/timer/version.map                      |   2 +-
 lib/vhost/meson.build                      |   2 -
 lib/vhost/socket.c                         |  59 +--------
 lib/vhost/version.map                      |   8 +-
 lib/vhost/vhost.h                          |   6 -
 90 files changed, 230 insertions(+), 202 deletions(-)
 create mode 100644 doc/guides/rel_notes/release_23_11.rst

-- 
2.41.0


^ permalink raw reply	[relevance 4%]

* RE: [EXT] Re: [PATCH v2] doc: announce new major ABI version
  2023-07-28 17:02  7%       ` Patrick Robb
  2023-07-28 17:33  4%         ` Thomas Monjalon
@ 2023-07-31  4:42  8%         ` Akhil Goyal
  1 sibling, 0 replies; 200+ results
From: Akhil Goyal @ 2023-07-31  4:42 UTC (permalink / raw)
  To: Patrick Robb, Thomas Monjalon; +Cc: Bruce Richardson, dev

[-- Attachment #1: Type: text/plain, Size: 559 bytes --]

I believe it is not disabled in some checks.
http://mails.dpdk.org/archives/test-report/2023-July/432810.html
This is reported for today’s patch.

From: Patrick Robb <probb@iol.unh.edu>
Sent: Friday, July 28, 2023 10:32 PM
To: Thomas Monjalon <thomas@monjalon.net>
Cc: Bruce Richardson <bruce.richardson@intel.com>; dev@dpdk.org
Subject: [EXT] Re: [PATCH v2] doc: announce new major ABI version

External Email
________________________________
The Community Lab's ABI testing on new patchseries is now disabled until the 23.11 release. Thanks.

[-- Attachment #2: Type: text/html, Size: 3048 bytes --]

^ permalink raw reply	[relevance 8%]

* [PATCH v2] kni: remove deprecated kernel network interface
  2023-07-29 22:54  1% [PATCH] kni: remove deprecated kernel network interface Stephen Hemminger
@ 2023-07-30  2:12  1% ` Stephen Hemminger
    0 siblings, 1 reply; 200+ results
From: Stephen Hemminger @ 2023-07-30  2:12 UTC (permalink / raw)
  To: dev
  Cc: Stephen Hemminger, Thomas Monjalon, Maxime Coquelin, Chenbo Xia,
	Anatoly Burakov, Cristian Dumitrescu, Nithin Dabilpuram,
	Kiran Kumar K, Sunil Kumar Kori, Satha Rao, Bruce Richardson

Deprecation and removal was announced in 22.11.
Make it so.

Leave kernel/linux with empty directory because
CI is trying to directly build it. At some later date,
kernel/linux can be removed.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
v2 - fix doc and CI build

 MAINTAINERS                                   |  10 -
 app/test/meson.build                          |   2 -
 app/test/test_kni.c                           | 740 ---------------
 doc/api/doxy-api-index.md                     |   2 -
 doc/api/doxy-api.conf.in                      |   1 -
 doc/guides/contributing/documentation.rst     |   2 +-
 doc/guides/howto/flow_bifurcation.rst         |   3 +-
 doc/guides/nics/index.rst                     |   1 -
 doc/guides/nics/kni.rst                       | 170 ----
 doc/guides/nics/virtio.rst                    |  92 +-
 .../prog_guide/env_abstraction_layer.rst      |   2 -
 doc/guides/prog_guide/glossary.rst            |   3 -
 doc/guides/prog_guide/index.rst               |   1 -
 .../prog_guide/kernel_nic_interface.rst       | 423 ---------
 doc/guides/prog_guide/packet_framework.rst    |   9 +-
 doc/guides/rel_notes/deprecation.rst          |   9 +-
 doc/guides/rel_notes/index.rst                |   1 +
 doc/guides/rel_notes/release_23_11.rst        |  16 +
 doc/guides/sample_app_ug/ip_pipeline.rst      |  22 -
 drivers/net/cnxk/cnxk_ethdev.c                |   2 +-
 drivers/net/kni/meson.build                   |  11 -
 drivers/net/kni/rte_eth_kni.c                 | 524 -----------
 drivers/net/meson.build                       |   1 -
 examples/ip_pipeline/Makefile                 |   1 -
 examples/ip_pipeline/cli.c                    |  95 --
 examples/ip_pipeline/examples/kni.cli         |  69 --
 examples/ip_pipeline/kni.c                    | 168 ----
 examples/ip_pipeline/kni.h                    |  46 -
 examples/ip_pipeline/main.c                   |  10 -
 examples/ip_pipeline/meson.build              |   1 -
 examples/ip_pipeline/pipeline.c               |  57 --
 examples/ip_pipeline/pipeline.h               |   2 -
 kernel/linux/kni/Kbuild                       |   6 -
 kernel/linux/kni/compat.h                     | 157 ----
 kernel/linux/kni/kni_dev.h                    | 137 ---
 kernel/linux/kni/kni_fifo.h                   |  87 --
 kernel/linux/kni/kni_misc.c                   | 719 --------------
 kernel/linux/kni/kni_net.c                    | 878 ------------------
 kernel/linux/kni/meson.build                  |  41 -
 kernel/linux/meson.build                      |   2 +-
 lib/eal/common/eal_common_log.c               |   1 -
 lib/eal/include/rte_log.h                     |   2 +-
 lib/eal/linux/eal.c                           |  19 -
 lib/kni/meson.build                           |  21 -
 lib/kni/rte_kni.c                             | 843 -----------------
 lib/kni/rte_kni.h                             | 269 ------
 lib/kni/rte_kni_common.h                      | 147 ---
 lib/kni/rte_kni_fifo.h                        | 117 ---
 lib/kni/version.map                           |  24 -
 lib/meson.build                               |   3 -
 lib/port/meson.build                          |   6 -
 lib/port/rte_port_kni.c                       | 515 ----------
 lib/port/rte_port_kni.h                       |  63 --
 lib/port/version.map                          |   3 -
 meson_options.txt                             |   2 +-
 55 files changed, 28 insertions(+), 6530 deletions(-)
 delete mode 100644 app/test/test_kni.c
 delete mode 100644 doc/guides/nics/kni.rst
 delete mode 100644 doc/guides/prog_guide/kernel_nic_interface.rst
 create mode 100644 doc/guides/rel_notes/release_23_11.rst
 delete mode 100644 drivers/net/kni/meson.build
 delete mode 100644 drivers/net/kni/rte_eth_kni.c
 delete mode 100644 examples/ip_pipeline/examples/kni.cli
 delete mode 100644 examples/ip_pipeline/kni.c
 delete mode 100644 examples/ip_pipeline/kni.h
 delete mode 100644 kernel/linux/kni/Kbuild
 delete mode 100644 kernel/linux/kni/compat.h
 delete mode 100644 kernel/linux/kni/kni_dev.h
 delete mode 100644 kernel/linux/kni/kni_fifo.h
 delete mode 100644 kernel/linux/kni/kni_misc.c
 delete mode 100644 kernel/linux/kni/kni_net.c
 delete mode 100644 kernel/linux/kni/meson.build
 delete mode 100644 lib/kni/meson.build
 delete mode 100644 lib/kni/rte_kni.c
 delete mode 100644 lib/kni/rte_kni.h
 delete mode 100644 lib/kni/rte_kni_common.h
 delete mode 100644 lib/kni/rte_kni_fifo.h
 delete mode 100644 lib/kni/version.map
 delete mode 100644 lib/port/rte_port_kni.c
 delete mode 100644 lib/port/rte_port_kni.h

diff --git a/MAINTAINERS b/MAINTAINERS
index 18bc05fccd0d..6ad45569bcd2 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -617,12 +617,6 @@ F: doc/guides/prog_guide/link_bonding_poll_mode_drv_lib.rst
 F: app/test/test_link_bonding*
 F: examples/bond/
 
-Linux KNI
-F: kernel/linux/kni/
-F: lib/kni/
-F: doc/guides/prog_guide/kernel_nic_interface.rst
-F: app/test/test_kni.c
-
 Linux AF_PACKET
 M: John W. Linville <linville@tuxdriver.com>
 F: drivers/net/af_packet/
@@ -1027,10 +1021,6 @@ F: drivers/net/tap/
 F: doc/guides/nics/tap.rst
 F: doc/guides/nics/features/tap.ini
 
-KNI PMD
-F: drivers/net/kni/
-F: doc/guides/nics/kni.rst
-
 Ring PMD
 M: Bruce Richardson <bruce.richardson@intel.com>
 F: drivers/net/ring/
diff --git a/app/test/meson.build b/app/test/meson.build
index b89cf0368fb5..de895cc8fc52 100644
--- a/app/test/meson.build
+++ b/app/test/meson.build
@@ -72,7 +72,6 @@ test_sources = files(
         'test_ipsec.c',
         'test_ipsec_sad.c',
         'test_ipsec_perf.c',
-        'test_kni.c',
         'test_kvargs.c',
         'test_lcores.c',
         'test_logs.c',
@@ -237,7 +236,6 @@ fast_tests = [
         ['fbarray_autotest', true, true],
         ['hash_readwrite_func_autotest', false, true],
         ['ipsec_autotest', true, true],
-        ['kni_autotest', false, true],
         ['kvargs_autotest', true, true],
         ['member_autotest', true, true],
         ['power_cpufreq_autotest', false, true],
diff --git a/app/test/test_kni.c b/app/test/test_kni.c
deleted file mode 100644
index 4039da0b080c..000000000000
--- a/app/test/test_kni.c
+++ /dev/null
@@ -1,740 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2014 Intel Corporation
- */
-
-#include "test.h"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <unistd.h>
-#include <string.h>
-#if !defined(RTE_EXEC_ENV_LINUX) || !defined(RTE_LIB_KNI)
-
-static int
-test_kni(void)
-{
-	printf("KNI not supported, skipping test\n");
-	return TEST_SKIPPED;
-}
-
-#else
-
-#include <sys/wait.h>
-#include <dirent.h>
-
-#include <rte_string_fns.h>
-#include <rte_mempool.h>
-#include <rte_ethdev.h>
-#include <rte_cycles.h>
-#include <rte_kni.h>
-
-#define NB_MBUF          8192
-#define MAX_PACKET_SZ    2048
-#define MBUF_DATA_SZ     (MAX_PACKET_SZ + RTE_PKTMBUF_HEADROOM)
-#define PKT_BURST_SZ     32
-#define MEMPOOL_CACHE_SZ PKT_BURST_SZ
-#define SOCKET           0
-#define NB_RXD           1024
-#define NB_TXD           1024
-#define KNI_TIMEOUT_MS   5000 /* ms */
-
-#define IFCONFIG      "/sbin/ifconfig "
-#define TEST_KNI_PORT "test_kni_port"
-#define KNI_MODULE_PATH "/sys/module/rte_kni"
-#define KNI_MODULE_PARAM_LO KNI_MODULE_PATH"/parameters/lo_mode"
-#define KNI_TEST_MAX_PORTS 4
-/* The threshold number of mbufs to be transmitted or received. */
-#define KNI_NUM_MBUF_THRESHOLD 100
-static int kni_pkt_mtu = 0;
-
-struct test_kni_stats {
-	volatile uint64_t ingress;
-	volatile uint64_t egress;
-};
-
-static const struct rte_eth_rxconf rx_conf = {
-	.rx_thresh = {
-		.pthresh = 8,
-		.hthresh = 8,
-		.wthresh = 4,
-	},
-	.rx_free_thresh = 0,
-};
-
-static const struct rte_eth_txconf tx_conf = {
-	.tx_thresh = {
-		.pthresh = 36,
-		.hthresh = 0,
-		.wthresh = 0,
-	},
-	.tx_free_thresh = 0,
-	.tx_rs_thresh = 0,
-};
-
-static const struct rte_eth_conf port_conf = {
-	.txmode = {
-		.mq_mode = RTE_ETH_MQ_TX_NONE,
-	},
-};
-
-static struct rte_kni_ops kni_ops = {
-	.change_mtu = NULL,
-	.config_network_if = NULL,
-	.config_mac_address = NULL,
-	.config_promiscusity = NULL,
-};
-
-static unsigned int lcore_main, lcore_ingress, lcore_egress;
-static struct rte_kni *test_kni_ctx;
-static struct test_kni_stats stats;
-
-static volatile uint32_t test_kni_processing_flag;
-
-static struct rte_mempool *
-test_kni_create_mempool(void)
-{
-	struct rte_mempool * mp;
-
-	mp = rte_mempool_lookup("kni_mempool");
-	if (!mp)
-		mp = rte_pktmbuf_pool_create("kni_mempool",
-				NB_MBUF,
-				MEMPOOL_CACHE_SZ, 0, MBUF_DATA_SZ,
-				SOCKET);
-
-	return mp;
-}
-
-static struct rte_mempool *
-test_kni_lookup_mempool(void)
-{
-	return rte_mempool_lookup("kni_mempool");
-}
-/* Callback for request of changing MTU */
-static int
-kni_change_mtu(uint16_t port_id, unsigned int new_mtu)
-{
-	printf("Change MTU of port %d to %u\n", port_id, new_mtu);
-	kni_pkt_mtu = new_mtu;
-	printf("Change MTU of port %d to %i successfully.\n",
-					 port_id, kni_pkt_mtu);
-	return 0;
-}
-
-static int
-test_kni_link_change(void)
-{
-	int ret;
-	int pid;
-
-	pid = fork();
-	if (pid < 0) {
-		printf("Error: Failed to fork a process\n");
-		return -1;
-	}
-
-	if (pid == 0) {
-		printf("Starting KNI Link status change tests.\n");
-		if (system(IFCONFIG TEST_KNI_PORT" up") == -1) {
-			ret = -1;
-			goto error;
-		}
-
-		ret = rte_kni_update_link(test_kni_ctx, 1);
-		if (ret < 0) {
-			printf("Failed to change link state to Up ret=%d.\n",
-				ret);
-			goto error;
-		}
-		rte_delay_ms(1000);
-		printf("KNI: Set LINKUP, previous state=%d\n", ret);
-
-		ret = rte_kni_update_link(test_kni_ctx, 0);
-		if (ret != 1) {
-			printf(
-		"Failed! Previous link state should be 1, returned %d.\n",
-				ret);
-			goto error;
-		}
-		rte_delay_ms(1000);
-		printf("KNI: Set LINKDOWN, previous state=%d\n", ret);
-
-		ret = rte_kni_update_link(test_kni_ctx, 1);
-		if (ret != 0) {
-			printf(
-		"Failed! Previous link state should be 0, returned %d.\n",
-				ret);
-			goto error;
-		}
-		printf("KNI: Set LINKUP, previous state=%d\n", ret);
-
-		ret = 0;
-		rte_delay_ms(1000);
-
-error:
-		if (system(IFCONFIG TEST_KNI_PORT" down") == -1)
-			ret = -1;
-
-		printf("KNI: Link status change tests: %s.\n",
-			(ret == 0) ? "Passed" : "Failed");
-		exit(ret);
-	} else {
-		int p_ret, status;
-
-		while (1) {
-			p_ret = waitpid(pid, &status, WNOHANG);
-			if (p_ret != 0) {
-				if (WIFEXITED(status))
-					return WEXITSTATUS(status);
-				return -1;
-			}
-			rte_delay_ms(10);
-			rte_kni_handle_request(test_kni_ctx);
-		}
-	}
-}
-/**
- * This loop fully tests the basic functions of KNI. e.g. transmitting,
- * receiving to, from kernel space, and kernel requests.
- *
- * This is the loop to transmit/receive mbufs to/from kernel interface with
- * supported by KNI kernel module. The ingress lcore will allocate mbufs and
- * transmit them to kernel space; while the egress lcore will receive the mbufs
- * from kernel space and free them.
- * On the main lcore, several commands will be run to check handling the
- * kernel requests. And it will finally set the flag to exit the KNI
- * transmitting/receiving to/from the kernel space.
- *
- * Note: To support this testing, the KNI kernel module needs to be insmodded
- * in one of its loopback modes.
- */
-static int
-test_kni_loop(__rte_unused void *arg)
-{
-	int ret = 0;
-	unsigned nb_rx, nb_tx, num, i;
-	const unsigned lcore_id = rte_lcore_id();
-	struct rte_mbuf *pkts_burst[PKT_BURST_SZ];
-
-	if (lcore_id == lcore_main) {
-		rte_delay_ms(KNI_TIMEOUT_MS);
-		/* tests of handling kernel request */
-		if (system(IFCONFIG TEST_KNI_PORT" up") == -1)
-			ret = -1;
-		if (system(IFCONFIG TEST_KNI_PORT" mtu 1400") == -1)
-			ret = -1;
-		if (system(IFCONFIG TEST_KNI_PORT" down") == -1)
-			ret = -1;
-		rte_delay_ms(KNI_TIMEOUT_MS);
-		test_kni_processing_flag = 1;
-	} else if (lcore_id == lcore_ingress) {
-		struct rte_mempool *mp = test_kni_lookup_mempool();
-
-		if (mp == NULL)
-			return -1;
-
-		while (1) {
-			if (test_kni_processing_flag)
-				break;
-
-			for (nb_rx = 0; nb_rx < PKT_BURST_SZ; nb_rx++) {
-				pkts_burst[nb_rx] = rte_pktmbuf_alloc(mp);
-				if (!pkts_burst[nb_rx])
-					break;
-			}
-
-			num = rte_kni_tx_burst(test_kni_ctx, pkts_burst,
-								nb_rx);
-			stats.ingress += num;
-			rte_kni_handle_request(test_kni_ctx);
-			if (num < nb_rx) {
-				for (i = num; i < nb_rx; i++) {
-					rte_pktmbuf_free(pkts_burst[i]);
-				}
-			}
-			rte_delay_ms(10);
-		}
-	} else if (lcore_id == lcore_egress) {
-		while (1) {
-			if (test_kni_processing_flag)
-				break;
-			num = rte_kni_rx_burst(test_kni_ctx, pkts_burst,
-							PKT_BURST_SZ);
-			stats.egress += num;
-			for (nb_tx = 0; nb_tx < num; nb_tx++)
-				rte_pktmbuf_free(pkts_burst[nb_tx]);
-			rte_delay_ms(10);
-		}
-	}
-
-	return ret;
-}
-
-static int
-test_kni_allocate_lcores(void)
-{
-	unsigned i, count = 0;
-
-	lcore_main = rte_get_main_lcore();
-	printf("main lcore: %u\n", lcore_main);
-	for (i = 0; i < RTE_MAX_LCORE; i++) {
-		if (count >=2 )
-			break;
-		if (rte_lcore_is_enabled(i) && i != lcore_main) {
-			count ++;
-			if (count == 1)
-				lcore_ingress = i;
-			else if (count == 2)
-				lcore_egress = i;
-		}
-	}
-	printf("count: %u\n", count);
-
-	return count == 2 ? 0 : -1;
-}
-
-static int
-test_kni_register_handler_mp(void)
-{
-#define TEST_KNI_HANDLE_REQ_COUNT    10  /* 5s */
-#define TEST_KNI_HANDLE_REQ_INTERVAL 500 /* ms */
-#define TEST_KNI_MTU                 1450
-#define TEST_KNI_MTU_STR             " 1450"
-	int pid;
-
-	pid = fork();
-	if (pid < 0) {
-		printf("Failed to fork a process\n");
-		return -1;
-	} else if (pid == 0) {
-		int i;
-		struct rte_kni *kni = rte_kni_get(TEST_KNI_PORT);
-		struct rte_kni_ops ops = {
-			.change_mtu = kni_change_mtu,
-			.config_network_if = NULL,
-			.config_mac_address = NULL,
-			.config_promiscusity = NULL,
-		};
-
-		if (!kni) {
-			printf("Failed to get KNI named %s\n", TEST_KNI_PORT);
-			exit(-1);
-		}
-
-		kni_pkt_mtu = 0;
-
-		/* Check with the invalid parameters */
-		if (rte_kni_register_handlers(kni, NULL) == 0) {
-			printf("Unexpectedly register successfully "
-					"with NULL ops pointer\n");
-			exit(-1);
-		}
-		if (rte_kni_register_handlers(NULL, &ops) == 0) {
-			printf("Unexpectedly register successfully "
-					"to NULL KNI device pointer\n");
-			exit(-1);
-		}
-
-		if (rte_kni_register_handlers(kni, &ops)) {
-			printf("Fail to register ops\n");
-			exit(-1);
-		}
-
-		/* Check registering again after it has been registered */
-		if (rte_kni_register_handlers(kni, &ops) == 0) {
-			printf("Unexpectedly register successfully after "
-					"it has already been registered\n");
-			exit(-1);
-		}
-
-		/**
-		 * Handle the request of setting MTU,
-		 * with registered handlers.
-		 */
-		for (i = 0; i < TEST_KNI_HANDLE_REQ_COUNT; i++) {
-			rte_kni_handle_request(kni);
-			if (kni_pkt_mtu == TEST_KNI_MTU)
-				break;
-			rte_delay_ms(TEST_KNI_HANDLE_REQ_INTERVAL);
-		}
-		if (i >= TEST_KNI_HANDLE_REQ_COUNT) {
-			printf("MTU has not been set\n");
-			exit(-1);
-		}
-
-		kni_pkt_mtu = 0;
-		if (rte_kni_unregister_handlers(kni) < 0) {
-			printf("Fail to unregister ops\n");
-			exit(-1);
-		}
-
-		/* Check with invalid parameter */
-		if (rte_kni_unregister_handlers(NULL) == 0) {
-			exit(-1);
-		}
-
-		/**
-		 * Handle the request of setting MTU,
-		 * without registered handlers.
-		 */
-		for (i = 0; i < TEST_KNI_HANDLE_REQ_COUNT; i++) {
-			rte_kni_handle_request(kni);
-			if (kni_pkt_mtu != 0)
-				break;
-			rte_delay_ms(TEST_KNI_HANDLE_REQ_INTERVAL);
-		}
-		if (kni_pkt_mtu != 0) {
-			printf("MTU shouldn't be set\n");
-			exit(-1);
-		}
-
-		exit(0);
-	} else {
-		int p_ret, status;
-
-		rte_delay_ms(1000);
-		if (system(IFCONFIG TEST_KNI_PORT " mtu" TEST_KNI_MTU_STR)
-								== -1)
-			return -1;
-
-		rte_delay_ms(1000);
-		if (system(IFCONFIG TEST_KNI_PORT " mtu" TEST_KNI_MTU_STR)
-								== -1)
-			return -1;
-
-		p_ret = wait(&status);
-		if (!WIFEXITED(status)) {
-			printf("Child process (%d) exit abnormally\n", p_ret);
-			return -1;
-		}
-		if (WEXITSTATUS(status) != 0) {
-			printf("Child process exit with failure\n");
-			return -1;
-		}
-	}
-
-	return 0;
-}
-
-static int
-test_kni_processing(uint16_t port_id, struct rte_mempool *mp)
-{
-	int ret = 0;
-	unsigned i;
-	struct rte_kni *kni;
-	struct rte_kni_conf conf;
-	struct rte_eth_dev_info info;
-	struct rte_kni_ops ops;
-
-	if (!mp)
-		return -1;
-
-	memset(&conf, 0, sizeof(conf));
-	memset(&info, 0, sizeof(info));
-	memset(&ops, 0, sizeof(ops));
-
-	ret = rte_eth_dev_info_get(port_id, &info);
-	if (ret != 0) {
-		printf("Error during getting device (port %u) info: %s\n",
-				port_id, strerror(-ret));
-		return -1;
-	}
-
-	snprintf(conf.name, sizeof(conf.name), TEST_KNI_PORT);
-
-	/* core id 1 configured for kernel thread */
-	conf.core_id = 1;
-	conf.force_bind = 1;
-	conf.mbuf_size = MAX_PACKET_SZ;
-	conf.group_id = port_id;
-
-	ops = kni_ops;
-	ops.port_id = port_id;
-
-	/* basic test of kni processing */
-	kni = rte_kni_alloc(mp, &conf, &ops);
-	if (!kni) {
-		printf("fail to create kni\n");
-		return -1;
-	}
-
-	test_kni_ctx = kni;
-	test_kni_processing_flag = 0;
-	stats.ingress = 0;
-	stats.egress = 0;
-
-	/**
-	 * Check multiple processes support on
-	 * registering/unregistering handlers.
-	 */
-	if (test_kni_register_handler_mp() < 0) {
-		printf("fail to check multiple process support\n");
-		ret = -1;
-		goto fail_kni;
-	}
-
-	ret = test_kni_link_change();
-	if (ret != 0)
-		goto fail_kni;
-
-	rte_eal_mp_remote_launch(test_kni_loop, NULL, CALL_MAIN);
-	RTE_LCORE_FOREACH_WORKER(i) {
-		if (rte_eal_wait_lcore(i) < 0) {
-			ret = -1;
-			goto fail_kni;
-		}
-	}
-	/**
-	 * Check if the number of mbufs received from kernel space is equal
-	 * to that of transmitted to kernel space
-	 */
-	if (stats.ingress < KNI_NUM_MBUF_THRESHOLD ||
-		stats.egress < KNI_NUM_MBUF_THRESHOLD) {
-		printf("The ingress/egress number should not be "
-			"less than %u\n", (unsigned)KNI_NUM_MBUF_THRESHOLD);
-		ret = -1;
-		goto fail_kni;
-	}
-
-	if (rte_kni_release(kni) < 0) {
-		printf("fail to release kni\n");
-		return -1;
-	}
-	test_kni_ctx = NULL;
-
-	/* test of reusing memzone */
-	kni = rte_kni_alloc(mp, &conf, &ops);
-	if (!kni) {
-		printf("fail to create kni\n");
-		return -1;
-	}
-
-	/* Release the kni for following testing */
-	if (rte_kni_release(kni) < 0) {
-		printf("fail to release kni\n");
-		return -1;
-	}
-
-	return ret;
-fail_kni:
-	if (rte_kni_release(kni) < 0) {
-		printf("fail to release kni\n");
-		ret = -1;
-	}
-
-	return ret;
-}
-
-static int
-test_kni(void)
-{
-	int ret = -1;
-	uint16_t port_id;
-	struct rte_kni *kni;
-	struct rte_mempool *mp;
-	struct rte_kni_conf conf;
-	struct rte_eth_dev_info info;
-	struct rte_kni_ops ops;
-	FILE *fd;
-	DIR *dir;
-	char buf[16];
-
-	dir = opendir(KNI_MODULE_PATH);
-	if (!dir) {
-		if (errno == ENOENT) {
-			printf("Cannot run UT due to missing rte_kni module\n");
-			return TEST_SKIPPED;
-		}
-		printf("opendir: %s", strerror(errno));
-		return -1;
-	}
-	closedir(dir);
-
-	/* Initialize KNI subsystem */
-	ret = rte_kni_init(KNI_TEST_MAX_PORTS);
-	if (ret < 0) {
-		printf("fail to initialize KNI subsystem\n");
-		return -1;
-	}
-
-	if (test_kni_allocate_lcores() < 0) {
-		printf("No enough lcores for kni processing\n");
-		return -1;
-	}
-
-	mp = test_kni_create_mempool();
-	if (!mp) {
-		printf("fail to create mempool for kni\n");
-		return -1;
-	}
-
-	/* configuring port 0 for the test is enough */
-	port_id = 0;
-	ret = rte_eth_dev_configure(port_id, 1, 1, &port_conf);
-	if (ret < 0) {
-		printf("fail to configure port %d\n", port_id);
-		return -1;
-	}
-
-	ret = rte_eth_rx_queue_setup(port_id, 0, NB_RXD, SOCKET, &rx_conf, mp);
-	if (ret < 0) {
-		printf("fail to setup rx queue for port %d\n", port_id);
-		return -1;
-	}
-
-	ret = rte_eth_tx_queue_setup(port_id, 0, NB_TXD, SOCKET, &tx_conf);
-	if (ret < 0) {
-		printf("fail to setup tx queue for port %d\n", port_id);
-		return -1;
-	}
-
-	ret = rte_eth_dev_start(port_id);
-	if (ret < 0) {
-		printf("fail to start port %d\n", port_id);
-		return -1;
-	}
-	ret = rte_eth_promiscuous_enable(port_id);
-	if (ret != 0) {
-		printf("fail to enable promiscuous mode for port %d: %s\n",
-			port_id, rte_strerror(-ret));
-		return -1;
-	}
-
-	/* basic test of kni processing */
-	fd = fopen(KNI_MODULE_PARAM_LO, "r");
-	if (fd == NULL) {
-		printf("fopen: %s", strerror(errno));
-		return -1;
-	}
-	memset(&buf, 0, sizeof(buf));
-	if (fgets(buf, sizeof(buf), fd)) {
-		if (!strncmp(buf, "lo_mode_fifo", strlen("lo_mode_fifo")) ||
-			!strncmp(buf, "lo_mode_fifo_skb",
-				  strlen("lo_mode_fifo_skb"))) {
-			ret = test_kni_processing(port_id, mp);
-			if (ret < 0) {
-				fclose(fd);
-				goto fail;
-			}
-		} else
-			printf("test_kni_processing skipped because of missing rte_kni module lo_mode argument\n");
-	}
-	fclose(fd);
-
-	/* test of allocating KNI with NULL mempool pointer */
-	memset(&info, 0, sizeof(info));
-	memset(&conf, 0, sizeof(conf));
-	memset(&ops, 0, sizeof(ops));
-
-	ret = rte_eth_dev_info_get(port_id, &info);
-	if (ret != 0) {
-		printf("Error during getting device (port %u) info: %s\n",
-				port_id, strerror(-ret));
-		return -1;
-	}
-
-	conf.group_id = port_id;
-	conf.mbuf_size = MAX_PACKET_SZ;
-
-	ops = kni_ops;
-	ops.port_id = port_id;
-	kni = rte_kni_alloc(NULL, &conf, &ops);
-	if (kni) {
-		ret = -1;
-		printf("unexpectedly creates kni successfully with NULL "
-							"mempool pointer\n");
-		goto fail;
-	}
-
-	/* test of allocating KNI without configurations */
-	kni = rte_kni_alloc(mp, NULL, NULL);
-	if (kni) {
-		ret = -1;
-		printf("Unexpectedly allocate KNI device successfully "
-					"without configurations\n");
-		goto fail;
-	}
-
-	/* test of allocating KNI without a name */
-	memset(&conf, 0, sizeof(conf));
-	memset(&info, 0, sizeof(info));
-	memset(&ops, 0, sizeof(ops));
-
-	ret = rte_eth_dev_info_get(port_id, &info);
-	if (ret != 0) {
-		printf("Error during getting device (port %u) info: %s\n",
-				port_id, strerror(-ret));
-		ret = -1;
-		goto fail;
-	}
-
-	conf.group_id = port_id;
-	conf.mbuf_size = MAX_PACKET_SZ;
-
-	ops = kni_ops;
-	ops.port_id = port_id;
-	kni = rte_kni_alloc(mp, &conf, &ops);
-	if (kni) {
-		ret = -1;
-		printf("Unexpectedly allocate a KNI device successfully "
-						"without a name\n");
-		goto fail;
-	}
-
-	/* test of releasing NULL kni context */
-	ret = rte_kni_release(NULL);
-	if (ret == 0) {
-		ret = -1;
-		printf("unexpectedly release kni successfully\n");
-		goto fail;
-	}
-
-	/* test of handling request on NULL device pointer */
-	ret = rte_kni_handle_request(NULL);
-	if (ret == 0) {
-		ret = -1;
-		printf("Unexpectedly handle request on NULL device pointer\n");
-		goto fail;
-	}
-
-	/* test of getting KNI device with pointer to NULL */
-	kni = rte_kni_get(NULL);
-	if (kni) {
-		ret = -1;
-		printf("Unexpectedly get a KNI device with "
-					"NULL name pointer\n");
-		goto fail;
-	}
-
-	/* test of getting KNI device with an zero length name string */
-	memset(&conf, 0, sizeof(conf));
-	kni = rte_kni_get(conf.name);
-	if (kni) {
-		ret = -1;
-		printf("Unexpectedly get a KNI device with "
-				"zero length name string\n");
-		goto fail;
-	}
-
-	/* test of getting KNI device with an invalid string name */
-	memset(&conf, 0, sizeof(conf));
-	snprintf(conf.name, sizeof(conf.name), "testing");
-	kni = rte_kni_get(conf.name);
-	if (kni) {
-		ret = -1;
-		printf("Unexpectedly get a KNI device with "
-				"a never used name string\n");
-		goto fail;
-	}
-	ret = 0;
-
-fail:
-	if (rte_eth_dev_stop(port_id) != 0)
-		printf("Failed to stop port %u\n", port_id);
-
-	return ret;
-}
-
-#endif
-
-REGISTER_TEST_COMMAND(kni_autotest, test_kni);
diff --git a/doc/api/doxy-api-index.md b/doc/api/doxy-api-index.md
index 3bc8778981f6..7bba67d58586 100644
--- a/doc/api/doxy-api-index.md
+++ b/doc/api/doxy-api-index.md
@@ -43,7 +43,6 @@ The public API headers are grouped by topics:
   [bond](@ref rte_eth_bond.h),
   [vhost](@ref rte_vhost.h),
   [vdpa](@ref rte_vdpa.h),
-  [KNI](@ref rte_kni.h),
   [ixgbe](@ref rte_pmd_ixgbe.h),
   [i40e](@ref rte_pmd_i40e.h),
   [iavf](@ref rte_pmd_iavf.h),
@@ -178,7 +177,6 @@ The public API headers are grouped by topics:
     [frag](@ref rte_port_frag.h),
     [reass](@ref rte_port_ras.h),
     [sched](@ref rte_port_sched.h),
-    [kni](@ref rte_port_kni.h),
     [src/sink](@ref rte_port_source_sink.h)
   * [table](@ref rte_table.h):
     [lpm IPv4](@ref rte_table_lpm.h),
diff --git a/doc/api/doxy-api.conf.in b/doc/api/doxy-api.conf.in
index 1a4210b948a8..90dcf232dffd 100644
--- a/doc/api/doxy-api.conf.in
+++ b/doc/api/doxy-api.conf.in
@@ -49,7 +49,6 @@ INPUT                   = @TOPDIR@/doc/api/doxy-api-index.md \
                           @TOPDIR@/lib/ip_frag \
                           @TOPDIR@/lib/ipsec \
                           @TOPDIR@/lib/jobstats \
-                          @TOPDIR@/lib/kni \
                           @TOPDIR@/lib/kvargs \
                           @TOPDIR@/lib/latencystats \
                           @TOPDIR@/lib/lpm \
diff --git a/doc/guides/contributing/documentation.rst b/doc/guides/contributing/documentation.rst
index 7fcbb7fc43b2..f16c94e9768b 100644
--- a/doc/guides/contributing/documentation.rst
+++ b/doc/guides/contributing/documentation.rst
@@ -95,7 +95,7 @@ added to by the developer.
 * **The Programmers Guide**
 
   The Programmers Guide explains how the API components of DPDK such as the EAL, Memzone, Rings and the Hash Library work.
-  It also explains how some higher level functionality such as Packet Distributor, Packet Framework and KNI work.
+  It also explains how some higher level functionality such as Packet Distributor and Packet Framework.
   It also shows the build system and explains how to add applications.
 
   The Programmers Guide should be expanded when new functionality is added to DPDK.
diff --git a/doc/guides/howto/flow_bifurcation.rst b/doc/guides/howto/flow_bifurcation.rst
index 838eb2a4cc89..554dd24c32c5 100644
--- a/doc/guides/howto/flow_bifurcation.rst
+++ b/doc/guides/howto/flow_bifurcation.rst
@@ -7,8 +7,7 @@ Flow Bifurcation How-to Guide
 Flow Bifurcation is a mechanism which uses hardware capable Ethernet devices
 to split traffic between Linux user space and kernel space. Since it is a
 hardware assisted feature this approach can provide line rate processing
-capability. Other than :ref:`KNI <kni>`, the software is just required to
-enable device configuration, there is no need to take care of the packet
+capability. There is no need to take care of the packet
 movement during the traffic split. This can yield better performance with
 less CPU overhead.
 
diff --git a/doc/guides/nics/index.rst b/doc/guides/nics/index.rst
index 31296822e5ec..7bfcac880f44 100644
--- a/doc/guides/nics/index.rst
+++ b/doc/guides/nics/index.rst
@@ -43,7 +43,6 @@ Network Interface Controller Drivers
     ionic
     ipn3ke
     ixgbe
-    kni
     mana
     memif
     mlx4
diff --git a/doc/guides/nics/kni.rst b/doc/guides/nics/kni.rst
deleted file mode 100644
index bd3033bb585c..000000000000
--- a/doc/guides/nics/kni.rst
+++ /dev/null
@@ -1,170 +0,0 @@
-..  SPDX-License-Identifier: BSD-3-Clause
-    Copyright(c) 2017 Intel Corporation.
-
-KNI Poll Mode Driver
-======================
-
-KNI PMD is wrapper to the :ref:`librte_kni <kni>` library.
-
-This PMD enables using KNI without having a KNI specific application,
-any forwarding application can use PMD interface for KNI.
-
-Sending packets to any DPDK controlled interface or sending to the
-Linux networking stack will be transparent to the DPDK application.
-
-To create a KNI device ``net_kni#`` device name should be used, and this
-will create ``kni#`` Linux virtual network interface.
-
-There is no physical device backend for the virtual KNI device.
-
-Packets sent to the KNI Linux interface will be received by the DPDK
-application, and DPDK application may forward packets to a physical NIC
-or to a virtual device (like another KNI interface or PCAP interface).
-
-To forward any traffic from physical NIC to the Linux networking stack,
-an application should control a physical port and create one virtual KNI port,
-and forward between two.
-
-Using this PMD requires KNI kernel module be inserted.
-
-
-Usage
------
-
-EAL ``--vdev`` argument can be used to create KNI device instance, like::
-
-        dpdk-testpmd --vdev=net_kni0 --vdev=net_kni1 -- -i
-
-Above command will create ``kni0`` and ``kni1`` Linux network interfaces,
-those interfaces can be controlled by standard Linux tools.
-
-When testpmd forwarding starts, any packets sent to ``kni0`` interface
-forwarded to the ``kni1`` interface and vice versa.
-
-There is no hard limit on number of interfaces that can be created.
-
-
-Default interface configuration
--------------------------------
-
-``librte_kni`` can create Linux network interfaces with different features,
-feature set controlled by a configuration struct, and KNI PMD uses a fixed
-configuration:
-
-    .. code-block:: console
-
-        Interface name: kni#
-        force bind kernel thread to a core : NO
-        mbuf size: (rte_pktmbuf_data_room_size(pktmbuf_pool) - RTE_PKTMBUF_HEADROOM)
-        mtu: (conf.mbuf_size - RTE_ETHER_HDR_LEN)
-
-KNI control path is not supported with the PMD, since there is no physical
-backend device by default.
-
-
-Runtime Configuration
----------------------
-
-``no_request_thread``, by default PMD creates a pthread for each KNI interface
-to handle Linux network interface control commands, like ``ifconfig kni0 up``
-
-With ``no_request_thread`` option, pthread is not created and control commands
-not handled by PMD.
-
-By default request thread is enabled. And this argument should not be used
-most of the time, unless this PMD used with customized DPDK application to handle
-requests itself.
-
-Argument usage::
-
-        dpdk-testpmd --vdev "net_kni0,no_request_thread=1" -- -i
-
-
-PMD log messages
-----------------
-
-If KNI kernel module (rte_kni.ko) not inserted, following error log printed::
-
-        "KNI: KNI subsystem has not been initialized. Invoke rte_kni_init() first"
-
-
-PMD testing
------------
-
-It is possible to test PMD quickly using KNI kernel module loopback feature:
-
-* Insert KNI kernel module with loopback support:
-
-    .. code-block:: console
-
-        insmod <build_dir>/kernel/linux/kni/rte_kni.ko lo_mode=lo_mode_fifo_skb
-
-* Start testpmd with no physical device but two KNI virtual devices:
-
-    .. code-block:: console
-
-        ./dpdk-testpmd --vdev net_kni0 --vdev net_kni1 -- -i
-
-    .. code-block:: console
-
-        ...
-        Configuring Port 0 (socket 0)
-        KNI: pci: 00:00:00       c580:b8
-        Port 0: 1A:4A:5B:7C:A2:8C
-        Configuring Port 1 (socket 0)
-        KNI: pci: 00:00:00       600:b9
-        Port 1: AE:95:21:07:93:DD
-        Checking link statuses...
-        Port 0 Link Up - speed 10000 Mbps - full-duplex
-        Port 1 Link Up - speed 10000 Mbps - full-duplex
-        Done
-        testpmd>
-
-* Observe Linux interfaces
-
-    .. code-block:: console
-
-        $ ifconfig kni0 && ifconfig kni1
-        kni0: flags=4098<BROADCAST,MULTICAST>  mtu 1500
-                ether ae:8e:79:8e:9b:c8  txqueuelen 1000  (Ethernet)
-                RX packets 0  bytes 0 (0.0 B)
-                RX errors 0  dropped 0  overruns 0  frame 0
-                TX packets 0  bytes 0 (0.0 B)
-                TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
-
-        kni1: flags=4098<BROADCAST,MULTICAST>  mtu 1500
-                ether 9e:76:43:53:3e:9b  txqueuelen 1000  (Ethernet)
-                RX packets 0  bytes 0 (0.0 B)
-                RX errors 0  dropped 0  overruns 0  frame 0
-                TX packets 0  bytes 0 (0.0 B)
-                TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
-
-
-* Start forwarding with tx_first:
-
-    .. code-block:: console
-
-        testpmd> start tx_first
-
-* Quit and check forwarding stats:
-
-    .. code-block:: console
-
-        testpmd> quit
-        Telling cores to stop...
-        Waiting for lcores to finish...
-
-        ---------------------- Forward statistics for port 0  ----------------------
-        RX-packets: 35637905       RX-dropped: 0             RX-total: 35637905
-        TX-packets: 35637947       TX-dropped: 0             TX-total: 35637947
-        ----------------------------------------------------------------------------
-
-        ---------------------- Forward statistics for port 1  ----------------------
-        RX-packets: 35637915       RX-dropped: 0             RX-total: 35637915
-        TX-packets: 35637937       TX-dropped: 0             TX-total: 35637937
-        ----------------------------------------------------------------------------
-
-        +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
-        RX-packets: 71275820       RX-dropped: 0             RX-total: 71275820
-        TX-packets: 71275884       TX-dropped: 0             TX-total: 71275884
-        ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
diff --git a/doc/guides/nics/virtio.rst b/doc/guides/nics/virtio.rst
index f5e54a5e9cfd..ba6247170dbb 100644
--- a/doc/guides/nics/virtio.rst
+++ b/doc/guides/nics/virtio.rst
@@ -10,15 +10,12 @@ we provide a virtio Poll Mode Driver (PMD) as a software solution, comparing to
 for fast guest VM to guest VM communication and guest VM to host communication.
 
 Vhost is a kernel acceleration module for virtio qemu backend.
-The DPDK extends kni to support vhost raw socket interface,
-which enables vhost to directly read/ write packets from/to a physical port.
-With this enhancement, virtio could achieve quite promising performance.
 
 For basic qemu-KVM installation and other Intel EM poll mode driver in guest VM,
 please refer to Chapter "Driver for VM Emulated Devices".
 
 In this chapter, we will demonstrate usage of virtio PMD with two backends,
-standard qemu vhost back end and vhost kni back end.
+standard qemu vhost back end.
 
 Virtio Implementation in DPDK
 -----------------------------
@@ -89,93 +86,6 @@ The following prerequisites apply:
 *   When using legacy interface, ``SYS_RAWIO`` capability is required
     for ``iopl()`` call to enable access to PCI I/O ports.
 
-Virtio with kni vhost Back End
-------------------------------
-
-This section demonstrates kni vhost back end example setup for Phy-VM Communication.
-
-.. _figure_host_vm_comms:
-
-.. figure:: img/host_vm_comms.*
-
-   Host2VM Communication Example Using kni vhost Back End
-
-
-Host2VM communication example
-
-#.  Load the kni kernel module:
-
-    .. code-block:: console
-
-        insmod rte_kni.ko
-
-    Other basic DPDK preparations like hugepage enabling,
-    UIO port binding are not listed here.
-    Please refer to the *DPDK Getting Started Guide* for detailed instructions.
-
-#.  Launch the kni user application:
-
-    .. code-block:: console
-
-        <build_dir>/examples/dpdk-kni -l 0-3 -n 4 -- -p 0x1 -P --config="(0,1,3)"
-
-    This command generates one network device vEth0 for physical port.
-    If specify more physical ports, the generated network device will be vEth1, vEth2, and so on.
-
-    For each physical port, kni creates two user threads.
-    One thread loops to fetch packets from the physical NIC port into the kni receive queue.
-    The other user thread loops to send packets in the kni transmit queue.
-
-    For each physical port, kni also creates a kernel thread that retrieves packets from the kni receive queue,
-    place them onto kni's raw socket's queue and wake up the vhost kernel thread to exchange packets with the virtio virt queue.
-
-    For more details about kni, please refer to :ref:`kni`.
-
-#.  Enable the kni raw socket functionality for the specified physical NIC port,
-    get the generated file descriptor and set it in the qemu command line parameter.
-    Always remember to set ioeventfd_on and vhost_on.
-
-    Example:
-
-    .. code-block:: console
-
-        echo 1 > /sys/class/net/vEth0/sock_en
-        fd=`cat /sys/class/net/vEth0/sock_fd`
-        exec qemu-system-x86_64 -enable-kvm -cpu host \
-        -m 2048 -smp 4 -name dpdk-test1-vm1 \
-        -drive file=/data/DPDKVMS/dpdk-vm.img \
-        -netdev tap, fd=$fd,id=mynet_kni, script=no,vhost=on \
-        -device virtio-net-pci,netdev=mynet_kni,bus=pci.0,addr=0x3,ioeventfd=on \
-        -vnc:1 -daemonize
-
-    In the above example, virtio port 0 in the guest VM will be associated with vEth0, which in turns corresponds to a physical port,
-    which means received packets come from vEth0, and transmitted packets is sent to vEth0.
-
-#.  In the guest, bind the virtio device to the uio_pci_generic kernel module and start the forwarding application.
-    When the virtio port in guest bursts Rx, it is getting packets from the
-    raw socket's receive queue.
-    When the virtio port bursts Tx, it is sending packet to the tx_q.
-
-    .. code-block:: console
-
-        modprobe uio
-        dpdk-hugepages.py --setup 1G
-        modprobe uio_pci_generic
-        ./usertools/dpdk-devbind.py -b uio_pci_generic 00:03.0
-
-    We use testpmd as the forwarding application in this example.
-
-    .. figure:: img/console.*
-
-       Running testpmd
-
-#.  Use IXIA packet generator to inject a packet stream into the KNI physical port.
-
-    The packet reception and transmission flow path is:
-
-    IXIA packet generator->82599 PF->KNI Rx queue->KNI raw socket queue->Guest
-    VM virtio port 0 Rx burst->Guest VM virtio port 0 Tx burst-> KNI Tx queue
-    ->82599 PF-> IXIA packet generator
 
 Virtio with qemu virtio Back End
 --------------------------------
diff --git a/doc/guides/prog_guide/env_abstraction_layer.rst b/doc/guides/prog_guide/env_abstraction_layer.rst
index 93c8a031be56..5d382fdd9032 100644
--- a/doc/guides/prog_guide/env_abstraction_layer.rst
+++ b/doc/guides/prog_guide/env_abstraction_layer.rst
@@ -610,8 +610,6 @@ devices would fail anyway.
     ``RTE_PCI_DRV_NEED_IOVA_AS_VA`` flag is used to dictate that this PCI
     driver can only work in RTE_IOVA_VA mode.
 
-    When the KNI kernel module is detected, RTE_IOVA_PA mode is preferred as a
-    performance penalty is expected in RTE_IOVA_VA mode.
 
 IOVA Mode Configuration
 ~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/doc/guides/prog_guide/glossary.rst b/doc/guides/prog_guide/glossary.rst
index fb0910ba5b3f..8d6349701e43 100644
--- a/doc/guides/prog_guide/glossary.rst
+++ b/doc/guides/prog_guide/glossary.rst
@@ -103,9 +103,6 @@ lcore
    A logical execution unit of the processor, sometimes called a *hardware
    thread*.
 
-KNI
-   Kernel Network Interface
-
 L1
    Layer 1
 
diff --git a/doc/guides/prog_guide/index.rst b/doc/guides/prog_guide/index.rst
index d89cd3edb63c..1be6a3d6d9b6 100644
--- a/doc/guides/prog_guide/index.rst
+++ b/doc/guides/prog_guide/index.rst
@@ -54,7 +54,6 @@ Programmer's Guide
     pcapng_lib
     pdump_lib
     multi_proc_support
-    kernel_nic_interface
     thread_safety_dpdk_functions
     eventdev
     event_ethernet_rx_adapter
diff --git a/doc/guides/prog_guide/kernel_nic_interface.rst b/doc/guides/prog_guide/kernel_nic_interface.rst
deleted file mode 100644
index 392e5df75fcf..000000000000
--- a/doc/guides/prog_guide/kernel_nic_interface.rst
+++ /dev/null
@@ -1,423 +0,0 @@
-..  SPDX-License-Identifier: BSD-3-Clause
-    Copyright(c) 2010-2015 Intel Corporation.
-
-.. _kni:
-
-Kernel NIC Interface
-====================
-
-.. note::
-
-   KNI is deprecated and will be removed in future.
-   See :doc:`../rel_notes/deprecation`.
-
-   :ref:`virtio_user_as_exception_path` alternative is the preferred way
-   for interfacing with the Linux network stack
-   as it is an in-kernel solution and has similar performance expectations.
-
-.. note::
-
-   KNI is disabled by default in the DPDK build.
-   To re-enable the library, remove 'kni' from the "disable_libs" meson option when configuring a build.
-
-The DPDK Kernel NIC Interface (KNI) allows userspace applications access to the Linux* control plane.
-
-KNI provides an interface with the kernel network stack
-and allows management of DPDK ports using standard Linux net tools
-such as ``ethtool``, ``iproute2`` and ``tcpdump``.
-
-The main use case of KNI is to get/receive exception packets from/to Linux network stack
-while main datapath IO is done bypassing the networking stack.
-
-There are other alternatives to KNI, all are available in the upstream Linux:
-
-#. :ref:`virtio_user_as_exception_path`
-
-#. :doc:`../nics/tap` as wrapper to `Linux tun/tap
-   <https://www.kernel.org/doc/Documentation/networking/tuntap.txt>`_
-
-The benefits of using the KNI against alternatives are:
-
-*   Faster than existing Linux TUN/TAP interfaces
-    (by eliminating system calls and copy_to_user()/copy_from_user() operations.
-
-The disadvantages of the KNI are:
-
-* It is out-of-tree Linux kernel module
-  which makes updating and distributing the driver more difficult.
-  Most users end up building the KNI driver from source
-  which requires the packages and tools to build kernel modules.
-
-* As it shares memory between userspace and kernelspace,
-  and kernel part directly uses input provided by userspace, it is not safe.
-  This makes hard to upstream the module.
-
-* Requires dedicated kernel cores.
-
-* Only a subset of net devices control commands are supported by KNI.
-
-The components of an application using the DPDK Kernel NIC Interface are shown in :numref:`figure_kernel_nic_intf`.
-
-.. _figure_kernel_nic_intf:
-
-.. figure:: img/kernel_nic_intf.*
-
-   Components of a DPDK KNI Application
-
-
-The DPDK KNI Kernel Module
---------------------------
-
-The KNI kernel loadable module ``rte_kni`` provides the kernel interface
-for DPDK applications.
-
-When the ``rte_kni`` module is loaded, it will create a device ``/dev/kni``
-that is used by the DPDK KNI API functions to control and communicate with
-the kernel module.
-
-The ``rte_kni`` kernel module contains several optional parameters which
-can be specified when the module is loaded to control its behavior:
-
-.. code-block:: console
-
-    # modinfo rte_kni.ko
-    <snip>
-    parm:           lo_mode: KNI loopback mode (default=lo_mode_none):
-                    lo_mode_none        Kernel loopback disabled
-                    lo_mode_fifo        Enable kernel loopback with fifo
-                    lo_mode_fifo_skb    Enable kernel loopback with fifo and skb buffer
-                     (charp)
-    parm:           kthread_mode: Kernel thread mode (default=single):
-                    single    Single kernel thread mode enabled.
-                    multiple  Multiple kernel thread mode enabled.
-                     (charp)
-    parm:           carrier: Default carrier state for KNI interface (default=off):
-                    off   Interfaces will be created with carrier state set to off.
-                    on    Interfaces will be created with carrier state set to on.
-                     (charp)
-    parm:           enable_bifurcated: Enable request processing support for
-                    bifurcated drivers, which means releasing rtnl_lock before calling
-                    userspace callback and supporting async requests (default=off):
-                    on    Enable request processing support for bifurcated drivers.
-                     (charp)
-    parm:           min_scheduling_interval: KNI thread min scheduling interval (default=100 microseconds)
-                     (long)
-    parm:           max_scheduling_interval: KNI thread max scheduling interval (default=200 microseconds)
-                     (long)
-
-
-Loading the ``rte_kni`` kernel module without any optional parameters is
-the typical way a DPDK application gets packets into and out of the kernel
-network stack.  Without any parameters, only one kernel thread is created
-for all KNI devices for packet receiving in kernel side, loopback mode is
-disabled, and the default carrier state of KNI interfaces is set to *off*.
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko
-
-.. _kni_loopback_mode:
-
-Loopback Mode
-~~~~~~~~~~~~~
-
-For testing, the ``rte_kni`` kernel module can be loaded in loopback mode
-by specifying the ``lo_mode`` parameter:
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko lo_mode=lo_mode_fifo
-
-The ``lo_mode_fifo`` loopback option will loop back ring enqueue/dequeue
-operations in kernel space.
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko lo_mode=lo_mode_fifo_skb
-
-The ``lo_mode_fifo_skb`` loopback option will loop back ring enqueue/dequeue
-operations and sk buffer copies in kernel space.
-
-If the ``lo_mode`` parameter is not specified, loopback mode is disabled.
-
-.. _kni_kernel_thread_mode:
-
-Kernel Thread Mode
-~~~~~~~~~~~~~~~~~~
-
-To provide flexibility of performance, the ``rte_kni`` KNI kernel module
-can be loaded with the ``kthread_mode`` parameter.  The ``rte_kni`` kernel
-module supports two options: "single kernel thread" mode and "multiple
-kernel thread" mode.
-
-Single kernel thread mode is enabled as follows:
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko kthread_mode=single
-
-This mode will create only one kernel thread for all KNI interfaces to
-receive data on the kernel side.  By default, this kernel thread is not
-bound to any particular core, but the user can set the core affinity for
-this kernel thread by setting the ``core_id`` and ``force_bind`` parameters
-in ``struct rte_kni_conf`` when the first KNI interface is created:
-
-For optimum performance, the kernel thread should be bound to a core in
-on the same socket as the DPDK lcores used in the application.
-
-The KNI kernel module can also be configured to start a separate kernel
-thread for each KNI interface created by the DPDK application.  Multiple
-kernel thread mode is enabled as follows:
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko kthread_mode=multiple
-
-This mode will create a separate kernel thread for each KNI interface to
-receive data on the kernel side.  The core affinity of each ``kni_thread``
-kernel thread can be specified by setting the ``core_id`` and ``force_bind``
-parameters in ``struct rte_kni_conf`` when each KNI interface is created.
-
-Multiple kernel thread mode can provide scalable higher performance if
-sufficient unused cores are available on the host system.
-
-If the ``kthread_mode`` parameter is not specified, the "single kernel
-thread" mode is used.
-
-.. _kni_default_carrier_state:
-
-Default Carrier State
-~~~~~~~~~~~~~~~~~~~~~
-
-The default carrier state of KNI interfaces created by the ``rte_kni``
-kernel module is controlled via the ``carrier`` option when the module
-is loaded.
-
-If ``carrier=off`` is specified, the kernel module will leave the carrier
-state of the interface *down* when the interface is management enabled.
-The DPDK application can set the carrier state of the KNI interface using the
-``rte_kni_update_link()`` function.  This is useful for DPDK applications
-which require that the carrier state of the KNI interface reflect the
-actual link state of the corresponding physical NIC port.
-
-If ``carrier=on`` is specified, the kernel module will automatically set
-the carrier state of the interface to *up* when the interface is management
-enabled.  This is useful for DPDK applications which use the KNI interface as
-a purely virtual interface that does not correspond to any physical hardware
-and do not wish to explicitly set the carrier state of the interface with
-``rte_kni_update_link()``.  It is also useful for testing in loopback mode
-where the NIC port may not be physically connected to anything.
-
-To set the default carrier state to *on*:
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko carrier=on
-
-To set the default carrier state to *off*:
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko carrier=off
-
-If the ``carrier`` parameter is not specified, the default carrier state
-of KNI interfaces will be set to *off*.
-
-.. _kni_bifurcated_device_support:
-
-Bifurcated Device Support
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-User callbacks are executed while kernel module holds the ``rtnl`` lock, this
-causes a deadlock when callbacks run control commands on another Linux kernel
-network interface.
-
-Bifurcated devices has kernel network driver part and to prevent deadlock for
-them ``enable_bifurcated`` is used.
-
-To enable bifurcated device support:
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko enable_bifurcated=on
-
-Enabling bifurcated device support releases ``rtnl`` lock before calling
-callback and locks it back after callback. Also enables asynchronous request to
-support callbacks that requires rtnl lock to work (interface down).
-
-KNI Kthread Scheduling
-~~~~~~~~~~~~~~~~~~~~~~
-
-The ``min_scheduling_interval`` and ``max_scheduling_interval`` parameters
-control the rescheduling interval of the KNI kthreads.
-
-This might be useful if we have use cases in which we require improved
-latency or performance for control plane traffic.
-
-The implementation is backed by Linux High Precision Timers, and uses ``usleep_range``.
-Hence, it will have the same granularity constraints as this Linux subsystem.
-
-For Linux High Precision Timers, you can check the following resource: `Kernel Timers <http://www.kernel.org/doc/Documentation/timers/timers-howto.txt>`_
-
-To set the ``min_scheduling_interval`` to a value of 100 microseconds:
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko min_scheduling_interval=100
-
-To set the ``max_scheduling_interval`` to a value of 200 microseconds:
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko max_scheduling_interval=200
-
-If the ``min_scheduling_interval`` and ``max_scheduling_interval`` parameters are
-not specified, the default interval limits will be set to *100* and *200* respectively.
-
-KNI Creation and Deletion
--------------------------
-
-Before any KNI interfaces can be created, the ``rte_kni`` kernel module must
-be loaded into the kernel and configured with the ``rte_kni_init()`` function.
-
-The KNI interfaces are created by a DPDK application dynamically via the
-``rte_kni_alloc()`` function.
-
-The ``struct rte_kni_conf`` structure contains fields which allow the
-user to specify the interface name, set the MTU size, set an explicit or
-random MAC address and control the affinity of the kernel Rx thread(s)
-(both single and multi-threaded modes).
-By default the KNI sample example gets the MTU from the matching device,
-and in case of KNI PMD it is derived from mbuf buffer length.
-
-The ``struct rte_kni_ops`` structure contains pointers to functions to
-handle requests from the ``rte_kni`` kernel module.  These functions
-allow DPDK applications to perform actions when the KNI interfaces are
-manipulated by control commands or functions external to the application.
-
-For example, the DPDK application may wish to enabled/disable a physical
-NIC port when a user enabled/disables a KNI interface with ``ip link set
-[up|down] dev <ifaceX>``.  The DPDK application can register a callback for
-``config_network_if`` which will be called when the interface management
-state changes.
-
-There are currently four callbacks for which the user can register
-application functions:
-
-``config_network_if``:
-
-    Called when the management state of the KNI interface changes.
-    For example, when the user runs ``ip link set [up|down] dev <ifaceX>``.
-
-``change_mtu``:
-
-    Called when the user changes the MTU size of the KNI
-    interface.  For example, when the user runs ``ip link set mtu <size>
-    dev <ifaceX>``.
-
-``config_mac_address``:
-
-    Called when the user changes the MAC address of the KNI interface.
-    For example, when the user runs ``ip link set address <MAC>
-    dev <ifaceX>``.  If the user sets this callback function to NULL,
-    but sets the ``port_id`` field to a value other than -1, a default
-    callback handler in the rte_kni library ``kni_config_mac_address()``
-    will be called which calls ``rte_eth_dev_default_mac_addr_set()``
-    on the specified ``port_id``.
-
-``config_promiscusity``:
-
-    Called when the user changes the promiscuity state of the KNI
-    interface.  For example, when the user runs ``ip link set promisc
-    [on|off] dev <ifaceX>``. If the user sets this callback function to
-    NULL, but sets the ``port_id`` field to a value other than -1, a default
-    callback handler in the rte_kni library ``kni_config_promiscusity()``
-    will be called which calls ``rte_eth_promiscuous_<enable|disable>()``
-    on the specified ``port_id``.
-
-``config_allmulticast``:
-
-    Called when the user changes the allmulticast state of the KNI interface.
-    For example, when the user runs ``ifconfig <ifaceX> [-]allmulti``. If the
-    user sets this callback function to NULL, but sets the ``port_id`` field to
-    a value other than -1, a default callback handler in the rte_kni library
-    ``kni_config_allmulticast()`` will be called which calls
-    ``rte_eth_allmulticast_<enable|disable>()`` on the specified ``port_id``.
-
-In order to run these callbacks, the application must periodically call
-the ``rte_kni_handle_request()`` function.  Any user callback function
-registered will be called directly from ``rte_kni_handle_request()`` so
-care must be taken to prevent deadlock and to not block any DPDK fastpath
-tasks.  Typically DPDK applications which use these callbacks will need
-to create a separate thread or secondary process to periodically call
-``rte_kni_handle_request()``.
-
-The KNI interfaces can be deleted by a DPDK application with
-``rte_kni_release()``.  All KNI interfaces not explicitly deleted will be
-deleted when the ``/dev/kni`` device is closed, either explicitly with
-``rte_kni_close()`` or when the DPDK application is closed.
-
-DPDK mbuf Flow
---------------
-
-To minimize the amount of DPDK code running in kernel space, the mbuf mempool is managed in userspace only.
-The kernel module will be aware of mbufs,
-but all mbuf allocation and free operations will be handled by the DPDK application only.
-
-:numref:`figure_pkt_flow_kni` shows a typical scenario with packets sent in both directions.
-
-.. _figure_pkt_flow_kni:
-
-.. figure:: img/pkt_flow_kni.*
-
-   Packet Flow via mbufs in the DPDK KNI
-
-
-Use Case: Ingress
------------------
-
-On the DPDK RX side, the mbuf is allocated by the PMD in the RX thread context.
-This thread will enqueue the mbuf in the rx_q FIFO,
-and the next pointers in mbuf-chain will convert to physical address.
-The KNI thread will poll all KNI active devices for the rx_q.
-If an mbuf is dequeued, it will be converted to a sk_buff and sent to the net stack via netif_rx().
-The dequeued mbuf must be freed, so the same pointer is sent back in the free_q FIFO,
-and next pointers must convert back to virtual address if exists before put in the free_q FIFO.
-
-The RX thread, in the same main loop, polls this FIFO and frees the mbuf after dequeuing it.
-The address conversion of the next pointer is to prevent the chained mbuf
-in different hugepage segments from causing kernel crash.
-
-Use Case: Egress
-----------------
-
-For packet egress the DPDK application must first enqueue several mbufs to create an mbuf cache on the kernel side.
-
-The packet is received from the Linux net stack, by calling the kni_net_tx() callback.
-The mbuf is dequeued (without waiting due the cache) and filled with data from sk_buff.
-The sk_buff is then freed and the mbuf sent in the tx_q FIFO.
-
-The DPDK TX thread dequeues the mbuf and sends it to the PMD via ``rte_eth_tx_burst()``.
-It then puts the mbuf back in the cache.
-
-IOVA = VA: Support
-------------------
-
-KNI operates in IOVA_VA scheme when
-
-- LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0) and
-- EAL option `iova-mode=va` is passed or bus IOVA scheme in the DPDK is selected
-  as RTE_IOVA_VA.
-
-Due to IOVA to KVA address translations, based on the KNI use case there
-can be a performance impact. For mitigation, forcing IOVA to PA via EAL
-"--iova-mode=pa" option can be used, IOVA_DC bus iommu scheme can also
-result in IOVA as PA.
-
-Ethtool
--------
-
-Ethtool is a Linux-specific tool with corresponding support in the kernel.
-The current version of kni provides minimal ethtool functionality
-including querying version and link state. It does not support link
-control, statistics, or dumping device registers.
diff --git a/doc/guides/prog_guide/packet_framework.rst b/doc/guides/prog_guide/packet_framework.rst
index 3d4e3b66cc5c..ebc69d8c3e75 100644
--- a/doc/guides/prog_guide/packet_framework.rst
+++ b/doc/guides/prog_guide/packet_framework.rst
@@ -87,18 +87,15 @@ Port Types
    |   |                  | management and hierarchical scheduling according to pre-defined SLAs.                 |
    |   |                  |                                                                                       |
    +---+------------------+---------------------------------------------------------------------------------------+
-   | 6 | KNI              | Send/receive packets to/from Linux kernel space.                                      |
-   |   |                  |                                                                                       |
-   +---+------------------+---------------------------------------------------------------------------------------+
-   | 7 | Source           | Input port used as packet generator. Similar to Linux kernel /dev/zero character      |
+   | 6 | Source           | Input port used as packet generator. Similar to Linux kernel /dev/zero character      |
    |   |                  | device.                                                                               |
    |   |                  |                                                                                       |
    +---+------------------+---------------------------------------------------------------------------------------+
-   | 8 | Sink             | Output port used to drop all input packets. Similar to Linux kernel /dev/null         |
+   | 7 | Sink             | Output port used to drop all input packets. Similar to Linux kernel /dev/null         |
    |   |                  | character device.                                                                     |
    |   |                  |                                                                                       |
    +---+------------------+---------------------------------------------------------------------------------------+
-   | 9 | Sym_crypto       | Output port used to extract DPDK Cryptodev operations from a fixed offset of the      |
+   | 8 | Sym_crypto       | Output port used to extract DPDK Cryptodev operations from a fixed offset of the      |
    |   |                  | packet and then enqueue to the Cryptodev PMD. Input port used to dequeue the          |
    |   |                  | Cryptodev operations from the Cryptodev PMD and then retrieve the packets from them.  |
    +---+------------------+---------------------------------------------------------------------------------------+
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 494b401cda4b..fa619514fd64 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -35,7 +35,7 @@ Deprecation Notices
     which also added support for standard atomics
     (Ref: https://releases.llvm.org/3.6.0/tools/clang/docs/ReleaseNotes.html)
 
-* build: Enabling deprecated libraries (``flow_classify``, ``kni``)
+* build: Enabling deprecated libraries (``flow_classify``)
   won't be possible anymore through the use of the ``disable_libs`` build option.
   A new build option for deprecated libraries will be introduced instead.
 
@@ -78,13 +78,6 @@ Deprecation Notices
   ``__atomic_thread_fence`` must be used for patches that need to be merged in
   20.08 onwards. This change will not introduce any performance degradation.
 
-* kni: The KNI kernel module and library are not recommended for use by new
-  applications - other technologies such as virtio-user are recommended instead.
-  Following the DPDK technical board
-  `decision <https://mails.dpdk.org/archives/dev/2021-January/197077.html>`_
-  and `refinement <https://mails.dpdk.org/archives/dev/2022-June/243596.html>`_,
-  the KNI kernel module, library and PMD will be removed from the DPDK 23.11 release.
-
 * lib: will fix extending some enum/define breaking the ABI. There are multiple
   samples in DPDK that enum/define terminated with a ``.*MAX.*`` value which is
   used by iterators, and arrays holding these values are sized with this
diff --git a/doc/guides/rel_notes/index.rst b/doc/guides/rel_notes/index.rst
index d8dfa621ecf2..d07281527991 100644
--- a/doc/guides/rel_notes/index.rst
+++ b/doc/guides/rel_notes/index.rst
@@ -8,6 +8,7 @@ Release Notes
     :maxdepth: 1
     :numbered:
 
+    release_23_11
     release_23_07
     release_23_03
     release_22_11
diff --git a/doc/guides/rel_notes/release_23_11.rst b/doc/guides/rel_notes/release_23_11.rst
new file mode 100644
index 000000000000..e2158934751f
--- /dev/null
+++ b/doc/guides/rel_notes/release_23_11.rst
@@ -0,0 +1,16 @@
+.. SPDX-License-Identifier: BSD-3-Clause
+   Copyright 2022 The DPDK contributors
+
+.. include:: <isonum.txt>
+
+DPDK Release 23.11
+==================
+
+New Features
+------------
+
+
+Removed Items
+-------------
+
+* kni: Remove deprecated Kernel Network Interface driver, libraries and examples
diff --git a/doc/guides/sample_app_ug/ip_pipeline.rst b/doc/guides/sample_app_ug/ip_pipeline.rst
index b521d3b8be20..f30ac5e19db7 100644
--- a/doc/guides/sample_app_ug/ip_pipeline.rst
+++ b/doc/guides/sample_app_ug/ip_pipeline.rst
@@ -164,15 +164,6 @@ Examples
    |                       |                      |                | 8. Pipeline table rule add default |
    |                       |                      |                | 9. Pipeline table rule add         |
    +-----------------------+----------------------+----------------+------------------------------------+
-   | KNI                   | Stub                 | Forward        | 1. Mempool create                  |
-   |                       |                      |                | 2. Link create                     |
-   |                       |                      |                | 3. Pipeline create                 |
-   |                       |                      |                | 4. Pipeline port in/out            |
-   |                       |                      |                | 5. Pipeline table                  |
-   |                       |                      |                | 6. Pipeline port in table          |
-   |                       |                      |                | 7. Pipeline enable                 |
-   |                       |                      |                | 8. Pipeline table rule add         |
-   +-----------------------+----------------------+----------------+------------------------------------+
    | Firewall              | ACL                  | Allow/Drop     | 1. Mempool create                  |
    |                       |                      |                | 2. Link create                     |
    |                       | * Key = n-tuple      |                | 3. Pipeline create                 |
@@ -297,17 +288,6 @@ Tap
   tap <name>
 
 
-Kni
-~~~
-
-  Create kni port ::
-
-   kni <kni_name>
-    link <link_name>
-    mempool <mempool_name>
-    [thread <thread_id>]
-
-
 Cryptodev
 ~~~~~~~~~
 
@@ -366,7 +346,6 @@ Create pipeline input port ::
    | swq <swq_name>
    | tmgr <tmgr_name>
    | tap <tap_name> mempool <mempool_name> mtu <mtu>
-   | kni <kni_name>
    | source mempool <mempool_name> file <file_name> bpp <n_bytes_per_pkt>
    [action <port_in_action_profile_name>]
    [disabled]
@@ -379,7 +358,6 @@ Create pipeline output port ::
    | swq <swq_name>
    | tmgr <tmgr_name>
    | tap <tap_name>
-   | kni <kni_name>
    | sink [file <file_name> pkts <max_n_pkts>]
 
 Create pipeline table ::
diff --git a/drivers/net/cnxk/cnxk_ethdev.c b/drivers/net/cnxk/cnxk_ethdev.c
index 4b98faa72980..01b707b6c4ac 100644
--- a/drivers/net/cnxk/cnxk_ethdev.c
+++ b/drivers/net/cnxk/cnxk_ethdev.c
@@ -1130,7 +1130,7 @@ nix_set_nop_rxtx_function(struct rte_eth_dev *eth_dev)
 {
 	/* These dummy functions are required for supporting
 	 * some applications which reconfigure queues without
-	 * stopping tx burst and rx burst threads(eg kni app)
+	 * stopping tx burst and rx burst threads.
 	 * When the queues context is saved, txq/rxqs are released
 	 * which caused app crash since rx/tx burst is still
 	 * on different lcores
diff --git a/drivers/net/kni/meson.build b/drivers/net/kni/meson.build
deleted file mode 100644
index 2acc98969426..000000000000
--- a/drivers/net/kni/meson.build
+++ /dev/null
@@ -1,11 +0,0 @@
-# SPDX-License-Identifier: BSD-3-Clause
-# Copyright(c) 2018 Intel Corporation
-
-if is_windows
-    build = false
-    reason = 'not supported on Windows'
-    subdir_done()
-endif
-
-deps += 'kni'
-sources = files('rte_eth_kni.c')
diff --git a/drivers/net/kni/rte_eth_kni.c b/drivers/net/kni/rte_eth_kni.c
deleted file mode 100644
index c0e1f8db409e..000000000000
--- a/drivers/net/kni/rte_eth_kni.c
+++ /dev/null
@@ -1,524 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2017 Intel Corporation
- */
-
-#include <fcntl.h>
-#include <pthread.h>
-#include <unistd.h>
-
-#include <rte_string_fns.h>
-#include <ethdev_driver.h>
-#include <ethdev_vdev.h>
-#include <rte_kni.h>
-#include <rte_kvargs.h>
-#include <rte_malloc.h>
-#include <bus_vdev_driver.h>
-
-/* Only single queue supported */
-#define KNI_MAX_QUEUE_PER_PORT 1
-
-#define MAX_KNI_PORTS 8
-
-#define KNI_ETHER_MTU(mbuf_size)       \
-	((mbuf_size) - RTE_ETHER_HDR_LEN) /**< Ethernet MTU. */
-
-#define ETH_KNI_NO_REQUEST_THREAD_ARG	"no_request_thread"
-static const char * const valid_arguments[] = {
-	ETH_KNI_NO_REQUEST_THREAD_ARG,
-	NULL
-};
-
-struct eth_kni_args {
-	int no_request_thread;
-};
-
-struct pmd_queue_stats {
-	uint64_t pkts;
-	uint64_t bytes;
-};
-
-struct pmd_queue {
-	struct pmd_internals *internals;
-	struct rte_mempool *mb_pool;
-
-	struct pmd_queue_stats rx;
-	struct pmd_queue_stats tx;
-};
-
-struct pmd_internals {
-	struct rte_kni *kni;
-	uint16_t port_id;
-	int is_kni_started;
-
-	pthread_t thread;
-	int stop_thread;
-	int no_request_thread;
-
-	struct rte_ether_addr eth_addr;
-
-	struct pmd_queue rx_queues[KNI_MAX_QUEUE_PER_PORT];
-	struct pmd_queue tx_queues[KNI_MAX_QUEUE_PER_PORT];
-};
-
-static const struct rte_eth_link pmd_link = {
-		.link_speed = RTE_ETH_SPEED_NUM_10G,
-		.link_duplex = RTE_ETH_LINK_FULL_DUPLEX,
-		.link_status = RTE_ETH_LINK_DOWN,
-		.link_autoneg = RTE_ETH_LINK_FIXED,
-};
-static int is_kni_initialized;
-
-RTE_LOG_REGISTER_DEFAULT(eth_kni_logtype, NOTICE);
-
-#define PMD_LOG(level, fmt, args...) \
-	rte_log(RTE_LOG_ ## level, eth_kni_logtype, \
-		"%s(): " fmt "\n", __func__, ##args)
-static uint16_t
-eth_kni_rx(void *q, struct rte_mbuf **bufs, uint16_t nb_bufs)
-{
-	struct pmd_queue *kni_q = q;
-	struct rte_kni *kni = kni_q->internals->kni;
-	uint16_t nb_pkts;
-	int i;
-
-	nb_pkts = rte_kni_rx_burst(kni, bufs, nb_bufs);
-	for (i = 0; i < nb_pkts; i++)
-		bufs[i]->port = kni_q->internals->port_id;
-
-	kni_q->rx.pkts += nb_pkts;
-
-	return nb_pkts;
-}
-
-static uint16_t
-eth_kni_tx(void *q, struct rte_mbuf **bufs, uint16_t nb_bufs)
-{
-	struct pmd_queue *kni_q = q;
-	struct rte_kni *kni = kni_q->internals->kni;
-	uint16_t nb_pkts;
-
-	nb_pkts =  rte_kni_tx_burst(kni, bufs, nb_bufs);
-
-	kni_q->tx.pkts += nb_pkts;
-
-	return nb_pkts;
-}
-
-static void *
-kni_handle_request(void *param)
-{
-	struct pmd_internals *internals = param;
-#define MS 1000
-
-	while (!internals->stop_thread) {
-		rte_kni_handle_request(internals->kni);
-		usleep(500 * MS);
-	}
-
-	return param;
-}
-
-static int
-eth_kni_start(struct rte_eth_dev *dev)
-{
-	struct pmd_internals *internals = dev->data->dev_private;
-	uint16_t port_id = dev->data->port_id;
-	struct rte_mempool *mb_pool;
-	struct rte_kni_conf conf = {{0}};
-	const char *name = dev->device->name + 4; /* remove net_ */
-
-	mb_pool = internals->rx_queues[0].mb_pool;
-	strlcpy(conf.name, name, RTE_KNI_NAMESIZE);
-	conf.force_bind = 0;
-	conf.group_id = port_id;
-	conf.mbuf_size =
-		rte_pktmbuf_data_room_size(mb_pool) - RTE_PKTMBUF_HEADROOM;
-	conf.mtu = KNI_ETHER_MTU(conf.mbuf_size);
-
-	internals->kni = rte_kni_alloc(mb_pool, &conf, NULL);
-	if (internals->kni == NULL) {
-		PMD_LOG(ERR,
-			"Fail to create kni interface for port: %d",
-			port_id);
-		return -1;
-	}
-
-	return 0;
-}
-
-static int
-eth_kni_dev_start(struct rte_eth_dev *dev)
-{
-	struct pmd_internals *internals = dev->data->dev_private;
-	int ret;
-
-	if (internals->is_kni_started == 0) {
-		ret = eth_kni_start(dev);
-		if (ret)
-			return -1;
-		internals->is_kni_started = 1;
-	}
-
-	if (internals->no_request_thread == 0) {
-		internals->stop_thread = 0;
-
-		ret = rte_ctrl_thread_create(&internals->thread,
-			"kni_handle_req", NULL,
-			kni_handle_request, internals);
-		if (ret) {
-			PMD_LOG(ERR,
-				"Fail to create kni request thread");
-			return -1;
-		}
-	}
-
-	dev->data->dev_link.link_status = 1;
-
-	return 0;
-}
-
-static int
-eth_kni_dev_stop(struct rte_eth_dev *dev)
-{
-	struct pmd_internals *internals = dev->data->dev_private;
-	int ret;
-
-	if (internals->no_request_thread == 0 && internals->stop_thread == 0) {
-		internals->stop_thread = 1;
-
-		ret = pthread_cancel(internals->thread);
-		if (ret)
-			PMD_LOG(ERR, "Can't cancel the thread");
-
-		ret = pthread_join(internals->thread, NULL);
-		if (ret)
-			PMD_LOG(ERR, "Can't join the thread");
-	}
-
-	dev->data->dev_link.link_status = 0;
-	dev->data->dev_started = 0;
-
-	return 0;
-}
-
-static int
-eth_kni_close(struct rte_eth_dev *eth_dev)
-{
-	struct pmd_internals *internals;
-	int ret;
-
-	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
-		return 0;
-
-	ret = eth_kni_dev_stop(eth_dev);
-	if (ret)
-		PMD_LOG(WARNING, "Not able to stop kni for %s",
-			eth_dev->data->name);
-
-	/* mac_addrs must not be freed alone because part of dev_private */
-	eth_dev->data->mac_addrs = NULL;
-
-	internals = eth_dev->data->dev_private;
-	ret = rte_kni_release(internals->kni);
-	if (ret)
-		PMD_LOG(WARNING, "Not able to release kni for %s",
-			eth_dev->data->name);
-
-	return ret;
-}
-
-static int
-eth_kni_dev_configure(struct rte_eth_dev *dev __rte_unused)
-{
-	return 0;
-}
-
-static int
-eth_kni_dev_info(struct rte_eth_dev *dev __rte_unused,
-		struct rte_eth_dev_info *dev_info)
-{
-	dev_info->max_mac_addrs = 1;
-	dev_info->max_rx_pktlen = UINT32_MAX;
-	dev_info->max_rx_queues = KNI_MAX_QUEUE_PER_PORT;
-	dev_info->max_tx_queues = KNI_MAX_QUEUE_PER_PORT;
-	dev_info->min_rx_bufsize = 0;
-
-	return 0;
-}
-
-static int
-eth_kni_rx_queue_setup(struct rte_eth_dev *dev,
-		uint16_t rx_queue_id,
-		uint16_t nb_rx_desc __rte_unused,
-		unsigned int socket_id __rte_unused,
-		const struct rte_eth_rxconf *rx_conf __rte_unused,
-		struct rte_mempool *mb_pool)
-{
-	struct pmd_internals *internals = dev->data->dev_private;
-	struct pmd_queue *q;
-
-	q = &internals->rx_queues[rx_queue_id];
-	q->internals = internals;
-	q->mb_pool = mb_pool;
-
-	dev->data->rx_queues[rx_queue_id] = q;
-
-	return 0;
-}
-
-static int
-eth_kni_tx_queue_setup(struct rte_eth_dev *dev,
-		uint16_t tx_queue_id,
-		uint16_t nb_tx_desc __rte_unused,
-		unsigned int socket_id __rte_unused,
-		const struct rte_eth_txconf *tx_conf __rte_unused)
-{
-	struct pmd_internals *internals = dev->data->dev_private;
-	struct pmd_queue *q;
-
-	q = &internals->tx_queues[tx_queue_id];
-	q->internals = internals;
-
-	dev->data->tx_queues[tx_queue_id] = q;
-
-	return 0;
-}
-
-static int
-eth_kni_link_update(struct rte_eth_dev *dev __rte_unused,
-		int wait_to_complete __rte_unused)
-{
-	return 0;
-}
-
-static int
-eth_kni_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
-{
-	unsigned long rx_packets_total = 0, rx_bytes_total = 0;
-	unsigned long tx_packets_total = 0, tx_bytes_total = 0;
-	struct rte_eth_dev_data *data = dev->data;
-	unsigned int i, num_stats;
-	struct pmd_queue *q;
-
-	num_stats = RTE_MIN((unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS,
-			data->nb_rx_queues);
-	for (i = 0; i < num_stats; i++) {
-		q = data->rx_queues[i];
-		stats->q_ipackets[i] = q->rx.pkts;
-		stats->q_ibytes[i] = q->rx.bytes;
-		rx_packets_total += stats->q_ipackets[i];
-		rx_bytes_total += stats->q_ibytes[i];
-	}
-
-	num_stats = RTE_MIN((unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS,
-			data->nb_tx_queues);
-	for (i = 0; i < num_stats; i++) {
-		q = data->tx_queues[i];
-		stats->q_opackets[i] = q->tx.pkts;
-		stats->q_obytes[i] = q->tx.bytes;
-		tx_packets_total += stats->q_opackets[i];
-		tx_bytes_total += stats->q_obytes[i];
-	}
-
-	stats->ipackets = rx_packets_total;
-	stats->ibytes = rx_bytes_total;
-	stats->opackets = tx_packets_total;
-	stats->obytes = tx_bytes_total;
-
-	return 0;
-}
-
-static int
-eth_kni_stats_reset(struct rte_eth_dev *dev)
-{
-	struct rte_eth_dev_data *data = dev->data;
-	struct pmd_queue *q;
-	unsigned int i;
-
-	for (i = 0; i < data->nb_rx_queues; i++) {
-		q = data->rx_queues[i];
-		q->rx.pkts = 0;
-		q->rx.bytes = 0;
-	}
-	for (i = 0; i < data->nb_tx_queues; i++) {
-		q = data->tx_queues[i];
-		q->tx.pkts = 0;
-		q->tx.bytes = 0;
-	}
-
-	return 0;
-}
-
-static const struct eth_dev_ops eth_kni_ops = {
-	.dev_start = eth_kni_dev_start,
-	.dev_stop = eth_kni_dev_stop,
-	.dev_close = eth_kni_close,
-	.dev_configure = eth_kni_dev_configure,
-	.dev_infos_get = eth_kni_dev_info,
-	.rx_queue_setup = eth_kni_rx_queue_setup,
-	.tx_queue_setup = eth_kni_tx_queue_setup,
-	.link_update = eth_kni_link_update,
-	.stats_get = eth_kni_stats_get,
-	.stats_reset = eth_kni_stats_reset,
-};
-
-static struct rte_eth_dev *
-eth_kni_create(struct rte_vdev_device *vdev,
-		struct eth_kni_args *args,
-		unsigned int numa_node)
-{
-	struct pmd_internals *internals;
-	struct rte_eth_dev_data *data;
-	struct rte_eth_dev *eth_dev;
-
-	PMD_LOG(INFO, "Creating kni ethdev on numa socket %u",
-			numa_node);
-
-	/* reserve an ethdev entry */
-	eth_dev = rte_eth_vdev_allocate(vdev, sizeof(*internals));
-	if (!eth_dev)
-		return NULL;
-
-	internals = eth_dev->data->dev_private;
-	internals->port_id = eth_dev->data->port_id;
-	data = eth_dev->data;
-	data->nb_rx_queues = 1;
-	data->nb_tx_queues = 1;
-	data->dev_link = pmd_link;
-	data->mac_addrs = &internals->eth_addr;
-	data->promiscuous = 1;
-	data->all_multicast = 1;
-	data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
-
-	rte_eth_random_addr(internals->eth_addr.addr_bytes);
-
-	eth_dev->dev_ops = &eth_kni_ops;
-
-	internals->no_request_thread = args->no_request_thread;
-
-	return eth_dev;
-}
-
-static int
-kni_init(void)
-{
-	int ret;
-
-	if (is_kni_initialized == 0) {
-		ret = rte_kni_init(MAX_KNI_PORTS);
-		if (ret < 0)
-			return ret;
-	}
-
-	is_kni_initialized++;
-
-	return 0;
-}
-
-static int
-eth_kni_kvargs_process(struct eth_kni_args *args, const char *params)
-{
-	struct rte_kvargs *kvlist;
-
-	kvlist = rte_kvargs_parse(params, valid_arguments);
-	if (kvlist == NULL)
-		return -1;
-
-	memset(args, 0, sizeof(struct eth_kni_args));
-
-	if (rte_kvargs_count(kvlist, ETH_KNI_NO_REQUEST_THREAD_ARG) == 1)
-		args->no_request_thread = 1;
-
-	rte_kvargs_free(kvlist);
-
-	return 0;
-}
-
-static int
-eth_kni_probe(struct rte_vdev_device *vdev)
-{
-	struct rte_eth_dev *eth_dev;
-	struct eth_kni_args args;
-	const char *name;
-	const char *params;
-	int ret;
-
-	name = rte_vdev_device_name(vdev);
-	params = rte_vdev_device_args(vdev);
-	PMD_LOG(INFO, "Initializing eth_kni for %s", name);
-
-	if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
-		eth_dev = rte_eth_dev_attach_secondary(name);
-		if (!eth_dev) {
-			PMD_LOG(ERR, "Failed to probe %s", name);
-			return -1;
-		}
-		/* TODO: request info from primary to set up Rx and Tx */
-		eth_dev->dev_ops = &eth_kni_ops;
-		eth_dev->device = &vdev->device;
-		rte_eth_dev_probing_finish(eth_dev);
-		return 0;
-	}
-
-	ret = eth_kni_kvargs_process(&args, params);
-	if (ret < 0)
-		return ret;
-
-	ret = kni_init();
-	if (ret < 0)
-		return ret;
-
-	eth_dev = eth_kni_create(vdev, &args, rte_socket_id());
-	if (eth_dev == NULL)
-		goto kni_uninit;
-
-	eth_dev->rx_pkt_burst = eth_kni_rx;
-	eth_dev->tx_pkt_burst = eth_kni_tx;
-
-	rte_eth_dev_probing_finish(eth_dev);
-	return 0;
-
-kni_uninit:
-	is_kni_initialized--;
-	if (is_kni_initialized == 0)
-		rte_kni_close();
-	return -1;
-}
-
-static int
-eth_kni_remove(struct rte_vdev_device *vdev)
-{
-	struct rte_eth_dev *eth_dev;
-	const char *name;
-	int ret;
-
-	name = rte_vdev_device_name(vdev);
-	PMD_LOG(INFO, "Un-Initializing eth_kni for %s", name);
-
-	/* find the ethdev entry */
-	eth_dev = rte_eth_dev_allocated(name);
-	if (eth_dev != NULL) {
-		if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
-			ret = eth_kni_dev_stop(eth_dev);
-			if (ret != 0)
-				return ret;
-			return rte_eth_dev_release_port(eth_dev);
-		}
-		eth_kni_close(eth_dev);
-		rte_eth_dev_release_port(eth_dev);
-	}
-
-	is_kni_initialized--;
-	if (is_kni_initialized == 0)
-		rte_kni_close();
-
-	return 0;
-}
-
-static struct rte_vdev_driver eth_kni_drv = {
-	.probe = eth_kni_probe,
-	.remove = eth_kni_remove,
-};
-
-RTE_PMD_REGISTER_VDEV(net_kni, eth_kni_drv);
-RTE_PMD_REGISTER_PARAM_STRING(net_kni, ETH_KNI_NO_REQUEST_THREAD_ARG "=<int>");
diff --git a/drivers/net/meson.build b/drivers/net/meson.build
index f68bbc27a784..bd38b533c573 100644
--- a/drivers/net/meson.build
+++ b/drivers/net/meson.build
@@ -35,7 +35,6 @@ drivers = [
         'ionic',
         'ipn3ke',
         'ixgbe',
-        'kni',
         'mana',
         'memif',
         'mlx4',
diff --git a/examples/ip_pipeline/Makefile b/examples/ip_pipeline/Makefile
index 785c7ee38ce5..bc5e0a9f1800 100644
--- a/examples/ip_pipeline/Makefile
+++ b/examples/ip_pipeline/Makefile
@@ -8,7 +8,6 @@ APP = ip_pipeline
 SRCS-y := action.c
 SRCS-y += cli.c
 SRCS-y += conn.c
-SRCS-y += kni.c
 SRCS-y += link.c
 SRCS-y += main.c
 SRCS-y += mempool.c
diff --git a/examples/ip_pipeline/cli.c b/examples/ip_pipeline/cli.c
index c918f30e06f3..e8269ea90c11 100644
--- a/examples/ip_pipeline/cli.c
+++ b/examples/ip_pipeline/cli.c
@@ -14,7 +14,6 @@
 #include "cli.h"
 
 #include "cryptodev.h"
-#include "kni.h"
 #include "link.h"
 #include "mempool.h"
 #include "parser.h"
@@ -728,65 +727,6 @@ cmd_tap(char **tokens,
 	}
 }
 
-static const char cmd_kni_help[] =
-"kni <kni_name>\n"
-"   link <link_name>\n"
-"   mempool <mempool_name>\n"
-"   [thread <thread_id>]\n";
-
-static void
-cmd_kni(char **tokens,
-	uint32_t n_tokens,
-	char *out,
-	size_t out_size)
-{
-	struct kni_params p;
-	char *name;
-	struct kni *kni;
-
-	memset(&p, 0, sizeof(p));
-	if ((n_tokens != 6) && (n_tokens != 8)) {
-		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
-		return;
-	}
-
-	name = tokens[1];
-
-	if (strcmp(tokens[2], "link") != 0) {
-		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "link");
-		return;
-	}
-
-	p.link_name = tokens[3];
-
-	if (strcmp(tokens[4], "mempool") != 0) {
-		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "mempool");
-		return;
-	}
-
-	p.mempool_name = tokens[5];
-
-	if (n_tokens == 8) {
-		if (strcmp(tokens[6], "thread") != 0) {
-			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "thread");
-			return;
-		}
-
-		if (parser_read_uint32(&p.thread_id, tokens[7]) != 0) {
-			snprintf(out, out_size, MSG_ARG_INVALID, "thread_id");
-			return;
-		}
-
-		p.force_bind = 1;
-	} else
-		p.force_bind = 0;
-
-	kni = kni_create(name, &p);
-	if (kni == NULL) {
-		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
-		return;
-	}
-}
 
 static const char cmd_cryptodev_help[] =
 "cryptodev <cryptodev_name>\n"
@@ -1541,7 +1481,6 @@ static const char cmd_pipeline_port_in_help[] =
 "   | swq <swq_name>\n"
 "   | tmgr <tmgr_name>\n"
 "   | tap <tap_name> mempool <mempool_name> mtu <mtu>\n"
-"   | kni <kni_name>\n"
 "   | source mempool <mempool_name> file <file_name> bpp <n_bytes_per_pkt>\n"
 "   | cryptodev <cryptodev_name> rxq <queue_id>\n"
 "   [action <port_in_action_profile_name>]\n"
@@ -1664,18 +1603,6 @@ cmd_pipeline_port_in(char **tokens,
 		}
 
 		t0 += 6;
-	} else if (strcmp(tokens[t0], "kni") == 0) {
-		if (n_tokens < t0 + 2) {
-			snprintf(out, out_size, MSG_ARG_MISMATCH,
-				"pipeline port in kni");
-			return;
-		}
-
-		p.type = PORT_IN_KNI;
-
-		p.dev_name = tokens[t0 + 1];
-
-		t0 += 2;
 	} else if (strcmp(tokens[t0], "source") == 0) {
 		if (n_tokens < t0 + 6) {
 			snprintf(out, out_size, MSG_ARG_MISMATCH,
@@ -1781,7 +1708,6 @@ static const char cmd_pipeline_port_out_help[] =
 "   | swq <swq_name>\n"
 "   | tmgr <tmgr_name>\n"
 "   | tap <tap_name>\n"
-"   | kni <kni_name>\n"
 "   | sink [file <file_name> pkts <max_n_pkts>]\n"
 "   | cryptodev <cryptodev_name> txq <txq_id> offset <crypto_op_offset>\n";
 
@@ -1873,16 +1799,6 @@ cmd_pipeline_port_out(char **tokens,
 
 		p.type = PORT_OUT_TAP;
 
-		p.dev_name = tokens[7];
-	} else if (strcmp(tokens[6], "kni") == 0) {
-		if (n_tokens != 8) {
-			snprintf(out, out_size, MSG_ARG_MISMATCH,
-				"pipeline port out kni");
-			return;
-		}
-
-		p.type = PORT_OUT_KNI;
-
 		p.dev_name = tokens[7];
 	} else if (strcmp(tokens[6], "sink") == 0) {
 		if ((n_tokens != 7) && (n_tokens != 11)) {
@@ -6038,7 +5954,6 @@ cmd_help(char **tokens, uint32_t n_tokens, char *out, size_t out_size)
 			"\ttmgr subport\n"
 			"\ttmgr subport pipe\n"
 			"\ttap\n"
-			"\tkni\n"
 			"\tport in action profile\n"
 			"\ttable action profile\n"
 			"\tpipeline\n"
@@ -6124,11 +6039,6 @@ cmd_help(char **tokens, uint32_t n_tokens, char *out, size_t out_size)
 		return;
 	}
 
-	if (strcmp(tokens[0], "kni") == 0) {
-		snprintf(out, out_size, "\n%s\n", cmd_kni_help);
-		return;
-	}
-
 	if (strcmp(tokens[0], "cryptodev") == 0) {
 		snprintf(out, out_size, "\n%s\n", cmd_cryptodev_help);
 		return;
@@ -6436,11 +6346,6 @@ cli_process(char *in, char *out, size_t out_size)
 		return;
 	}
 
-	if (strcmp(tokens[0], "kni") == 0) {
-		cmd_kni(tokens, n_tokens, out, out_size);
-		return;
-	}
-
 	if (strcmp(tokens[0], "cryptodev") == 0) {
 		cmd_cryptodev(tokens, n_tokens, out, out_size);
 		return;
diff --git a/examples/ip_pipeline/examples/kni.cli b/examples/ip_pipeline/examples/kni.cli
deleted file mode 100644
index 143834093d4d..000000000000
--- a/examples/ip_pipeline/examples/kni.cli
+++ /dev/null
@@ -1,69 +0,0 @@
-; SPDX-License-Identifier: BSD-3-Clause
-; Copyright(c) 2010-2018 Intel Corporation
-
-;                 _______________          ______________________
-;                |               |  KNI0  |                      |
-; LINK0 RXQ0 --->|...............|------->|--+                   |
-;                |               |  KNI1  |  | br0               |
-; LINK1 TXQ0 <---|...............|<-------|<-+                   |
-;                |               |        |     Linux Kernel     |
-;                |   PIPELINE0   |        |     Network Stack    |
-;                |               |  KNI1  |                      |
-; LINK1 RXQ0 --->|...............|------->|--+                   |
-;                |               |  KNI0  |  | br0               |
-; LINK0 TXQ0 <---|...............|<-------|<-+                   |
-;                |_______________|        |______________________|
-;
-; Insert Linux kernel KNI module:
-;    [Linux]$ insmod rte_kni.ko
-;
-; Configure Linux kernel bridge between KNI0 and KNI1 interfaces:
-;    [Linux]$ brctl addbr br0
-;    [Linux]$ brctl addif br0 KNI0
-;    [Linux]$ brctl addif br0 KNI1
-;    [Linux]$ ifconfig br0 up
-;    [Linux]$ ifconfig KNI0 up
-;    [Linux]$ ifconfig KNI1 up
-;
-; Monitor packet forwarding performed by Linux kernel between KNI0 and KNI1:
-;    [Linux]$ tcpdump -i KNI0
-;    [Linux]$ tcpdump -i KNI1
-
-mempool MEMPOOL0 buffer 2304 pool 32K cache 256 cpu 0
-
-link LINK0 dev 0000:02:00.0 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-link LINK1 dev 0000:02:00.1 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-
-kni KNI0 link LINK0 mempool MEMPOOL0
-kni KNI1 link LINK1 mempool MEMPOOL0
-
-table action profile AP0 ipv4 offset 270 fwd
-
-pipeline PIPELINE0 period 10 offset_port_id 0 cpu 0
-
-pipeline PIPELINE0 port in bsz 32 link LINK0 rxq 0
-pipeline PIPELINE0 port in bsz 32 kni KNI1
-pipeline PIPELINE0 port in bsz 32 link LINK1 rxq 0
-pipeline PIPELINE0 port in bsz 32 kni KNI0
-
-pipeline PIPELINE0 port out bsz 32 kni KNI0
-pipeline PIPELINE0 port out bsz 32 link LINK1 txq 0
-pipeline PIPELINE0 port out bsz 32 kni KNI1
-pipeline PIPELINE0 port out bsz 32 link LINK0 txq 0
-
-pipeline PIPELINE0 table match stub action AP0
-pipeline PIPELINE0 table match stub action AP0
-pipeline PIPELINE0 table match stub action AP0
-pipeline PIPELINE0 table match stub action AP0
-
-pipeline PIPELINE0 port in 0 table 0
-pipeline PIPELINE0 port in 1 table 1
-pipeline PIPELINE0 port in 2 table 2
-pipeline PIPELINE0 port in 3 table 3
-
-thread 1 pipeline PIPELINE0 enable
-
-pipeline PIPELINE0 table 0 rule add match default action fwd port 0
-pipeline PIPELINE0 table 1 rule add match default action fwd port 1
-pipeline PIPELINE0 table 2 rule add match default action fwd port 2
-pipeline PIPELINE0 table 3 rule add match default action fwd port 3
diff --git a/examples/ip_pipeline/kni.c b/examples/ip_pipeline/kni.c
deleted file mode 100644
index cd02c3947827..000000000000
--- a/examples/ip_pipeline/kni.c
+++ /dev/null
@@ -1,168 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <rte_ethdev.h>
-#include <rte_string_fns.h>
-
-#include "kni.h"
-#include "mempool.h"
-#include "link.h"
-
-static struct kni_list kni_list;
-
-#ifndef KNI_MAX
-#define KNI_MAX                                            16
-#endif
-
-int
-kni_init(void)
-{
-	TAILQ_INIT(&kni_list);
-
-#ifdef RTE_LIB_KNI
-	rte_kni_init(KNI_MAX);
-#endif
-
-	return 0;
-}
-
-struct kni *
-kni_find(const char *name)
-{
-	struct kni *kni;
-
-	if (name == NULL)
-		return NULL;
-
-	TAILQ_FOREACH(kni, &kni_list, node)
-		if (strcmp(kni->name, name) == 0)
-			return kni;
-
-	return NULL;
-}
-
-#ifndef RTE_LIB_KNI
-
-struct kni *
-kni_create(const char *name __rte_unused,
-	struct kni_params *params __rte_unused)
-{
-	return NULL;
-}
-
-void
-kni_handle_request(void)
-{
-	return;
-}
-
-#else
-
-static int
-kni_config_network_interface(uint16_t port_id, uint8_t if_up)
-{
-	int ret = 0;
-
-	if (!rte_eth_dev_is_valid_port(port_id))
-		return -EINVAL;
-
-	ret = (if_up) ?
-		rte_eth_dev_set_link_up(port_id) :
-		rte_eth_dev_set_link_down(port_id);
-
-	return ret;
-}
-
-static int
-kni_change_mtu(uint16_t port_id, unsigned int new_mtu)
-{
-	int ret;
-
-	if (!rte_eth_dev_is_valid_port(port_id))
-		return -EINVAL;
-
-	if (new_mtu > RTE_ETHER_MAX_LEN)
-		return -EINVAL;
-
-	/* Set new MTU */
-	ret = rte_eth_dev_set_mtu(port_id, new_mtu);
-	if (ret < 0)
-		return ret;
-
-	return 0;
-}
-
-struct kni *
-kni_create(const char *name, struct kni_params *params)
-{
-	struct rte_eth_dev_info dev_info;
-	struct rte_kni_conf kni_conf;
-	struct rte_kni_ops kni_ops;
-	struct kni *kni;
-	struct mempool *mempool;
-	struct link *link;
-	struct rte_kni *k;
-	int ret;
-
-	/* Check input params */
-	if ((name == NULL) ||
-		kni_find(name) ||
-		(params == NULL))
-		return NULL;
-
-	mempool = mempool_find(params->mempool_name);
-	link = link_find(params->link_name);
-	if ((mempool == NULL) ||
-		(link == NULL))
-		return NULL;
-
-	/* Resource create */
-	ret = rte_eth_dev_info_get(link->port_id, &dev_info);
-	if (ret != 0)
-		return NULL;
-
-	memset(&kni_conf, 0, sizeof(kni_conf));
-	strlcpy(kni_conf.name, name, RTE_KNI_NAMESIZE);
-	kni_conf.force_bind = params->force_bind;
-	kni_conf.core_id = params->thread_id;
-	kni_conf.group_id = link->port_id;
-	kni_conf.mbuf_size = mempool->buffer_size;
-
-	memset(&kni_ops, 0, sizeof(kni_ops));
-	kni_ops.port_id = link->port_id;
-	kni_ops.config_network_if = kni_config_network_interface;
-	kni_ops.change_mtu = kni_change_mtu;
-
-	k = rte_kni_alloc(mempool->m, &kni_conf, &kni_ops);
-	if (k == NULL)
-		return NULL;
-
-	/* Node allocation */
-	kni = calloc(1, sizeof(struct kni));
-	if (kni == NULL)
-		return NULL;
-
-	/* Node fill in */
-	strlcpy(kni->name, name, sizeof(kni->name));
-	kni->k = k;
-
-	/* Node add to list */
-	TAILQ_INSERT_TAIL(&kni_list, kni, node);
-
-	return kni;
-}
-
-void
-kni_handle_request(void)
-{
-	struct kni *kni;
-
-	TAILQ_FOREACH(kni, &kni_list, node)
-		rte_kni_handle_request(kni->k);
-}
-
-#endif
diff --git a/examples/ip_pipeline/kni.h b/examples/ip_pipeline/kni.h
deleted file mode 100644
index 118f48df73d8..000000000000
--- a/examples/ip_pipeline/kni.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#ifndef _INCLUDE_KNI_H_
-#define _INCLUDE_KNI_H_
-
-#include <stdint.h>
-#include <sys/queue.h>
-
-#ifdef RTE_LIB_KNI
-#include <rte_kni.h>
-#endif
-
-#include "common.h"
-
-struct kni {
-	TAILQ_ENTRY(kni) node;
-	char name[NAME_SIZE];
-#ifdef RTE_LIB_KNI
-	struct rte_kni *k;
-#endif
-};
-
-TAILQ_HEAD(kni_list, kni);
-
-int
-kni_init(void);
-
-struct kni *
-kni_find(const char *name);
-
-struct kni_params {
-	const char *link_name;
-	const char *mempool_name;
-	int force_bind;
-	uint32_t thread_id;
-};
-
-struct kni *
-kni_create(const char *name, struct kni_params *params);
-
-void
-kni_handle_request(void);
-
-#endif /* _INCLUDE_KNI_H_ */
diff --git a/examples/ip_pipeline/main.c b/examples/ip_pipeline/main.c
index e35d9bce3984..663f538f024a 100644
--- a/examples/ip_pipeline/main.c
+++ b/examples/ip_pipeline/main.c
@@ -14,7 +14,6 @@
 
 #include "cli.h"
 #include "conn.h"
-#include "kni.h"
 #include "cryptodev.h"
 #include "link.h"
 #include "mempool.h"
@@ -205,13 +204,6 @@ main(int argc, char **argv)
 		return status;
 	}
 
-	/* KNI */
-	status = kni_init();
-	if (status) {
-		printf("Error: KNI initialization failed (%d)\n", status);
-		return status;
-	}
-
 	/* Sym Crypto */
 	status = cryptodev_init();
 	if (status) {
@@ -264,7 +256,5 @@ main(int argc, char **argv)
 		conn_poll_for_conn(conn);
 
 		conn_poll_for_msg(conn);
-
-		kni_handle_request();
 	}
 }
diff --git a/examples/ip_pipeline/meson.build b/examples/ip_pipeline/meson.build
index 57f522c24cf9..68049157e429 100644
--- a/examples/ip_pipeline/meson.build
+++ b/examples/ip_pipeline/meson.build
@@ -18,7 +18,6 @@ sources = files(
         'cli.c',
         'conn.c',
         'cryptodev.c',
-        'kni.c',
         'link.c',
         'main.c',
         'mempool.c',
diff --git a/examples/ip_pipeline/pipeline.c b/examples/ip_pipeline/pipeline.c
index 7ebabcae984d..63352257c6e9 100644
--- a/examples/ip_pipeline/pipeline.c
+++ b/examples/ip_pipeline/pipeline.c
@@ -11,9 +11,6 @@
 
 #include <rte_string_fns.h>
 #include <rte_port_ethdev.h>
-#ifdef RTE_LIB_KNI
-#include <rte_port_kni.h>
-#endif
 #include <rte_port_ring.h>
 #include <rte_port_source_sink.h>
 #include <rte_port_fd.h>
@@ -28,9 +25,6 @@
 #include <rte_table_lpm_ipv6.h>
 #include <rte_table_stub.h>
 
-#ifdef RTE_LIB_KNI
-#include "kni.h"
-#endif
 #include "link.h"
 #include "mempool.h"
 #include "pipeline.h"
@@ -160,9 +154,6 @@ pipeline_port_in_create(const char *pipeline_name,
 		struct rte_port_ring_reader_params ring;
 		struct rte_port_sched_reader_params sched;
 		struct rte_port_fd_reader_params fd;
-#ifdef RTE_LIB_KNI
-		struct rte_port_kni_reader_params kni;
-#endif
 		struct rte_port_source_params source;
 		struct rte_port_sym_crypto_reader_params sym_crypto;
 	} pp;
@@ -264,22 +255,6 @@ pipeline_port_in_create(const char *pipeline_name,
 		break;
 	}
 
-#ifdef RTE_LIB_KNI
-	case PORT_IN_KNI:
-	{
-		struct kni *kni;
-
-		kni = kni_find(params->dev_name);
-		if (kni == NULL)
-			return -1;
-
-		pp.kni.kni = kni->k;
-
-		p.ops = &rte_port_kni_reader_ops;
-		p.arg_create = &pp.kni;
-		break;
-	}
-#endif
 
 	case PORT_IN_SOURCE:
 	{
@@ -404,9 +379,6 @@ pipeline_port_out_create(const char *pipeline_name,
 		struct rte_port_ring_writer_params ring;
 		struct rte_port_sched_writer_params sched;
 		struct rte_port_fd_writer_params fd;
-#ifdef RTE_LIB_KNI
-		struct rte_port_kni_writer_params kni;
-#endif
 		struct rte_port_sink_params sink;
 		struct rte_port_sym_crypto_writer_params sym_crypto;
 	} pp;
@@ -415,9 +387,6 @@ pipeline_port_out_create(const char *pipeline_name,
 		struct rte_port_ethdev_writer_nodrop_params ethdev;
 		struct rte_port_ring_writer_nodrop_params ring;
 		struct rte_port_fd_writer_nodrop_params fd;
-#ifdef RTE_LIB_KNI
-		struct rte_port_kni_writer_nodrop_params kni;
-#endif
 		struct rte_port_sym_crypto_writer_nodrop_params sym_crypto;
 	} pp_nodrop;
 
@@ -537,32 +506,6 @@ pipeline_port_out_create(const char *pipeline_name,
 		break;
 	}
 
-#ifdef RTE_LIB_KNI
-	case PORT_OUT_KNI:
-	{
-		struct kni *kni;
-
-		kni = kni_find(params->dev_name);
-		if (kni == NULL)
-			return -1;
-
-		pp.kni.kni = kni->k;
-		pp.kni.tx_burst_sz = params->burst_size;
-
-		pp_nodrop.kni.kni = kni->k;
-		pp_nodrop.kni.tx_burst_sz = params->burst_size;
-		pp_nodrop.kni.n_retries = params->n_retries;
-
-		if (params->retry == 0) {
-			p.ops = &rte_port_kni_writer_ops;
-			p.arg_create = &pp.kni;
-		} else {
-			p.ops = &rte_port_kni_writer_nodrop_ops;
-			p.arg_create = &pp_nodrop.kni;
-		}
-		break;
-	}
-#endif
 
 	case PORT_OUT_SINK:
 	{
diff --git a/examples/ip_pipeline/pipeline.h b/examples/ip_pipeline/pipeline.h
index 4d2ee29a54c7..083d5e852421 100644
--- a/examples/ip_pipeline/pipeline.h
+++ b/examples/ip_pipeline/pipeline.h
@@ -25,7 +25,6 @@ enum port_in_type {
 	PORT_IN_SWQ,
 	PORT_IN_TMGR,
 	PORT_IN_TAP,
-	PORT_IN_KNI,
 	PORT_IN_SOURCE,
 	PORT_IN_CRYPTODEV,
 };
@@ -67,7 +66,6 @@ enum port_out_type {
 	PORT_OUT_SWQ,
 	PORT_OUT_TMGR,
 	PORT_OUT_TAP,
-	PORT_OUT_KNI,
 	PORT_OUT_SINK,
 	PORT_OUT_CRYPTODEV,
 };
diff --git a/kernel/linux/kni/Kbuild b/kernel/linux/kni/Kbuild
deleted file mode 100644
index e5452d6c00db..000000000000
--- a/kernel/linux/kni/Kbuild
+++ /dev/null
@@ -1,6 +0,0 @@
-# SPDX-License-Identifier: BSD-3-Clause
-# Copyright(c) 2018 Luca Boccassi <bluca@debian.org>
-
-ccflags-y := $(MODULE_CFLAGS)
-obj-m := rte_kni.o
-rte_kni-y := $(patsubst $(src)/%.c,%.o,$(wildcard $(src)/*.c))
diff --git a/kernel/linux/kni/compat.h b/kernel/linux/kni/compat.h
deleted file mode 100644
index 8beb67046577..000000000000
--- a/kernel/linux/kni/compat.h
+++ /dev/null
@@ -1,157 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Minimal wrappers to allow compiling kni on older kernels.
- */
-
-#include <linux/version.h>
-
-#ifndef RHEL_RELEASE_VERSION
-#define RHEL_RELEASE_VERSION(a, b) (((a) << 8) + (b))
-#endif
-
-/* SuSE version macro is the same as Linux kernel version */
-#ifndef SLE_VERSION
-#define SLE_VERSION(a, b, c) KERNEL_VERSION(a, b, c)
-#endif
-#ifdef CONFIG_SUSE_KERNEL
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 57))
-/* SLES12SP3 is at least 4.4.57+ based */
-#define SLE_VERSION_CODE SLE_VERSION(12, 3, 0)
-#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 12, 28))
-/* SLES12 is at least 3.12.28+ based */
-#define SLE_VERSION_CODE SLE_VERSION(12, 0, 0)
-#elif ((LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 61)) && \
-	(LINUX_VERSION_CODE < KERNEL_VERSION(3, 1, 0)))
-/* SLES11 SP3 is at least 3.0.61+ based */
-#define SLE_VERSION_CODE SLE_VERSION(11, 3, 0)
-#elif (LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 32))
-/* SLES11 SP1 is 2.6.32 based */
-#define SLE_VERSION_CODE SLE_VERSION(11, 1, 0)
-#elif (LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 27))
-/* SLES11 GA is 2.6.27 based */
-#define SLE_VERSION_CODE SLE_VERSION(11, 0, 0)
-#endif /* LINUX_VERSION_CODE == KERNEL_VERSION(x,y,z) */
-#endif /* CONFIG_SUSE_KERNEL */
-#ifndef SLE_VERSION_CODE
-#define SLE_VERSION_CODE 0
-#endif /* SLE_VERSION_CODE */
-
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 39) && \
-	(!(defined(RHEL_RELEASE_CODE) && \
-	   RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6, 4)))
-
-#define kstrtoul strict_strtoul
-
-#endif /* < 2.6.39 */
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 33)
-#define HAVE_SIMPLIFIED_PERNET_OPERATIONS
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 35)
-#define sk_sleep(s) ((s)->sk_sleep)
-#else
-#define HAVE_SOCKET_WQ
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0)
-#define HAVE_STATIC_SOCK_MAP_FD
-#else
-#define kni_sock_map_fd(s) sock_map_fd(s, 0)
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
-#define HAVE_CHANGE_CARRIER_CB
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)
-#define ether_addr_copy(dst, src) memcpy(dst, src, ETH_ALEN)
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)
-#define HAVE_IOV_ITER_MSGHDR
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 1, 0)
-#define HAVE_KIOCB_MSG_PARAM
-#define HAVE_REBUILD_HEADER
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
-#define HAVE_SK_ALLOC_KERN_PARAM
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0) || \
-	(defined(RHEL_RELEASE_CODE) && \
-	 RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7, 4)) || \
-	(SLE_VERSION_CODE && SLE_VERSION_CODE == SLE_VERSION(12, 3, 0))
-#define HAVE_TRANS_START_HELPER
-#endif
-
-/*
- * KNI uses NET_NAME_UNKNOWN macro to select correct version of alloc_netdev()
- * For old kernels just backported the commit that enables the macro
- * (685343fc3ba6) but still uses old API, it is required to undefine macro to
- * select correct version of API, this is safe since KNI doesn't use the value.
- * This fix is specific to RedHat/CentOS kernels.
- */
-#if (defined(RHEL_RELEASE_CODE) && \
-	(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6, 8)) && \
-	(LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 34)))
-#undef NET_NAME_UNKNOWN
-#endif
-
-/*
- * RHEL has two different version with different kernel version:
- * 3.10 is for AMD, Intel, IBM POWER7 and POWER8;
- * 4.14 is for ARM and IBM POWER9
- */
-#if (defined(RHEL_RELEASE_CODE) && \
-	(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7, 5)) && \
-	(RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(8, 0)) && \
-	(LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 0)))
-#define ndo_change_mtu ndo_change_mtu_rh74
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0)
-#define HAVE_MAX_MTU_PARAM
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
-#define HAVE_SIGNAL_FUNCTIONS_OWN_HEADER
-#endif
-
-/*
- * iova to kva mapping support can be provided since 4.6.0, but required
- * kernel version increased to >= 4.10.0 because of the updates in
- * get_user_pages_remote() kernel API
- */
-#if KERNEL_VERSION(4, 10, 0) <= LINUX_VERSION_CODE
-#define HAVE_IOVA_TO_KVA_MAPPING_SUPPORT
-#endif
-
-#if KERNEL_VERSION(5, 6, 0) <= LINUX_VERSION_CODE || \
-	(defined(RHEL_RELEASE_CODE) && \
-	 RHEL_RELEASE_VERSION(8, 3) <= RHEL_RELEASE_CODE) || \
-	 (defined(CONFIG_SUSE_KERNEL) && defined(HAVE_ARG_TX_QUEUE))
-#define HAVE_TX_TIMEOUT_TXQUEUE
-#endif
-
-#if KERNEL_VERSION(5, 9, 0) > LINUX_VERSION_CODE
-#define HAVE_TSK_IN_GUP
-#endif
-
-#if KERNEL_VERSION(5, 15, 0) <= LINUX_VERSION_CODE
-#define HAVE_ETH_HW_ADDR_SET
-#endif
-
-#if KERNEL_VERSION(5, 18, 0) > LINUX_VERSION_CODE && \
-	(!(defined(RHEL_RELEASE_CODE) && \
-	 RHEL_RELEASE_VERSION(9, 1) <= RHEL_RELEASE_CODE))
-#define HAVE_NETIF_RX_NI
-#endif
-
-#if KERNEL_VERSION(6, 5, 0) > LINUX_VERSION_CODE
-#define HAVE_VMA_IN_GUP
-#endif
diff --git a/kernel/linux/kni/kni_dev.h b/kernel/linux/kni/kni_dev.h
deleted file mode 100644
index 975379825b2d..000000000000
--- a/kernel/linux/kni/kni_dev.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright(c) 2010-2014 Intel Corporation.
- */
-
-#ifndef _KNI_DEV_H_
-#define _KNI_DEV_H_
-
-#ifdef pr_fmt
-#undef pr_fmt
-#endif
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
-#define KNI_VERSION	"1.0"
-
-#include "compat.h"
-
-#include <linux/if.h>
-#include <linux/wait.h>
-#ifdef HAVE_SIGNAL_FUNCTIONS_OWN_HEADER
-#include <linux/sched/signal.h>
-#else
-#include <linux/sched.h>
-#endif
-#include <linux/netdevice.h>
-#include <linux/spinlock.h>
-#include <linux/list.h>
-
-#include <rte_kni_common.h>
-#define KNI_KTHREAD_MAX_RESCHEDULE_INTERVAL 1000000 /* us */
-
-#define MBUF_BURST_SZ 32
-
-/* Default carrier state for created KNI network interfaces */
-extern uint32_t kni_dflt_carrier;
-
-/* Request processing support for bifurcated drivers. */
-extern uint32_t bifurcated_support;
-
-/**
- * A structure describing the private information for a kni device.
- */
-struct kni_dev {
-	/* kni list */
-	struct list_head list;
-
-	uint8_t iova_mode;
-
-	uint32_t core_id;            /* Core ID to bind */
-	char name[RTE_KNI_NAMESIZE]; /* Network device name */
-	struct task_struct *pthread;
-
-	/* wait queue for req/resp */
-	wait_queue_head_t wq;
-	struct mutex sync_lock;
-
-	/* kni device */
-	struct net_device *net_dev;
-
-	/* queue for packets to be sent out */
-	struct rte_kni_fifo *tx_q;
-
-	/* queue for the packets received */
-	struct rte_kni_fifo *rx_q;
-
-	/* queue for the allocated mbufs those can be used to save sk buffs */
-	struct rte_kni_fifo *alloc_q;
-
-	/* free queue for the mbufs to be freed */
-	struct rte_kni_fifo *free_q;
-
-	/* request queue */
-	struct rte_kni_fifo *req_q;
-
-	/* response queue */
-	struct rte_kni_fifo *resp_q;
-
-	void *sync_kva;
-	void *sync_va;
-
-	void *mbuf_kva;
-	void *mbuf_va;
-
-	/* mbuf size */
-	uint32_t mbuf_size;
-
-	/* buffers */
-	void *pa[MBUF_BURST_SZ];
-	void *va[MBUF_BURST_SZ];
-	void *alloc_pa[MBUF_BURST_SZ];
-	void *alloc_va[MBUF_BURST_SZ];
-
-	struct task_struct *usr_tsk;
-};
-
-#ifdef HAVE_IOVA_TO_KVA_MAPPING_SUPPORT
-static inline phys_addr_t iova_to_phys(struct task_struct *tsk,
-				       unsigned long iova)
-{
-	phys_addr_t offset, phys_addr;
-	struct page *page = NULL;
-	long ret;
-
-	offset = iova & (PAGE_SIZE - 1);
-
-	/* Read one page struct info */
-#ifdef HAVE_TSK_IN_GUP
-	ret = get_user_pages_remote(tsk, tsk->mm, iova, 1, 0, &page, NULL, NULL);
-#else
-  #ifdef HAVE_VMA_IN_GUP
-	ret = get_user_pages_remote(tsk->mm, iova, 1, 0, &page, NULL, NULL);
-  #else
-	ret = get_user_pages_remote(tsk->mm, iova, 1, 0, &page, NULL);
-  #endif
-#endif
-	if (ret < 0)
-		return 0;
-
-	phys_addr = page_to_phys(page) | offset;
-	put_page(page);
-
-	return phys_addr;
-}
-
-static inline void *iova_to_kva(struct task_struct *tsk, unsigned long iova)
-{
-	return phys_to_virt(iova_to_phys(tsk, iova));
-}
-#endif
-
-void kni_net_release_fifo_phy(struct kni_dev *kni);
-void kni_net_rx(struct kni_dev *kni);
-void kni_net_init(struct net_device *dev);
-void kni_net_config_lo_mode(char *lo_str);
-void kni_net_poll_resp(struct kni_dev *kni);
-
-#endif
diff --git a/kernel/linux/kni/kni_fifo.h b/kernel/linux/kni/kni_fifo.h
deleted file mode 100644
index 1ba5172002b6..000000000000
--- a/kernel/linux/kni/kni_fifo.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright(c) 2010-2014 Intel Corporation.
- */
-
-#ifndef _KNI_FIFO_H_
-#define _KNI_FIFO_H_
-
-#include <rte_kni_common.h>
-
-/* Skip some memory barriers on Linux < 3.14 */
-#ifndef smp_load_acquire
-#define smp_load_acquire(a) (*(a))
-#endif
-#ifndef smp_store_release
-#define smp_store_release(a, b) *(a) = (b)
-#endif
-
-/**
- * Adds num elements into the fifo. Return the number actually written
- */
-static inline uint32_t
-kni_fifo_put(struct rte_kni_fifo *fifo, void **data, uint32_t num)
-{
-	uint32_t i = 0;
-	uint32_t fifo_write = fifo->write;
-	uint32_t fifo_read = smp_load_acquire(&fifo->read);
-	uint32_t new_write = fifo_write;
-
-	for (i = 0; i < num; i++) {
-		new_write = (new_write + 1) & (fifo->len - 1);
-
-		if (new_write == fifo_read)
-			break;
-		fifo->buffer[fifo_write] = data[i];
-		fifo_write = new_write;
-	}
-	smp_store_release(&fifo->write, fifo_write);
-
-	return i;
-}
-
-/**
- * Get up to num elements from the FIFO. Return the number actually read
- */
-static inline uint32_t
-kni_fifo_get(struct rte_kni_fifo *fifo, void **data, uint32_t num)
-{
-	uint32_t i = 0;
-	uint32_t new_read = fifo->read;
-	uint32_t fifo_write = smp_load_acquire(&fifo->write);
-
-	for (i = 0; i < num; i++) {
-		if (new_read == fifo_write)
-			break;
-
-		data[i] = fifo->buffer[new_read];
-		new_read = (new_read + 1) & (fifo->len - 1);
-	}
-	smp_store_release(&fifo->read, new_read);
-
-	return i;
-}
-
-/**
- * Get the num of elements in the fifo
- */
-static inline uint32_t
-kni_fifo_count(struct rte_kni_fifo *fifo)
-{
-	uint32_t fifo_write = smp_load_acquire(&fifo->write);
-	uint32_t fifo_read = smp_load_acquire(&fifo->read);
-	return (fifo->len + fifo_write - fifo_read) & (fifo->len - 1);
-}
-
-/**
- * Get the num of available elements in the fifo
- */
-static inline uint32_t
-kni_fifo_free_count(struct rte_kni_fifo *fifo)
-{
-	uint32_t fifo_write = smp_load_acquire(&fifo->write);
-	uint32_t fifo_read = smp_load_acquire(&fifo->read);
-	return (fifo_read - fifo_write - 1) & (fifo->len - 1);
-}
-
-#endif /* _KNI_FIFO_H_ */
diff --git a/kernel/linux/kni/kni_misc.c b/kernel/linux/kni/kni_misc.c
deleted file mode 100644
index 0c3a86ee352e..000000000000
--- a/kernel/linux/kni/kni_misc.c
+++ /dev/null
@@ -1,719 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright(c) 2010-2014 Intel Corporation.
- */
-
-#include <linux/version.h>
-#include <linux/module.h>
-#include <linux/miscdevice.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/pci.h>
-#include <linux/kthread.h>
-#include <linux/rwsem.h>
-#include <linux/mutex.h>
-#include <linux/nsproxy.h>
-#include <net/net_namespace.h>
-#include <net/netns/generic.h>
-
-#include <rte_kni_common.h>
-
-#include "compat.h"
-#include "kni_dev.h"
-
-MODULE_VERSION(KNI_VERSION);
-MODULE_LICENSE("Dual BSD/GPL");
-MODULE_AUTHOR("Intel Corporation");
-MODULE_DESCRIPTION("Kernel Module for managing kni devices");
-
-#define KNI_RX_LOOP_NUM 1000
-
-#define KNI_MAX_DEVICES 32
-
-/* loopback mode */
-static char *lo_mode;
-
-/* Kernel thread mode */
-static char *kthread_mode;
-static uint32_t multiple_kthread_on;
-
-/* Default carrier state for created KNI network interfaces */
-static char *carrier;
-uint32_t kni_dflt_carrier;
-
-/* Request processing support for bifurcated drivers. */
-static char *enable_bifurcated;
-uint32_t bifurcated_support;
-
-/* KNI thread scheduling interval */
-static long min_scheduling_interval = 100; /* us */
-static long max_scheduling_interval = 200; /* us */
-
-#define KNI_DEV_IN_USE_BIT_NUM 0 /* Bit number for device in use */
-
-static int kni_net_id;
-
-struct kni_net {
-	unsigned long device_in_use; /* device in use flag */
-	struct mutex kni_kthread_lock;
-	struct task_struct *kni_kthread;
-	struct rw_semaphore kni_list_lock;
-	struct list_head kni_list_head;
-};
-
-static int __net_init
-kni_init_net(struct net *net)
-{
-#ifdef HAVE_SIMPLIFIED_PERNET_OPERATIONS
-	struct kni_net *knet = net_generic(net, kni_net_id);
-
-	memset(knet, 0, sizeof(*knet));
-#else
-	struct kni_net *knet;
-	int ret;
-
-	knet = kzalloc(sizeof(struct kni_net), GFP_KERNEL);
-	if (!knet) {
-		ret = -ENOMEM;
-		return ret;
-	}
-#endif
-
-	/* Clear the bit of device in use */
-	clear_bit(KNI_DEV_IN_USE_BIT_NUM, &knet->device_in_use);
-
-	mutex_init(&knet->kni_kthread_lock);
-
-	init_rwsem(&knet->kni_list_lock);
-	INIT_LIST_HEAD(&knet->kni_list_head);
-
-#ifdef HAVE_SIMPLIFIED_PERNET_OPERATIONS
-	return 0;
-#else
-	ret = net_assign_generic(net, kni_net_id, knet);
-	if (ret < 0)
-		kfree(knet);
-
-	return ret;
-#endif
-}
-
-static void __net_exit
-kni_exit_net(struct net *net)
-{
-	struct kni_net *knet __maybe_unused;
-
-	knet = net_generic(net, kni_net_id);
-	mutex_destroy(&knet->kni_kthread_lock);
-
-#ifndef HAVE_SIMPLIFIED_PERNET_OPERATIONS
-	kfree(knet);
-#endif
-}
-
-static struct pernet_operations kni_net_ops = {
-	.init = kni_init_net,
-	.exit = kni_exit_net,
-#ifdef HAVE_SIMPLIFIED_PERNET_OPERATIONS
-	.id   = &kni_net_id,
-	.size = sizeof(struct kni_net),
-#endif
-};
-
-static int
-kni_thread_single(void *data)
-{
-	struct kni_net *knet = data;
-	int j;
-	struct kni_dev *dev;
-
-	while (!kthread_should_stop()) {
-		down_read(&knet->kni_list_lock);
-		for (j = 0; j < KNI_RX_LOOP_NUM; j++) {
-			list_for_each_entry(dev, &knet->kni_list_head, list) {
-				kni_net_rx(dev);
-				kni_net_poll_resp(dev);
-			}
-		}
-		up_read(&knet->kni_list_lock);
-		/* reschedule out for a while */
-		usleep_range(min_scheduling_interval, max_scheduling_interval);
-	}
-
-	return 0;
-}
-
-static int
-kni_thread_multiple(void *param)
-{
-	int j;
-	struct kni_dev *dev = param;
-
-	while (!kthread_should_stop()) {
-		for (j = 0; j < KNI_RX_LOOP_NUM; j++) {
-			kni_net_rx(dev);
-			kni_net_poll_resp(dev);
-		}
-		usleep_range(min_scheduling_interval, max_scheduling_interval);
-	}
-
-	return 0;
-}
-
-static int
-kni_open(struct inode *inode, struct file *file)
-{
-	struct net *net = current->nsproxy->net_ns;
-	struct kni_net *knet = net_generic(net, kni_net_id);
-
-	/* kni device can be opened by one user only per netns */
-	if (test_and_set_bit(KNI_DEV_IN_USE_BIT_NUM, &knet->device_in_use))
-		return -EBUSY;
-
-	file->private_data = get_net(net);
-	pr_debug("/dev/kni opened\n");
-
-	return 0;
-}
-
-static int
-kni_dev_remove(struct kni_dev *dev)
-{
-	if (!dev)
-		return -ENODEV;
-
-	/*
-	 * The memory of kni device is allocated and released together
-	 * with net device. Release mbuf before freeing net device.
-	 */
-	kni_net_release_fifo_phy(dev);
-
-	if (dev->net_dev) {
-		unregister_netdev(dev->net_dev);
-		free_netdev(dev->net_dev);
-	}
-
-	return 0;
-}
-
-static int
-kni_release(struct inode *inode, struct file *file)
-{
-	struct net *net = file->private_data;
-	struct kni_net *knet = net_generic(net, kni_net_id);
-	struct kni_dev *dev, *n;
-
-	/* Stop kernel thread for single mode */
-	if (multiple_kthread_on == 0) {
-		mutex_lock(&knet->kni_kthread_lock);
-		/* Stop kernel thread */
-		if (knet->kni_kthread != NULL) {
-			kthread_stop(knet->kni_kthread);
-			knet->kni_kthread = NULL;
-		}
-		mutex_unlock(&knet->kni_kthread_lock);
-	}
-
-	down_write(&knet->kni_list_lock);
-	list_for_each_entry_safe(dev, n, &knet->kni_list_head, list) {
-		/* Stop kernel thread for multiple mode */
-		if (multiple_kthread_on && dev->pthread != NULL) {
-			kthread_stop(dev->pthread);
-			dev->pthread = NULL;
-		}
-
-		list_del(&dev->list);
-		kni_dev_remove(dev);
-	}
-	up_write(&knet->kni_list_lock);
-
-	/* Clear the bit of device in use */
-	clear_bit(KNI_DEV_IN_USE_BIT_NUM, &knet->device_in_use);
-
-	put_net(net);
-	pr_debug("/dev/kni closed\n");
-
-	return 0;
-}
-
-static int
-kni_check_param(struct kni_dev *kni, struct rte_kni_device_info *dev)
-{
-	if (!kni || !dev)
-		return -1;
-
-	/* Check if network name has been used */
-	if (!strncmp(kni->name, dev->name, RTE_KNI_NAMESIZE)) {
-		pr_err("KNI name %s duplicated\n", dev->name);
-		return -1;
-	}
-
-	return 0;
-}
-
-static int
-kni_run_thread(struct kni_net *knet, struct kni_dev *kni, uint8_t force_bind)
-{
-	/**
-	 * Create a new kernel thread for multiple mode, set its core affinity,
-	 * and finally wake it up.
-	 */
-	if (multiple_kthread_on) {
-		kni->pthread = kthread_create(kni_thread_multiple,
-			(void *)kni, "kni_%s", kni->name);
-		if (IS_ERR(kni->pthread)) {
-			kni_dev_remove(kni);
-			return -ECANCELED;
-		}
-
-		if (force_bind)
-			kthread_bind(kni->pthread, kni->core_id);
-		wake_up_process(kni->pthread);
-	} else {
-		mutex_lock(&knet->kni_kthread_lock);
-
-		if (knet->kni_kthread == NULL) {
-			knet->kni_kthread = kthread_create(kni_thread_single,
-				(void *)knet, "kni_single");
-			if (IS_ERR(knet->kni_kthread)) {
-				mutex_unlock(&knet->kni_kthread_lock);
-				kni_dev_remove(kni);
-				return -ECANCELED;
-			}
-
-			if (force_bind)
-				kthread_bind(knet->kni_kthread, kni->core_id);
-			wake_up_process(knet->kni_kthread);
-		}
-
-		mutex_unlock(&knet->kni_kthread_lock);
-	}
-
-	return 0;
-}
-
-static int
-kni_ioctl_create(struct net *net, uint32_t ioctl_num,
-		unsigned long ioctl_param)
-{
-	struct kni_net *knet = net_generic(net, kni_net_id);
-	int ret;
-	struct rte_kni_device_info dev_info;
-	struct net_device *net_dev = NULL;
-	struct kni_dev *kni, *dev, *n;
-
-	pr_info("Creating kni...\n");
-	/* Check the buffer size, to avoid warning */
-	if (_IOC_SIZE(ioctl_num) > sizeof(dev_info))
-		return -EINVAL;
-
-	/* Copy kni info from user space */
-	if (copy_from_user(&dev_info, (void *)ioctl_param, sizeof(dev_info)))
-		return -EFAULT;
-
-	/* Check if name is zero-ended */
-	if (strnlen(dev_info.name, sizeof(dev_info.name)) == sizeof(dev_info.name)) {
-		pr_err("kni.name not zero-terminated");
-		return -EINVAL;
-	}
-
-	/**
-	 * Check if the cpu core id is valid for binding.
-	 */
-	if (dev_info.force_bind && !cpu_online(dev_info.core_id)) {
-		pr_err("cpu %u is not online\n", dev_info.core_id);
-		return -EINVAL;
-	}
-
-	/* Check if it has been created */
-	down_read(&knet->kni_list_lock);
-	list_for_each_entry_safe(dev, n, &knet->kni_list_head, list) {
-		if (kni_check_param(dev, &dev_info) < 0) {
-			up_read(&knet->kni_list_lock);
-			return -EINVAL;
-		}
-	}
-	up_read(&knet->kni_list_lock);
-
-	net_dev = alloc_netdev(sizeof(struct kni_dev), dev_info.name,
-#ifdef NET_NAME_USER
-							NET_NAME_USER,
-#endif
-							kni_net_init);
-	if (net_dev == NULL) {
-		pr_err("error allocating device \"%s\"\n", dev_info.name);
-		return -EBUSY;
-	}
-
-	dev_net_set(net_dev, net);
-
-	kni = netdev_priv(net_dev);
-
-	kni->net_dev = net_dev;
-	kni->core_id = dev_info.core_id;
-	strncpy(kni->name, dev_info.name, RTE_KNI_NAMESIZE);
-
-	/* Translate user space info into kernel space info */
-	if (dev_info.iova_mode) {
-#ifdef HAVE_IOVA_TO_KVA_MAPPING_SUPPORT
-		kni->tx_q = iova_to_kva(current, dev_info.tx_phys);
-		kni->rx_q = iova_to_kva(current, dev_info.rx_phys);
-		kni->alloc_q = iova_to_kva(current, dev_info.alloc_phys);
-		kni->free_q = iova_to_kva(current, dev_info.free_phys);
-
-		kni->req_q = iova_to_kva(current, dev_info.req_phys);
-		kni->resp_q = iova_to_kva(current, dev_info.resp_phys);
-		kni->sync_va = dev_info.sync_va;
-		kni->sync_kva = iova_to_kva(current, dev_info.sync_phys);
-		kni->usr_tsk = current;
-		kni->iova_mode = 1;
-#else
-		pr_err("KNI module does not support IOVA to VA translation\n");
-		return -EINVAL;
-#endif
-	} else {
-
-		kni->tx_q = phys_to_virt(dev_info.tx_phys);
-		kni->rx_q = phys_to_virt(dev_info.rx_phys);
-		kni->alloc_q = phys_to_virt(dev_info.alloc_phys);
-		kni->free_q = phys_to_virt(dev_info.free_phys);
-
-		kni->req_q = phys_to_virt(dev_info.req_phys);
-		kni->resp_q = phys_to_virt(dev_info.resp_phys);
-		kni->sync_va = dev_info.sync_va;
-		kni->sync_kva = phys_to_virt(dev_info.sync_phys);
-		kni->iova_mode = 0;
-	}
-
-	kni->mbuf_size = dev_info.mbuf_size;
-
-	pr_debug("tx_phys:      0x%016llx, tx_q addr:      0x%p\n",
-		(unsigned long long) dev_info.tx_phys, kni->tx_q);
-	pr_debug("rx_phys:      0x%016llx, rx_q addr:      0x%p\n",
-		(unsigned long long) dev_info.rx_phys, kni->rx_q);
-	pr_debug("alloc_phys:   0x%016llx, alloc_q addr:   0x%p\n",
-		(unsigned long long) dev_info.alloc_phys, kni->alloc_q);
-	pr_debug("free_phys:    0x%016llx, free_q addr:    0x%p\n",
-		(unsigned long long) dev_info.free_phys, kni->free_q);
-	pr_debug("req_phys:     0x%016llx, req_q addr:     0x%p\n",
-		(unsigned long long) dev_info.req_phys, kni->req_q);
-	pr_debug("resp_phys:    0x%016llx, resp_q addr:    0x%p\n",
-		(unsigned long long) dev_info.resp_phys, kni->resp_q);
-	pr_debug("mbuf_size:    %u\n", kni->mbuf_size);
-
-	/* if user has provided a valid mac address */
-	if (is_valid_ether_addr(dev_info.mac_addr)) {
-#ifdef HAVE_ETH_HW_ADDR_SET
-		eth_hw_addr_set(net_dev, dev_info.mac_addr);
-#else
-		memcpy(net_dev->dev_addr, dev_info.mac_addr, ETH_ALEN);
-#endif
-	} else {
-		/* Assign random MAC address. */
-		eth_hw_addr_random(net_dev);
-	}
-
-	if (dev_info.mtu)
-		net_dev->mtu = dev_info.mtu;
-#ifdef HAVE_MAX_MTU_PARAM
-	net_dev->max_mtu = net_dev->mtu;
-
-	if (dev_info.min_mtu)
-		net_dev->min_mtu = dev_info.min_mtu;
-
-	if (dev_info.max_mtu)
-		net_dev->max_mtu = dev_info.max_mtu;
-#endif
-
-	ret = register_netdev(net_dev);
-	if (ret) {
-		pr_err("error %i registering device \"%s\"\n",
-					ret, dev_info.name);
-		kni->net_dev = NULL;
-		kni_dev_remove(kni);
-		free_netdev(net_dev);
-		return -ENODEV;
-	}
-
-	netif_carrier_off(net_dev);
-
-	ret = kni_run_thread(knet, kni, dev_info.force_bind);
-	if (ret != 0)
-		return ret;
-
-	down_write(&knet->kni_list_lock);
-	list_add(&kni->list, &knet->kni_list_head);
-	up_write(&knet->kni_list_lock);
-
-	return 0;
-}
-
-static int
-kni_ioctl_release(struct net *net, uint32_t ioctl_num,
-		unsigned long ioctl_param)
-{
-	struct kni_net *knet = net_generic(net, kni_net_id);
-	int ret = -EINVAL;
-	struct kni_dev *dev, *n;
-	struct rte_kni_device_info dev_info;
-
-	if (_IOC_SIZE(ioctl_num) > sizeof(dev_info))
-		return -EINVAL;
-
-	if (copy_from_user(&dev_info, (void *)ioctl_param, sizeof(dev_info)))
-		return -EFAULT;
-
-	/* Release the network device according to its name */
-	if (strlen(dev_info.name) == 0)
-		return -EINVAL;
-
-	down_write(&knet->kni_list_lock);
-	list_for_each_entry_safe(dev, n, &knet->kni_list_head, list) {
-		if (strncmp(dev->name, dev_info.name, RTE_KNI_NAMESIZE) != 0)
-			continue;
-
-		if (multiple_kthread_on && dev->pthread != NULL) {
-			kthread_stop(dev->pthread);
-			dev->pthread = NULL;
-		}
-
-		list_del(&dev->list);
-		kni_dev_remove(dev);
-		ret = 0;
-		break;
-	}
-	up_write(&knet->kni_list_lock);
-	pr_info("%s release kni named %s\n",
-		(ret == 0 ? "Successfully" : "Unsuccessfully"), dev_info.name);
-
-	return ret;
-}
-
-static long
-kni_ioctl(struct file *file, unsigned int ioctl_num, unsigned long ioctl_param)
-{
-	long ret = -EINVAL;
-	struct net *net = current->nsproxy->net_ns;
-
-	pr_debug("IOCTL num=0x%0x param=0x%0lx\n", ioctl_num, ioctl_param);
-
-	/*
-	 * Switch according to the ioctl called
-	 */
-	switch (_IOC_NR(ioctl_num)) {
-	case _IOC_NR(RTE_KNI_IOCTL_TEST):
-		/* For test only, not used */
-		break;
-	case _IOC_NR(RTE_KNI_IOCTL_CREATE):
-		ret = kni_ioctl_create(net, ioctl_num, ioctl_param);
-		break;
-	case _IOC_NR(RTE_KNI_IOCTL_RELEASE):
-		ret = kni_ioctl_release(net, ioctl_num, ioctl_param);
-		break;
-	default:
-		pr_debug("IOCTL default\n");
-		break;
-	}
-
-	return ret;
-}
-
-static long
-kni_compat_ioctl(struct file *file, unsigned int ioctl_num,
-		unsigned long ioctl_param)
-{
-	/* 32 bits app on 64 bits OS to be supported later */
-	pr_debug("Not implemented.\n");
-
-	return -EINVAL;
-}
-
-static const struct file_operations kni_fops = {
-	.owner = THIS_MODULE,
-	.open = kni_open,
-	.release = kni_release,
-	.unlocked_ioctl = kni_ioctl,
-	.compat_ioctl = kni_compat_ioctl,
-};
-
-static struct miscdevice kni_misc = {
-	.minor = MISC_DYNAMIC_MINOR,
-	.name = KNI_DEVICE,
-	.fops = &kni_fops,
-};
-
-static int __init
-kni_parse_kthread_mode(void)
-{
-	if (!kthread_mode)
-		return 0;
-
-	if (strcmp(kthread_mode, "single") == 0)
-		return 0;
-	else if (strcmp(kthread_mode, "multiple") == 0)
-		multiple_kthread_on = 1;
-	else
-		return -1;
-
-	return 0;
-}
-
-static int __init
-kni_parse_carrier_state(void)
-{
-	if (!carrier) {
-		kni_dflt_carrier = 0;
-		return 0;
-	}
-
-	if (strcmp(carrier, "off") == 0)
-		kni_dflt_carrier = 0;
-	else if (strcmp(carrier, "on") == 0)
-		kni_dflt_carrier = 1;
-	else
-		return -1;
-
-	return 0;
-}
-
-static int __init
-kni_parse_bifurcated_support(void)
-{
-	if (!enable_bifurcated) {
-		bifurcated_support = 0;
-		return 0;
-	}
-
-	if (strcmp(enable_bifurcated, "on") == 0)
-		bifurcated_support = 1;
-	else
-		return -1;
-
-	return 0;
-}
-
-static int __init
-kni_init(void)
-{
-	int rc;
-
-	if (kni_parse_kthread_mode() < 0) {
-		pr_err("Invalid parameter for kthread_mode\n");
-		return -EINVAL;
-	}
-
-	if (multiple_kthread_on == 0)
-		pr_debug("Single kernel thread for all KNI devices\n");
-	else
-		pr_debug("Multiple kernel thread mode enabled\n");
-
-	if (kni_parse_carrier_state() < 0) {
-		pr_err("Invalid parameter for carrier\n");
-		return -EINVAL;
-	}
-
-	if (kni_dflt_carrier == 0)
-		pr_debug("Default carrier state set to off.\n");
-	else
-		pr_debug("Default carrier state set to on.\n");
-
-	if (kni_parse_bifurcated_support() < 0) {
-		pr_err("Invalid parameter for bifurcated support\n");
-		return -EINVAL;
-	}
-	if (bifurcated_support == 1)
-		pr_debug("bifurcated support is enabled.\n");
-
-	if (min_scheduling_interval < 0 || max_scheduling_interval < 0 ||
-		min_scheduling_interval > KNI_KTHREAD_MAX_RESCHEDULE_INTERVAL ||
-		max_scheduling_interval > KNI_KTHREAD_MAX_RESCHEDULE_INTERVAL ||
-		min_scheduling_interval >= max_scheduling_interval) {
-		pr_err("Invalid parameters for scheduling interval\n");
-		return -EINVAL;
-	}
-
-#ifdef HAVE_SIMPLIFIED_PERNET_OPERATIONS
-	rc = register_pernet_subsys(&kni_net_ops);
-#else
-	rc = register_pernet_gen_subsys(&kni_net_id, &kni_net_ops);
-#endif
-	if (rc)
-		return -EPERM;
-
-	rc = misc_register(&kni_misc);
-	if (rc != 0) {
-		pr_err("Misc registration failed\n");
-		goto out;
-	}
-
-	/* Configure the lo mode according to the input parameter */
-	kni_net_config_lo_mode(lo_mode);
-
-	return 0;
-
-out:
-#ifdef HAVE_SIMPLIFIED_PERNET_OPERATIONS
-	unregister_pernet_subsys(&kni_net_ops);
-#else
-	unregister_pernet_gen_subsys(kni_net_id, &kni_net_ops);
-#endif
-	return rc;
-}
-
-static void __exit
-kni_exit(void)
-{
-	misc_deregister(&kni_misc);
-#ifdef HAVE_SIMPLIFIED_PERNET_OPERATIONS
-	unregister_pernet_subsys(&kni_net_ops);
-#else
-	unregister_pernet_gen_subsys(kni_net_id, &kni_net_ops);
-#endif
-}
-
-module_init(kni_init);
-module_exit(kni_exit);
-
-module_param(lo_mode, charp, 0644);
-MODULE_PARM_DESC(lo_mode,
-"KNI loopback mode (default=lo_mode_none):\n"
-"\t\tlo_mode_none        Kernel loopback disabled\n"
-"\t\tlo_mode_fifo        Enable kernel loopback with fifo\n"
-"\t\tlo_mode_fifo_skb    Enable kernel loopback with fifo and skb buffer\n"
-"\t\t"
-);
-
-module_param(kthread_mode, charp, 0644);
-MODULE_PARM_DESC(kthread_mode,
-"Kernel thread mode (default=single):\n"
-"\t\tsingle    Single kernel thread mode enabled.\n"
-"\t\tmultiple  Multiple kernel thread mode enabled.\n"
-"\t\t"
-);
-
-module_param(carrier, charp, 0644);
-MODULE_PARM_DESC(carrier,
-"Default carrier state for KNI interface (default=off):\n"
-"\t\toff   Interfaces will be created with carrier state set to off.\n"
-"\t\ton    Interfaces will be created with carrier state set to on.\n"
-"\t\t"
-);
-
-module_param(enable_bifurcated, charp, 0644);
-MODULE_PARM_DESC(enable_bifurcated,
-"Enable request processing support for bifurcated drivers, "
-"which means releasing rtnl_lock before calling userspace callback and "
-"supporting async requests (default=off):\n"
-"\t\ton    Enable request processing support for bifurcated drivers.\n"
-"\t\t"
-);
-
-module_param(min_scheduling_interval, long, 0644);
-MODULE_PARM_DESC(min_scheduling_interval,
-"KNI thread min scheduling interval (default=100 microseconds)"
-);
-
-module_param(max_scheduling_interval, long, 0644);
-MODULE_PARM_DESC(max_scheduling_interval,
-"KNI thread max scheduling interval (default=200 microseconds)"
-);
diff --git a/kernel/linux/kni/kni_net.c b/kernel/linux/kni/kni_net.c
deleted file mode 100644
index 779ee3451a4c..000000000000
--- a/kernel/linux/kni/kni_net.c
+++ /dev/null
@@ -1,878 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright(c) 2010-2014 Intel Corporation.
- */
-
-/*
- * This code is inspired from the book "Linux Device Drivers" by
- * Alessandro Rubini and Jonathan Corbet, published by O'Reilly & Associates
- */
-
-#include <linux/device.h>
-#include <linux/module.h>
-#include <linux/version.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h> /* eth_type_trans */
-#include <linux/ethtool.h>
-#include <linux/skbuff.h>
-#include <linux/kthread.h>
-#include <linux/delay.h>
-#include <linux/rtnetlink.h>
-
-#include <rte_kni_common.h>
-#include <kni_fifo.h>
-
-#include "compat.h"
-#include "kni_dev.h"
-
-#define WD_TIMEOUT 5 /*jiffies */
-
-#define KNI_WAIT_RESPONSE_TIMEOUT 300 /* 3 seconds */
-
-/* typedef for rx function */
-typedef void (*kni_net_rx_t)(struct kni_dev *kni);
-
-static void kni_net_rx_normal(struct kni_dev *kni);
-
-/* kni rx function pointer, with default to normal rx */
-static kni_net_rx_t kni_net_rx_func = kni_net_rx_normal;
-
-#ifdef HAVE_IOVA_TO_KVA_MAPPING_SUPPORT
-/* iova to kernel virtual address */
-static inline void *
-iova2kva(struct kni_dev *kni, void *iova)
-{
-	return phys_to_virt(iova_to_phys(kni->usr_tsk, (unsigned long)iova));
-}
-
-static inline void *
-iova2data_kva(struct kni_dev *kni, struct rte_kni_mbuf *m)
-{
-	return phys_to_virt(iova_to_phys(kni->usr_tsk, m->buf_iova) +
-			    m->data_off);
-}
-#endif
-
-/* physical address to kernel virtual address */
-static void *
-pa2kva(void *pa)
-{
-	return phys_to_virt((unsigned long)pa);
-}
-
-/* physical address to virtual address */
-static void *
-pa2va(void *pa, struct rte_kni_mbuf *m)
-{
-	void *va;
-
-	va = (void *)((unsigned long)pa +
-			(unsigned long)m->buf_addr -
-			(unsigned long)m->buf_iova);
-	return va;
-}
-
-/* mbuf data kernel virtual address from mbuf kernel virtual address */
-static void *
-kva2data_kva(struct rte_kni_mbuf *m)
-{
-	return phys_to_virt(m->buf_iova + m->data_off);
-}
-
-static inline void *
-get_kva(struct kni_dev *kni, void *pa)
-{
-#ifdef HAVE_IOVA_TO_KVA_MAPPING_SUPPORT
-	if (kni->iova_mode == 1)
-		return iova2kva(kni, pa);
-#endif
-	return pa2kva(pa);
-}
-
-static inline void *
-get_data_kva(struct kni_dev *kni, void *pkt_kva)
-{
-#ifdef HAVE_IOVA_TO_KVA_MAPPING_SUPPORT
-	if (kni->iova_mode == 1)
-		return iova2data_kva(kni, pkt_kva);
-#endif
-	return kva2data_kva(pkt_kva);
-}
-
-/*
- * It can be called to process the request.
- */
-static int
-kni_net_process_request(struct net_device *dev, struct rte_kni_request *req)
-{
-	struct kni_dev *kni = netdev_priv(dev);
-	int ret = -1;
-	void *resp_va;
-	uint32_t num;
-	int ret_val;
-
-	ASSERT_RTNL();
-
-	if (bifurcated_support) {
-		/* If we need to wait and RTNL mutex is held
-		 * drop the mutex and hold reference to keep device
-		 */
-		if (req->async == 0) {
-			dev_hold(dev);
-			rtnl_unlock();
-		}
-	}
-
-	mutex_lock(&kni->sync_lock);
-
-	/* Construct data */
-	memcpy(kni->sync_kva, req, sizeof(struct rte_kni_request));
-	num = kni_fifo_put(kni->req_q, &kni->sync_va, 1);
-	if (num < 1) {
-		pr_err("Cannot send to req_q\n");
-		ret = -EBUSY;
-		goto fail;
-	}
-
-	if (bifurcated_support) {
-		/* No result available since request is handled
-		 * asynchronously. set response to success.
-		 */
-		if (req->async != 0) {
-			req->result = 0;
-			goto async;
-		}
-	}
-
-	ret_val = wait_event_interruptible_timeout(kni->wq,
-			kni_fifo_count(kni->resp_q), 3 * HZ);
-	if (signal_pending(current) || ret_val <= 0) {
-		ret = -ETIME;
-		goto fail;
-	}
-	num = kni_fifo_get(kni->resp_q, (void **)&resp_va, 1);
-	if (num != 1 || resp_va != kni->sync_va) {
-		/* This should never happen */
-		pr_err("No data in resp_q\n");
-		ret = -ENODATA;
-		goto fail;
-	}
-
-	memcpy(req, kni->sync_kva, sizeof(struct rte_kni_request));
-async:
-	ret = 0;
-
-fail:
-	mutex_unlock(&kni->sync_lock);
-	if (bifurcated_support) {
-		if (req->async == 0) {
-			rtnl_lock();
-			dev_put(dev);
-		}
-	}
-	return ret;
-}
-
-/*
- * Open and close
- */
-static int
-kni_net_open(struct net_device *dev)
-{
-	int ret;
-	struct rte_kni_request req;
-
-	netif_start_queue(dev);
-	if (kni_dflt_carrier == 1)
-		netif_carrier_on(dev);
-	else
-		netif_carrier_off(dev);
-
-	memset(&req, 0, sizeof(req));
-	req.req_id = RTE_KNI_REQ_CFG_NETWORK_IF;
-
-	/* Setting if_up to non-zero means up */
-	req.if_up = 1;
-	ret = kni_net_process_request(dev, &req);
-
-	return (ret == 0) ? req.result : ret;
-}
-
-static int
-kni_net_release(struct net_device *dev)
-{
-	int ret;
-	struct rte_kni_request req;
-
-	netif_stop_queue(dev); /* can't transmit any more */
-	netif_carrier_off(dev);
-
-	memset(&req, 0, sizeof(req));
-	req.req_id = RTE_KNI_REQ_CFG_NETWORK_IF;
-
-	/* Setting if_up to 0 means down */
-	req.if_up = 0;
-
-	if (bifurcated_support) {
-		/* request async because of the deadlock problem */
-		req.async = 1;
-	}
-
-	ret = kni_net_process_request(dev, &req);
-
-	return (ret == 0) ? req.result : ret;
-}
-
-static void
-kni_fifo_trans_pa2va(struct kni_dev *kni,
-	struct rte_kni_fifo *src_pa, struct rte_kni_fifo *dst_va)
-{
-	uint32_t ret, i, num_dst, num_rx;
-	struct rte_kni_mbuf *kva, *prev_kva;
-	int nb_segs;
-	int kva_nb_segs;
-
-	do {
-		num_dst = kni_fifo_free_count(dst_va);
-		if (num_dst == 0)
-			return;
-
-		num_rx = min_t(uint32_t, num_dst, MBUF_BURST_SZ);
-
-		num_rx = kni_fifo_get(src_pa, kni->pa, num_rx);
-		if (num_rx == 0)
-			return;
-
-		for (i = 0; i < num_rx; i++) {
-			kva = get_kva(kni, kni->pa[i]);
-			kni->va[i] = pa2va(kni->pa[i], kva);
-
-			kva_nb_segs = kva->nb_segs;
-			for (nb_segs = 0; nb_segs < kva_nb_segs; nb_segs++) {
-				if (!kva->next)
-					break;
-
-				prev_kva = kva;
-				kva = get_kva(kni, kva->next);
-				/* Convert physical address to virtual address */
-				prev_kva->next = pa2va(prev_kva->next, kva);
-			}
-		}
-
-		ret = kni_fifo_put(dst_va, kni->va, num_rx);
-		if (ret != num_rx) {
-			/* Failing should not happen */
-			pr_err("Fail to enqueue entries into dst_va\n");
-			return;
-		}
-	} while (1);
-}
-
-/* Try to release mbufs when kni release */
-void kni_net_release_fifo_phy(struct kni_dev *kni)
-{
-	/* release rx_q first, because it can't release in userspace */
-	kni_fifo_trans_pa2va(kni, kni->rx_q, kni->free_q);
-	/* release alloc_q for speeding up kni release in userspace */
-	kni_fifo_trans_pa2va(kni, kni->alloc_q, kni->free_q);
-}
-
-/*
- * Configuration changes (passed on by ifconfig)
- */
-static int
-kni_net_config(struct net_device *dev, struct ifmap *map)
-{
-	if (dev->flags & IFF_UP) /* can't act on a running interface */
-		return -EBUSY;
-
-	/* ignore other fields */
-	return 0;
-}
-
-/*
- * Transmit a packet (called by the kernel)
- */
-static int
-kni_net_tx(struct sk_buff *skb, struct net_device *dev)
-{
-	int len = 0;
-	uint32_t ret;
-	struct kni_dev *kni = netdev_priv(dev);
-	struct rte_kni_mbuf *pkt_kva = NULL;
-	void *pkt_pa = NULL;
-	void *pkt_va = NULL;
-
-	/* save the timestamp */
-#ifdef HAVE_TRANS_START_HELPER
-	netif_trans_update(dev);
-#else
-	dev->trans_start = jiffies;
-#endif
-
-	/* Check if the length of skb is less than mbuf size */
-	if (skb->len > kni->mbuf_size)
-		goto drop;
-
-	/**
-	 * Check if it has at least one free entry in tx_q and
-	 * one entry in alloc_q.
-	 */
-	if (kni_fifo_free_count(kni->tx_q) == 0 ||
-			kni_fifo_count(kni->alloc_q) == 0) {
-		/**
-		 * If no free entry in tx_q or no entry in alloc_q,
-		 * drops skb and goes out.
-		 */
-		goto drop;
-	}
-
-	/* dequeue a mbuf from alloc_q */
-	ret = kni_fifo_get(kni->alloc_q, &pkt_pa, 1);
-	if (likely(ret == 1)) {
-		void *data_kva;
-
-		pkt_kva = get_kva(kni, pkt_pa);
-		data_kva = get_data_kva(kni, pkt_kva);
-		pkt_va = pa2va(pkt_pa, pkt_kva);
-
-		len = skb->len;
-		memcpy(data_kva, skb->data, len);
-		if (unlikely(len < ETH_ZLEN)) {
-			memset(data_kva + len, 0, ETH_ZLEN - len);
-			len = ETH_ZLEN;
-		}
-		pkt_kva->pkt_len = len;
-		pkt_kva->data_len = len;
-
-		/* enqueue mbuf into tx_q */
-		ret = kni_fifo_put(kni->tx_q, &pkt_va, 1);
-		if (unlikely(ret != 1)) {
-			/* Failing should not happen */
-			pr_err("Fail to enqueue mbuf into tx_q\n");
-			goto drop;
-		}
-	} else {
-		/* Failing should not happen */
-		pr_err("Fail to dequeue mbuf from alloc_q\n");
-		goto drop;
-	}
-
-	/* Free skb and update statistics */
-	dev_kfree_skb(skb);
-	dev->stats.tx_bytes += len;
-	dev->stats.tx_packets++;
-
-	return NETDEV_TX_OK;
-
-drop:
-	/* Free skb and update statistics */
-	dev_kfree_skb(skb);
-	dev->stats.tx_dropped++;
-
-	return NETDEV_TX_OK;
-}
-
-/*
- * RX: normal working mode
- */
-static void
-kni_net_rx_normal(struct kni_dev *kni)
-{
-	uint32_t ret;
-	uint32_t len;
-	uint32_t i, num_rx, num_fq;
-	struct rte_kni_mbuf *kva, *prev_kva;
-	void *data_kva;
-	struct sk_buff *skb;
-	struct net_device *dev = kni->net_dev;
-
-	/* Get the number of free entries in free_q */
-	num_fq = kni_fifo_free_count(kni->free_q);
-	if (num_fq == 0) {
-		/* No room on the free_q, bail out */
-		return;
-	}
-
-	/* Calculate the number of entries to dequeue from rx_q */
-	num_rx = min_t(uint32_t, num_fq, MBUF_BURST_SZ);
-
-	/* Burst dequeue from rx_q */
-	num_rx = kni_fifo_get(kni->rx_q, kni->pa, num_rx);
-	if (num_rx == 0)
-		return;
-
-	/* Transfer received packets to netif */
-	for (i = 0; i < num_rx; i++) {
-		kva = get_kva(kni, kni->pa[i]);
-		len = kva->pkt_len;
-		data_kva = get_data_kva(kni, kva);
-		kni->va[i] = pa2va(kni->pa[i], kva);
-
-		skb = netdev_alloc_skb(dev, len);
-		if (!skb) {
-			/* Update statistics */
-			dev->stats.rx_dropped++;
-			continue;
-		}
-
-		if (kva->nb_segs == 1) {
-			memcpy(skb_put(skb, len), data_kva, len);
-		} else {
-			int nb_segs;
-			int kva_nb_segs = kva->nb_segs;
-
-			for (nb_segs = 0; nb_segs < kva_nb_segs; nb_segs++) {
-				memcpy(skb_put(skb, kva->data_len),
-					data_kva, kva->data_len);
-
-				if (!kva->next)
-					break;
-
-				prev_kva = kva;
-				kva = get_kva(kni, kva->next);
-				data_kva = kva2data_kva(kva);
-				/* Convert physical address to virtual address */
-				prev_kva->next = pa2va(prev_kva->next, kva);
-			}
-		}
-
-		skb->protocol = eth_type_trans(skb, dev);
-		skb->ip_summed = CHECKSUM_UNNECESSARY;
-
-		/* Call netif interface */
-#ifdef HAVE_NETIF_RX_NI
-		netif_rx_ni(skb);
-#else
-		netif_rx(skb);
-#endif
-
-		/* Update statistics */
-		dev->stats.rx_bytes += len;
-		dev->stats.rx_packets++;
-	}
-
-	/* Burst enqueue mbufs into free_q */
-	ret = kni_fifo_put(kni->free_q, kni->va, num_rx);
-	if (ret != num_rx)
-		/* Failing should not happen */
-		pr_err("Fail to enqueue entries into free_q\n");
-}
-
-/*
- * RX: loopback with enqueue/dequeue fifos.
- */
-static void
-kni_net_rx_lo_fifo(struct kni_dev *kni)
-{
-	uint32_t ret;
-	uint32_t len;
-	uint32_t i, num, num_rq, num_tq, num_aq, num_fq;
-	struct rte_kni_mbuf *kva, *next_kva;
-	void *data_kva;
-	struct rte_kni_mbuf *alloc_kva;
-	void *alloc_data_kva;
-	struct net_device *dev = kni->net_dev;
-
-	/* Get the number of entries in rx_q */
-	num_rq = kni_fifo_count(kni->rx_q);
-
-	/* Get the number of free entries in tx_q */
-	num_tq = kni_fifo_free_count(kni->tx_q);
-
-	/* Get the number of entries in alloc_q */
-	num_aq = kni_fifo_count(kni->alloc_q);
-
-	/* Get the number of free entries in free_q */
-	num_fq = kni_fifo_free_count(kni->free_q);
-
-	/* Calculate the number of entries to be dequeued from rx_q */
-	num = min(num_rq, num_tq);
-	num = min(num, num_aq);
-	num = min(num, num_fq);
-	num = min_t(uint32_t, num, MBUF_BURST_SZ);
-
-	/* Return if no entry to dequeue from rx_q */
-	if (num == 0)
-		return;
-
-	/* Burst dequeue from rx_q */
-	ret = kni_fifo_get(kni->rx_q, kni->pa, num);
-	if (ret == 0)
-		return; /* Failing should not happen */
-
-	/* Dequeue entries from alloc_q */
-	ret = kni_fifo_get(kni->alloc_q, kni->alloc_pa, num);
-	if (ret) {
-		num = ret;
-		/* Copy mbufs */
-		for (i = 0; i < num; i++) {
-			kva = get_kva(kni, kni->pa[i]);
-			len = kva->data_len;
-			data_kva = get_data_kva(kni, kva);
-			kni->va[i] = pa2va(kni->pa[i], kva);
-
-			while (kva->next) {
-				next_kva = get_kva(kni, kva->next);
-				/* Convert physical address to virtual address */
-				kva->next = pa2va(kva->next, next_kva);
-				kva = next_kva;
-			}
-
-			alloc_kva = get_kva(kni, kni->alloc_pa[i]);
-			alloc_data_kva = get_data_kva(kni, alloc_kva);
-			kni->alloc_va[i] = pa2va(kni->alloc_pa[i], alloc_kva);
-
-			memcpy(alloc_data_kva, data_kva, len);
-			alloc_kva->pkt_len = len;
-			alloc_kva->data_len = len;
-
-			dev->stats.tx_bytes += len;
-			dev->stats.rx_bytes += len;
-		}
-
-		/* Burst enqueue mbufs into tx_q */
-		ret = kni_fifo_put(kni->tx_q, kni->alloc_va, num);
-		if (ret != num)
-			/* Failing should not happen */
-			pr_err("Fail to enqueue mbufs into tx_q\n");
-	}
-
-	/* Burst enqueue mbufs into free_q */
-	ret = kni_fifo_put(kni->free_q, kni->va, num);
-	if (ret != num)
-		/* Failing should not happen */
-		pr_err("Fail to enqueue mbufs into free_q\n");
-
-	/**
-	 * Update statistic, and enqueue/dequeue failure is impossible,
-	 * as all queues are checked at first.
-	 */
-	dev->stats.tx_packets += num;
-	dev->stats.rx_packets += num;
-}
-
-/*
- * RX: loopback with enqueue/dequeue fifos and sk buffer copies.
- */
-static void
-kni_net_rx_lo_fifo_skb(struct kni_dev *kni)
-{
-	uint32_t ret;
-	uint32_t len;
-	uint32_t i, num_rq, num_fq, num;
-	struct rte_kni_mbuf *kva, *prev_kva;
-	void *data_kva;
-	struct sk_buff *skb;
-	struct net_device *dev = kni->net_dev;
-
-	/* Get the number of entries in rx_q */
-	num_rq = kni_fifo_count(kni->rx_q);
-
-	/* Get the number of free entries in free_q */
-	num_fq = kni_fifo_free_count(kni->free_q);
-
-	/* Calculate the number of entries to dequeue from rx_q */
-	num = min(num_rq, num_fq);
-	num = min_t(uint32_t, num, MBUF_BURST_SZ);
-
-	/* Return if no entry to dequeue from rx_q */
-	if (num == 0)
-		return;
-
-	/* Burst dequeue mbufs from rx_q */
-	ret = kni_fifo_get(kni->rx_q, kni->pa, num);
-	if (ret == 0)
-		return;
-
-	/* Copy mbufs to sk buffer and then call tx interface */
-	for (i = 0; i < num; i++) {
-		kva = get_kva(kni, kni->pa[i]);
-		len = kva->pkt_len;
-		data_kva = get_data_kva(kni, kva);
-		kni->va[i] = pa2va(kni->pa[i], kva);
-
-		skb = netdev_alloc_skb(dev, len);
-		if (skb) {
-			memcpy(skb_put(skb, len), data_kva, len);
-			skb->ip_summed = CHECKSUM_UNNECESSARY;
-			dev_kfree_skb(skb);
-		}
-
-		/* Simulate real usage, allocate/copy skb twice */
-		skb = netdev_alloc_skb(dev, len);
-		if (skb == NULL) {
-			dev->stats.rx_dropped++;
-			continue;
-		}
-
-		if (kva->nb_segs == 1) {
-			memcpy(skb_put(skb, len), data_kva, len);
-		} else {
-			int nb_segs;
-			int kva_nb_segs = kva->nb_segs;
-
-			for (nb_segs = 0; nb_segs < kva_nb_segs; nb_segs++) {
-				memcpy(skb_put(skb, kva->data_len),
-					data_kva, kva->data_len);
-
-				if (!kva->next)
-					break;
-
-				prev_kva = kva;
-				kva = get_kva(kni, kva->next);
-				data_kva = get_data_kva(kni, kva);
-				/* Convert physical address to virtual address */
-				prev_kva->next = pa2va(prev_kva->next, kva);
-			}
-		}
-
-		skb->ip_summed = CHECKSUM_UNNECESSARY;
-
-		dev->stats.rx_bytes += len;
-		dev->stats.rx_packets++;
-
-		/* call tx interface */
-		kni_net_tx(skb, dev);
-	}
-
-	/* enqueue all the mbufs from rx_q into free_q */
-	ret = kni_fifo_put(kni->free_q, kni->va, num);
-	if (ret != num)
-		/* Failing should not happen */
-		pr_err("Fail to enqueue mbufs into free_q\n");
-}
-
-/* rx interface */
-void
-kni_net_rx(struct kni_dev *kni)
-{
-	/**
-	 * It doesn't need to check if it is NULL pointer,
-	 * as it has a default value
-	 */
-	(*kni_net_rx_func)(kni);
-}
-
-/*
- * Deal with a transmit timeout.
- */
-#ifdef HAVE_TX_TIMEOUT_TXQUEUE
-static void
-kni_net_tx_timeout(struct net_device *dev, unsigned int txqueue)
-#else
-static void
-kni_net_tx_timeout(struct net_device *dev)
-#endif
-{
-	pr_debug("Transmit timeout at %ld, latency %ld\n", jiffies,
-			jiffies - dev_trans_start(dev));
-
-	dev->stats.tx_errors++;
-	netif_wake_queue(dev);
-}
-
-static int
-kni_net_change_mtu(struct net_device *dev, int new_mtu)
-{
-	int ret;
-	struct rte_kni_request req;
-
-	pr_debug("kni_net_change_mtu new mtu %d to be set\n", new_mtu);
-
-	memset(&req, 0, sizeof(req));
-	req.req_id = RTE_KNI_REQ_CHANGE_MTU;
-	req.new_mtu = new_mtu;
-	ret = kni_net_process_request(dev, &req);
-	if (ret == 0 && req.result == 0)
-		dev->mtu = new_mtu;
-
-	return (ret == 0) ? req.result : ret;
-}
-
-static void
-kni_net_change_rx_flags(struct net_device *netdev, int flags)
-{
-	struct rte_kni_request req;
-
-	memset(&req, 0, sizeof(req));
-
-	if (flags & IFF_ALLMULTI) {
-		req.req_id = RTE_KNI_REQ_CHANGE_ALLMULTI;
-
-		if (netdev->flags & IFF_ALLMULTI)
-			req.allmulti = 1;
-		else
-			req.allmulti = 0;
-	}
-
-	if (flags & IFF_PROMISC) {
-		req.req_id = RTE_KNI_REQ_CHANGE_PROMISC;
-
-		if (netdev->flags & IFF_PROMISC)
-			req.promiscusity = 1;
-		else
-			req.promiscusity = 0;
-	}
-
-	kni_net_process_request(netdev, &req);
-}
-
-/*
- * Checks if the user space application provided the resp message
- */
-void
-kni_net_poll_resp(struct kni_dev *kni)
-{
-	if (kni_fifo_count(kni->resp_q))
-		wake_up_interruptible(&kni->wq);
-}
-
-/*
- *  Fill the eth header
- */
-static int
-kni_net_header(struct sk_buff *skb, struct net_device *dev,
-		unsigned short type, const void *daddr,
-		const void *saddr, uint32_t len)
-{
-	struct ethhdr *eth = (struct ethhdr *) skb_push(skb, ETH_HLEN);
-
-	memcpy(eth->h_source, saddr ? saddr : dev->dev_addr, dev->addr_len);
-	memcpy(eth->h_dest,   daddr ? daddr : dev->dev_addr, dev->addr_len);
-	eth->h_proto = htons(type);
-
-	return dev->hard_header_len;
-}
-
-/*
- * Re-fill the eth header
- */
-#ifdef HAVE_REBUILD_HEADER
-static int
-kni_net_rebuild_header(struct sk_buff *skb)
-{
-	struct net_device *dev = skb->dev;
-	struct ethhdr *eth = (struct ethhdr *) skb->data;
-
-	memcpy(eth->h_source, dev->dev_addr, dev->addr_len);
-	memcpy(eth->h_dest, dev->dev_addr, dev->addr_len);
-
-	return 0;
-}
-#endif /* < 4.1.0  */
-
-/**
- * kni_net_set_mac - Change the Ethernet Address of the KNI NIC
- * @netdev: network interface device structure
- * @p: pointer to an address structure
- *
- * Returns 0 on success, negative on failure
- **/
-static int
-kni_net_set_mac(struct net_device *netdev, void *p)
-{
-	int ret;
-	struct rte_kni_request req;
-	struct sockaddr *addr = p;
-
-	memset(&req, 0, sizeof(req));
-	req.req_id = RTE_KNI_REQ_CHANGE_MAC_ADDR;
-
-	if (!is_valid_ether_addr((unsigned char *)(addr->sa_data)))
-		return -EADDRNOTAVAIL;
-
-	memcpy(req.mac_addr, addr->sa_data, netdev->addr_len);
-#ifdef HAVE_ETH_HW_ADDR_SET
-	eth_hw_addr_set(netdev, addr->sa_data);
-#else
-	memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
-#endif
-
-	ret = kni_net_process_request(netdev, &req);
-
-	return (ret == 0 ? req.result : ret);
-}
-
-#ifdef HAVE_CHANGE_CARRIER_CB
-static int
-kni_net_change_carrier(struct net_device *dev, bool new_carrier)
-{
-	if (new_carrier)
-		netif_carrier_on(dev);
-	else
-		netif_carrier_off(dev);
-	return 0;
-}
-#endif
-
-static const struct header_ops kni_net_header_ops = {
-	.create  = kni_net_header,
-	.parse   = eth_header_parse,
-#ifdef HAVE_REBUILD_HEADER
-	.rebuild = kni_net_rebuild_header,
-#endif /* < 4.1.0  */
-	.cache   = NULL,  /* disable caching */
-};
-
-static const struct net_device_ops kni_net_netdev_ops = {
-	.ndo_open = kni_net_open,
-	.ndo_stop = kni_net_release,
-	.ndo_set_config = kni_net_config,
-	.ndo_change_rx_flags = kni_net_change_rx_flags,
-	.ndo_start_xmit = kni_net_tx,
-	.ndo_change_mtu = kni_net_change_mtu,
-	.ndo_tx_timeout = kni_net_tx_timeout,
-	.ndo_set_mac_address = kni_net_set_mac,
-#ifdef HAVE_CHANGE_CARRIER_CB
-	.ndo_change_carrier = kni_net_change_carrier,
-#endif
-};
-
-static void kni_get_drvinfo(struct net_device *dev,
-			    struct ethtool_drvinfo *info)
-{
-	strlcpy(info->version, KNI_VERSION, sizeof(info->version));
-	strlcpy(info->driver, "kni", sizeof(info->driver));
-}
-
-static const struct ethtool_ops kni_net_ethtool_ops = {
-	.get_drvinfo	= kni_get_drvinfo,
-	.get_link	= ethtool_op_get_link,
-};
-
-void
-kni_net_init(struct net_device *dev)
-{
-	struct kni_dev *kni = netdev_priv(dev);
-
-	init_waitqueue_head(&kni->wq);
-	mutex_init(&kni->sync_lock);
-
-	ether_setup(dev); /* assign some of the fields */
-	dev->netdev_ops      = &kni_net_netdev_ops;
-	dev->header_ops      = &kni_net_header_ops;
-	dev->ethtool_ops     = &kni_net_ethtool_ops;
-	dev->watchdog_timeo = WD_TIMEOUT;
-}
-
-void
-kni_net_config_lo_mode(char *lo_str)
-{
-	if (!lo_str) {
-		pr_debug("loopback disabled");
-		return;
-	}
-
-	if (!strcmp(lo_str, "lo_mode_none"))
-		pr_debug("loopback disabled");
-	else if (!strcmp(lo_str, "lo_mode_fifo")) {
-		pr_debug("loopback mode=lo_mode_fifo enabled");
-		kni_net_rx_func = kni_net_rx_lo_fifo;
-	} else if (!strcmp(lo_str, "lo_mode_fifo_skb")) {
-		pr_debug("loopback mode=lo_mode_fifo_skb enabled");
-		kni_net_rx_func = kni_net_rx_lo_fifo_skb;
-	} else {
-		pr_debug("Unknown loopback parameter, disabled");
-	}
-}
diff --git a/kernel/linux/kni/meson.build b/kernel/linux/kni/meson.build
deleted file mode 100644
index 4c90069e9989..000000000000
--- a/kernel/linux/kni/meson.build
+++ /dev/null
@@ -1,41 +0,0 @@
-# SPDX-License-Identifier: BSD-3-Clause
-# Copyright(c) 2018 Luca Boccassi <bluca@debian.org>
-
-# For SUSE build check function arguments of ndo_tx_timeout API
-# Ref: https://jira.devtools.intel.com/browse/DPDK-29263
-kmod_cflags = ''
-file_path = kernel_source_dir + '/include/linux/netdevice.h'
-run_cmd = run_command('grep', 'ndo_tx_timeout', file_path, check: false)
-
-if run_cmd.stdout().contains('txqueue') == true
-   kmod_cflags = '-DHAVE_ARG_TX_QUEUE'
-endif
-
-
-kni_mkfile = custom_target('rte_kni_makefile',
-        output: 'Makefile',
-        command: ['touch', '@OUTPUT@'])
-
-kni_sources = files(
-        'kni_misc.c',
-        'kni_net.c',
-        'Kbuild',
-)
-
-custom_target('rte_kni',
-        input: kni_sources,
-        output: 'rte_kni.ko',
-        command: ['make', '-j4', '-C', kernel_build_dir,
-            'M=' + meson.current_build_dir(),
-            'src=' + meson.current_source_dir(),
-            ' '.join(['MODULE_CFLAGS=', kmod_cflags,'-include '])
-            + dpdk_source_root + '/config/rte_config.h' +
-            ' -I' + dpdk_source_root + '/lib/eal/include' +
-            ' -I' + dpdk_source_root + '/lib/kni' +
-            ' -I' + dpdk_build_root +
-            ' -I' + meson.current_source_dir(),
-            'modules'] + cross_args,
-        depends: kni_mkfile,
-        install: install,
-        install_dir: kernel_install_dir,
-        build_by_default: get_option('enable_kmods'))
diff --git a/kernel/linux/meson.build b/kernel/linux/meson.build
index 16a094899446..8d47074621f7 100644
--- a/kernel/linux/meson.build
+++ b/kernel/linux/meson.build
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2018 Intel Corporation
 
-subdirs = ['kni']
+subdirs = []
 
 kernel_build_dir = get_option('kernel_dir')
 kernel_source_dir = get_option('kernel_dir')
diff --git a/lib/eal/common/eal_common_log.c b/lib/eal/common/eal_common_log.c
index bd7b188ceb4a..0a1d219d6924 100644
--- a/lib/eal/common/eal_common_log.c
+++ b/lib/eal/common/eal_common_log.c
@@ -356,7 +356,6 @@ static const struct logtype logtype_strings[] = {
 	{RTE_LOGTYPE_PMD,        "pmd"},
 	{RTE_LOGTYPE_HASH,       "lib.hash"},
 	{RTE_LOGTYPE_LPM,        "lib.lpm"},
-	{RTE_LOGTYPE_KNI,        "lib.kni"},
 	{RTE_LOGTYPE_ACL,        "lib.acl"},
 	{RTE_LOGTYPE_POWER,      "lib.power"},
 	{RTE_LOGTYPE_METER,      "lib.meter"},
diff --git a/lib/eal/include/rte_log.h b/lib/eal/include/rte_log.h
index 6d2b0856a565..bdefff2a5933 100644
--- a/lib/eal/include/rte_log.h
+++ b/lib/eal/include/rte_log.h
@@ -34,7 +34,7 @@ extern "C" {
 #define RTE_LOGTYPE_PMD        5 /**< Log related to poll mode driver. */
 #define RTE_LOGTYPE_HASH       6 /**< Log related to hash table. */
 #define RTE_LOGTYPE_LPM        7 /**< Log related to LPM. */
-#define RTE_LOGTYPE_KNI        8 /**< Log related to KNI. */
+				 /* was RTE_LOGTYPE_KNI */
 #define RTE_LOGTYPE_ACL        9 /**< Log related to ACL. */
 #define RTE_LOGTYPE_POWER     10 /**< Log related to power. */
 #define RTE_LOGTYPE_METER     11 /**< Log related to QoS meter. */
diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c
index c6efd920145c..a1fefcd9d83a 100644
--- a/lib/eal/linux/eal.c
+++ b/lib/eal/linux/eal.c
@@ -1084,11 +1084,6 @@ rte_eal_init(int argc, char **argv)
 				 */
 				iova_mode = RTE_IOVA_VA;
 				RTE_LOG(DEBUG, EAL, "Physical addresses are unavailable, selecting IOVA as VA mode.\n");
-#if defined(RTE_LIB_KNI) && LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0)
-			} else if (rte_eal_check_module("rte_kni") == 1) {
-				iova_mode = RTE_IOVA_PA;
-				RTE_LOG(DEBUG, EAL, "KNI is loaded, selecting IOVA as PA mode for better KNI performance.\n");
-#endif
 			} else if (is_iommu_enabled()) {
 				/* we have an IOMMU, pick IOVA as VA mode */
 				iova_mode = RTE_IOVA_VA;
@@ -1101,20 +1096,6 @@ rte_eal_init(int argc, char **argv)
 				RTE_LOG(DEBUG, EAL, "IOMMU is not available, selecting IOVA as PA mode.\n");
 			}
 		}
-#if defined(RTE_LIB_KNI) && LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0)
-		/* Workaround for KNI which requires physical address to work
-		 * in kernels < 4.10
-		 */
-		if (iova_mode == RTE_IOVA_VA &&
-				rte_eal_check_module("rte_kni") == 1) {
-			if (phys_addrs) {
-				iova_mode = RTE_IOVA_PA;
-				RTE_LOG(WARNING, EAL, "Forcing IOVA as 'PA' because KNI module is loaded\n");
-			} else {
-				RTE_LOG(DEBUG, EAL, "KNI can not work since physical addresses are unavailable\n");
-			}
-		}
-#endif
 		rte_eal_get_configuration()->iova_mode = iova_mode;
 	} else {
 		rte_eal_get_configuration()->iova_mode =
diff --git a/lib/kni/meson.build b/lib/kni/meson.build
deleted file mode 100644
index 5ce410f7f2d2..000000000000
--- a/lib/kni/meson.build
+++ /dev/null
@@ -1,21 +0,0 @@
-# SPDX-License-Identifier: BSD-3-Clause
-# Copyright(c) 2017 Intel Corporation
-
-if is_windows
-    build = false
-    reason = 'not supported on Windows'
-    subdir_done()
-endif
-
-if dpdk_conf.get('RTE_IOVA_IN_MBUF') == 0
-    build = false
-    reason = 'requires IOVA in mbuf (set enable_iova_as_pa option)'
-endif
-
-if not is_linux or not dpdk_conf.get('RTE_ARCH_64')
-    build = false
-    reason = 'only supported on 64-bit Linux'
-endif
-sources = files('rte_kni.c')
-headers = files('rte_kni.h', 'rte_kni_common.h')
-deps += ['ethdev', 'pci']
diff --git a/lib/kni/rte_kni.c b/lib/kni/rte_kni.c
deleted file mode 100644
index bfa6a001ff59..000000000000
--- a/lib/kni/rte_kni.c
+++ /dev/null
@@ -1,843 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2014 Intel Corporation
- */
-
-#ifndef RTE_EXEC_ENV_LINUX
-#error "KNI is not supported"
-#endif
-
-#include <string.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <sys/ioctl.h>
-#include <linux/version.h>
-
-#include <rte_string_fns.h>
-#include <rte_ethdev.h>
-#include <rte_malloc.h>
-#include <rte_log.h>
-#include <rte_kni.h>
-#include <rte_memzone.h>
-#include <rte_tailq.h>
-#include <rte_eal_memconfig.h>
-#include <rte_kni_common.h>
-#include "rte_kni_fifo.h"
-
-#define MAX_MBUF_BURST_NUM            32
-
-/* Maximum number of ring entries */
-#define KNI_FIFO_COUNT_MAX     1024
-#define KNI_FIFO_SIZE          (KNI_FIFO_COUNT_MAX * sizeof(void *) + \
-					sizeof(struct rte_kni_fifo))
-
-#define KNI_REQUEST_MBUF_NUM_MAX      32
-
-#define KNI_MEM_CHECK(cond, fail) do { if (cond) goto fail; } while (0)
-
-#define KNI_MZ_NAME_FMT			"kni_info_%s"
-#define KNI_TX_Q_MZ_NAME_FMT		"kni_tx_%s"
-#define KNI_RX_Q_MZ_NAME_FMT		"kni_rx_%s"
-#define KNI_ALLOC_Q_MZ_NAME_FMT		"kni_alloc_%s"
-#define KNI_FREE_Q_MZ_NAME_FMT		"kni_free_%s"
-#define KNI_REQ_Q_MZ_NAME_FMT		"kni_req_%s"
-#define KNI_RESP_Q_MZ_NAME_FMT		"kni_resp_%s"
-#define KNI_SYNC_ADDR_MZ_NAME_FMT	"kni_sync_%s"
-
-TAILQ_HEAD(rte_kni_list, rte_tailq_entry);
-
-static struct rte_tailq_elem rte_kni_tailq = {
-	.name = "RTE_KNI",
-};
-EAL_REGISTER_TAILQ(rte_kni_tailq)
-
-/**
- * KNI context
- */
-struct rte_kni {
-	char name[RTE_KNI_NAMESIZE];        /**< KNI interface name */
-	uint16_t group_id;                  /**< Group ID of KNI devices */
-	uint32_t slot_id;                   /**< KNI pool slot ID */
-	struct rte_mempool *pktmbuf_pool;   /**< pkt mbuf mempool */
-	unsigned int mbuf_size;                 /**< mbuf size */
-
-	const struct rte_memzone *m_tx_q;   /**< TX queue memzone */
-	const struct rte_memzone *m_rx_q;   /**< RX queue memzone */
-	const struct rte_memzone *m_alloc_q;/**< Alloc queue memzone */
-	const struct rte_memzone *m_free_q; /**< Free queue memzone */
-
-	struct rte_kni_fifo *tx_q;          /**< TX queue */
-	struct rte_kni_fifo *rx_q;          /**< RX queue */
-	struct rte_kni_fifo *alloc_q;       /**< Allocated mbufs queue */
-	struct rte_kni_fifo *free_q;        /**< To be freed mbufs queue */
-
-	const struct rte_memzone *m_req_q;  /**< Request queue memzone */
-	const struct rte_memzone *m_resp_q; /**< Response queue memzone */
-	const struct rte_memzone *m_sync_addr;/**< Sync addr memzone */
-
-	/* For request & response */
-	struct rte_kni_fifo *req_q;         /**< Request queue */
-	struct rte_kni_fifo *resp_q;        /**< Response queue */
-	void *sync_addr;                   /**< Req/Resp Mem address */
-
-	struct rte_kni_ops ops;             /**< operations for request */
-};
-
-enum kni_ops_status {
-	KNI_REQ_NO_REGISTER = 0,
-	KNI_REQ_REGISTERED,
-};
-
-static void kni_free_mbufs(struct rte_kni *kni);
-static void kni_allocate_mbufs(struct rte_kni *kni);
-
-static volatile int kni_fd = -1;
-
-/* Shall be called before any allocation happens */
-int
-rte_kni_init(unsigned int max_kni_ifaces __rte_unused)
-{
-	RTE_LOG(WARNING, KNI, "WARNING: KNI is deprecated and will be removed in DPDK 23.11\n");
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0)
-	if (rte_eal_iova_mode() != RTE_IOVA_PA) {
-		RTE_LOG(ERR, KNI, "KNI requires IOVA as PA\n");
-		return -1;
-	}
-#endif
-
-	/* Check FD and open */
-	if (kni_fd < 0) {
-		kni_fd = open("/dev/" KNI_DEVICE, O_RDWR);
-		if (kni_fd < 0) {
-			RTE_LOG(ERR, KNI,
-				"Can not open /dev/%s\n", KNI_DEVICE);
-			return -1;
-		}
-	}
-
-	return 0;
-}
-
-static struct rte_kni *
-__rte_kni_get(const char *name)
-{
-	struct rte_kni *kni;
-	struct rte_tailq_entry *te;
-	struct rte_kni_list *kni_list;
-
-	kni_list = RTE_TAILQ_CAST(rte_kni_tailq.head, rte_kni_list);
-
-	TAILQ_FOREACH(te, kni_list, next) {
-		kni = te->data;
-		if (strncmp(name, kni->name, RTE_KNI_NAMESIZE) == 0)
-			break;
-	}
-
-	if (te == NULL)
-		kni = NULL;
-
-	return kni;
-}
-
-static int
-kni_reserve_mz(struct rte_kni *kni)
-{
-	char mz_name[RTE_MEMZONE_NAMESIZE];
-
-	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, KNI_TX_Q_MZ_NAME_FMT, kni->name);
-	kni->m_tx_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY,
-			RTE_MEMZONE_IOVA_CONTIG);
-	KNI_MEM_CHECK(kni->m_tx_q == NULL, tx_q_fail);
-
-	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, KNI_RX_Q_MZ_NAME_FMT, kni->name);
-	kni->m_rx_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY,
-			RTE_MEMZONE_IOVA_CONTIG);
-	KNI_MEM_CHECK(kni->m_rx_q == NULL, rx_q_fail);
-
-	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, KNI_ALLOC_Q_MZ_NAME_FMT, kni->name);
-	kni->m_alloc_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY,
-			RTE_MEMZONE_IOVA_CONTIG);
-	KNI_MEM_CHECK(kni->m_alloc_q == NULL, alloc_q_fail);
-
-	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, KNI_FREE_Q_MZ_NAME_FMT, kni->name);
-	kni->m_free_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY,
-			RTE_MEMZONE_IOVA_CONTIG);
-	KNI_MEM_CHECK(kni->m_free_q == NULL, free_q_fail);
-
-	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, KNI_REQ_Q_MZ_NAME_FMT, kni->name);
-	kni->m_req_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY,
-			RTE_MEMZONE_IOVA_CONTIG);
-	KNI_MEM_CHECK(kni->m_req_q == NULL, req_q_fail);
-
-	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, KNI_RESP_Q_MZ_NAME_FMT, kni->name);
-	kni->m_resp_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY,
-			RTE_MEMZONE_IOVA_CONTIG);
-	KNI_MEM_CHECK(kni->m_resp_q == NULL, resp_q_fail);
-
-	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, KNI_SYNC_ADDR_MZ_NAME_FMT, kni->name);
-	kni->m_sync_addr = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY,
-			RTE_MEMZONE_IOVA_CONTIG);
-	KNI_MEM_CHECK(kni->m_sync_addr == NULL, sync_addr_fail);
-
-	return 0;
-
-sync_addr_fail:
-	rte_memzone_free(kni->m_resp_q);
-resp_q_fail:
-	rte_memzone_free(kni->m_req_q);
-req_q_fail:
-	rte_memzone_free(kni->m_free_q);
-free_q_fail:
-	rte_memzone_free(kni->m_alloc_q);
-alloc_q_fail:
-	rte_memzone_free(kni->m_rx_q);
-rx_q_fail:
-	rte_memzone_free(kni->m_tx_q);
-tx_q_fail:
-	return -1;
-}
-
-static void
-kni_release_mz(struct rte_kni *kni)
-{
-	rte_memzone_free(kni->m_tx_q);
-	rte_memzone_free(kni->m_rx_q);
-	rte_memzone_free(kni->m_alloc_q);
-	rte_memzone_free(kni->m_free_q);
-	rte_memzone_free(kni->m_req_q);
-	rte_memzone_free(kni->m_resp_q);
-	rte_memzone_free(kni->m_sync_addr);
-}
-
-struct rte_kni *
-rte_kni_alloc(struct rte_mempool *pktmbuf_pool,
-	      const struct rte_kni_conf *conf,
-	      struct rte_kni_ops *ops)
-{
-	int ret;
-	struct rte_kni_device_info dev_info;
-	struct rte_kni *kni;
-	struct rte_tailq_entry *te;
-	struct rte_kni_list *kni_list;
-
-	if (!pktmbuf_pool || !conf || !conf->name[0])
-		return NULL;
-
-	/* Check if KNI subsystem has been initialized */
-	if (kni_fd < 0) {
-		RTE_LOG(ERR, KNI, "KNI subsystem has not been initialized. Invoke rte_kni_init() first\n");
-		return NULL;
-	}
-
-	rte_mcfg_tailq_write_lock();
-
-	kni = __rte_kni_get(conf->name);
-	if (kni != NULL) {
-		RTE_LOG(ERR, KNI, "KNI already exists\n");
-		goto unlock;
-	}
-
-	te = rte_zmalloc("KNI_TAILQ_ENTRY", sizeof(*te), 0);
-	if (te == NULL) {
-		RTE_LOG(ERR, KNI, "Failed to allocate tailq entry\n");
-		goto unlock;
-	}
-
-	kni = rte_zmalloc("KNI", sizeof(struct rte_kni), RTE_CACHE_LINE_SIZE);
-	if (kni == NULL) {
-		RTE_LOG(ERR, KNI, "KNI memory allocation failed\n");
-		goto kni_fail;
-	}
-
-	strlcpy(kni->name, conf->name, RTE_KNI_NAMESIZE);
-
-	if (ops)
-		memcpy(&kni->ops, ops, sizeof(struct rte_kni_ops));
-	else
-		kni->ops.port_id = UINT16_MAX;
-
-	memset(&dev_info, 0, sizeof(dev_info));
-	dev_info.core_id = conf->core_id;
-	dev_info.force_bind = conf->force_bind;
-	dev_info.group_id = conf->group_id;
-	dev_info.mbuf_size = conf->mbuf_size;
-	dev_info.mtu = conf->mtu;
-	dev_info.min_mtu = conf->min_mtu;
-	dev_info.max_mtu = conf->max_mtu;
-
-	memcpy(dev_info.mac_addr, conf->mac_addr, RTE_ETHER_ADDR_LEN);
-
-	strlcpy(dev_info.name, conf->name, RTE_KNI_NAMESIZE);
-
-	ret = kni_reserve_mz(kni);
-	if (ret < 0)
-		goto mz_fail;
-
-	/* TX RING */
-	kni->tx_q = kni->m_tx_q->addr;
-	kni_fifo_init(kni->tx_q, KNI_FIFO_COUNT_MAX);
-	dev_info.tx_phys = kni->m_tx_q->iova;
-
-	/* RX RING */
-	kni->rx_q = kni->m_rx_q->addr;
-	kni_fifo_init(kni->rx_q, KNI_FIFO_COUNT_MAX);
-	dev_info.rx_phys = kni->m_rx_q->iova;
-
-	/* ALLOC RING */
-	kni->alloc_q = kni->m_alloc_q->addr;
-	kni_fifo_init(kni->alloc_q, KNI_FIFO_COUNT_MAX);
-	dev_info.alloc_phys = kni->m_alloc_q->iova;
-
-	/* FREE RING */
-	kni->free_q = kni->m_free_q->addr;
-	kni_fifo_init(kni->free_q, KNI_FIFO_COUNT_MAX);
-	dev_info.free_phys = kni->m_free_q->iova;
-
-	/* Request RING */
-	kni->req_q = kni->m_req_q->addr;
-	kni_fifo_init(kni->req_q, KNI_FIFO_COUNT_MAX);
-	dev_info.req_phys = kni->m_req_q->iova;
-
-	/* Response RING */
-	kni->resp_q = kni->m_resp_q->addr;
-	kni_fifo_init(kni->resp_q, KNI_FIFO_COUNT_MAX);
-	dev_info.resp_phys = kni->m_resp_q->iova;
-
-	/* Req/Resp sync mem area */
-	kni->sync_addr = kni->m_sync_addr->addr;
-	dev_info.sync_va = kni->m_sync_addr->addr;
-	dev_info.sync_phys = kni->m_sync_addr->iova;
-
-	kni->pktmbuf_pool = pktmbuf_pool;
-	kni->group_id = conf->group_id;
-	kni->mbuf_size = conf->mbuf_size;
-
-	dev_info.iova_mode = (rte_eal_iova_mode() == RTE_IOVA_VA) ? 1 : 0;
-
-	ret = ioctl(kni_fd, RTE_KNI_IOCTL_CREATE, &dev_info);
-	if (ret < 0)
-		goto ioctl_fail;
-
-	te->data = kni;
-
-	kni_list = RTE_TAILQ_CAST(rte_kni_tailq.head, rte_kni_list);
-	TAILQ_INSERT_TAIL(kni_list, te, next);
-
-	rte_mcfg_tailq_write_unlock();
-
-	/* Allocate mbufs and then put them into alloc_q */
-	kni_allocate_mbufs(kni);
-
-	return kni;
-
-ioctl_fail:
-	kni_release_mz(kni);
-mz_fail:
-	rte_free(kni);
-kni_fail:
-	rte_free(te);
-unlock:
-	rte_mcfg_tailq_write_unlock();
-
-	return NULL;
-}
-
-static void
-kni_free_fifo(struct rte_kni_fifo *fifo)
-{
-	int ret;
-	struct rte_mbuf *pkt;
-
-	do {
-		ret = kni_fifo_get(fifo, (void **)&pkt, 1);
-		if (ret)
-			rte_pktmbuf_free(pkt);
-	} while (ret);
-}
-
-static void *
-va2pa(struct rte_mbuf *m)
-{
-	return (void *)((unsigned long)m -
-			((unsigned long)m->buf_addr - (unsigned long)rte_mbuf_iova_get(m)));
-}
-
-static void *
-va2pa_all(struct rte_mbuf *mbuf)
-{
-	void *phy_mbuf = va2pa(mbuf);
-	struct rte_mbuf *next = mbuf->next;
-	while (next) {
-		mbuf->next = va2pa(next);
-		mbuf = next;
-		next = mbuf->next;
-	}
-	return phy_mbuf;
-}
-
-static void
-obj_free(struct rte_mempool *mp __rte_unused, void *opaque, void *obj,
-		unsigned obj_idx __rte_unused)
-{
-	struct rte_mbuf *m = obj;
-	void *mbuf_phys = opaque;
-
-	if (va2pa(m) == mbuf_phys)
-		rte_pktmbuf_free(m);
-}
-
-static void
-kni_free_fifo_phy(struct rte_mempool *mp, struct rte_kni_fifo *fifo)
-{
-	void *mbuf_phys;
-	int ret;
-
-	do {
-		ret = kni_fifo_get(fifo, &mbuf_phys, 1);
-		if (ret)
-			rte_mempool_obj_iter(mp, obj_free, mbuf_phys);
-	} while (ret);
-}
-
-int
-rte_kni_release(struct rte_kni *kni)
-{
-	struct rte_tailq_entry *te;
-	struct rte_kni_list *kni_list;
-	struct rte_kni_device_info dev_info;
-	uint32_t retry = 5;
-
-	if (!kni)
-		return -1;
-
-	kni_list = RTE_TAILQ_CAST(rte_kni_tailq.head, rte_kni_list);
-
-	rte_mcfg_tailq_write_lock();
-
-	TAILQ_FOREACH(te, kni_list, next) {
-		if (te->data == kni)
-			break;
-	}
-
-	if (te == NULL)
-		goto unlock;
-
-	strlcpy(dev_info.name, kni->name, sizeof(dev_info.name));
-	if (ioctl(kni_fd, RTE_KNI_IOCTL_RELEASE, &dev_info) < 0) {
-		RTE_LOG(ERR, KNI, "Fail to release kni device\n");
-		goto unlock;
-	}
-
-	TAILQ_REMOVE(kni_list, te, next);
-
-	rte_mcfg_tailq_write_unlock();
-
-	/* mbufs in all fifo should be released, except request/response */
-
-	/* wait until all rxq packets processed by kernel */
-	while (kni_fifo_count(kni->rx_q) && retry--)
-		usleep(1000);
-
-	if (kni_fifo_count(kni->rx_q))
-		RTE_LOG(ERR, KNI, "Fail to free all Rx-q items\n");
-
-	kni_free_fifo_phy(kni->pktmbuf_pool, kni->alloc_q);
-	kni_free_fifo(kni->tx_q);
-	kni_free_fifo(kni->free_q);
-
-	kni_release_mz(kni);
-
-	rte_free(kni);
-
-	rte_free(te);
-
-	return 0;
-
-unlock:
-	rte_mcfg_tailq_write_unlock();
-
-	return -1;
-}
-
-/* default callback for request of configuring device mac address */
-static int
-kni_config_mac_address(uint16_t port_id, uint8_t mac_addr[])
-{
-	int ret = 0;
-
-	if (!rte_eth_dev_is_valid_port(port_id)) {
-		RTE_LOG(ERR, KNI, "Invalid port id %d\n", port_id);
-		return -EINVAL;
-	}
-
-	RTE_LOG(INFO, KNI, "Configure mac address of %d", port_id);
-
-	ret = rte_eth_dev_default_mac_addr_set(port_id,
-					(struct rte_ether_addr *)mac_addr);
-	if (ret < 0)
-		RTE_LOG(ERR, KNI, "Failed to config mac_addr for port %d\n",
-			port_id);
-
-	return ret;
-}
-
-/* default callback for request of configuring promiscuous mode */
-static int
-kni_config_promiscusity(uint16_t port_id, uint8_t to_on)
-{
-	int ret;
-
-	if (!rte_eth_dev_is_valid_port(port_id)) {
-		RTE_LOG(ERR, KNI, "Invalid port id %d\n", port_id);
-		return -EINVAL;
-	}
-
-	RTE_LOG(INFO, KNI, "Configure promiscuous mode of %d to %d\n",
-		port_id, to_on);
-
-	if (to_on)
-		ret = rte_eth_promiscuous_enable(port_id);
-	else
-		ret = rte_eth_promiscuous_disable(port_id);
-
-	if (ret != 0)
-		RTE_LOG(ERR, KNI,
-			"Failed to %s promiscuous mode for port %u: %s\n",
-			to_on ? "enable" : "disable", port_id,
-			rte_strerror(-ret));
-
-	return ret;
-}
-
-/* default callback for request of configuring allmulticast mode */
-static int
-kni_config_allmulticast(uint16_t port_id, uint8_t to_on)
-{
-	int ret;
-
-	if (!rte_eth_dev_is_valid_port(port_id)) {
-		RTE_LOG(ERR, KNI, "Invalid port id %d\n", port_id);
-		return -EINVAL;
-	}
-
-	RTE_LOG(INFO, KNI, "Configure allmulticast mode of %d to %d\n",
-		port_id, to_on);
-
-	if (to_on)
-		ret = rte_eth_allmulticast_enable(port_id);
-	else
-		ret = rte_eth_allmulticast_disable(port_id);
-	if (ret != 0)
-		RTE_LOG(ERR, KNI,
-			"Failed to %s allmulticast mode for port %u: %s\n",
-			to_on ? "enable" : "disable", port_id,
-			rte_strerror(-ret));
-
-	return ret;
-}
-
-int
-rte_kni_handle_request(struct rte_kni *kni)
-{
-	unsigned int ret;
-	struct rte_kni_request *req = NULL;
-
-	if (kni == NULL)
-		return -1;
-
-	/* Get request mbuf */
-	ret = kni_fifo_get(kni->req_q, (void **)&req, 1);
-	if (ret != 1)
-		return 0; /* It is OK of can not getting the request mbuf */
-
-	if (req != kni->sync_addr) {
-		RTE_LOG(ERR, KNI, "Wrong req pointer %p\n", req);
-		return -1;
-	}
-
-	/* Analyze the request and call the relevant actions for it */
-	switch (req->req_id) {
-	case RTE_KNI_REQ_CHANGE_MTU: /* Change MTU */
-		if (kni->ops.change_mtu)
-			req->result = kni->ops.change_mtu(kni->ops.port_id,
-							req->new_mtu);
-		break;
-	case RTE_KNI_REQ_CFG_NETWORK_IF: /* Set network interface up/down */
-		if (kni->ops.config_network_if)
-			req->result = kni->ops.config_network_if(kni->ops.port_id,
-								 req->if_up);
-		break;
-	case RTE_KNI_REQ_CHANGE_MAC_ADDR: /* Change MAC Address */
-		if (kni->ops.config_mac_address)
-			req->result = kni->ops.config_mac_address(
-					kni->ops.port_id, req->mac_addr);
-		else if (kni->ops.port_id != UINT16_MAX)
-			req->result = kni_config_mac_address(
-					kni->ops.port_id, req->mac_addr);
-		break;
-	case RTE_KNI_REQ_CHANGE_PROMISC: /* Change PROMISCUOUS MODE */
-		if (kni->ops.config_promiscusity)
-			req->result = kni->ops.config_promiscusity(
-					kni->ops.port_id, req->promiscusity);
-		else if (kni->ops.port_id != UINT16_MAX)
-			req->result = kni_config_promiscusity(
-					kni->ops.port_id, req->promiscusity);
-		break;
-	case RTE_KNI_REQ_CHANGE_ALLMULTI: /* Change ALLMULTICAST MODE */
-		if (kni->ops.config_allmulticast)
-			req->result = kni->ops.config_allmulticast(
-					kni->ops.port_id, req->allmulti);
-		else if (kni->ops.port_id != UINT16_MAX)
-			req->result = kni_config_allmulticast(
-					kni->ops.port_id, req->allmulti);
-		break;
-	default:
-		RTE_LOG(ERR, KNI, "Unknown request id %u\n", req->req_id);
-		req->result = -EINVAL;
-		break;
-	}
-
-	/* if needed, construct response buffer and put it back to resp_q */
-	if (!req->async)
-		ret = kni_fifo_put(kni->resp_q, (void **)&req, 1);
-	else
-		ret = 1;
-	if (ret != 1) {
-		RTE_LOG(ERR, KNI, "Fail to put the muf back to resp_q\n");
-		return -1; /* It is an error of can't putting the mbuf back */
-	}
-
-	return 0;
-}
-
-unsigned
-rte_kni_tx_burst(struct rte_kni *kni, struct rte_mbuf **mbufs, unsigned int num)
-{
-	num = RTE_MIN(kni_fifo_free_count(kni->rx_q), num);
-	void *phy_mbufs[num];
-	unsigned int ret;
-	unsigned int i;
-
-	for (i = 0; i < num; i++)
-		phy_mbufs[i] = va2pa_all(mbufs[i]);
-
-	ret = kni_fifo_put(kni->rx_q, phy_mbufs, num);
-
-	/* Get mbufs from free_q and then free them */
-	kni_free_mbufs(kni);
-
-	return ret;
-}
-
-unsigned
-rte_kni_rx_burst(struct rte_kni *kni, struct rte_mbuf **mbufs, unsigned int num)
-{
-	unsigned int ret = kni_fifo_get(kni->tx_q, (void **)mbufs, num);
-
-	/* If buffers removed or alloc_q is empty, allocate mbufs and then put them into alloc_q */
-	if (ret || (kni_fifo_count(kni->alloc_q) == 0))
-		kni_allocate_mbufs(kni);
-
-	return ret;
-}
-
-static void
-kni_free_mbufs(struct rte_kni *kni)
-{
-	int i, ret;
-	struct rte_mbuf *pkts[MAX_MBUF_BURST_NUM];
-
-	ret = kni_fifo_get(kni->free_q, (void **)pkts, MAX_MBUF_BURST_NUM);
-	if (likely(ret > 0)) {
-		for (i = 0; i < ret; i++)
-			rte_pktmbuf_free(pkts[i]);
-	}
-}
-
-static void
-kni_allocate_mbufs(struct rte_kni *kni)
-{
-	int i, ret;
-	struct rte_mbuf *pkts[MAX_MBUF_BURST_NUM];
-	void *phys[MAX_MBUF_BURST_NUM];
-	int allocq_free;
-
-	RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, pool) !=
-			 offsetof(struct rte_kni_mbuf, pool));
-	RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, buf_addr) !=
-			 offsetof(struct rte_kni_mbuf, buf_addr));
-	RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, next) !=
-			 offsetof(struct rte_kni_mbuf, next));
-	RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, data_off) !=
-			 offsetof(struct rte_kni_mbuf, data_off));
-	RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, data_len) !=
-			 offsetof(struct rte_kni_mbuf, data_len));
-	RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, pkt_len) !=
-			 offsetof(struct rte_kni_mbuf, pkt_len));
-	RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, ol_flags) !=
-			 offsetof(struct rte_kni_mbuf, ol_flags));
-
-	/* Check if pktmbuf pool has been configured */
-	if (kni->pktmbuf_pool == NULL) {
-		RTE_LOG(ERR, KNI, "No valid mempool for allocating mbufs\n");
-		return;
-	}
-
-	allocq_free = kni_fifo_free_count(kni->alloc_q);
-	allocq_free = (allocq_free > MAX_MBUF_BURST_NUM) ?
-		MAX_MBUF_BURST_NUM : allocq_free;
-	for (i = 0; i < allocq_free; i++) {
-		pkts[i] = rte_pktmbuf_alloc(kni->pktmbuf_pool);
-		if (unlikely(pkts[i] == NULL)) {
-			/* Out of memory */
-			RTE_LOG(ERR, KNI, "Out of memory\n");
-			break;
-		}
-		phys[i] = va2pa(pkts[i]);
-	}
-
-	/* No pkt mbuf allocated */
-	if (i <= 0)
-		return;
-
-	ret = kni_fifo_put(kni->alloc_q, phys, i);
-
-	/* Check if any mbufs not put into alloc_q, and then free them */
-	if (ret >= 0 && ret < i && ret < MAX_MBUF_BURST_NUM) {
-		int j;
-
-		for (j = ret; j < i; j++)
-			rte_pktmbuf_free(pkts[j]);
-	}
-}
-
-struct rte_kni *
-rte_kni_get(const char *name)
-{
-	struct rte_kni *kni;
-
-	if (name == NULL || name[0] == '\0')
-		return NULL;
-
-	rte_mcfg_tailq_read_lock();
-
-	kni = __rte_kni_get(name);
-
-	rte_mcfg_tailq_read_unlock();
-
-	return kni;
-}
-
-const char *
-rte_kni_get_name(const struct rte_kni *kni)
-{
-	return kni->name;
-}
-
-static enum kni_ops_status
-kni_check_request_register(struct rte_kni_ops *ops)
-{
-	/* check if KNI request ops has been registered*/
-	if (ops == NULL)
-		return KNI_REQ_NO_REGISTER;
-
-	if (ops->change_mtu == NULL
-	    && ops->config_network_if == NULL
-	    && ops->config_mac_address == NULL
-	    && ops->config_promiscusity == NULL
-	    && ops->config_allmulticast == NULL)
-		return KNI_REQ_NO_REGISTER;
-
-	return KNI_REQ_REGISTERED;
-}
-
-int
-rte_kni_register_handlers(struct rte_kni *kni, struct rte_kni_ops *ops)
-{
-	enum kni_ops_status req_status;
-
-	if (ops == NULL) {
-		RTE_LOG(ERR, KNI, "Invalid KNI request operation.\n");
-		return -1;
-	}
-
-	if (kni == NULL) {
-		RTE_LOG(ERR, KNI, "Invalid kni info.\n");
-		return -1;
-	}
-
-	req_status = kni_check_request_register(&kni->ops);
-	if (req_status == KNI_REQ_REGISTERED) {
-		RTE_LOG(ERR, KNI, "The KNI request operation has already registered.\n");
-		return -1;
-	}
-
-	memcpy(&kni->ops, ops, sizeof(struct rte_kni_ops));
-	return 0;
-}
-
-int
-rte_kni_unregister_handlers(struct rte_kni *kni)
-{
-	if (kni == NULL) {
-		RTE_LOG(ERR, KNI, "Invalid kni info.\n");
-		return -1;
-	}
-
-	memset(&kni->ops, 0, sizeof(struct rte_kni_ops));
-
-	return 0;
-}
-
-int
-rte_kni_update_link(struct rte_kni *kni, unsigned int linkup)
-{
-	char path[64];
-	char old_carrier[2];
-	const char *new_carrier;
-	int old_linkup;
-	int fd, ret;
-
-	if (kni == NULL)
-		return -1;
-
-	snprintf(path, sizeof(path), "/sys/devices/virtual/net/%s/carrier",
-		kni->name);
-
-	fd = open(path, O_RDWR);
-	if (fd == -1) {
-		RTE_LOG(ERR, KNI, "Failed to open file: %s.\n", path);
-		return -1;
-	}
-
-	ret = read(fd, old_carrier, 2);
-	if (ret < 1) {
-		close(fd);
-		return -1;
-	}
-	old_linkup = (old_carrier[0] == '1');
-
-	if (old_linkup == (int)linkup)
-		goto out;
-
-	new_carrier = linkup ? "1" : "0";
-	ret = write(fd, new_carrier, 1);
-	if (ret < 1) {
-		RTE_LOG(ERR, KNI, "Failed to write file: %s.\n", path);
-		close(fd);
-		return -1;
-	}
-out:
-	close(fd);
-	return old_linkup;
-}
-
-void
-rte_kni_close(void)
-{
-	if (kni_fd < 0)
-		return;
-
-	close(kni_fd);
-	kni_fd = -1;
-}
diff --git a/lib/kni/rte_kni.h b/lib/kni/rte_kni.h
deleted file mode 100644
index 1e508acc829b..000000000000
--- a/lib/kni/rte_kni.h
+++ /dev/null
@@ -1,269 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2014 Intel Corporation
- */
-
-#ifndef _RTE_KNI_H_
-#define _RTE_KNI_H_
-
-/**
- * @file
- * RTE KNI
- *
- * The KNI library provides the ability to create and destroy kernel NIC
- * interfaces that may be used by the RTE application to receive/transmit
- * packets from/to Linux kernel net interfaces.
- *
- * This library provides two APIs to burst receive packets from KNI interfaces,
- * and burst transmit packets to KNI interfaces.
- */
-
-#include <rte_compat.h>
-#include <rte_pci.h>
-#include <rte_ether.h>
-
-#include <rte_kni_common.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct rte_kni;
-struct rte_mbuf;
-
-/**
- * Structure which has the function pointers for KNI interface.
- */
-struct rte_kni_ops {
-	uint16_t port_id; /* Port ID */
-
-	/* Pointer to function of changing MTU */
-	int (*change_mtu)(uint16_t port_id, unsigned int new_mtu);
-
-	/* Pointer to function of configuring network interface */
-	int (*config_network_if)(uint16_t port_id, uint8_t if_up);
-
-	/* Pointer to function of configuring mac address */
-	int (*config_mac_address)(uint16_t port_id, uint8_t mac_addr[]);
-
-	/* Pointer to function of configuring promiscuous mode */
-	int (*config_promiscusity)(uint16_t port_id, uint8_t to_on);
-
-	/* Pointer to function of configuring allmulticast mode */
-	int (*config_allmulticast)(uint16_t port_id, uint8_t to_on);
-};
-
-/**
- * Structure for configuring KNI device.
- */
-struct rte_kni_conf {
-	/*
-	 * KNI name which will be used in relevant network device.
-	 * Let the name as short as possible, as it will be part of
-	 * memzone name.
-	 */
-	char name[RTE_KNI_NAMESIZE];
-	uint32_t core_id;   /* Core ID to bind kernel thread on */
-	uint16_t group_id;  /* Group ID */
-	unsigned mbuf_size; /* mbuf size */
-	struct rte_pci_addr addr; /* deprecated */
-	struct rte_pci_id id; /* deprecated */
-
-	__extension__
-	uint8_t force_bind : 1; /* Flag to bind kernel thread */
-	uint8_t mac_addr[RTE_ETHER_ADDR_LEN]; /* MAC address assigned to KNI */
-	uint16_t mtu;
-	uint16_t min_mtu;
-	uint16_t max_mtu;
-};
-
-/**
- * Initialize and preallocate KNI subsystem
- *
- * This function is to be executed on the main lcore only, after EAL
- * initialization and before any KNI interface is attempted to be
- * allocated
- *
- * @param max_kni_ifaces
- *  The maximum number of KNI interfaces that can coexist concurrently
- *
- * @return
- *  - 0 indicates success.
- *  - negative value indicates failure.
- */
-int rte_kni_init(unsigned int max_kni_ifaces);
-
-
-/**
- * Allocate KNI interface according to the port id, mbuf size, mbuf pool,
- * configurations and callbacks for kernel requests.The KNI interface created
- * in the kernel space is the net interface the traditional Linux application
- * talking to.
- *
- * The rte_kni_alloc shall not be called before rte_kni_init() has been
- * called. rte_kni_alloc is thread safe.
- *
- * The mempool should have capacity of more than "2 x KNI_FIFO_COUNT_MAX"
- * elements for each KNI interface allocated.
- *
- * @param pktmbuf_pool
- *  The mempool for allocating mbufs for packets.
- * @param conf
- *  The pointer to the configurations of the KNI device.
- * @param ops
- *  The pointer to the callbacks for the KNI kernel requests.
- *
- * @return
- *  - The pointer to the context of a KNI interface.
- *  - NULL indicate error.
- */
-struct rte_kni *rte_kni_alloc(struct rte_mempool *pktmbuf_pool,
-		const struct rte_kni_conf *conf, struct rte_kni_ops *ops);
-
-/**
- * Release KNI interface according to the context. It will also release the
- * paired KNI interface in kernel space. All processing on the specific KNI
- * context need to be stopped before calling this interface.
- *
- * rte_kni_release is thread safe.
- *
- * @param kni
- *  The pointer to the context of an existent KNI interface.
- *
- * @return
- *  - 0 indicates success.
- *  - negative value indicates failure.
- */
-int rte_kni_release(struct rte_kni *kni);
-
-/**
- * It is used to handle the request mbufs sent from kernel space.
- * Then analyzes it and calls the specific actions for the specific requests.
- * Finally constructs the response mbuf and puts it back to the resp_q.
- *
- * @param kni
- *  The pointer to the context of an existent KNI interface.
- *
- * @return
- *  - 0
- *  - negative value indicates failure.
- */
-int rte_kni_handle_request(struct rte_kni *kni);
-
-/**
- * Retrieve a burst of packets from a KNI interface. The retrieved packets are
- * stored in rte_mbuf structures whose pointers are supplied in the array of
- * mbufs, and the maximum number is indicated by num. It handles allocating
- * the mbufs for KNI interface alloc queue.
- *
- * @param kni
- *  The KNI interface context.
- * @param mbufs
- *  The array to store the pointers of mbufs.
- * @param num
- *  The maximum number per burst.
- *
- * @return
- *  The actual number of packets retrieved.
- */
-unsigned rte_kni_rx_burst(struct rte_kni *kni, struct rte_mbuf **mbufs,
-		unsigned num);
-
-/**
- * Send a burst of packets to a KNI interface. The packets to be sent out are
- * stored in rte_mbuf structures whose pointers are supplied in the array of
- * mbufs, and the maximum number is indicated by num. It handles the freeing of
- * the mbufs in the free queue of KNI interface.
- *
- * @param kni
- *  The KNI interface context.
- * @param mbufs
- *  The array to store the pointers of mbufs.
- * @param num
- *  The maximum number per burst.
- *
- * @return
- *  The actual number of packets sent.
- */
-unsigned rte_kni_tx_burst(struct rte_kni *kni, struct rte_mbuf **mbufs,
-		unsigned num);
-
-/**
- * Get the KNI context of its name.
- *
- * @param name
- *  pointer to the KNI device name.
- *
- * @return
- *  On success: Pointer to KNI interface.
- *  On failure: NULL.
- */
-struct rte_kni *rte_kni_get(const char *name);
-
-/**
- * Get the name given to a KNI device
- *
- * @param kni
- *   The KNI instance to query
- * @return
- *   The pointer to the KNI name
- */
-const char *rte_kni_get_name(const struct rte_kni *kni);
-
-/**
- * Register KNI request handling for a specified port,and it can
- * be called by primary process or secondary process.
- *
- * @param kni
- *  pointer to struct rte_kni.
- * @param ops
- *  pointer to struct rte_kni_ops.
- *
- * @return
- *  On success: 0
- *  On failure: -1
- */
-int rte_kni_register_handlers(struct rte_kni *kni, struct rte_kni_ops *ops);
-
-/**
- *  Unregister KNI request handling for a specified port.
- *
- *  @param kni
- *   pointer to struct rte_kni.
- *
- *  @return
- *   On success: 0
- *   On failure: -1
- */
-int rte_kni_unregister_handlers(struct rte_kni *kni);
-
-/**
- * Update link carrier state for KNI port.
- *
- * Update the linkup/linkdown state of a KNI interface in the kernel.
- *
- * @param kni
- *  pointer to struct rte_kni.
- * @param linkup
- *  New link state:
- *  0 for linkdown.
- *  > 0 for linkup.
- *
- * @return
- *  On failure: -1
- *  Previous link state == linkdown: 0
- *  Previous link state == linkup: 1
- */
-__rte_experimental
-int
-rte_kni_update_link(struct rte_kni *kni, unsigned int linkup);
-
-/**
- *  Close KNI device.
- */
-void rte_kni_close(void);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _RTE_KNI_H_ */
diff --git a/lib/kni/rte_kni_common.h b/lib/kni/rte_kni_common.h
deleted file mode 100644
index 8d3ee0fa4fc2..000000000000
--- a/lib/kni/rte_kni_common.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/* SPDX-License-Identifier: (BSD-3-Clause OR LGPL-2.1) */
-/*
- * Copyright(c) 2007-2014 Intel Corporation.
- */
-
-#ifndef _RTE_KNI_COMMON_H_
-#define _RTE_KNI_COMMON_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef __KERNEL__
-#include <linux/if.h>
-#include <asm/barrier.h>
-#define RTE_STD_C11
-#else
-#include <rte_common.h>
-#include <rte_config.h>
-#endif
-
-/*
- * KNI name is part of memzone name. Must not exceed IFNAMSIZ.
- */
-#define RTE_KNI_NAMESIZE 16
-
-#define RTE_CACHE_LINE_MIN_SIZE 64
-
-/*
- * Request id.
- */
-enum rte_kni_req_id {
-	RTE_KNI_REQ_UNKNOWN = 0,
-	RTE_KNI_REQ_CHANGE_MTU,
-	RTE_KNI_REQ_CFG_NETWORK_IF,
-	RTE_KNI_REQ_CHANGE_MAC_ADDR,
-	RTE_KNI_REQ_CHANGE_PROMISC,
-	RTE_KNI_REQ_CHANGE_ALLMULTI,
-	RTE_KNI_REQ_MAX,
-};
-
-/*
- * Structure for KNI request.
- */
-struct rte_kni_request {
-	uint32_t req_id;             /**< Request id */
-	RTE_STD_C11
-	union {
-		uint32_t new_mtu;    /**< New MTU */
-		uint8_t if_up;       /**< 1: interface up, 0: interface down */
-		uint8_t mac_addr[6]; /**< MAC address for interface */
-		uint8_t promiscusity;/**< 1: promisc mode enable, 0: disable */
-		uint8_t allmulti;    /**< 1: all-multicast mode enable, 0: disable */
-	};
-	int32_t async : 1;            /**< 1: request is asynchronous */
-	int32_t result;               /**< Result for processing request */
-} __attribute__((__packed__));
-
-/*
- * Fifo struct mapped in a shared memory. It describes a circular buffer FIFO
- * Write and read should wrap around. Fifo is empty when write == read
- * Writing should never overwrite the read position
- */
-struct rte_kni_fifo {
-#ifdef RTE_USE_C11_MEM_MODEL
-	unsigned write;              /**< Next position to be written*/
-	unsigned read;               /**< Next position to be read */
-#else
-	volatile unsigned write;     /**< Next position to be written*/
-	volatile unsigned read;      /**< Next position to be read */
-#endif
-	unsigned len;                /**< Circular buffer length */
-	unsigned elem_size;          /**< Pointer size - for 32/64 bit OS */
-	void *volatile buffer[];     /**< The buffer contains mbuf pointers */
-};
-
-/*
- * The kernel image of the rte_mbuf struct, with only the relevant fields.
- * Padding is necessary to assure the offsets of these fields
- */
-struct rte_kni_mbuf {
-	void *buf_addr __attribute__((__aligned__(RTE_CACHE_LINE_SIZE)));
-	uint64_t buf_iova;
-	uint16_t data_off;      /**< Start address of data in segment buffer. */
-	char pad1[2];
-	uint16_t nb_segs;       /**< Number of segments. */
-	char pad4[2];
-	uint64_t ol_flags;      /**< Offload features. */
-	char pad2[4];
-	uint32_t pkt_len;       /**< Total pkt len: sum of all segment data_len. */
-	uint16_t data_len;      /**< Amount of data in segment buffer. */
-	char pad3[14];
-	void *pool;
-
-	/* fields on second cache line */
-	__attribute__((__aligned__(RTE_CACHE_LINE_MIN_SIZE)))
-	void *next;             /**< Physical address of next mbuf in kernel. */
-};
-
-/*
- * Struct used to create a KNI device. Passed to the kernel in IOCTL call
- */
-
-struct rte_kni_device_info {
-	char name[RTE_KNI_NAMESIZE];  /**< Network device name for KNI */
-
-	phys_addr_t tx_phys;
-	phys_addr_t rx_phys;
-	phys_addr_t alloc_phys;
-	phys_addr_t free_phys;
-
-	/* Used by Ethtool */
-	phys_addr_t req_phys;
-	phys_addr_t resp_phys;
-	phys_addr_t sync_phys;
-	void * sync_va;
-
-	/* mbuf mempool */
-	void * mbuf_va;
-	phys_addr_t mbuf_phys;
-
-	uint16_t group_id;            /**< Group ID */
-	uint32_t core_id;             /**< core ID to bind for kernel thread */
-
-	__extension__
-	uint8_t force_bind : 1;       /**< Flag for kernel thread binding */
-
-	/* mbuf size */
-	unsigned mbuf_size;
-	unsigned int mtu;
-	unsigned int min_mtu;
-	unsigned int max_mtu;
-	uint8_t mac_addr[6];
-	uint8_t iova_mode;
-};
-
-#define KNI_DEVICE "kni"
-
-#define RTE_KNI_IOCTL_TEST    _IOWR(0, 1, int)
-#define RTE_KNI_IOCTL_CREATE  _IOWR(0, 2, struct rte_kni_device_info)
-#define RTE_KNI_IOCTL_RELEASE _IOWR(0, 3, struct rte_kni_device_info)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _RTE_KNI_COMMON_H_ */
diff --git a/lib/kni/rte_kni_fifo.h b/lib/kni/rte_kni_fifo.h
deleted file mode 100644
index d2ec82fe87fc..000000000000
--- a/lib/kni/rte_kni_fifo.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2014 Intel Corporation
- */
-
-
-
-/**
- * @internal when c11 memory model enabled use c11 atomic memory barrier.
- * when under non c11 memory model use rte_smp_* memory barrier.
- *
- * @param src
- *   Pointer to the source data.
- * @param dst
- *   Pointer to the destination data.
- * @param value
- *   Data value.
- */
-#ifdef RTE_USE_C11_MEM_MODEL
-#define __KNI_LOAD_ACQUIRE(src) ({                         \
-		__atomic_load_n((src), __ATOMIC_ACQUIRE);           \
-	})
-#define __KNI_STORE_RELEASE(dst, value) do {               \
-		__atomic_store_n((dst), value, __ATOMIC_RELEASE);   \
-	} while(0)
-#else
-#define __KNI_LOAD_ACQUIRE(src) ({                         \
-		typeof (*(src)) val = *(src);                       \
-		rte_smp_rmb();                                      \
-		val;                                                \
-	})
-#define __KNI_STORE_RELEASE(dst, value) do {               \
-		*(dst) = value;                                     \
-		rte_smp_wmb();                                      \
-	} while(0)
-#endif
-
-/**
- * Initializes the kni fifo structure
- */
-static void
-kni_fifo_init(struct rte_kni_fifo *fifo, unsigned size)
-{
-	/* Ensure size is power of 2 */
-	if (size & (size - 1))
-		rte_panic("KNI fifo size must be power of 2\n");
-
-	fifo->write = 0;
-	fifo->read = 0;
-	fifo->len = size;
-	fifo->elem_size = sizeof(void *);
-}
-
-/**
- * Adds num elements into the fifo. Return the number actually written
- */
-static inline unsigned
-kni_fifo_put(struct rte_kni_fifo *fifo, void **data, unsigned num)
-{
-	unsigned i = 0;
-	unsigned fifo_write = fifo->write;
-	unsigned new_write = fifo_write;
-	unsigned fifo_read = __KNI_LOAD_ACQUIRE(&fifo->read);
-
-	for (i = 0; i < num; i++) {
-		new_write = (new_write + 1) & (fifo->len - 1);
-
-		if (new_write == fifo_read)
-			break;
-		fifo->buffer[fifo_write] = data[i];
-		fifo_write = new_write;
-	}
-	__KNI_STORE_RELEASE(&fifo->write, fifo_write);
-	return i;
-}
-
-/**
- * Get up to num elements from the fifo. Return the number actually read
- */
-static inline unsigned
-kni_fifo_get(struct rte_kni_fifo *fifo, void **data, unsigned num)
-{
-	unsigned i = 0;
-	unsigned new_read = fifo->read;
-	unsigned fifo_write = __KNI_LOAD_ACQUIRE(&fifo->write);
-
-	for (i = 0; i < num; i++) {
-		if (new_read == fifo_write)
-			break;
-
-		data[i] = fifo->buffer[new_read];
-		new_read = (new_read + 1) & (fifo->len - 1);
-	}
-	__KNI_STORE_RELEASE(&fifo->read, new_read);
-	return i;
-}
-
-/**
- * Get the num of elements in the fifo
- */
-static inline uint32_t
-kni_fifo_count(struct rte_kni_fifo *fifo)
-{
-	unsigned fifo_write = __KNI_LOAD_ACQUIRE(&fifo->write);
-	unsigned fifo_read = __KNI_LOAD_ACQUIRE(&fifo->read);
-	return (fifo->len + fifo_write - fifo_read) & (fifo->len - 1);
-}
-
-/**
- * Get the num of available elements in the fifo
- */
-static inline uint32_t
-kni_fifo_free_count(struct rte_kni_fifo *fifo)
-{
-	uint32_t fifo_write = __KNI_LOAD_ACQUIRE(&fifo->write);
-	uint32_t fifo_read = __KNI_LOAD_ACQUIRE(&fifo->read);
-	return (fifo_read - fifo_write - 1) & (fifo->len - 1);
-}
diff --git a/lib/kni/version.map b/lib/kni/version.map
deleted file mode 100644
index 83bbbe880f43..000000000000
--- a/lib/kni/version.map
+++ /dev/null
@@ -1,24 +0,0 @@
-DPDK_23 {
-	global:
-
-	rte_kni_alloc;
-	rte_kni_close;
-	rte_kni_get;
-	rte_kni_get_name;
-	rte_kni_handle_request;
-	rte_kni_init;
-	rte_kni_register_handlers;
-	rte_kni_release;
-	rte_kni_rx_burst;
-	rte_kni_tx_burst;
-	rte_kni_unregister_handlers;
-
-	local: *;
-};
-
-EXPERIMENTAL {
-	global:
-
-	# updated in v21.08
-	rte_kni_update_link;
-};
diff --git a/lib/meson.build b/lib/meson.build
index fac2f52cad4f..06df4f57ad6e 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -39,7 +39,6 @@ libraries = [
         'gso',
         'ip_frag',
         'jobstats',
-        'kni',
         'latencystats',
         'lpm',
         'member',
@@ -75,7 +74,6 @@ optional_libs = [
         'graph',
         'gro',
         'gso',
-        'kni',
         'jobstats',
         'latencystats',
         'metrics',
@@ -90,7 +88,6 @@ optional_libs = [
 
 dpdk_libs_deprecated += [
         'flow_classify',
-        'kni',
 ]
 
 disabled_libs = []
diff --git a/lib/port/meson.build b/lib/port/meson.build
index 3ab37e2cb4b7..b0af2b185b39 100644
--- a/lib/port/meson.build
+++ b/lib/port/meson.build
@@ -45,9 +45,3 @@ if dpdk_conf.has('RTE_HAS_LIBPCAP')
     dpdk_conf.set('RTE_PORT_PCAP', 1)
     ext_deps += pcap_dep # dependency provided in config/meson.build
 endif
-
-if dpdk_conf.has('RTE_LIB_KNI')
-    sources += files('rte_port_kni.c')
-    headers += files('rte_port_kni.h')
-    deps += 'kni'
-endif
diff --git a/lib/port/rte_port_kni.c b/lib/port/rte_port_kni.c
deleted file mode 100644
index 1c7a6cb200ea..000000000000
--- a/lib/port/rte_port_kni.c
+++ /dev/null
@@ -1,515 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2016 Ethan Zhuang <zhuangwj@gmail.com>.
- * Copyright(c) 2016 Intel Corporation.
- */
-#include <string.h>
-
-#include <rte_malloc.h>
-#include <rte_kni.h>
-
-#include "rte_port_kni.h"
-
-/*
- * Port KNI Reader
- */
-#ifdef RTE_PORT_STATS_COLLECT
-
-#define RTE_PORT_KNI_READER_STATS_PKTS_IN_ADD(port, val) \
-	port->stats.n_pkts_in += val
-#define RTE_PORT_KNI_READER_STATS_PKTS_DROP_ADD(port, val) \
-	port->stats.n_pkts_drop += val
-
-#else
-
-#define RTE_PORT_KNI_READER_STATS_PKTS_IN_ADD(port, val)
-#define RTE_PORT_KNI_READER_STATS_PKTS_DROP_ADD(port, val)
-
-#endif
-
-struct rte_port_kni_reader {
-	struct rte_port_in_stats stats;
-
-	struct rte_kni *kni;
-};
-
-static void *
-rte_port_kni_reader_create(void *params, int socket_id)
-{
-	struct rte_port_kni_reader_params *conf =
-			params;
-	struct rte_port_kni_reader *port;
-
-	/* Check input parameters */
-	if (conf == NULL) {
-		RTE_LOG(ERR, PORT, "%s: params is NULL\n", __func__);
-		return NULL;
-	}
-
-	/* Memory allocation */
-	port = rte_zmalloc_socket("PORT", sizeof(*port),
-		RTE_CACHE_LINE_SIZE, socket_id);
-	if (port == NULL) {
-		RTE_LOG(ERR, PORT, "%s: Failed to allocate port\n", __func__);
-		return NULL;
-	}
-
-	/* Initialization */
-	port->kni = conf->kni;
-
-	return port;
-}
-
-static int
-rte_port_kni_reader_rx(void *port, struct rte_mbuf **pkts, uint32_t n_pkts)
-{
-	struct rte_port_kni_reader *p =
-			port;
-	uint16_t rx_pkt_cnt;
-
-	rx_pkt_cnt = rte_kni_rx_burst(p->kni, pkts, n_pkts);
-	RTE_PORT_KNI_READER_STATS_PKTS_IN_ADD(p, rx_pkt_cnt);
-	return rx_pkt_cnt;
-}
-
-static int
-rte_port_kni_reader_free(void *port)
-{
-	if (port == NULL) {
-		RTE_LOG(ERR, PORT, "%s: port is NULL\n", __func__);
-		return -EINVAL;
-	}
-
-	rte_free(port);
-
-	return 0;
-}
-
-static int rte_port_kni_reader_stats_read(void *port,
-	struct rte_port_in_stats *stats, int clear)
-{
-	struct rte_port_kni_reader *p =
-			port;
-
-	if (stats != NULL)
-		memcpy(stats, &p->stats, sizeof(p->stats));
-
-	if (clear)
-		memset(&p->stats, 0, sizeof(p->stats));
-
-	return 0;
-}
-
-/*
- * Port KNI Writer
- */
-#ifdef RTE_PORT_STATS_COLLECT
-
-#define RTE_PORT_KNI_WRITER_STATS_PKTS_IN_ADD(port, val) \
-	port->stats.n_pkts_in += val
-#define RTE_PORT_KNI_WRITER_STATS_PKTS_DROP_ADD(port, val) \
-	port->stats.n_pkts_drop += val
-
-#else
-
-#define RTE_PORT_KNI_WRITER_STATS_PKTS_IN_ADD(port, val)
-#define RTE_PORT_KNI_WRITER_STATS_PKTS_DROP_ADD(port, val)
-
-#endif
-
-struct rte_port_kni_writer {
-	struct rte_port_out_stats stats;
-
-	struct rte_mbuf *tx_buf[2 * RTE_PORT_IN_BURST_SIZE_MAX];
-	uint32_t tx_burst_sz;
-	uint32_t tx_buf_count;
-	uint64_t bsz_mask;
-	struct rte_kni *kni;
-};
-
-static void *
-rte_port_kni_writer_create(void *params, int socket_id)
-{
-	struct rte_port_kni_writer_params *conf =
-			params;
-	struct rte_port_kni_writer *port;
-
-	/* Check input parameters */
-	if ((conf == NULL) ||
-		(conf->tx_burst_sz == 0) ||
-		(conf->tx_burst_sz > RTE_PORT_IN_BURST_SIZE_MAX) ||
-		(!rte_is_power_of_2(conf->tx_burst_sz))) {
-		RTE_LOG(ERR, PORT, "%s: Invalid input parameters\n", __func__);
-		return NULL;
-	}
-
-	/* Memory allocation */
-	port = rte_zmalloc_socket("PORT", sizeof(*port),
-		RTE_CACHE_LINE_SIZE, socket_id);
-	if (port == NULL) {
-		RTE_LOG(ERR, PORT, "%s: Failed to allocate port\n", __func__);
-		return NULL;
-	}
-
-	/* Initialization */
-	port->kni = conf->kni;
-	port->tx_burst_sz = conf->tx_burst_sz;
-	port->tx_buf_count = 0;
-	port->bsz_mask = 1LLU << (conf->tx_burst_sz - 1);
-
-	return port;
-}
-
-static inline void
-send_burst(struct rte_port_kni_writer *p)
-{
-	uint32_t nb_tx;
-
-	nb_tx = rte_kni_tx_burst(p->kni, p->tx_buf, p->tx_buf_count);
-
-	RTE_PORT_KNI_WRITER_STATS_PKTS_DROP_ADD(p, p->tx_buf_count - nb_tx);
-	for (; nb_tx < p->tx_buf_count; nb_tx++)
-		rte_pktmbuf_free(p->tx_buf[nb_tx]);
-
-	p->tx_buf_count = 0;
-}
-
-static int
-rte_port_kni_writer_tx(void *port, struct rte_mbuf *pkt)
-{
-	struct rte_port_kni_writer *p =
-			port;
-
-	p->tx_buf[p->tx_buf_count++] = pkt;
-	RTE_PORT_KNI_WRITER_STATS_PKTS_IN_ADD(p, 1);
-	if (p->tx_buf_count >= p->tx_burst_sz)
-		send_burst(p);
-
-	return 0;
-}
-
-static int
-rte_port_kni_writer_tx_bulk(void *port,
-	struct rte_mbuf **pkts,
-	uint64_t pkts_mask)
-{
-	struct rte_port_kni_writer *p =
-			port;
-	uint64_t bsz_mask = p->bsz_mask;
-	uint32_t tx_buf_count = p->tx_buf_count;
-	uint64_t expr = (pkts_mask & (pkts_mask + 1)) |
-					((pkts_mask & bsz_mask) ^ bsz_mask);
-
-	if (expr == 0) {
-		uint64_t n_pkts = __builtin_popcountll(pkts_mask);
-		uint32_t n_pkts_ok;
-
-		if (tx_buf_count)
-			send_burst(p);
-
-		RTE_PORT_KNI_WRITER_STATS_PKTS_IN_ADD(p, n_pkts);
-		n_pkts_ok = rte_kni_tx_burst(p->kni, pkts, n_pkts);
-
-		RTE_PORT_KNI_WRITER_STATS_PKTS_DROP_ADD(p, n_pkts - n_pkts_ok);
-		for (; n_pkts_ok < n_pkts; n_pkts_ok++) {
-			struct rte_mbuf *pkt = pkts[n_pkts_ok];
-
-			rte_pktmbuf_free(pkt);
-		}
-	} else {
-		for (; pkts_mask;) {
-			uint32_t pkt_index = __builtin_ctzll(pkts_mask);
-			uint64_t pkt_mask = 1LLU << pkt_index;
-			struct rte_mbuf *pkt = pkts[pkt_index];
-
-			p->tx_buf[tx_buf_count++] = pkt;
-			RTE_PORT_KNI_WRITER_STATS_PKTS_IN_ADD(p, 1);
-			pkts_mask &= ~pkt_mask;
-		}
-
-		p->tx_buf_count = tx_buf_count;
-		if (tx_buf_count >= p->tx_burst_sz)
-			send_burst(p);
-	}
-
-	return 0;
-}
-
-static int
-rte_port_kni_writer_flush(void *port)
-{
-	struct rte_port_kni_writer *p =
-			port;
-
-	if (p->tx_buf_count > 0)
-		send_burst(p);
-
-	return 0;
-}
-
-static int
-rte_port_kni_writer_free(void *port)
-{
-	if (port == NULL) {
-		RTE_LOG(ERR, PORT, "%s: Port is NULL\n", __func__);
-		return -EINVAL;
-	}
-
-	rte_port_kni_writer_flush(port);
-	rte_free(port);
-
-	return 0;
-}
-
-static int rte_port_kni_writer_stats_read(void *port,
-	struct rte_port_out_stats *stats, int clear)
-{
-	struct rte_port_kni_writer *p =
-			port;
-
-	if (stats != NULL)
-		memcpy(stats, &p->stats, sizeof(p->stats));
-
-	if (clear)
-		memset(&p->stats, 0, sizeof(p->stats));
-
-	return 0;
-}
-
-/*
- * Port KNI Writer Nodrop
- */
-#ifdef RTE_PORT_STATS_COLLECT
-
-#define RTE_PORT_KNI_WRITER_NODROP_STATS_PKTS_IN_ADD(port, val) \
-	port->stats.n_pkts_in += val
-#define RTE_PORT_KNI_WRITER_NODROP_STATS_PKTS_DROP_ADD(port, val) \
-	port->stats.n_pkts_drop += val
-
-#else
-
-#define RTE_PORT_KNI_WRITER_NODROP_STATS_PKTS_IN_ADD(port, val)
-#define RTE_PORT_KNI_WRITER_NODROP_STATS_PKTS_DROP_ADD(port, val)
-
-#endif
-
-struct rte_port_kni_writer_nodrop {
-	struct rte_port_out_stats stats;
-
-	struct rte_mbuf *tx_buf[2 * RTE_PORT_IN_BURST_SIZE_MAX];
-	uint32_t tx_burst_sz;
-	uint32_t tx_buf_count;
-	uint64_t bsz_mask;
-	uint64_t n_retries;
-	struct rte_kni *kni;
-};
-
-static void *
-rte_port_kni_writer_nodrop_create(void *params, int socket_id)
-{
-	struct rte_port_kni_writer_nodrop_params *conf =
-		params;
-	struct rte_port_kni_writer_nodrop *port;
-
-	/* Check input parameters */
-	if ((conf == NULL) ||
-		(conf->tx_burst_sz == 0) ||
-		(conf->tx_burst_sz > RTE_PORT_IN_BURST_SIZE_MAX) ||
-		(!rte_is_power_of_2(conf->tx_burst_sz))) {
-		RTE_LOG(ERR, PORT, "%s: Invalid input parameters\n", __func__);
-		return NULL;
-	}
-
-	/* Memory allocation */
-	port = rte_zmalloc_socket("PORT", sizeof(*port),
-		RTE_CACHE_LINE_SIZE, socket_id);
-	if (port == NULL) {
-		RTE_LOG(ERR, PORT, "%s: Failed to allocate port\n", __func__);
-		return NULL;
-	}
-
-	/* Initialization */
-	port->kni = conf->kni;
-	port->tx_burst_sz = conf->tx_burst_sz;
-	port->tx_buf_count = 0;
-	port->bsz_mask = 1LLU << (conf->tx_burst_sz - 1);
-
-	/*
-	 * When n_retries is 0 it means that we should wait for every packet to
-	 * send no matter how many retries should it take. To limit number of
-	 * branches in fast path, we use UINT64_MAX instead of branching.
-	 */
-	port->n_retries = (conf->n_retries == 0) ? UINT64_MAX : conf->n_retries;
-
-	return port;
-}
-
-static inline void
-send_burst_nodrop(struct rte_port_kni_writer_nodrop *p)
-{
-	uint32_t nb_tx = 0, i;
-
-	nb_tx = rte_kni_tx_burst(p->kni, p->tx_buf, p->tx_buf_count);
-
-	/* We sent all the packets in a first try */
-	if (nb_tx >= p->tx_buf_count) {
-		p->tx_buf_count = 0;
-		return;
-	}
-
-	for (i = 0; i < p->n_retries; i++) {
-		nb_tx += rte_kni_tx_burst(p->kni,
-			p->tx_buf + nb_tx,
-			p->tx_buf_count - nb_tx);
-
-		/* We sent all the packets in more than one try */
-		if (nb_tx >= p->tx_buf_count) {
-			p->tx_buf_count = 0;
-			return;
-		}
-	}
-
-	/* We didn't send the packets in maximum allowed attempts */
-	RTE_PORT_KNI_WRITER_NODROP_STATS_PKTS_DROP_ADD(p, p->tx_buf_count - nb_tx);
-	for ( ; nb_tx < p->tx_buf_count; nb_tx++)
-		rte_pktmbuf_free(p->tx_buf[nb_tx]);
-
-	p->tx_buf_count = 0;
-}
-
-static int
-rte_port_kni_writer_nodrop_tx(void *port, struct rte_mbuf *pkt)
-{
-	struct rte_port_kni_writer_nodrop *p =
-			port;
-
-	p->tx_buf[p->tx_buf_count++] = pkt;
-	RTE_PORT_KNI_WRITER_STATS_PKTS_IN_ADD(p, 1);
-	if (p->tx_buf_count >= p->tx_burst_sz)
-		send_burst_nodrop(p);
-
-	return 0;
-}
-
-static int
-rte_port_kni_writer_nodrop_tx_bulk(void *port,
-	struct rte_mbuf **pkts,
-	uint64_t pkts_mask)
-{
-	struct rte_port_kni_writer_nodrop *p =
-			port;
-
-	uint64_t bsz_mask = p->bsz_mask;
-	uint32_t tx_buf_count = p->tx_buf_count;
-	uint64_t expr = (pkts_mask & (pkts_mask + 1)) |
-					((pkts_mask & bsz_mask) ^ bsz_mask);
-
-	if (expr == 0) {
-		uint64_t n_pkts = __builtin_popcountll(pkts_mask);
-		uint32_t n_pkts_ok;
-
-		if (tx_buf_count)
-			send_burst_nodrop(p);
-
-		RTE_PORT_KNI_WRITER_NODROP_STATS_PKTS_IN_ADD(p, n_pkts);
-		n_pkts_ok = rte_kni_tx_burst(p->kni, pkts, n_pkts);
-
-		if (n_pkts_ok >= n_pkts)
-			return 0;
-
-		/*
-		 * If we didn't manage to send all packets in single burst, move
-		 * remaining packets to the buffer and call send burst.
-		 */
-		for (; n_pkts_ok < n_pkts; n_pkts_ok++) {
-			struct rte_mbuf *pkt = pkts[n_pkts_ok];
-			p->tx_buf[p->tx_buf_count++] = pkt;
-		}
-		send_burst_nodrop(p);
-	} else {
-		for ( ; pkts_mask; ) {
-			uint32_t pkt_index = __builtin_ctzll(pkts_mask);
-			uint64_t pkt_mask = 1LLU << pkt_index;
-			struct rte_mbuf *pkt = pkts[pkt_index];
-
-			p->tx_buf[tx_buf_count++] = pkt;
-			RTE_PORT_KNI_WRITER_NODROP_STATS_PKTS_IN_ADD(p, 1);
-			pkts_mask &= ~pkt_mask;
-		}
-
-		p->tx_buf_count = tx_buf_count;
-		if (tx_buf_count >= p->tx_burst_sz)
-			send_burst_nodrop(p);
-	}
-
-	return 0;
-}
-
-static int
-rte_port_kni_writer_nodrop_flush(void *port)
-{
-	struct rte_port_kni_writer_nodrop *p =
-		port;
-
-	if (p->tx_buf_count > 0)
-		send_burst_nodrop(p);
-
-	return 0;
-}
-
-static int
-rte_port_kni_writer_nodrop_free(void *port)
-{
-	if (port == NULL) {
-		RTE_LOG(ERR, PORT, "%s: Port is NULL\n", __func__);
-		return -EINVAL;
-	}
-
-	rte_port_kni_writer_nodrop_flush(port);
-	rte_free(port);
-
-	return 0;
-}
-
-static int rte_port_kni_writer_nodrop_stats_read(void *port,
-	struct rte_port_out_stats *stats, int clear)
-{
-	struct rte_port_kni_writer_nodrop *p =
-			port;
-
-	if (stats != NULL)
-		memcpy(stats, &p->stats, sizeof(p->stats));
-
-	if (clear)
-		memset(&p->stats, 0, sizeof(p->stats));
-
-	return 0;
-}
-
-
-/*
- * Summary of port operations
- */
-struct rte_port_in_ops rte_port_kni_reader_ops = {
-	.f_create = rte_port_kni_reader_create,
-	.f_free = rte_port_kni_reader_free,
-	.f_rx = rte_port_kni_reader_rx,
-	.f_stats = rte_port_kni_reader_stats_read,
-};
-
-struct rte_port_out_ops rte_port_kni_writer_ops = {
-	.f_create = rte_port_kni_writer_create,
-	.f_free = rte_port_kni_writer_free,
-	.f_tx = rte_port_kni_writer_tx,
-	.f_tx_bulk = rte_port_kni_writer_tx_bulk,
-	.f_flush = rte_port_kni_writer_flush,
-	.f_stats = rte_port_kni_writer_stats_read,
-};
-
-struct rte_port_out_ops rte_port_kni_writer_nodrop_ops = {
-	.f_create = rte_port_kni_writer_nodrop_create,
-	.f_free = rte_port_kni_writer_nodrop_free,
-	.f_tx = rte_port_kni_writer_nodrop_tx,
-	.f_tx_bulk = rte_port_kni_writer_nodrop_tx_bulk,
-	.f_flush = rte_port_kni_writer_nodrop_flush,
-	.f_stats = rte_port_kni_writer_nodrop_stats_read,
-};
diff --git a/lib/port/rte_port_kni.h b/lib/port/rte_port_kni.h
deleted file mode 100644
index 280f58c121e2..000000000000
--- a/lib/port/rte_port_kni.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2016 Ethan Zhuang <zhuangwj@gmail.com>.
- * Copyright(c) 2016 Intel Corporation.
- */
-
-#ifndef __INCLUDE_RTE_PORT_KNI_H__
-#define __INCLUDE_RTE_PORT_KNI_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @file
- * RTE Port KNI Interface
- *
- * kni_reader: input port built on top of pre-initialized KNI interface
- * kni_writer: output port built on top of pre-initialized KNI interface
- */
-
-#include <stdint.h>
-
-#include "rte_port.h"
-
-/** kni_reader port parameters */
-struct rte_port_kni_reader_params {
-	/** KNI interface reference */
-	struct rte_kni *kni;
-};
-
-/** kni_reader port operations */
-extern struct rte_port_in_ops rte_port_kni_reader_ops;
-
-
-/** kni_writer port parameters */
-struct rte_port_kni_writer_params {
-	/** KNI interface reference */
-	struct rte_kni *kni;
-	/** Burst size to KNI interface. */
-	uint32_t tx_burst_sz;
-};
-
-/** kni_writer port operations */
-extern struct rte_port_out_ops rte_port_kni_writer_ops;
-
-/** kni_writer_nodrop port parameters */
-struct rte_port_kni_writer_nodrop_params {
-	/** KNI interface reference */
-	struct rte_kni *kni;
-	/** Burst size to KNI interface. */
-	uint32_t tx_burst_sz;
-	/** Maximum number of retries, 0 for no limit */
-	uint32_t n_retries;
-};
-
-/** kni_writer_nodrop port operations */
-extern struct rte_port_out_ops rte_port_kni_writer_nodrop_ops;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/lib/port/version.map b/lib/port/version.map
index af6cf696fd54..d67a03650d8b 100644
--- a/lib/port/version.map
+++ b/lib/port/version.map
@@ -7,9 +7,6 @@ DPDK_23 {
 	rte_port_fd_reader_ops;
 	rte_port_fd_writer_nodrop_ops;
 	rte_port_fd_writer_ops;
-	rte_port_kni_reader_ops;
-	rte_port_kni_writer_nodrop_ops;
-	rte_port_kni_writer_ops;
 	rte_port_ring_multi_reader_ops;
 	rte_port_ring_multi_writer_nodrop_ops;
 	rte_port_ring_multi_writer_ops;
diff --git a/meson_options.txt b/meson_options.txt
index 82c8297065f0..7b67e0203f8f 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -10,7 +10,7 @@ option('disable_apps', type: 'string', value: '', description:
        'Comma-separated list of apps to explicitly disable.')
 option('disable_drivers', type: 'string', value: '', description:
        'Comma-separated list of drivers to explicitly disable.')
-option('disable_libs', type: 'string', value: 'flow_classify,kni', description:
+option('disable_libs', type: 'string', value: 'flow_classify', description:
        'Comma-separated list of libraries to explicitly disable. [NOTE: not all libs can be disabled]')
 option('drivers_install_subdir', type: 'string', value: 'dpdk/pmds-<VERSION>', description:
        'Subdirectory of libdir where to install PMDs. Defaults to using a versioned subdirectory.')
-- 
2.39.2


^ permalink raw reply	[relevance 1%]

* [PATCH] kni: remove deprecated kernel network interface
@ 2023-07-29 22:54  1% Stephen Hemminger
  2023-07-30  2:12  1% ` [PATCH v2] " Stephen Hemminger
  0 siblings, 1 reply; 200+ results
From: Stephen Hemminger @ 2023-07-29 22:54 UTC (permalink / raw)
  To: dev
  Cc: Stephen Hemminger, Thomas Monjalon, Maxime Coquelin, Chenbo Xia,
	Anatoly Burakov, Cristian Dumitrescu, Nithin Dabilpuram,
	Kiran Kumar K, Sunil Kumar Kori, Satha Rao, Bruce Richardson

Deprecation and removal was announced in 22.11.
Make it so.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 MAINTAINERS                                   |  10 -
 app/test/meson.build                          |   2 -
 app/test/test_kni.c                           | 740 ---------------
 doc/api/doxy-api-index.md                     |   2 -
 doc/api/doxy-api.conf.in                      |   1 -
 doc/guides/contributing/documentation.rst     |   2 +-
 doc/guides/howto/flow_bifurcation.rst         |   3 +-
 doc/guides/nics/index.rst                     |   1 -
 doc/guides/nics/kni.rst                       | 170 ----
 doc/guides/nics/virtio.rst                    |  92 +-
 .../prog_guide/env_abstraction_layer.rst      |   2 -
 doc/guides/prog_guide/glossary.rst            |   3 -
 doc/guides/prog_guide/index.rst               |   1 -
 .../prog_guide/kernel_nic_interface.rst       | 423 ---------
 doc/guides/prog_guide/packet_framework.rst    |   9 +-
 doc/guides/rel_notes/deprecation.rst          |   9 +-
 doc/guides/rel_notes/release_23_11.rst        |  16 +
 doc/guides/sample_app_ug/ip_pipeline.rst      |  22 -
 drivers/net/cnxk/cnxk_ethdev.c                |   2 +-
 drivers/net/kni/meson.build                   |  11 -
 drivers/net/kni/rte_eth_kni.c                 | 524 -----------
 drivers/net/meson.build                       |   1 -
 examples/ip_pipeline/Makefile                 |   1 -
 examples/ip_pipeline/cli.c                    |  95 --
 examples/ip_pipeline/examples/kni.cli         |  69 --
 examples/ip_pipeline/kni.c                    | 168 ----
 examples/ip_pipeline/kni.h                    |  46 -
 examples/ip_pipeline/main.c                   |  10 -
 examples/ip_pipeline/meson.build              |   1 -
 examples/ip_pipeline/pipeline.c               |  57 --
 examples/ip_pipeline/pipeline.h               |   2 -
 kernel/linux/kni/Kbuild                       |   6 -
 kernel/linux/kni/compat.h                     | 157 ----
 kernel/linux/kni/kni_dev.h                    | 137 ---
 kernel/linux/kni/kni_fifo.h                   |  87 --
 kernel/linux/kni/kni_misc.c                   | 719 --------------
 kernel/linux/kni/kni_net.c                    | 878 ------------------
 kernel/linux/kni/meson.build                  |  41 -
 kernel/linux/meson.build                      | 103 --
 lib/eal/common/eal_common_log.c               |   1 -
 lib/eal/include/rte_log.h                     |   2 +-
 lib/eal/linux/eal.c                           |  19 -
 lib/kni/meson.build                           |  21 -
 lib/kni/rte_kni.c                             | 843 -----------------
 lib/kni/rte_kni.h                             | 269 ------
 lib/kni/rte_kni_common.h                      | 147 ---
 lib/kni/rte_kni_fifo.h                        | 117 ---
 lib/kni/version.map                           |  24 -
 lib/meson.build                               |   3 -
 lib/port/meson.build                          |   6 -
 lib/port/rte_port_kni.c                       | 515 ----------
 lib/port/rte_port_kni.h                       |  63 --
 lib/port/version.map                          |   3 -
 meson_options.txt                             |   2 +-
 54 files changed, 26 insertions(+), 6632 deletions(-)
 delete mode 100644 app/test/test_kni.c
 delete mode 100644 doc/guides/nics/kni.rst
 delete mode 100644 doc/guides/prog_guide/kernel_nic_interface.rst
 create mode 100644 doc/guides/rel_notes/release_23_11.rst
 delete mode 100644 drivers/net/kni/meson.build
 delete mode 100644 drivers/net/kni/rte_eth_kni.c
 delete mode 100644 examples/ip_pipeline/examples/kni.cli
 delete mode 100644 examples/ip_pipeline/kni.c
 delete mode 100644 examples/ip_pipeline/kni.h
 delete mode 100644 kernel/linux/kni/Kbuild
 delete mode 100644 kernel/linux/kni/compat.h
 delete mode 100644 kernel/linux/kni/kni_dev.h
 delete mode 100644 kernel/linux/kni/kni_fifo.h
 delete mode 100644 kernel/linux/kni/kni_misc.c
 delete mode 100644 kernel/linux/kni/kni_net.c
 delete mode 100644 kernel/linux/kni/meson.build
 delete mode 100644 kernel/linux/meson.build
 delete mode 100644 lib/kni/meson.build
 delete mode 100644 lib/kni/rte_kni.c
 delete mode 100644 lib/kni/rte_kni.h
 delete mode 100644 lib/kni/rte_kni_common.h
 delete mode 100644 lib/kni/rte_kni_fifo.h
 delete mode 100644 lib/kni/version.map
 delete mode 100644 lib/port/rte_port_kni.c
 delete mode 100644 lib/port/rte_port_kni.h

diff --git a/MAINTAINERS b/MAINTAINERS
index 18bc05fccd0d..6ad45569bcd2 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -617,12 +617,6 @@ F: doc/guides/prog_guide/link_bonding_poll_mode_drv_lib.rst
 F: app/test/test_link_bonding*
 F: examples/bond/
 
-Linux KNI
-F: kernel/linux/kni/
-F: lib/kni/
-F: doc/guides/prog_guide/kernel_nic_interface.rst
-F: app/test/test_kni.c
-
 Linux AF_PACKET
 M: John W. Linville <linville@tuxdriver.com>
 F: drivers/net/af_packet/
@@ -1027,10 +1021,6 @@ F: drivers/net/tap/
 F: doc/guides/nics/tap.rst
 F: doc/guides/nics/features/tap.ini
 
-KNI PMD
-F: drivers/net/kni/
-F: doc/guides/nics/kni.rst
-
 Ring PMD
 M: Bruce Richardson <bruce.richardson@intel.com>
 F: drivers/net/ring/
diff --git a/app/test/meson.build b/app/test/meson.build
index b89cf0368fb5..de895cc8fc52 100644
--- a/app/test/meson.build
+++ b/app/test/meson.build
@@ -72,7 +72,6 @@ test_sources = files(
         'test_ipsec.c',
         'test_ipsec_sad.c',
         'test_ipsec_perf.c',
-        'test_kni.c',
         'test_kvargs.c',
         'test_lcores.c',
         'test_logs.c',
@@ -237,7 +236,6 @@ fast_tests = [
         ['fbarray_autotest', true, true],
         ['hash_readwrite_func_autotest', false, true],
         ['ipsec_autotest', true, true],
-        ['kni_autotest', false, true],
         ['kvargs_autotest', true, true],
         ['member_autotest', true, true],
         ['power_cpufreq_autotest', false, true],
diff --git a/app/test/test_kni.c b/app/test/test_kni.c
deleted file mode 100644
index 4039da0b080c..000000000000
--- a/app/test/test_kni.c
+++ /dev/null
@@ -1,740 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2014 Intel Corporation
- */
-
-#include "test.h"
-
-#include <stdio.h>
-#include <stdint.h>
-#include <unistd.h>
-#include <string.h>
-#if !defined(RTE_EXEC_ENV_LINUX) || !defined(RTE_LIB_KNI)
-
-static int
-test_kni(void)
-{
-	printf("KNI not supported, skipping test\n");
-	return TEST_SKIPPED;
-}
-
-#else
-
-#include <sys/wait.h>
-#include <dirent.h>
-
-#include <rte_string_fns.h>
-#include <rte_mempool.h>
-#include <rte_ethdev.h>
-#include <rte_cycles.h>
-#include <rte_kni.h>
-
-#define NB_MBUF          8192
-#define MAX_PACKET_SZ    2048
-#define MBUF_DATA_SZ     (MAX_PACKET_SZ + RTE_PKTMBUF_HEADROOM)
-#define PKT_BURST_SZ     32
-#define MEMPOOL_CACHE_SZ PKT_BURST_SZ
-#define SOCKET           0
-#define NB_RXD           1024
-#define NB_TXD           1024
-#define KNI_TIMEOUT_MS   5000 /* ms */
-
-#define IFCONFIG      "/sbin/ifconfig "
-#define TEST_KNI_PORT "test_kni_port"
-#define KNI_MODULE_PATH "/sys/module/rte_kni"
-#define KNI_MODULE_PARAM_LO KNI_MODULE_PATH"/parameters/lo_mode"
-#define KNI_TEST_MAX_PORTS 4
-/* The threshold number of mbufs to be transmitted or received. */
-#define KNI_NUM_MBUF_THRESHOLD 100
-static int kni_pkt_mtu = 0;
-
-struct test_kni_stats {
-	volatile uint64_t ingress;
-	volatile uint64_t egress;
-};
-
-static const struct rte_eth_rxconf rx_conf = {
-	.rx_thresh = {
-		.pthresh = 8,
-		.hthresh = 8,
-		.wthresh = 4,
-	},
-	.rx_free_thresh = 0,
-};
-
-static const struct rte_eth_txconf tx_conf = {
-	.tx_thresh = {
-		.pthresh = 36,
-		.hthresh = 0,
-		.wthresh = 0,
-	},
-	.tx_free_thresh = 0,
-	.tx_rs_thresh = 0,
-};
-
-static const struct rte_eth_conf port_conf = {
-	.txmode = {
-		.mq_mode = RTE_ETH_MQ_TX_NONE,
-	},
-};
-
-static struct rte_kni_ops kni_ops = {
-	.change_mtu = NULL,
-	.config_network_if = NULL,
-	.config_mac_address = NULL,
-	.config_promiscusity = NULL,
-};
-
-static unsigned int lcore_main, lcore_ingress, lcore_egress;
-static struct rte_kni *test_kni_ctx;
-static struct test_kni_stats stats;
-
-static volatile uint32_t test_kni_processing_flag;
-
-static struct rte_mempool *
-test_kni_create_mempool(void)
-{
-	struct rte_mempool * mp;
-
-	mp = rte_mempool_lookup("kni_mempool");
-	if (!mp)
-		mp = rte_pktmbuf_pool_create("kni_mempool",
-				NB_MBUF,
-				MEMPOOL_CACHE_SZ, 0, MBUF_DATA_SZ,
-				SOCKET);
-
-	return mp;
-}
-
-static struct rte_mempool *
-test_kni_lookup_mempool(void)
-{
-	return rte_mempool_lookup("kni_mempool");
-}
-/* Callback for request of changing MTU */
-static int
-kni_change_mtu(uint16_t port_id, unsigned int new_mtu)
-{
-	printf("Change MTU of port %d to %u\n", port_id, new_mtu);
-	kni_pkt_mtu = new_mtu;
-	printf("Change MTU of port %d to %i successfully.\n",
-					 port_id, kni_pkt_mtu);
-	return 0;
-}
-
-static int
-test_kni_link_change(void)
-{
-	int ret;
-	int pid;
-
-	pid = fork();
-	if (pid < 0) {
-		printf("Error: Failed to fork a process\n");
-		return -1;
-	}
-
-	if (pid == 0) {
-		printf("Starting KNI Link status change tests.\n");
-		if (system(IFCONFIG TEST_KNI_PORT" up") == -1) {
-			ret = -1;
-			goto error;
-		}
-
-		ret = rte_kni_update_link(test_kni_ctx, 1);
-		if (ret < 0) {
-			printf("Failed to change link state to Up ret=%d.\n",
-				ret);
-			goto error;
-		}
-		rte_delay_ms(1000);
-		printf("KNI: Set LINKUP, previous state=%d\n", ret);
-
-		ret = rte_kni_update_link(test_kni_ctx, 0);
-		if (ret != 1) {
-			printf(
-		"Failed! Previous link state should be 1, returned %d.\n",
-				ret);
-			goto error;
-		}
-		rte_delay_ms(1000);
-		printf("KNI: Set LINKDOWN, previous state=%d\n", ret);
-
-		ret = rte_kni_update_link(test_kni_ctx, 1);
-		if (ret != 0) {
-			printf(
-		"Failed! Previous link state should be 0, returned %d.\n",
-				ret);
-			goto error;
-		}
-		printf("KNI: Set LINKUP, previous state=%d\n", ret);
-
-		ret = 0;
-		rte_delay_ms(1000);
-
-error:
-		if (system(IFCONFIG TEST_KNI_PORT" down") == -1)
-			ret = -1;
-
-		printf("KNI: Link status change tests: %s.\n",
-			(ret == 0) ? "Passed" : "Failed");
-		exit(ret);
-	} else {
-		int p_ret, status;
-
-		while (1) {
-			p_ret = waitpid(pid, &status, WNOHANG);
-			if (p_ret != 0) {
-				if (WIFEXITED(status))
-					return WEXITSTATUS(status);
-				return -1;
-			}
-			rte_delay_ms(10);
-			rte_kni_handle_request(test_kni_ctx);
-		}
-	}
-}
-/**
- * This loop fully tests the basic functions of KNI. e.g. transmitting,
- * receiving to, from kernel space, and kernel requests.
- *
- * This is the loop to transmit/receive mbufs to/from kernel interface with
- * supported by KNI kernel module. The ingress lcore will allocate mbufs and
- * transmit them to kernel space; while the egress lcore will receive the mbufs
- * from kernel space and free them.
- * On the main lcore, several commands will be run to check handling the
- * kernel requests. And it will finally set the flag to exit the KNI
- * transmitting/receiving to/from the kernel space.
- *
- * Note: To support this testing, the KNI kernel module needs to be insmodded
- * in one of its loopback modes.
- */
-static int
-test_kni_loop(__rte_unused void *arg)
-{
-	int ret = 0;
-	unsigned nb_rx, nb_tx, num, i;
-	const unsigned lcore_id = rte_lcore_id();
-	struct rte_mbuf *pkts_burst[PKT_BURST_SZ];
-
-	if (lcore_id == lcore_main) {
-		rte_delay_ms(KNI_TIMEOUT_MS);
-		/* tests of handling kernel request */
-		if (system(IFCONFIG TEST_KNI_PORT" up") == -1)
-			ret = -1;
-		if (system(IFCONFIG TEST_KNI_PORT" mtu 1400") == -1)
-			ret = -1;
-		if (system(IFCONFIG TEST_KNI_PORT" down") == -1)
-			ret = -1;
-		rte_delay_ms(KNI_TIMEOUT_MS);
-		test_kni_processing_flag = 1;
-	} else if (lcore_id == lcore_ingress) {
-		struct rte_mempool *mp = test_kni_lookup_mempool();
-
-		if (mp == NULL)
-			return -1;
-
-		while (1) {
-			if (test_kni_processing_flag)
-				break;
-
-			for (nb_rx = 0; nb_rx < PKT_BURST_SZ; nb_rx++) {
-				pkts_burst[nb_rx] = rte_pktmbuf_alloc(mp);
-				if (!pkts_burst[nb_rx])
-					break;
-			}
-
-			num = rte_kni_tx_burst(test_kni_ctx, pkts_burst,
-								nb_rx);
-			stats.ingress += num;
-			rte_kni_handle_request(test_kni_ctx);
-			if (num < nb_rx) {
-				for (i = num; i < nb_rx; i++) {
-					rte_pktmbuf_free(pkts_burst[i]);
-				}
-			}
-			rte_delay_ms(10);
-		}
-	} else if (lcore_id == lcore_egress) {
-		while (1) {
-			if (test_kni_processing_flag)
-				break;
-			num = rte_kni_rx_burst(test_kni_ctx, pkts_burst,
-							PKT_BURST_SZ);
-			stats.egress += num;
-			for (nb_tx = 0; nb_tx < num; nb_tx++)
-				rte_pktmbuf_free(pkts_burst[nb_tx]);
-			rte_delay_ms(10);
-		}
-	}
-
-	return ret;
-}
-
-static int
-test_kni_allocate_lcores(void)
-{
-	unsigned i, count = 0;
-
-	lcore_main = rte_get_main_lcore();
-	printf("main lcore: %u\n", lcore_main);
-	for (i = 0; i < RTE_MAX_LCORE; i++) {
-		if (count >=2 )
-			break;
-		if (rte_lcore_is_enabled(i) && i != lcore_main) {
-			count ++;
-			if (count == 1)
-				lcore_ingress = i;
-			else if (count == 2)
-				lcore_egress = i;
-		}
-	}
-	printf("count: %u\n", count);
-
-	return count == 2 ? 0 : -1;
-}
-
-static int
-test_kni_register_handler_mp(void)
-{
-#define TEST_KNI_HANDLE_REQ_COUNT    10  /* 5s */
-#define TEST_KNI_HANDLE_REQ_INTERVAL 500 /* ms */
-#define TEST_KNI_MTU                 1450
-#define TEST_KNI_MTU_STR             " 1450"
-	int pid;
-
-	pid = fork();
-	if (pid < 0) {
-		printf("Failed to fork a process\n");
-		return -1;
-	} else if (pid == 0) {
-		int i;
-		struct rte_kni *kni = rte_kni_get(TEST_KNI_PORT);
-		struct rte_kni_ops ops = {
-			.change_mtu = kni_change_mtu,
-			.config_network_if = NULL,
-			.config_mac_address = NULL,
-			.config_promiscusity = NULL,
-		};
-
-		if (!kni) {
-			printf("Failed to get KNI named %s\n", TEST_KNI_PORT);
-			exit(-1);
-		}
-
-		kni_pkt_mtu = 0;
-
-		/* Check with the invalid parameters */
-		if (rte_kni_register_handlers(kni, NULL) == 0) {
-			printf("Unexpectedly register successfully "
-					"with NULL ops pointer\n");
-			exit(-1);
-		}
-		if (rte_kni_register_handlers(NULL, &ops) == 0) {
-			printf("Unexpectedly register successfully "
-					"to NULL KNI device pointer\n");
-			exit(-1);
-		}
-
-		if (rte_kni_register_handlers(kni, &ops)) {
-			printf("Fail to register ops\n");
-			exit(-1);
-		}
-
-		/* Check registering again after it has been registered */
-		if (rte_kni_register_handlers(kni, &ops) == 0) {
-			printf("Unexpectedly register successfully after "
-					"it has already been registered\n");
-			exit(-1);
-		}
-
-		/**
-		 * Handle the request of setting MTU,
-		 * with registered handlers.
-		 */
-		for (i = 0; i < TEST_KNI_HANDLE_REQ_COUNT; i++) {
-			rte_kni_handle_request(kni);
-			if (kni_pkt_mtu == TEST_KNI_MTU)
-				break;
-			rte_delay_ms(TEST_KNI_HANDLE_REQ_INTERVAL);
-		}
-		if (i >= TEST_KNI_HANDLE_REQ_COUNT) {
-			printf("MTU has not been set\n");
-			exit(-1);
-		}
-
-		kni_pkt_mtu = 0;
-		if (rte_kni_unregister_handlers(kni) < 0) {
-			printf("Fail to unregister ops\n");
-			exit(-1);
-		}
-
-		/* Check with invalid parameter */
-		if (rte_kni_unregister_handlers(NULL) == 0) {
-			exit(-1);
-		}
-
-		/**
-		 * Handle the request of setting MTU,
-		 * without registered handlers.
-		 */
-		for (i = 0; i < TEST_KNI_HANDLE_REQ_COUNT; i++) {
-			rte_kni_handle_request(kni);
-			if (kni_pkt_mtu != 0)
-				break;
-			rte_delay_ms(TEST_KNI_HANDLE_REQ_INTERVAL);
-		}
-		if (kni_pkt_mtu != 0) {
-			printf("MTU shouldn't be set\n");
-			exit(-1);
-		}
-
-		exit(0);
-	} else {
-		int p_ret, status;
-
-		rte_delay_ms(1000);
-		if (system(IFCONFIG TEST_KNI_PORT " mtu" TEST_KNI_MTU_STR)
-								== -1)
-			return -1;
-
-		rte_delay_ms(1000);
-		if (system(IFCONFIG TEST_KNI_PORT " mtu" TEST_KNI_MTU_STR)
-								== -1)
-			return -1;
-
-		p_ret = wait(&status);
-		if (!WIFEXITED(status)) {
-			printf("Child process (%d) exit abnormally\n", p_ret);
-			return -1;
-		}
-		if (WEXITSTATUS(status) != 0) {
-			printf("Child process exit with failure\n");
-			return -1;
-		}
-	}
-
-	return 0;
-}
-
-static int
-test_kni_processing(uint16_t port_id, struct rte_mempool *mp)
-{
-	int ret = 0;
-	unsigned i;
-	struct rte_kni *kni;
-	struct rte_kni_conf conf;
-	struct rte_eth_dev_info info;
-	struct rte_kni_ops ops;
-
-	if (!mp)
-		return -1;
-
-	memset(&conf, 0, sizeof(conf));
-	memset(&info, 0, sizeof(info));
-	memset(&ops, 0, sizeof(ops));
-
-	ret = rte_eth_dev_info_get(port_id, &info);
-	if (ret != 0) {
-		printf("Error during getting device (port %u) info: %s\n",
-				port_id, strerror(-ret));
-		return -1;
-	}
-
-	snprintf(conf.name, sizeof(conf.name), TEST_KNI_PORT);
-
-	/* core id 1 configured for kernel thread */
-	conf.core_id = 1;
-	conf.force_bind = 1;
-	conf.mbuf_size = MAX_PACKET_SZ;
-	conf.group_id = port_id;
-
-	ops = kni_ops;
-	ops.port_id = port_id;
-
-	/* basic test of kni processing */
-	kni = rte_kni_alloc(mp, &conf, &ops);
-	if (!kni) {
-		printf("fail to create kni\n");
-		return -1;
-	}
-
-	test_kni_ctx = kni;
-	test_kni_processing_flag = 0;
-	stats.ingress = 0;
-	stats.egress = 0;
-
-	/**
-	 * Check multiple processes support on
-	 * registering/unregistering handlers.
-	 */
-	if (test_kni_register_handler_mp() < 0) {
-		printf("fail to check multiple process support\n");
-		ret = -1;
-		goto fail_kni;
-	}
-
-	ret = test_kni_link_change();
-	if (ret != 0)
-		goto fail_kni;
-
-	rte_eal_mp_remote_launch(test_kni_loop, NULL, CALL_MAIN);
-	RTE_LCORE_FOREACH_WORKER(i) {
-		if (rte_eal_wait_lcore(i) < 0) {
-			ret = -1;
-			goto fail_kni;
-		}
-	}
-	/**
-	 * Check if the number of mbufs received from kernel space is equal
-	 * to that of transmitted to kernel space
-	 */
-	if (stats.ingress < KNI_NUM_MBUF_THRESHOLD ||
-		stats.egress < KNI_NUM_MBUF_THRESHOLD) {
-		printf("The ingress/egress number should not be "
-			"less than %u\n", (unsigned)KNI_NUM_MBUF_THRESHOLD);
-		ret = -1;
-		goto fail_kni;
-	}
-
-	if (rte_kni_release(kni) < 0) {
-		printf("fail to release kni\n");
-		return -1;
-	}
-	test_kni_ctx = NULL;
-
-	/* test of reusing memzone */
-	kni = rte_kni_alloc(mp, &conf, &ops);
-	if (!kni) {
-		printf("fail to create kni\n");
-		return -1;
-	}
-
-	/* Release the kni for following testing */
-	if (rte_kni_release(kni) < 0) {
-		printf("fail to release kni\n");
-		return -1;
-	}
-
-	return ret;
-fail_kni:
-	if (rte_kni_release(kni) < 0) {
-		printf("fail to release kni\n");
-		ret = -1;
-	}
-
-	return ret;
-}
-
-static int
-test_kni(void)
-{
-	int ret = -1;
-	uint16_t port_id;
-	struct rte_kni *kni;
-	struct rte_mempool *mp;
-	struct rte_kni_conf conf;
-	struct rte_eth_dev_info info;
-	struct rte_kni_ops ops;
-	FILE *fd;
-	DIR *dir;
-	char buf[16];
-
-	dir = opendir(KNI_MODULE_PATH);
-	if (!dir) {
-		if (errno == ENOENT) {
-			printf("Cannot run UT due to missing rte_kni module\n");
-			return TEST_SKIPPED;
-		}
-		printf("opendir: %s", strerror(errno));
-		return -1;
-	}
-	closedir(dir);
-
-	/* Initialize KNI subsystem */
-	ret = rte_kni_init(KNI_TEST_MAX_PORTS);
-	if (ret < 0) {
-		printf("fail to initialize KNI subsystem\n");
-		return -1;
-	}
-
-	if (test_kni_allocate_lcores() < 0) {
-		printf("No enough lcores for kni processing\n");
-		return -1;
-	}
-
-	mp = test_kni_create_mempool();
-	if (!mp) {
-		printf("fail to create mempool for kni\n");
-		return -1;
-	}
-
-	/* configuring port 0 for the test is enough */
-	port_id = 0;
-	ret = rte_eth_dev_configure(port_id, 1, 1, &port_conf);
-	if (ret < 0) {
-		printf("fail to configure port %d\n", port_id);
-		return -1;
-	}
-
-	ret = rte_eth_rx_queue_setup(port_id, 0, NB_RXD, SOCKET, &rx_conf, mp);
-	if (ret < 0) {
-		printf("fail to setup rx queue for port %d\n", port_id);
-		return -1;
-	}
-
-	ret = rte_eth_tx_queue_setup(port_id, 0, NB_TXD, SOCKET, &tx_conf);
-	if (ret < 0) {
-		printf("fail to setup tx queue for port %d\n", port_id);
-		return -1;
-	}
-
-	ret = rte_eth_dev_start(port_id);
-	if (ret < 0) {
-		printf("fail to start port %d\n", port_id);
-		return -1;
-	}
-	ret = rte_eth_promiscuous_enable(port_id);
-	if (ret != 0) {
-		printf("fail to enable promiscuous mode for port %d: %s\n",
-			port_id, rte_strerror(-ret));
-		return -1;
-	}
-
-	/* basic test of kni processing */
-	fd = fopen(KNI_MODULE_PARAM_LO, "r");
-	if (fd == NULL) {
-		printf("fopen: %s", strerror(errno));
-		return -1;
-	}
-	memset(&buf, 0, sizeof(buf));
-	if (fgets(buf, sizeof(buf), fd)) {
-		if (!strncmp(buf, "lo_mode_fifo", strlen("lo_mode_fifo")) ||
-			!strncmp(buf, "lo_mode_fifo_skb",
-				  strlen("lo_mode_fifo_skb"))) {
-			ret = test_kni_processing(port_id, mp);
-			if (ret < 0) {
-				fclose(fd);
-				goto fail;
-			}
-		} else
-			printf("test_kni_processing skipped because of missing rte_kni module lo_mode argument\n");
-	}
-	fclose(fd);
-
-	/* test of allocating KNI with NULL mempool pointer */
-	memset(&info, 0, sizeof(info));
-	memset(&conf, 0, sizeof(conf));
-	memset(&ops, 0, sizeof(ops));
-
-	ret = rte_eth_dev_info_get(port_id, &info);
-	if (ret != 0) {
-		printf("Error during getting device (port %u) info: %s\n",
-				port_id, strerror(-ret));
-		return -1;
-	}
-
-	conf.group_id = port_id;
-	conf.mbuf_size = MAX_PACKET_SZ;
-
-	ops = kni_ops;
-	ops.port_id = port_id;
-	kni = rte_kni_alloc(NULL, &conf, &ops);
-	if (kni) {
-		ret = -1;
-		printf("unexpectedly creates kni successfully with NULL "
-							"mempool pointer\n");
-		goto fail;
-	}
-
-	/* test of allocating KNI without configurations */
-	kni = rte_kni_alloc(mp, NULL, NULL);
-	if (kni) {
-		ret = -1;
-		printf("Unexpectedly allocate KNI device successfully "
-					"without configurations\n");
-		goto fail;
-	}
-
-	/* test of allocating KNI without a name */
-	memset(&conf, 0, sizeof(conf));
-	memset(&info, 0, sizeof(info));
-	memset(&ops, 0, sizeof(ops));
-
-	ret = rte_eth_dev_info_get(port_id, &info);
-	if (ret != 0) {
-		printf("Error during getting device (port %u) info: %s\n",
-				port_id, strerror(-ret));
-		ret = -1;
-		goto fail;
-	}
-
-	conf.group_id = port_id;
-	conf.mbuf_size = MAX_PACKET_SZ;
-
-	ops = kni_ops;
-	ops.port_id = port_id;
-	kni = rte_kni_alloc(mp, &conf, &ops);
-	if (kni) {
-		ret = -1;
-		printf("Unexpectedly allocate a KNI device successfully "
-						"without a name\n");
-		goto fail;
-	}
-
-	/* test of releasing NULL kni context */
-	ret = rte_kni_release(NULL);
-	if (ret == 0) {
-		ret = -1;
-		printf("unexpectedly release kni successfully\n");
-		goto fail;
-	}
-
-	/* test of handling request on NULL device pointer */
-	ret = rte_kni_handle_request(NULL);
-	if (ret == 0) {
-		ret = -1;
-		printf("Unexpectedly handle request on NULL device pointer\n");
-		goto fail;
-	}
-
-	/* test of getting KNI device with pointer to NULL */
-	kni = rte_kni_get(NULL);
-	if (kni) {
-		ret = -1;
-		printf("Unexpectedly get a KNI device with "
-					"NULL name pointer\n");
-		goto fail;
-	}
-
-	/* test of getting KNI device with an zero length name string */
-	memset(&conf, 0, sizeof(conf));
-	kni = rte_kni_get(conf.name);
-	if (kni) {
-		ret = -1;
-		printf("Unexpectedly get a KNI device with "
-				"zero length name string\n");
-		goto fail;
-	}
-
-	/* test of getting KNI device with an invalid string name */
-	memset(&conf, 0, sizeof(conf));
-	snprintf(conf.name, sizeof(conf.name), "testing");
-	kni = rte_kni_get(conf.name);
-	if (kni) {
-		ret = -1;
-		printf("Unexpectedly get a KNI device with "
-				"a never used name string\n");
-		goto fail;
-	}
-	ret = 0;
-
-fail:
-	if (rte_eth_dev_stop(port_id) != 0)
-		printf("Failed to stop port %u\n", port_id);
-
-	return ret;
-}
-
-#endif
-
-REGISTER_TEST_COMMAND(kni_autotest, test_kni);
diff --git a/doc/api/doxy-api-index.md b/doc/api/doxy-api-index.md
index 3bc8778981f6..7bba67d58586 100644
--- a/doc/api/doxy-api-index.md
+++ b/doc/api/doxy-api-index.md
@@ -43,7 +43,6 @@ The public API headers are grouped by topics:
   [bond](@ref rte_eth_bond.h),
   [vhost](@ref rte_vhost.h),
   [vdpa](@ref rte_vdpa.h),
-  [KNI](@ref rte_kni.h),
   [ixgbe](@ref rte_pmd_ixgbe.h),
   [i40e](@ref rte_pmd_i40e.h),
   [iavf](@ref rte_pmd_iavf.h),
@@ -178,7 +177,6 @@ The public API headers are grouped by topics:
     [frag](@ref rte_port_frag.h),
     [reass](@ref rte_port_ras.h),
     [sched](@ref rte_port_sched.h),
-    [kni](@ref rte_port_kni.h),
     [src/sink](@ref rte_port_source_sink.h)
   * [table](@ref rte_table.h):
     [lpm IPv4](@ref rte_table_lpm.h),
diff --git a/doc/api/doxy-api.conf.in b/doc/api/doxy-api.conf.in
index 1a4210b948a8..90dcf232dffd 100644
--- a/doc/api/doxy-api.conf.in
+++ b/doc/api/doxy-api.conf.in
@@ -49,7 +49,6 @@ INPUT                   = @TOPDIR@/doc/api/doxy-api-index.md \
                           @TOPDIR@/lib/ip_frag \
                           @TOPDIR@/lib/ipsec \
                           @TOPDIR@/lib/jobstats \
-                          @TOPDIR@/lib/kni \
                           @TOPDIR@/lib/kvargs \
                           @TOPDIR@/lib/latencystats \
                           @TOPDIR@/lib/lpm \
diff --git a/doc/guides/contributing/documentation.rst b/doc/guides/contributing/documentation.rst
index 7fcbb7fc43b2..f16c94e9768b 100644
--- a/doc/guides/contributing/documentation.rst
+++ b/doc/guides/contributing/documentation.rst
@@ -95,7 +95,7 @@ added to by the developer.
 * **The Programmers Guide**
 
   The Programmers Guide explains how the API components of DPDK such as the EAL, Memzone, Rings and the Hash Library work.
-  It also explains how some higher level functionality such as Packet Distributor, Packet Framework and KNI work.
+  It also explains how some higher level functionality such as Packet Distributor and Packet Framework.
   It also shows the build system and explains how to add applications.
 
   The Programmers Guide should be expanded when new functionality is added to DPDK.
diff --git a/doc/guides/howto/flow_bifurcation.rst b/doc/guides/howto/flow_bifurcation.rst
index 838eb2a4cc89..554dd24c32c5 100644
--- a/doc/guides/howto/flow_bifurcation.rst
+++ b/doc/guides/howto/flow_bifurcation.rst
@@ -7,8 +7,7 @@ Flow Bifurcation How-to Guide
 Flow Bifurcation is a mechanism which uses hardware capable Ethernet devices
 to split traffic between Linux user space and kernel space. Since it is a
 hardware assisted feature this approach can provide line rate processing
-capability. Other than :ref:`KNI <kni>`, the software is just required to
-enable device configuration, there is no need to take care of the packet
+capability. There is no need to take care of the packet
 movement during the traffic split. This can yield better performance with
 less CPU overhead.
 
diff --git a/doc/guides/nics/index.rst b/doc/guides/nics/index.rst
index 31296822e5ec..7bfcac880f44 100644
--- a/doc/guides/nics/index.rst
+++ b/doc/guides/nics/index.rst
@@ -43,7 +43,6 @@ Network Interface Controller Drivers
     ionic
     ipn3ke
     ixgbe
-    kni
     mana
     memif
     mlx4
diff --git a/doc/guides/nics/kni.rst b/doc/guides/nics/kni.rst
deleted file mode 100644
index bd3033bb585c..000000000000
--- a/doc/guides/nics/kni.rst
+++ /dev/null
@@ -1,170 +0,0 @@
-..  SPDX-License-Identifier: BSD-3-Clause
-    Copyright(c) 2017 Intel Corporation.
-
-KNI Poll Mode Driver
-======================
-
-KNI PMD is wrapper to the :ref:`librte_kni <kni>` library.
-
-This PMD enables using KNI without having a KNI specific application,
-any forwarding application can use PMD interface for KNI.
-
-Sending packets to any DPDK controlled interface or sending to the
-Linux networking stack will be transparent to the DPDK application.
-
-To create a KNI device ``net_kni#`` device name should be used, and this
-will create ``kni#`` Linux virtual network interface.
-
-There is no physical device backend for the virtual KNI device.
-
-Packets sent to the KNI Linux interface will be received by the DPDK
-application, and DPDK application may forward packets to a physical NIC
-or to a virtual device (like another KNI interface or PCAP interface).
-
-To forward any traffic from physical NIC to the Linux networking stack,
-an application should control a physical port and create one virtual KNI port,
-and forward between two.
-
-Using this PMD requires KNI kernel module be inserted.
-
-
-Usage
------
-
-EAL ``--vdev`` argument can be used to create KNI device instance, like::
-
-        dpdk-testpmd --vdev=net_kni0 --vdev=net_kni1 -- -i
-
-Above command will create ``kni0`` and ``kni1`` Linux network interfaces,
-those interfaces can be controlled by standard Linux tools.
-
-When testpmd forwarding starts, any packets sent to ``kni0`` interface
-forwarded to the ``kni1`` interface and vice versa.
-
-There is no hard limit on number of interfaces that can be created.
-
-
-Default interface configuration
--------------------------------
-
-``librte_kni`` can create Linux network interfaces with different features,
-feature set controlled by a configuration struct, and KNI PMD uses a fixed
-configuration:
-
-    .. code-block:: console
-
-        Interface name: kni#
-        force bind kernel thread to a core : NO
-        mbuf size: (rte_pktmbuf_data_room_size(pktmbuf_pool) - RTE_PKTMBUF_HEADROOM)
-        mtu: (conf.mbuf_size - RTE_ETHER_HDR_LEN)
-
-KNI control path is not supported with the PMD, since there is no physical
-backend device by default.
-
-
-Runtime Configuration
----------------------
-
-``no_request_thread``, by default PMD creates a pthread for each KNI interface
-to handle Linux network interface control commands, like ``ifconfig kni0 up``
-
-With ``no_request_thread`` option, pthread is not created and control commands
-not handled by PMD.
-
-By default request thread is enabled. And this argument should not be used
-most of the time, unless this PMD used with customized DPDK application to handle
-requests itself.
-
-Argument usage::
-
-        dpdk-testpmd --vdev "net_kni0,no_request_thread=1" -- -i
-
-
-PMD log messages
-----------------
-
-If KNI kernel module (rte_kni.ko) not inserted, following error log printed::
-
-        "KNI: KNI subsystem has not been initialized. Invoke rte_kni_init() first"
-
-
-PMD testing
------------
-
-It is possible to test PMD quickly using KNI kernel module loopback feature:
-
-* Insert KNI kernel module with loopback support:
-
-    .. code-block:: console
-
-        insmod <build_dir>/kernel/linux/kni/rte_kni.ko lo_mode=lo_mode_fifo_skb
-
-* Start testpmd with no physical device but two KNI virtual devices:
-
-    .. code-block:: console
-
-        ./dpdk-testpmd --vdev net_kni0 --vdev net_kni1 -- -i
-
-    .. code-block:: console
-
-        ...
-        Configuring Port 0 (socket 0)
-        KNI: pci: 00:00:00       c580:b8
-        Port 0: 1A:4A:5B:7C:A2:8C
-        Configuring Port 1 (socket 0)
-        KNI: pci: 00:00:00       600:b9
-        Port 1: AE:95:21:07:93:DD
-        Checking link statuses...
-        Port 0 Link Up - speed 10000 Mbps - full-duplex
-        Port 1 Link Up - speed 10000 Mbps - full-duplex
-        Done
-        testpmd>
-
-* Observe Linux interfaces
-
-    .. code-block:: console
-
-        $ ifconfig kni0 && ifconfig kni1
-        kni0: flags=4098<BROADCAST,MULTICAST>  mtu 1500
-                ether ae:8e:79:8e:9b:c8  txqueuelen 1000  (Ethernet)
-                RX packets 0  bytes 0 (0.0 B)
-                RX errors 0  dropped 0  overruns 0  frame 0
-                TX packets 0  bytes 0 (0.0 B)
-                TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
-
-        kni1: flags=4098<BROADCAST,MULTICAST>  mtu 1500
-                ether 9e:76:43:53:3e:9b  txqueuelen 1000  (Ethernet)
-                RX packets 0  bytes 0 (0.0 B)
-                RX errors 0  dropped 0  overruns 0  frame 0
-                TX packets 0  bytes 0 (0.0 B)
-                TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
-
-
-* Start forwarding with tx_first:
-
-    .. code-block:: console
-
-        testpmd> start tx_first
-
-* Quit and check forwarding stats:
-
-    .. code-block:: console
-
-        testpmd> quit
-        Telling cores to stop...
-        Waiting for lcores to finish...
-
-        ---------------------- Forward statistics for port 0  ----------------------
-        RX-packets: 35637905       RX-dropped: 0             RX-total: 35637905
-        TX-packets: 35637947       TX-dropped: 0             TX-total: 35637947
-        ----------------------------------------------------------------------------
-
-        ---------------------- Forward statistics for port 1  ----------------------
-        RX-packets: 35637915       RX-dropped: 0             RX-total: 35637915
-        TX-packets: 35637937       TX-dropped: 0             TX-total: 35637937
-        ----------------------------------------------------------------------------
-
-        +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
-        RX-packets: 71275820       RX-dropped: 0             RX-total: 71275820
-        TX-packets: 71275884       TX-dropped: 0             TX-total: 71275884
-        ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
diff --git a/doc/guides/nics/virtio.rst b/doc/guides/nics/virtio.rst
index f5e54a5e9cfd..ba6247170dbb 100644
--- a/doc/guides/nics/virtio.rst
+++ b/doc/guides/nics/virtio.rst
@@ -10,15 +10,12 @@ we provide a virtio Poll Mode Driver (PMD) as a software solution, comparing to
 for fast guest VM to guest VM communication and guest VM to host communication.
 
 Vhost is a kernel acceleration module for virtio qemu backend.
-The DPDK extends kni to support vhost raw socket interface,
-which enables vhost to directly read/ write packets from/to a physical port.
-With this enhancement, virtio could achieve quite promising performance.
 
 For basic qemu-KVM installation and other Intel EM poll mode driver in guest VM,
 please refer to Chapter "Driver for VM Emulated Devices".
 
 In this chapter, we will demonstrate usage of virtio PMD with two backends,
-standard qemu vhost back end and vhost kni back end.
+standard qemu vhost back end.
 
 Virtio Implementation in DPDK
 -----------------------------
@@ -89,93 +86,6 @@ The following prerequisites apply:
 *   When using legacy interface, ``SYS_RAWIO`` capability is required
     for ``iopl()`` call to enable access to PCI I/O ports.
 
-Virtio with kni vhost Back End
-------------------------------
-
-This section demonstrates kni vhost back end example setup for Phy-VM Communication.
-
-.. _figure_host_vm_comms:
-
-.. figure:: img/host_vm_comms.*
-
-   Host2VM Communication Example Using kni vhost Back End
-
-
-Host2VM communication example
-
-#.  Load the kni kernel module:
-
-    .. code-block:: console
-
-        insmod rte_kni.ko
-
-    Other basic DPDK preparations like hugepage enabling,
-    UIO port binding are not listed here.
-    Please refer to the *DPDK Getting Started Guide* for detailed instructions.
-
-#.  Launch the kni user application:
-
-    .. code-block:: console
-
-        <build_dir>/examples/dpdk-kni -l 0-3 -n 4 -- -p 0x1 -P --config="(0,1,3)"
-
-    This command generates one network device vEth0 for physical port.
-    If specify more physical ports, the generated network device will be vEth1, vEth2, and so on.
-
-    For each physical port, kni creates two user threads.
-    One thread loops to fetch packets from the physical NIC port into the kni receive queue.
-    The other user thread loops to send packets in the kni transmit queue.
-
-    For each physical port, kni also creates a kernel thread that retrieves packets from the kni receive queue,
-    place them onto kni's raw socket's queue and wake up the vhost kernel thread to exchange packets with the virtio virt queue.
-
-    For more details about kni, please refer to :ref:`kni`.
-
-#.  Enable the kni raw socket functionality for the specified physical NIC port,
-    get the generated file descriptor and set it in the qemu command line parameter.
-    Always remember to set ioeventfd_on and vhost_on.
-
-    Example:
-
-    .. code-block:: console
-
-        echo 1 > /sys/class/net/vEth0/sock_en
-        fd=`cat /sys/class/net/vEth0/sock_fd`
-        exec qemu-system-x86_64 -enable-kvm -cpu host \
-        -m 2048 -smp 4 -name dpdk-test1-vm1 \
-        -drive file=/data/DPDKVMS/dpdk-vm.img \
-        -netdev tap, fd=$fd,id=mynet_kni, script=no,vhost=on \
-        -device virtio-net-pci,netdev=mynet_kni,bus=pci.0,addr=0x3,ioeventfd=on \
-        -vnc:1 -daemonize
-
-    In the above example, virtio port 0 in the guest VM will be associated with vEth0, which in turns corresponds to a physical port,
-    which means received packets come from vEth0, and transmitted packets is sent to vEth0.
-
-#.  In the guest, bind the virtio device to the uio_pci_generic kernel module and start the forwarding application.
-    When the virtio port in guest bursts Rx, it is getting packets from the
-    raw socket's receive queue.
-    When the virtio port bursts Tx, it is sending packet to the tx_q.
-
-    .. code-block:: console
-
-        modprobe uio
-        dpdk-hugepages.py --setup 1G
-        modprobe uio_pci_generic
-        ./usertools/dpdk-devbind.py -b uio_pci_generic 00:03.0
-
-    We use testpmd as the forwarding application in this example.
-
-    .. figure:: img/console.*
-
-       Running testpmd
-
-#.  Use IXIA packet generator to inject a packet stream into the KNI physical port.
-
-    The packet reception and transmission flow path is:
-
-    IXIA packet generator->82599 PF->KNI Rx queue->KNI raw socket queue->Guest
-    VM virtio port 0 Rx burst->Guest VM virtio port 0 Tx burst-> KNI Tx queue
-    ->82599 PF-> IXIA packet generator
 
 Virtio with qemu virtio Back End
 --------------------------------
diff --git a/doc/guides/prog_guide/env_abstraction_layer.rst b/doc/guides/prog_guide/env_abstraction_layer.rst
index 93c8a031be56..5d382fdd9032 100644
--- a/doc/guides/prog_guide/env_abstraction_layer.rst
+++ b/doc/guides/prog_guide/env_abstraction_layer.rst
@@ -610,8 +610,6 @@ devices would fail anyway.
     ``RTE_PCI_DRV_NEED_IOVA_AS_VA`` flag is used to dictate that this PCI
     driver can only work in RTE_IOVA_VA mode.
 
-    When the KNI kernel module is detected, RTE_IOVA_PA mode is preferred as a
-    performance penalty is expected in RTE_IOVA_VA mode.
 
 IOVA Mode Configuration
 ~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/doc/guides/prog_guide/glossary.rst b/doc/guides/prog_guide/glossary.rst
index fb0910ba5b3f..8d6349701e43 100644
--- a/doc/guides/prog_guide/glossary.rst
+++ b/doc/guides/prog_guide/glossary.rst
@@ -103,9 +103,6 @@ lcore
    A logical execution unit of the processor, sometimes called a *hardware
    thread*.
 
-KNI
-   Kernel Network Interface
-
 L1
    Layer 1
 
diff --git a/doc/guides/prog_guide/index.rst b/doc/guides/prog_guide/index.rst
index d89cd3edb63c..1be6a3d6d9b6 100644
--- a/doc/guides/prog_guide/index.rst
+++ b/doc/guides/prog_guide/index.rst
@@ -54,7 +54,6 @@ Programmer's Guide
     pcapng_lib
     pdump_lib
     multi_proc_support
-    kernel_nic_interface
     thread_safety_dpdk_functions
     eventdev
     event_ethernet_rx_adapter
diff --git a/doc/guides/prog_guide/kernel_nic_interface.rst b/doc/guides/prog_guide/kernel_nic_interface.rst
deleted file mode 100644
index 392e5df75fcf..000000000000
--- a/doc/guides/prog_guide/kernel_nic_interface.rst
+++ /dev/null
@@ -1,423 +0,0 @@
-..  SPDX-License-Identifier: BSD-3-Clause
-    Copyright(c) 2010-2015 Intel Corporation.
-
-.. _kni:
-
-Kernel NIC Interface
-====================
-
-.. note::
-
-   KNI is deprecated and will be removed in future.
-   See :doc:`../rel_notes/deprecation`.
-
-   :ref:`virtio_user_as_exception_path` alternative is the preferred way
-   for interfacing with the Linux network stack
-   as it is an in-kernel solution and has similar performance expectations.
-
-.. note::
-
-   KNI is disabled by default in the DPDK build.
-   To re-enable the library, remove 'kni' from the "disable_libs" meson option when configuring a build.
-
-The DPDK Kernel NIC Interface (KNI) allows userspace applications access to the Linux* control plane.
-
-KNI provides an interface with the kernel network stack
-and allows management of DPDK ports using standard Linux net tools
-such as ``ethtool``, ``iproute2`` and ``tcpdump``.
-
-The main use case of KNI is to get/receive exception packets from/to Linux network stack
-while main datapath IO is done bypassing the networking stack.
-
-There are other alternatives to KNI, all are available in the upstream Linux:
-
-#. :ref:`virtio_user_as_exception_path`
-
-#. :doc:`../nics/tap` as wrapper to `Linux tun/tap
-   <https://www.kernel.org/doc/Documentation/networking/tuntap.txt>`_
-
-The benefits of using the KNI against alternatives are:
-
-*   Faster than existing Linux TUN/TAP interfaces
-    (by eliminating system calls and copy_to_user()/copy_from_user() operations.
-
-The disadvantages of the KNI are:
-
-* It is out-of-tree Linux kernel module
-  which makes updating and distributing the driver more difficult.
-  Most users end up building the KNI driver from source
-  which requires the packages and tools to build kernel modules.
-
-* As it shares memory between userspace and kernelspace,
-  and kernel part directly uses input provided by userspace, it is not safe.
-  This makes hard to upstream the module.
-
-* Requires dedicated kernel cores.
-
-* Only a subset of net devices control commands are supported by KNI.
-
-The components of an application using the DPDK Kernel NIC Interface are shown in :numref:`figure_kernel_nic_intf`.
-
-.. _figure_kernel_nic_intf:
-
-.. figure:: img/kernel_nic_intf.*
-
-   Components of a DPDK KNI Application
-
-
-The DPDK KNI Kernel Module
---------------------------
-
-The KNI kernel loadable module ``rte_kni`` provides the kernel interface
-for DPDK applications.
-
-When the ``rte_kni`` module is loaded, it will create a device ``/dev/kni``
-that is used by the DPDK KNI API functions to control and communicate with
-the kernel module.
-
-The ``rte_kni`` kernel module contains several optional parameters which
-can be specified when the module is loaded to control its behavior:
-
-.. code-block:: console
-
-    # modinfo rte_kni.ko
-    <snip>
-    parm:           lo_mode: KNI loopback mode (default=lo_mode_none):
-                    lo_mode_none        Kernel loopback disabled
-                    lo_mode_fifo        Enable kernel loopback with fifo
-                    lo_mode_fifo_skb    Enable kernel loopback with fifo and skb buffer
-                     (charp)
-    parm:           kthread_mode: Kernel thread mode (default=single):
-                    single    Single kernel thread mode enabled.
-                    multiple  Multiple kernel thread mode enabled.
-                     (charp)
-    parm:           carrier: Default carrier state for KNI interface (default=off):
-                    off   Interfaces will be created with carrier state set to off.
-                    on    Interfaces will be created with carrier state set to on.
-                     (charp)
-    parm:           enable_bifurcated: Enable request processing support for
-                    bifurcated drivers, which means releasing rtnl_lock before calling
-                    userspace callback and supporting async requests (default=off):
-                    on    Enable request processing support for bifurcated drivers.
-                     (charp)
-    parm:           min_scheduling_interval: KNI thread min scheduling interval (default=100 microseconds)
-                     (long)
-    parm:           max_scheduling_interval: KNI thread max scheduling interval (default=200 microseconds)
-                     (long)
-
-
-Loading the ``rte_kni`` kernel module without any optional parameters is
-the typical way a DPDK application gets packets into and out of the kernel
-network stack.  Without any parameters, only one kernel thread is created
-for all KNI devices for packet receiving in kernel side, loopback mode is
-disabled, and the default carrier state of KNI interfaces is set to *off*.
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko
-
-.. _kni_loopback_mode:
-
-Loopback Mode
-~~~~~~~~~~~~~
-
-For testing, the ``rte_kni`` kernel module can be loaded in loopback mode
-by specifying the ``lo_mode`` parameter:
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko lo_mode=lo_mode_fifo
-
-The ``lo_mode_fifo`` loopback option will loop back ring enqueue/dequeue
-operations in kernel space.
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko lo_mode=lo_mode_fifo_skb
-
-The ``lo_mode_fifo_skb`` loopback option will loop back ring enqueue/dequeue
-operations and sk buffer copies in kernel space.
-
-If the ``lo_mode`` parameter is not specified, loopback mode is disabled.
-
-.. _kni_kernel_thread_mode:
-
-Kernel Thread Mode
-~~~~~~~~~~~~~~~~~~
-
-To provide flexibility of performance, the ``rte_kni`` KNI kernel module
-can be loaded with the ``kthread_mode`` parameter.  The ``rte_kni`` kernel
-module supports two options: "single kernel thread" mode and "multiple
-kernel thread" mode.
-
-Single kernel thread mode is enabled as follows:
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko kthread_mode=single
-
-This mode will create only one kernel thread for all KNI interfaces to
-receive data on the kernel side.  By default, this kernel thread is not
-bound to any particular core, but the user can set the core affinity for
-this kernel thread by setting the ``core_id`` and ``force_bind`` parameters
-in ``struct rte_kni_conf`` when the first KNI interface is created:
-
-For optimum performance, the kernel thread should be bound to a core in
-on the same socket as the DPDK lcores used in the application.
-
-The KNI kernel module can also be configured to start a separate kernel
-thread for each KNI interface created by the DPDK application.  Multiple
-kernel thread mode is enabled as follows:
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko kthread_mode=multiple
-
-This mode will create a separate kernel thread for each KNI interface to
-receive data on the kernel side.  The core affinity of each ``kni_thread``
-kernel thread can be specified by setting the ``core_id`` and ``force_bind``
-parameters in ``struct rte_kni_conf`` when each KNI interface is created.
-
-Multiple kernel thread mode can provide scalable higher performance if
-sufficient unused cores are available on the host system.
-
-If the ``kthread_mode`` parameter is not specified, the "single kernel
-thread" mode is used.
-
-.. _kni_default_carrier_state:
-
-Default Carrier State
-~~~~~~~~~~~~~~~~~~~~~
-
-The default carrier state of KNI interfaces created by the ``rte_kni``
-kernel module is controlled via the ``carrier`` option when the module
-is loaded.
-
-If ``carrier=off`` is specified, the kernel module will leave the carrier
-state of the interface *down* when the interface is management enabled.
-The DPDK application can set the carrier state of the KNI interface using the
-``rte_kni_update_link()`` function.  This is useful for DPDK applications
-which require that the carrier state of the KNI interface reflect the
-actual link state of the corresponding physical NIC port.
-
-If ``carrier=on`` is specified, the kernel module will automatically set
-the carrier state of the interface to *up* when the interface is management
-enabled.  This is useful for DPDK applications which use the KNI interface as
-a purely virtual interface that does not correspond to any physical hardware
-and do not wish to explicitly set the carrier state of the interface with
-``rte_kni_update_link()``.  It is also useful for testing in loopback mode
-where the NIC port may not be physically connected to anything.
-
-To set the default carrier state to *on*:
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko carrier=on
-
-To set the default carrier state to *off*:
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko carrier=off
-
-If the ``carrier`` parameter is not specified, the default carrier state
-of KNI interfaces will be set to *off*.
-
-.. _kni_bifurcated_device_support:
-
-Bifurcated Device Support
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-User callbacks are executed while kernel module holds the ``rtnl`` lock, this
-causes a deadlock when callbacks run control commands on another Linux kernel
-network interface.
-
-Bifurcated devices has kernel network driver part and to prevent deadlock for
-them ``enable_bifurcated`` is used.
-
-To enable bifurcated device support:
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko enable_bifurcated=on
-
-Enabling bifurcated device support releases ``rtnl`` lock before calling
-callback and locks it back after callback. Also enables asynchronous request to
-support callbacks that requires rtnl lock to work (interface down).
-
-KNI Kthread Scheduling
-~~~~~~~~~~~~~~~~~~~~~~
-
-The ``min_scheduling_interval`` and ``max_scheduling_interval`` parameters
-control the rescheduling interval of the KNI kthreads.
-
-This might be useful if we have use cases in which we require improved
-latency or performance for control plane traffic.
-
-The implementation is backed by Linux High Precision Timers, and uses ``usleep_range``.
-Hence, it will have the same granularity constraints as this Linux subsystem.
-
-For Linux High Precision Timers, you can check the following resource: `Kernel Timers <http://www.kernel.org/doc/Documentation/timers/timers-howto.txt>`_
-
-To set the ``min_scheduling_interval`` to a value of 100 microseconds:
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko min_scheduling_interval=100
-
-To set the ``max_scheduling_interval`` to a value of 200 microseconds:
-
-.. code-block:: console
-
-    # insmod <build_dir>/kernel/linux/kni/rte_kni.ko max_scheduling_interval=200
-
-If the ``min_scheduling_interval`` and ``max_scheduling_interval`` parameters are
-not specified, the default interval limits will be set to *100* and *200* respectively.
-
-KNI Creation and Deletion
--------------------------
-
-Before any KNI interfaces can be created, the ``rte_kni`` kernel module must
-be loaded into the kernel and configured with the ``rte_kni_init()`` function.
-
-The KNI interfaces are created by a DPDK application dynamically via the
-``rte_kni_alloc()`` function.
-
-The ``struct rte_kni_conf`` structure contains fields which allow the
-user to specify the interface name, set the MTU size, set an explicit or
-random MAC address and control the affinity of the kernel Rx thread(s)
-(both single and multi-threaded modes).
-By default the KNI sample example gets the MTU from the matching device,
-and in case of KNI PMD it is derived from mbuf buffer length.
-
-The ``struct rte_kni_ops`` structure contains pointers to functions to
-handle requests from the ``rte_kni`` kernel module.  These functions
-allow DPDK applications to perform actions when the KNI interfaces are
-manipulated by control commands or functions external to the application.
-
-For example, the DPDK application may wish to enabled/disable a physical
-NIC port when a user enabled/disables a KNI interface with ``ip link set
-[up|down] dev <ifaceX>``.  The DPDK application can register a callback for
-``config_network_if`` which will be called when the interface management
-state changes.
-
-There are currently four callbacks for which the user can register
-application functions:
-
-``config_network_if``:
-
-    Called when the management state of the KNI interface changes.
-    For example, when the user runs ``ip link set [up|down] dev <ifaceX>``.
-
-``change_mtu``:
-
-    Called when the user changes the MTU size of the KNI
-    interface.  For example, when the user runs ``ip link set mtu <size>
-    dev <ifaceX>``.
-
-``config_mac_address``:
-
-    Called when the user changes the MAC address of the KNI interface.
-    For example, when the user runs ``ip link set address <MAC>
-    dev <ifaceX>``.  If the user sets this callback function to NULL,
-    but sets the ``port_id`` field to a value other than -1, a default
-    callback handler in the rte_kni library ``kni_config_mac_address()``
-    will be called which calls ``rte_eth_dev_default_mac_addr_set()``
-    on the specified ``port_id``.
-
-``config_promiscusity``:
-
-    Called when the user changes the promiscuity state of the KNI
-    interface.  For example, when the user runs ``ip link set promisc
-    [on|off] dev <ifaceX>``. If the user sets this callback function to
-    NULL, but sets the ``port_id`` field to a value other than -1, a default
-    callback handler in the rte_kni library ``kni_config_promiscusity()``
-    will be called which calls ``rte_eth_promiscuous_<enable|disable>()``
-    on the specified ``port_id``.
-
-``config_allmulticast``:
-
-    Called when the user changes the allmulticast state of the KNI interface.
-    For example, when the user runs ``ifconfig <ifaceX> [-]allmulti``. If the
-    user sets this callback function to NULL, but sets the ``port_id`` field to
-    a value other than -1, a default callback handler in the rte_kni library
-    ``kni_config_allmulticast()`` will be called which calls
-    ``rte_eth_allmulticast_<enable|disable>()`` on the specified ``port_id``.
-
-In order to run these callbacks, the application must periodically call
-the ``rte_kni_handle_request()`` function.  Any user callback function
-registered will be called directly from ``rte_kni_handle_request()`` so
-care must be taken to prevent deadlock and to not block any DPDK fastpath
-tasks.  Typically DPDK applications which use these callbacks will need
-to create a separate thread or secondary process to periodically call
-``rte_kni_handle_request()``.
-
-The KNI interfaces can be deleted by a DPDK application with
-``rte_kni_release()``.  All KNI interfaces not explicitly deleted will be
-deleted when the ``/dev/kni`` device is closed, either explicitly with
-``rte_kni_close()`` or when the DPDK application is closed.
-
-DPDK mbuf Flow
---------------
-
-To minimize the amount of DPDK code running in kernel space, the mbuf mempool is managed in userspace only.
-The kernel module will be aware of mbufs,
-but all mbuf allocation and free operations will be handled by the DPDK application only.
-
-:numref:`figure_pkt_flow_kni` shows a typical scenario with packets sent in both directions.
-
-.. _figure_pkt_flow_kni:
-
-.. figure:: img/pkt_flow_kni.*
-
-   Packet Flow via mbufs in the DPDK KNI
-
-
-Use Case: Ingress
------------------
-
-On the DPDK RX side, the mbuf is allocated by the PMD in the RX thread context.
-This thread will enqueue the mbuf in the rx_q FIFO,
-and the next pointers in mbuf-chain will convert to physical address.
-The KNI thread will poll all KNI active devices for the rx_q.
-If an mbuf is dequeued, it will be converted to a sk_buff and sent to the net stack via netif_rx().
-The dequeued mbuf must be freed, so the same pointer is sent back in the free_q FIFO,
-and next pointers must convert back to virtual address if exists before put in the free_q FIFO.
-
-The RX thread, in the same main loop, polls this FIFO and frees the mbuf after dequeuing it.
-The address conversion of the next pointer is to prevent the chained mbuf
-in different hugepage segments from causing kernel crash.
-
-Use Case: Egress
-----------------
-
-For packet egress the DPDK application must first enqueue several mbufs to create an mbuf cache on the kernel side.
-
-The packet is received from the Linux net stack, by calling the kni_net_tx() callback.
-The mbuf is dequeued (without waiting due the cache) and filled with data from sk_buff.
-The sk_buff is then freed and the mbuf sent in the tx_q FIFO.
-
-The DPDK TX thread dequeues the mbuf and sends it to the PMD via ``rte_eth_tx_burst()``.
-It then puts the mbuf back in the cache.
-
-IOVA = VA: Support
-------------------
-
-KNI operates in IOVA_VA scheme when
-
-- LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0) and
-- EAL option `iova-mode=va` is passed or bus IOVA scheme in the DPDK is selected
-  as RTE_IOVA_VA.
-
-Due to IOVA to KVA address translations, based on the KNI use case there
-can be a performance impact. For mitigation, forcing IOVA to PA via EAL
-"--iova-mode=pa" option can be used, IOVA_DC bus iommu scheme can also
-result in IOVA as PA.
-
-Ethtool
--------
-
-Ethtool is a Linux-specific tool with corresponding support in the kernel.
-The current version of kni provides minimal ethtool functionality
-including querying version and link state. It does not support link
-control, statistics, or dumping device registers.
diff --git a/doc/guides/prog_guide/packet_framework.rst b/doc/guides/prog_guide/packet_framework.rst
index 3d4e3b66cc5c..ebc69d8c3e75 100644
--- a/doc/guides/prog_guide/packet_framework.rst
+++ b/doc/guides/prog_guide/packet_framework.rst
@@ -87,18 +87,15 @@ Port Types
    |   |                  | management and hierarchical scheduling according to pre-defined SLAs.                 |
    |   |                  |                                                                                       |
    +---+------------------+---------------------------------------------------------------------------------------+
-   | 6 | KNI              | Send/receive packets to/from Linux kernel space.                                      |
-   |   |                  |                                                                                       |
-   +---+------------------+---------------------------------------------------------------------------------------+
-   | 7 | Source           | Input port used as packet generator. Similar to Linux kernel /dev/zero character      |
+   | 6 | Source           | Input port used as packet generator. Similar to Linux kernel /dev/zero character      |
    |   |                  | device.                                                                               |
    |   |                  |                                                                                       |
    +---+------------------+---------------------------------------------------------------------------------------+
-   | 8 | Sink             | Output port used to drop all input packets. Similar to Linux kernel /dev/null         |
+   | 7 | Sink             | Output port used to drop all input packets. Similar to Linux kernel /dev/null         |
    |   |                  | character device.                                                                     |
    |   |                  |                                                                                       |
    +---+------------------+---------------------------------------------------------------------------------------+
-   | 9 | Sym_crypto       | Output port used to extract DPDK Cryptodev operations from a fixed offset of the      |
+   | 8 | Sym_crypto       | Output port used to extract DPDK Cryptodev operations from a fixed offset of the      |
    |   |                  | packet and then enqueue to the Cryptodev PMD. Input port used to dequeue the          |
    |   |                  | Cryptodev operations from the Cryptodev PMD and then retrieve the packets from them.  |
    +---+------------------+---------------------------------------------------------------------------------------+
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 494b401cda4b..fa619514fd64 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -35,7 +35,7 @@ Deprecation Notices
     which also added support for standard atomics
     (Ref: https://releases.llvm.org/3.6.0/tools/clang/docs/ReleaseNotes.html)
 
-* build: Enabling deprecated libraries (``flow_classify``, ``kni``)
+* build: Enabling deprecated libraries (``flow_classify``)
   won't be possible anymore through the use of the ``disable_libs`` build option.
   A new build option for deprecated libraries will be introduced instead.
 
@@ -78,13 +78,6 @@ Deprecation Notices
   ``__atomic_thread_fence`` must be used for patches that need to be merged in
   20.08 onwards. This change will not introduce any performance degradation.
 
-* kni: The KNI kernel module and library are not recommended for use by new
-  applications - other technologies such as virtio-user are recommended instead.
-  Following the DPDK technical board
-  `decision <https://mails.dpdk.org/archives/dev/2021-January/197077.html>`_
-  and `refinement <https://mails.dpdk.org/archives/dev/2022-June/243596.html>`_,
-  the KNI kernel module, library and PMD will be removed from the DPDK 23.11 release.
-
 * lib: will fix extending some enum/define breaking the ABI. There are multiple
   samples in DPDK that enum/define terminated with a ``.*MAX.*`` value which is
   used by iterators, and arrays holding these values are sized with this
diff --git a/doc/guides/rel_notes/release_23_11.rst b/doc/guides/rel_notes/release_23_11.rst
new file mode 100644
index 000000000000..e2158934751f
--- /dev/null
+++ b/doc/guides/rel_notes/release_23_11.rst
@@ -0,0 +1,16 @@
+.. SPDX-License-Identifier: BSD-3-Clause
+   Copyright 2022 The DPDK contributors
+
+.. include:: <isonum.txt>
+
+DPDK Release 23.11
+==================
+
+New Features
+------------
+
+
+Removed Items
+-------------
+
+* kni: Remove deprecated Kernel Network Interface driver, libraries and examples
diff --git a/doc/guides/sample_app_ug/ip_pipeline.rst b/doc/guides/sample_app_ug/ip_pipeline.rst
index b521d3b8be20..f30ac5e19db7 100644
--- a/doc/guides/sample_app_ug/ip_pipeline.rst
+++ b/doc/guides/sample_app_ug/ip_pipeline.rst
@@ -164,15 +164,6 @@ Examples
    |                       |                      |                | 8. Pipeline table rule add default |
    |                       |                      |                | 9. Pipeline table rule add         |
    +-----------------------+----------------------+----------------+------------------------------------+
-   | KNI                   | Stub                 | Forward        | 1. Mempool create                  |
-   |                       |                      |                | 2. Link create                     |
-   |                       |                      |                | 3. Pipeline create                 |
-   |                       |                      |                | 4. Pipeline port in/out            |
-   |                       |                      |                | 5. Pipeline table                  |
-   |                       |                      |                | 6. Pipeline port in table          |
-   |                       |                      |                | 7. Pipeline enable                 |
-   |                       |                      |                | 8. Pipeline table rule add         |
-   +-----------------------+----------------------+----------------+------------------------------------+
    | Firewall              | ACL                  | Allow/Drop     | 1. Mempool create                  |
    |                       |                      |                | 2. Link create                     |
    |                       | * Key = n-tuple      |                | 3. Pipeline create                 |
@@ -297,17 +288,6 @@ Tap
   tap <name>
 
 
-Kni
-~~~
-
-  Create kni port ::
-
-   kni <kni_name>
-    link <link_name>
-    mempool <mempool_name>
-    [thread <thread_id>]
-
-
 Cryptodev
 ~~~~~~~~~
 
@@ -366,7 +346,6 @@ Create pipeline input port ::
    | swq <swq_name>
    | tmgr <tmgr_name>
    | tap <tap_name> mempool <mempool_name> mtu <mtu>
-   | kni <kni_name>
    | source mempool <mempool_name> file <file_name> bpp <n_bytes_per_pkt>
    [action <port_in_action_profile_name>]
    [disabled]
@@ -379,7 +358,6 @@ Create pipeline output port ::
    | swq <swq_name>
    | tmgr <tmgr_name>
    | tap <tap_name>
-   | kni <kni_name>
    | sink [file <file_name> pkts <max_n_pkts>]
 
 Create pipeline table ::
diff --git a/drivers/net/cnxk/cnxk_ethdev.c b/drivers/net/cnxk/cnxk_ethdev.c
index 4b98faa72980..01b707b6c4ac 100644
--- a/drivers/net/cnxk/cnxk_ethdev.c
+++ b/drivers/net/cnxk/cnxk_ethdev.c
@@ -1130,7 +1130,7 @@ nix_set_nop_rxtx_function(struct rte_eth_dev *eth_dev)
 {
 	/* These dummy functions are required for supporting
 	 * some applications which reconfigure queues without
-	 * stopping tx burst and rx burst threads(eg kni app)
+	 * stopping tx burst and rx burst threads.
 	 * When the queues context is saved, txq/rxqs are released
 	 * which caused app crash since rx/tx burst is still
 	 * on different lcores
diff --git a/drivers/net/kni/meson.build b/drivers/net/kni/meson.build
deleted file mode 100644
index 2acc98969426..000000000000
--- a/drivers/net/kni/meson.build
+++ /dev/null
@@ -1,11 +0,0 @@
-# SPDX-License-Identifier: BSD-3-Clause
-# Copyright(c) 2018 Intel Corporation
-
-if is_windows
-    build = false
-    reason = 'not supported on Windows'
-    subdir_done()
-endif
-
-deps += 'kni'
-sources = files('rte_eth_kni.c')
diff --git a/drivers/net/kni/rte_eth_kni.c b/drivers/net/kni/rte_eth_kni.c
deleted file mode 100644
index c0e1f8db409e..000000000000
--- a/drivers/net/kni/rte_eth_kni.c
+++ /dev/null
@@ -1,524 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2017 Intel Corporation
- */
-
-#include <fcntl.h>
-#include <pthread.h>
-#include <unistd.h>
-
-#include <rte_string_fns.h>
-#include <ethdev_driver.h>
-#include <ethdev_vdev.h>
-#include <rte_kni.h>
-#include <rte_kvargs.h>
-#include <rte_malloc.h>
-#include <bus_vdev_driver.h>
-
-/* Only single queue supported */
-#define KNI_MAX_QUEUE_PER_PORT 1
-
-#define MAX_KNI_PORTS 8
-
-#define KNI_ETHER_MTU(mbuf_size)       \
-	((mbuf_size) - RTE_ETHER_HDR_LEN) /**< Ethernet MTU. */
-
-#define ETH_KNI_NO_REQUEST_THREAD_ARG	"no_request_thread"
-static const char * const valid_arguments[] = {
-	ETH_KNI_NO_REQUEST_THREAD_ARG,
-	NULL
-};
-
-struct eth_kni_args {
-	int no_request_thread;
-};
-
-struct pmd_queue_stats {
-	uint64_t pkts;
-	uint64_t bytes;
-};
-
-struct pmd_queue {
-	struct pmd_internals *internals;
-	struct rte_mempool *mb_pool;
-
-	struct pmd_queue_stats rx;
-	struct pmd_queue_stats tx;
-};
-
-struct pmd_internals {
-	struct rte_kni *kni;
-	uint16_t port_id;
-	int is_kni_started;
-
-	pthread_t thread;
-	int stop_thread;
-	int no_request_thread;
-
-	struct rte_ether_addr eth_addr;
-
-	struct pmd_queue rx_queues[KNI_MAX_QUEUE_PER_PORT];
-	struct pmd_queue tx_queues[KNI_MAX_QUEUE_PER_PORT];
-};
-
-static const struct rte_eth_link pmd_link = {
-		.link_speed = RTE_ETH_SPEED_NUM_10G,
-		.link_duplex = RTE_ETH_LINK_FULL_DUPLEX,
-		.link_status = RTE_ETH_LINK_DOWN,
-		.link_autoneg = RTE_ETH_LINK_FIXED,
-};
-static int is_kni_initialized;
-
-RTE_LOG_REGISTER_DEFAULT(eth_kni_logtype, NOTICE);
-
-#define PMD_LOG(level, fmt, args...) \
-	rte_log(RTE_LOG_ ## level, eth_kni_logtype, \
-		"%s(): " fmt "\n", __func__, ##args)
-static uint16_t
-eth_kni_rx(void *q, struct rte_mbuf **bufs, uint16_t nb_bufs)
-{
-	struct pmd_queue *kni_q = q;
-	struct rte_kni *kni = kni_q->internals->kni;
-	uint16_t nb_pkts;
-	int i;
-
-	nb_pkts = rte_kni_rx_burst(kni, bufs, nb_bufs);
-	for (i = 0; i < nb_pkts; i++)
-		bufs[i]->port = kni_q->internals->port_id;
-
-	kni_q->rx.pkts += nb_pkts;
-
-	return nb_pkts;
-}
-
-static uint16_t
-eth_kni_tx(void *q, struct rte_mbuf **bufs, uint16_t nb_bufs)
-{
-	struct pmd_queue *kni_q = q;
-	struct rte_kni *kni = kni_q->internals->kni;
-	uint16_t nb_pkts;
-
-	nb_pkts =  rte_kni_tx_burst(kni, bufs, nb_bufs);
-
-	kni_q->tx.pkts += nb_pkts;
-
-	return nb_pkts;
-}
-
-static void *
-kni_handle_request(void *param)
-{
-	struct pmd_internals *internals = param;
-#define MS 1000
-
-	while (!internals->stop_thread) {
-		rte_kni_handle_request(internals->kni);
-		usleep(500 * MS);
-	}
-
-	return param;
-}
-
-static int
-eth_kni_start(struct rte_eth_dev *dev)
-{
-	struct pmd_internals *internals = dev->data->dev_private;
-	uint16_t port_id = dev->data->port_id;
-	struct rte_mempool *mb_pool;
-	struct rte_kni_conf conf = {{0}};
-	const char *name = dev->device->name + 4; /* remove net_ */
-
-	mb_pool = internals->rx_queues[0].mb_pool;
-	strlcpy(conf.name, name, RTE_KNI_NAMESIZE);
-	conf.force_bind = 0;
-	conf.group_id = port_id;
-	conf.mbuf_size =
-		rte_pktmbuf_data_room_size(mb_pool) - RTE_PKTMBUF_HEADROOM;
-	conf.mtu = KNI_ETHER_MTU(conf.mbuf_size);
-
-	internals->kni = rte_kni_alloc(mb_pool, &conf, NULL);
-	if (internals->kni == NULL) {
-		PMD_LOG(ERR,
-			"Fail to create kni interface for port: %d",
-			port_id);
-		return -1;
-	}
-
-	return 0;
-}
-
-static int
-eth_kni_dev_start(struct rte_eth_dev *dev)
-{
-	struct pmd_internals *internals = dev->data->dev_private;
-	int ret;
-
-	if (internals->is_kni_started == 0) {
-		ret = eth_kni_start(dev);
-		if (ret)
-			return -1;
-		internals->is_kni_started = 1;
-	}
-
-	if (internals->no_request_thread == 0) {
-		internals->stop_thread = 0;
-
-		ret = rte_ctrl_thread_create(&internals->thread,
-			"kni_handle_req", NULL,
-			kni_handle_request, internals);
-		if (ret) {
-			PMD_LOG(ERR,
-				"Fail to create kni request thread");
-			return -1;
-		}
-	}
-
-	dev->data->dev_link.link_status = 1;
-
-	return 0;
-}
-
-static int
-eth_kni_dev_stop(struct rte_eth_dev *dev)
-{
-	struct pmd_internals *internals = dev->data->dev_private;
-	int ret;
-
-	if (internals->no_request_thread == 0 && internals->stop_thread == 0) {
-		internals->stop_thread = 1;
-
-		ret = pthread_cancel(internals->thread);
-		if (ret)
-			PMD_LOG(ERR, "Can't cancel the thread");
-
-		ret = pthread_join(internals->thread, NULL);
-		if (ret)
-			PMD_LOG(ERR, "Can't join the thread");
-	}
-
-	dev->data->dev_link.link_status = 0;
-	dev->data->dev_started = 0;
-
-	return 0;
-}
-
-static int
-eth_kni_close(struct rte_eth_dev *eth_dev)
-{
-	struct pmd_internals *internals;
-	int ret;
-
-	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
-		return 0;
-
-	ret = eth_kni_dev_stop(eth_dev);
-	if (ret)
-		PMD_LOG(WARNING, "Not able to stop kni for %s",
-			eth_dev->data->name);
-
-	/* mac_addrs must not be freed alone because part of dev_private */
-	eth_dev->data->mac_addrs = NULL;
-
-	internals = eth_dev->data->dev_private;
-	ret = rte_kni_release(internals->kni);
-	if (ret)
-		PMD_LOG(WARNING, "Not able to release kni for %s",
-			eth_dev->data->name);
-
-	return ret;
-}
-
-static int
-eth_kni_dev_configure(struct rte_eth_dev *dev __rte_unused)
-{
-	return 0;
-}
-
-static int
-eth_kni_dev_info(struct rte_eth_dev *dev __rte_unused,
-		struct rte_eth_dev_info *dev_info)
-{
-	dev_info->max_mac_addrs = 1;
-	dev_info->max_rx_pktlen = UINT32_MAX;
-	dev_info->max_rx_queues = KNI_MAX_QUEUE_PER_PORT;
-	dev_info->max_tx_queues = KNI_MAX_QUEUE_PER_PORT;
-	dev_info->min_rx_bufsize = 0;
-
-	return 0;
-}
-
-static int
-eth_kni_rx_queue_setup(struct rte_eth_dev *dev,
-		uint16_t rx_queue_id,
-		uint16_t nb_rx_desc __rte_unused,
-		unsigned int socket_id __rte_unused,
-		const struct rte_eth_rxconf *rx_conf __rte_unused,
-		struct rte_mempool *mb_pool)
-{
-	struct pmd_internals *internals = dev->data->dev_private;
-	struct pmd_queue *q;
-
-	q = &internals->rx_queues[rx_queue_id];
-	q->internals = internals;
-	q->mb_pool = mb_pool;
-
-	dev->data->rx_queues[rx_queue_id] = q;
-
-	return 0;
-}
-
-static int
-eth_kni_tx_queue_setup(struct rte_eth_dev *dev,
-		uint16_t tx_queue_id,
-		uint16_t nb_tx_desc __rte_unused,
-		unsigned int socket_id __rte_unused,
-		const struct rte_eth_txconf *tx_conf __rte_unused)
-{
-	struct pmd_internals *internals = dev->data->dev_private;
-	struct pmd_queue *q;
-
-	q = &internals->tx_queues[tx_queue_id];
-	q->internals = internals;
-
-	dev->data->tx_queues[tx_queue_id] = q;
-
-	return 0;
-}
-
-static int
-eth_kni_link_update(struct rte_eth_dev *dev __rte_unused,
-		int wait_to_complete __rte_unused)
-{
-	return 0;
-}
-
-static int
-eth_kni_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
-{
-	unsigned long rx_packets_total = 0, rx_bytes_total = 0;
-	unsigned long tx_packets_total = 0, tx_bytes_total = 0;
-	struct rte_eth_dev_data *data = dev->data;
-	unsigned int i, num_stats;
-	struct pmd_queue *q;
-
-	num_stats = RTE_MIN((unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS,
-			data->nb_rx_queues);
-	for (i = 0; i < num_stats; i++) {
-		q = data->rx_queues[i];
-		stats->q_ipackets[i] = q->rx.pkts;
-		stats->q_ibytes[i] = q->rx.bytes;
-		rx_packets_total += stats->q_ipackets[i];
-		rx_bytes_total += stats->q_ibytes[i];
-	}
-
-	num_stats = RTE_MIN((unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS,
-			data->nb_tx_queues);
-	for (i = 0; i < num_stats; i++) {
-		q = data->tx_queues[i];
-		stats->q_opackets[i] = q->tx.pkts;
-		stats->q_obytes[i] = q->tx.bytes;
-		tx_packets_total += stats->q_opackets[i];
-		tx_bytes_total += stats->q_obytes[i];
-	}
-
-	stats->ipackets = rx_packets_total;
-	stats->ibytes = rx_bytes_total;
-	stats->opackets = tx_packets_total;
-	stats->obytes = tx_bytes_total;
-
-	return 0;
-}
-
-static int
-eth_kni_stats_reset(struct rte_eth_dev *dev)
-{
-	struct rte_eth_dev_data *data = dev->data;
-	struct pmd_queue *q;
-	unsigned int i;
-
-	for (i = 0; i < data->nb_rx_queues; i++) {
-		q = data->rx_queues[i];
-		q->rx.pkts = 0;
-		q->rx.bytes = 0;
-	}
-	for (i = 0; i < data->nb_tx_queues; i++) {
-		q = data->tx_queues[i];
-		q->tx.pkts = 0;
-		q->tx.bytes = 0;
-	}
-
-	return 0;
-}
-
-static const struct eth_dev_ops eth_kni_ops = {
-	.dev_start = eth_kni_dev_start,
-	.dev_stop = eth_kni_dev_stop,
-	.dev_close = eth_kni_close,
-	.dev_configure = eth_kni_dev_configure,
-	.dev_infos_get = eth_kni_dev_info,
-	.rx_queue_setup = eth_kni_rx_queue_setup,
-	.tx_queue_setup = eth_kni_tx_queue_setup,
-	.link_update = eth_kni_link_update,
-	.stats_get = eth_kni_stats_get,
-	.stats_reset = eth_kni_stats_reset,
-};
-
-static struct rte_eth_dev *
-eth_kni_create(struct rte_vdev_device *vdev,
-		struct eth_kni_args *args,
-		unsigned int numa_node)
-{
-	struct pmd_internals *internals;
-	struct rte_eth_dev_data *data;
-	struct rte_eth_dev *eth_dev;
-
-	PMD_LOG(INFO, "Creating kni ethdev on numa socket %u",
-			numa_node);
-
-	/* reserve an ethdev entry */
-	eth_dev = rte_eth_vdev_allocate(vdev, sizeof(*internals));
-	if (!eth_dev)
-		return NULL;
-
-	internals = eth_dev->data->dev_private;
-	internals->port_id = eth_dev->data->port_id;
-	data = eth_dev->data;
-	data->nb_rx_queues = 1;
-	data->nb_tx_queues = 1;
-	data->dev_link = pmd_link;
-	data->mac_addrs = &internals->eth_addr;
-	data->promiscuous = 1;
-	data->all_multicast = 1;
-	data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
-
-	rte_eth_random_addr(internals->eth_addr.addr_bytes);
-
-	eth_dev->dev_ops = &eth_kni_ops;
-
-	internals->no_request_thread = args->no_request_thread;
-
-	return eth_dev;
-}
-
-static int
-kni_init(void)
-{
-	int ret;
-
-	if (is_kni_initialized == 0) {
-		ret = rte_kni_init(MAX_KNI_PORTS);
-		if (ret < 0)
-			return ret;
-	}
-
-	is_kni_initialized++;
-
-	return 0;
-}
-
-static int
-eth_kni_kvargs_process(struct eth_kni_args *args, const char *params)
-{
-	struct rte_kvargs *kvlist;
-
-	kvlist = rte_kvargs_parse(params, valid_arguments);
-	if (kvlist == NULL)
-		return -1;
-
-	memset(args, 0, sizeof(struct eth_kni_args));
-
-	if (rte_kvargs_count(kvlist, ETH_KNI_NO_REQUEST_THREAD_ARG) == 1)
-		args->no_request_thread = 1;
-
-	rte_kvargs_free(kvlist);
-
-	return 0;
-}
-
-static int
-eth_kni_probe(struct rte_vdev_device *vdev)
-{
-	struct rte_eth_dev *eth_dev;
-	struct eth_kni_args args;
-	const char *name;
-	const char *params;
-	int ret;
-
-	name = rte_vdev_device_name(vdev);
-	params = rte_vdev_device_args(vdev);
-	PMD_LOG(INFO, "Initializing eth_kni for %s", name);
-
-	if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
-		eth_dev = rte_eth_dev_attach_secondary(name);
-		if (!eth_dev) {
-			PMD_LOG(ERR, "Failed to probe %s", name);
-			return -1;
-		}
-		/* TODO: request info from primary to set up Rx and Tx */
-		eth_dev->dev_ops = &eth_kni_ops;
-		eth_dev->device = &vdev->device;
-		rte_eth_dev_probing_finish(eth_dev);
-		return 0;
-	}
-
-	ret = eth_kni_kvargs_process(&args, params);
-	if (ret < 0)
-		return ret;
-
-	ret = kni_init();
-	if (ret < 0)
-		return ret;
-
-	eth_dev = eth_kni_create(vdev, &args, rte_socket_id());
-	if (eth_dev == NULL)
-		goto kni_uninit;
-
-	eth_dev->rx_pkt_burst = eth_kni_rx;
-	eth_dev->tx_pkt_burst = eth_kni_tx;
-
-	rte_eth_dev_probing_finish(eth_dev);
-	return 0;
-
-kni_uninit:
-	is_kni_initialized--;
-	if (is_kni_initialized == 0)
-		rte_kni_close();
-	return -1;
-}
-
-static int
-eth_kni_remove(struct rte_vdev_device *vdev)
-{
-	struct rte_eth_dev *eth_dev;
-	const char *name;
-	int ret;
-
-	name = rte_vdev_device_name(vdev);
-	PMD_LOG(INFO, "Un-Initializing eth_kni for %s", name);
-
-	/* find the ethdev entry */
-	eth_dev = rte_eth_dev_allocated(name);
-	if (eth_dev != NULL) {
-		if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
-			ret = eth_kni_dev_stop(eth_dev);
-			if (ret != 0)
-				return ret;
-			return rte_eth_dev_release_port(eth_dev);
-		}
-		eth_kni_close(eth_dev);
-		rte_eth_dev_release_port(eth_dev);
-	}
-
-	is_kni_initialized--;
-	if (is_kni_initialized == 0)
-		rte_kni_close();
-
-	return 0;
-}
-
-static struct rte_vdev_driver eth_kni_drv = {
-	.probe = eth_kni_probe,
-	.remove = eth_kni_remove,
-};
-
-RTE_PMD_REGISTER_VDEV(net_kni, eth_kni_drv);
-RTE_PMD_REGISTER_PARAM_STRING(net_kni, ETH_KNI_NO_REQUEST_THREAD_ARG "=<int>");
diff --git a/drivers/net/meson.build b/drivers/net/meson.build
index f68bbc27a784..bd38b533c573 100644
--- a/drivers/net/meson.build
+++ b/drivers/net/meson.build
@@ -35,7 +35,6 @@ drivers = [
         'ionic',
         'ipn3ke',
         'ixgbe',
-        'kni',
         'mana',
         'memif',
         'mlx4',
diff --git a/examples/ip_pipeline/Makefile b/examples/ip_pipeline/Makefile
index 785c7ee38ce5..bc5e0a9f1800 100644
--- a/examples/ip_pipeline/Makefile
+++ b/examples/ip_pipeline/Makefile
@@ -8,7 +8,6 @@ APP = ip_pipeline
 SRCS-y := action.c
 SRCS-y += cli.c
 SRCS-y += conn.c
-SRCS-y += kni.c
 SRCS-y += link.c
 SRCS-y += main.c
 SRCS-y += mempool.c
diff --git a/examples/ip_pipeline/cli.c b/examples/ip_pipeline/cli.c
index c918f30e06f3..e8269ea90c11 100644
--- a/examples/ip_pipeline/cli.c
+++ b/examples/ip_pipeline/cli.c
@@ -14,7 +14,6 @@
 #include "cli.h"
 
 #include "cryptodev.h"
-#include "kni.h"
 #include "link.h"
 #include "mempool.h"
 #include "parser.h"
@@ -728,65 +727,6 @@ cmd_tap(char **tokens,
 	}
 }
 
-static const char cmd_kni_help[] =
-"kni <kni_name>\n"
-"   link <link_name>\n"
-"   mempool <mempool_name>\n"
-"   [thread <thread_id>]\n";
-
-static void
-cmd_kni(char **tokens,
-	uint32_t n_tokens,
-	char *out,
-	size_t out_size)
-{
-	struct kni_params p;
-	char *name;
-	struct kni *kni;
-
-	memset(&p, 0, sizeof(p));
-	if ((n_tokens != 6) && (n_tokens != 8)) {
-		snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
-		return;
-	}
-
-	name = tokens[1];
-
-	if (strcmp(tokens[2], "link") != 0) {
-		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "link");
-		return;
-	}
-
-	p.link_name = tokens[3];
-
-	if (strcmp(tokens[4], "mempool") != 0) {
-		snprintf(out, out_size, MSG_ARG_NOT_FOUND, "mempool");
-		return;
-	}
-
-	p.mempool_name = tokens[5];
-
-	if (n_tokens == 8) {
-		if (strcmp(tokens[6], "thread") != 0) {
-			snprintf(out, out_size, MSG_ARG_NOT_FOUND, "thread");
-			return;
-		}
-
-		if (parser_read_uint32(&p.thread_id, tokens[7]) != 0) {
-			snprintf(out, out_size, MSG_ARG_INVALID, "thread_id");
-			return;
-		}
-
-		p.force_bind = 1;
-	} else
-		p.force_bind = 0;
-
-	kni = kni_create(name, &p);
-	if (kni == NULL) {
-		snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
-		return;
-	}
-}
 
 static const char cmd_cryptodev_help[] =
 "cryptodev <cryptodev_name>\n"
@@ -1541,7 +1481,6 @@ static const char cmd_pipeline_port_in_help[] =
 "   | swq <swq_name>\n"
 "   | tmgr <tmgr_name>\n"
 "   | tap <tap_name> mempool <mempool_name> mtu <mtu>\n"
-"   | kni <kni_name>\n"
 "   | source mempool <mempool_name> file <file_name> bpp <n_bytes_per_pkt>\n"
 "   | cryptodev <cryptodev_name> rxq <queue_id>\n"
 "   [action <port_in_action_profile_name>]\n"
@@ -1664,18 +1603,6 @@ cmd_pipeline_port_in(char **tokens,
 		}
 
 		t0 += 6;
-	} else if (strcmp(tokens[t0], "kni") == 0) {
-		if (n_tokens < t0 + 2) {
-			snprintf(out, out_size, MSG_ARG_MISMATCH,
-				"pipeline port in kni");
-			return;
-		}
-
-		p.type = PORT_IN_KNI;
-
-		p.dev_name = tokens[t0 + 1];
-
-		t0 += 2;
 	} else if (strcmp(tokens[t0], "source") == 0) {
 		if (n_tokens < t0 + 6) {
 			snprintf(out, out_size, MSG_ARG_MISMATCH,
@@ -1781,7 +1708,6 @@ static const char cmd_pipeline_port_out_help[] =
 "   | swq <swq_name>\n"
 "   | tmgr <tmgr_name>\n"
 "   | tap <tap_name>\n"
-"   | kni <kni_name>\n"
 "   | sink [file <file_name> pkts <max_n_pkts>]\n"
 "   | cryptodev <cryptodev_name> txq <txq_id> offset <crypto_op_offset>\n";
 
@@ -1873,16 +1799,6 @@ cmd_pipeline_port_out(char **tokens,
 
 		p.type = PORT_OUT_TAP;
 
-		p.dev_name = tokens[7];
-	} else if (strcmp(tokens[6], "kni") == 0) {
-		if (n_tokens != 8) {
-			snprintf(out, out_size, MSG_ARG_MISMATCH,
-				"pipeline port out kni");
-			return;
-		}
-
-		p.type = PORT_OUT_KNI;
-
 		p.dev_name = tokens[7];
 	} else if (strcmp(tokens[6], "sink") == 0) {
 		if ((n_tokens != 7) && (n_tokens != 11)) {
@@ -6038,7 +5954,6 @@ cmd_help(char **tokens, uint32_t n_tokens, char *out, size_t out_size)
 			"\ttmgr subport\n"
 			"\ttmgr subport pipe\n"
 			"\ttap\n"
-			"\tkni\n"
 			"\tport in action profile\n"
 			"\ttable action profile\n"
 			"\tpipeline\n"
@@ -6124,11 +6039,6 @@ cmd_help(char **tokens, uint32_t n_tokens, char *out, size_t out_size)
 		return;
 	}
 
-	if (strcmp(tokens[0], "kni") == 0) {
-		snprintf(out, out_size, "\n%s\n", cmd_kni_help);
-		return;
-	}
-
 	if (strcmp(tokens[0], "cryptodev") == 0) {
 		snprintf(out, out_size, "\n%s\n", cmd_cryptodev_help);
 		return;
@@ -6436,11 +6346,6 @@ cli_process(char *in, char *out, size_t out_size)
 		return;
 	}
 
-	if (strcmp(tokens[0], "kni") == 0) {
-		cmd_kni(tokens, n_tokens, out, out_size);
-		return;
-	}
-
 	if (strcmp(tokens[0], "cryptodev") == 0) {
 		cmd_cryptodev(tokens, n_tokens, out, out_size);
 		return;
diff --git a/examples/ip_pipeline/examples/kni.cli b/examples/ip_pipeline/examples/kni.cli
deleted file mode 100644
index 143834093d4d..000000000000
--- a/examples/ip_pipeline/examples/kni.cli
+++ /dev/null
@@ -1,69 +0,0 @@
-; SPDX-License-Identifier: BSD-3-Clause
-; Copyright(c) 2010-2018 Intel Corporation
-
-;                 _______________          ______________________
-;                |               |  KNI0  |                      |
-; LINK0 RXQ0 --->|...............|------->|--+                   |
-;                |               |  KNI1  |  | br0               |
-; LINK1 TXQ0 <---|...............|<-------|<-+                   |
-;                |               |        |     Linux Kernel     |
-;                |   PIPELINE0   |        |     Network Stack    |
-;                |               |  KNI1  |                      |
-; LINK1 RXQ0 --->|...............|------->|--+                   |
-;                |               |  KNI0  |  | br0               |
-; LINK0 TXQ0 <---|...............|<-------|<-+                   |
-;                |_______________|        |______________________|
-;
-; Insert Linux kernel KNI module:
-;    [Linux]$ insmod rte_kni.ko
-;
-; Configure Linux kernel bridge between KNI0 and KNI1 interfaces:
-;    [Linux]$ brctl addbr br0
-;    [Linux]$ brctl addif br0 KNI0
-;    [Linux]$ brctl addif br0 KNI1
-;    [Linux]$ ifconfig br0 up
-;    [Linux]$ ifconfig KNI0 up
-;    [Linux]$ ifconfig KNI1 up
-;
-; Monitor packet forwarding performed by Linux kernel between KNI0 and KNI1:
-;    [Linux]$ tcpdump -i KNI0
-;    [Linux]$ tcpdump -i KNI1
-
-mempool MEMPOOL0 buffer 2304 pool 32K cache 256 cpu 0
-
-link LINK0 dev 0000:02:00.0 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-link LINK1 dev 0000:02:00.1 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-
-kni KNI0 link LINK0 mempool MEMPOOL0
-kni KNI1 link LINK1 mempool MEMPOOL0
-
-table action profile AP0 ipv4 offset 270 fwd
-
-pipeline PIPELINE0 period 10 offset_port_id 0 cpu 0
-
-pipeline PIPELINE0 port in bsz 32 link LINK0 rxq 0
-pipeline PIPELINE0 port in bsz 32 kni KNI1
-pipeline PIPELINE0 port in bsz 32 link LINK1 rxq 0
-pipeline PIPELINE0 port in bsz 32 kni KNI0
-
-pipeline PIPELINE0 port out bsz 32 kni KNI0
-pipeline PIPELINE0 port out bsz 32 link LINK1 txq 0
-pipeline PIPELINE0 port out bsz 32 kni KNI1
-pipeline PIPELINE0 port out bsz 32 link LINK0 txq 0
-
-pipeline PIPELINE0 table match stub action AP0
-pipeline PIPELINE0 table match stub action AP0
-pipeline PIPELINE0 table match stub action AP0
-pipeline PIPELINE0 table match stub action AP0
-
-pipeline PIPELINE0 port in 0 table 0
-pipeline PIPELINE0 port in 1 table 1
-pipeline PIPELINE0 port in 2 table 2
-pipeline PIPELINE0 port in 3 table 3
-
-thread 1 pipeline PIPELINE0 enable
-
-pipeline PIPELINE0 table 0 rule add match default action fwd port 0
-pipeline PIPELINE0 table 1 rule add match default action fwd port 1
-pipeline PIPELINE0 table 2 rule add match default action fwd port 2
-pipeline PIPELINE0 table 3 rule add match default action fwd port 3
diff --git a/examples/ip_pipeline/kni.c b/examples/ip_pipeline/kni.c
deleted file mode 100644
index cd02c3947827..000000000000
--- a/examples/ip_pipeline/kni.c
+++ /dev/null
@@ -1,168 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <rte_ethdev.h>
-#include <rte_string_fns.h>
-
-#include "kni.h"
-#include "mempool.h"
-#include "link.h"
-
-static struct kni_list kni_list;
-
-#ifndef KNI_MAX
-#define KNI_MAX                                            16
-#endif
-
-int
-kni_init(void)
-{
-	TAILQ_INIT(&kni_list);
-
-#ifdef RTE_LIB_KNI
-	rte_kni_init(KNI_MAX);
-#endif
-
-	return 0;
-}
-
-struct kni *
-kni_find(const char *name)
-{
-	struct kni *kni;
-
-	if (name == NULL)
-		return NULL;
-
-	TAILQ_FOREACH(kni, &kni_list, node)
-		if (strcmp(kni->name, name) == 0)
-			return kni;
-
-	return NULL;
-}
-
-#ifndef RTE_LIB_KNI
-
-struct kni *
-kni_create(const char *name __rte_unused,
-	struct kni_params *params __rte_unused)
-{
-	return NULL;
-}
-
-void
-kni_handle_request(void)
-{
-	return;
-}
-
-#else
-
-static int
-kni_config_network_interface(uint16_t port_id, uint8_t if_up)
-{
-	int ret = 0;
-
-	if (!rte_eth_dev_is_valid_port(port_id))
-		return -EINVAL;
-
-	ret = (if_up) ?
-		rte_eth_dev_set_link_up(port_id) :
-		rte_eth_dev_set_link_down(port_id);
-
-	return ret;
-}
-
-static int
-kni_change_mtu(uint16_t port_id, unsigned int new_mtu)
-{
-	int ret;
-
-	if (!rte_eth_dev_is_valid_port(port_id))
-		return -EINVAL;
-
-	if (new_mtu > RTE_ETHER_MAX_LEN)
-		return -EINVAL;
-
-	/* Set new MTU */
-	ret = rte_eth_dev_set_mtu(port_id, new_mtu);
-	if (ret < 0)
-		return ret;
-
-	return 0;
-}
-
-struct kni *
-kni_create(const char *name, struct kni_params *params)
-{
-	struct rte_eth_dev_info dev_info;
-	struct rte_kni_conf kni_conf;
-	struct rte_kni_ops kni_ops;
-	struct kni *kni;
-	struct mempool *mempool;
-	struct link *link;
-	struct rte_kni *k;
-	int ret;
-
-	/* Check input params */
-	if ((name == NULL) ||
-		kni_find(name) ||
-		(params == NULL))
-		return NULL;
-
-	mempool = mempool_find(params->mempool_name);
-	link = link_find(params->link_name);
-	if ((mempool == NULL) ||
-		(link == NULL))
-		return NULL;
-
-	/* Resource create */
-	ret = rte_eth_dev_info_get(link->port_id, &dev_info);
-	if (ret != 0)
-		return NULL;
-
-	memset(&kni_conf, 0, sizeof(kni_conf));
-	strlcpy(kni_conf.name, name, RTE_KNI_NAMESIZE);
-	kni_conf.force_bind = params->force_bind;
-	kni_conf.core_id = params->thread_id;
-	kni_conf.group_id = link->port_id;
-	kni_conf.mbuf_size = mempool->buffer_size;
-
-	memset(&kni_ops, 0, sizeof(kni_ops));
-	kni_ops.port_id = link->port_id;
-	kni_ops.config_network_if = kni_config_network_interface;
-	kni_ops.change_mtu = kni_change_mtu;
-
-	k = rte_kni_alloc(mempool->m, &kni_conf, &kni_ops);
-	if (k == NULL)
-		return NULL;
-
-	/* Node allocation */
-	kni = calloc(1, sizeof(struct kni));
-	if (kni == NULL)
-		return NULL;
-
-	/* Node fill in */
-	strlcpy(kni->name, name, sizeof(kni->name));
-	kni->k = k;
-
-	/* Node add to list */
-	TAILQ_INSERT_TAIL(&kni_list, kni, node);
-
-	return kni;
-}
-
-void
-kni_handle_request(void)
-{
-	struct kni *kni;
-
-	TAILQ_FOREACH(kni, &kni_list, node)
-		rte_kni_handle_request(kni->k);
-}
-
-#endif
diff --git a/examples/ip_pipeline/kni.h b/examples/ip_pipeline/kni.h
deleted file mode 100644
index 118f48df73d8..000000000000
--- a/examples/ip_pipeline/kni.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#ifndef _INCLUDE_KNI_H_
-#define _INCLUDE_KNI_H_
-
-#include <stdint.h>
-#include <sys/queue.h>
-
-#ifdef RTE_LIB_KNI
-#include <rte_kni.h>
-#endif
-
-#include "common.h"
-
-struct kni {
-	TAILQ_ENTRY(kni) node;
-	char name[NAME_SIZE];
-#ifdef RTE_LIB_KNI
-	struct rte_kni *k;
-#endif
-};
-
-TAILQ_HEAD(kni_list, kni);
-
-int
-kni_init(void);
-
-struct kni *
-kni_find(const char *name);
-
-struct kni_params {
-	const char *link_name;
-	const char *mempool_name;
-	int force_bind;
-	uint32_t thread_id;
-};
-
-struct kni *
-kni_create(const char *name, struct kni_params *params);
-
-void
-kni_handle_request(void);
-
-#endif /* _INCLUDE_KNI_H_ */
diff --git a/examples/ip_pipeline/main.c b/examples/ip_pipeline/main.c
index e35d9bce3984..663f538f024a 100644
--- a/examples/ip_pipeline/main.c
+++ b/examples/ip_pipeline/main.c
@@ -14,7 +14,6 @@
 
 #include "cli.h"
 #include "conn.h"
-#include "kni.h"
 #include "cryptodev.h"
 #include "link.h"
 #include "mempool.h"
@@ -205,13 +204,6 @@ main(int argc, char **argv)
 		return status;
 	}
 
-	/* KNI */
-	status = kni_init();
-	if (status) {
-		printf("Error: KNI initialization failed (%d)\n", status);
-		return status;
-	}
-
 	/* Sym Crypto */
 	status = cryptodev_init();
 	if (status) {
@@ -264,7 +256,5 @@ main(int argc, char **argv)
 		conn_poll_for_conn(conn);
 
 		conn_poll_for_msg(conn);
-
-		kni_handle_request();
 	}
 }
diff --git a/examples/ip_pipeline/meson.build b/examples/ip_pipeline/meson.build
index 57f522c24cf9..68049157e429 100644
--- a/examples/ip_pipeline/meson.build
+++ b/examples/ip_pipeline/meson.build
@@ -18,7 +18,6 @@ sources = files(
         'cli.c',
         'conn.c',
         'cryptodev.c',
-        'kni.c',
         'link.c',
         'main.c',
         'mempool.c',
diff --git a/examples/ip_pipeline/pipeline.c b/examples/ip_pipeline/pipeline.c
index 7ebabcae984d..63352257c6e9 100644
--- a/examples/ip_pipeline/pipeline.c
+++ b/examples/ip_pipeline/pipeline.c
@@ -11,9 +11,6 @@
 
 #include <rte_string_fns.h>
 #include <rte_port_ethdev.h>
-#ifdef RTE_LIB_KNI
-#include <rte_port_kni.h>
-#endif
 #include <rte_port_ring.h>
 #include <rte_port_source_sink.h>
 #include <rte_port_fd.h>
@@ -28,9 +25,6 @@
 #include <rte_table_lpm_ipv6.h>
 #include <rte_table_stub.h>
 
-#ifdef RTE_LIB_KNI
-#include "kni.h"
-#endif
 #include "link.h"
 #include "mempool.h"
 #include "pipeline.h"
@@ -160,9 +154,6 @@ pipeline_port_in_create(const char *pipeline_name,
 		struct rte_port_ring_reader_params ring;
 		struct rte_port_sched_reader_params sched;
 		struct rte_port_fd_reader_params fd;
-#ifdef RTE_LIB_KNI
-		struct rte_port_kni_reader_params kni;
-#endif
 		struct rte_port_source_params source;
 		struct rte_port_sym_crypto_reader_params sym_crypto;
 	} pp;
@@ -264,22 +255,6 @@ pipeline_port_in_create(const char *pipeline_name,
 		break;
 	}
 
-#ifdef RTE_LIB_KNI
-	case PORT_IN_KNI:
-	{
-		struct kni *kni;
-
-		kni = kni_find(params->dev_name);
-		if (kni == NULL)
-			return -1;
-
-		pp.kni.kni = kni->k;
-
-		p.ops = &rte_port_kni_reader_ops;
-		p.arg_create = &pp.kni;
-		break;
-	}
-#endif
 
 	case PORT_IN_SOURCE:
 	{
@@ -404,9 +379,6 @@ pipeline_port_out_create(const char *pipeline_name,
 		struct rte_port_ring_writer_params ring;
 		struct rte_port_sched_writer_params sched;
 		struct rte_port_fd_writer_params fd;
-#ifdef RTE_LIB_KNI
-		struct rte_port_kni_writer_params kni;
-#endif
 		struct rte_port_sink_params sink;
 		struct rte_port_sym_crypto_writer_params sym_crypto;
 	} pp;
@@ -415,9 +387,6 @@ pipeline_port_out_create(const char *pipeline_name,
 		struct rte_port_ethdev_writer_nodrop_params ethdev;
 		struct rte_port_ring_writer_nodrop_params ring;
 		struct rte_port_fd_writer_nodrop_params fd;
-#ifdef RTE_LIB_KNI
-		struct rte_port_kni_writer_nodrop_params kni;
-#endif
 		struct rte_port_sym_crypto_writer_nodrop_params sym_crypto;
 	} pp_nodrop;
 
@@ -537,32 +506,6 @@ pipeline_port_out_create(const char *pipeline_name,
 		break;
 	}
 
-#ifdef RTE_LIB_KNI
-	case PORT_OUT_KNI:
-	{
-		struct kni *kni;
-
-		kni = kni_find(params->dev_name);
-		if (kni == NULL)
-			return -1;
-
-		pp.kni.kni = kni->k;
-		pp.kni.tx_burst_sz = params->burst_size;
-
-		pp_nodrop.kni.kni = kni->k;
-		pp_nodrop.kni.tx_burst_sz = params->burst_size;
-		pp_nodrop.kni.n_retries = params->n_retries;
-
-		if (params->retry == 0) {
-			p.ops = &rte_port_kni_writer_ops;
-			p.arg_create = &pp.kni;
-		} else {
-			p.ops = &rte_port_kni_writer_nodrop_ops;
-			p.arg_create = &pp_nodrop.kni;
-		}
-		break;
-	}
-#endif
 
 	case PORT_OUT_SINK:
 	{
diff --git a/examples/ip_pipeline/pipeline.h b/examples/ip_pipeline/pipeline.h
index 4d2ee29a54c7..083d5e852421 100644
--- a/examples/ip_pipeline/pipeline.h
+++ b/examples/ip_pipeline/pipeline.h
@@ -25,7 +25,6 @@ enum port_in_type {
 	PORT_IN_SWQ,
 	PORT_IN_TMGR,
 	PORT_IN_TAP,
-	PORT_IN_KNI,
 	PORT_IN_SOURCE,
 	PORT_IN_CRYPTODEV,
 };
@@ -67,7 +66,6 @@ enum port_out_type {
 	PORT_OUT_SWQ,
 	PORT_OUT_TMGR,
 	PORT_OUT_TAP,
-	PORT_OUT_KNI,
 	PORT_OUT_SINK,
 	PORT_OUT_CRYPTODEV,
 };
diff --git a/kernel/linux/kni/Kbuild b/kernel/linux/kni/Kbuild
deleted file mode 100644
index e5452d6c00db..000000000000
--- a/kernel/linux/kni/Kbuild
+++ /dev/null
@@ -1,6 +0,0 @@
-# SPDX-License-Identifier: BSD-3-Clause
-# Copyright(c) 2018 Luca Boccassi <bluca@debian.org>
-
-ccflags-y := $(MODULE_CFLAGS)
-obj-m := rte_kni.o
-rte_kni-y := $(patsubst $(src)/%.c,%.o,$(wildcard $(src)/*.c))
diff --git a/kernel/linux/kni/compat.h b/kernel/linux/kni/compat.h
deleted file mode 100644
index 8beb67046577..000000000000
--- a/kernel/linux/kni/compat.h
+++ /dev/null
@@ -1,157 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Minimal wrappers to allow compiling kni on older kernels.
- */
-
-#include <linux/version.h>
-
-#ifndef RHEL_RELEASE_VERSION
-#define RHEL_RELEASE_VERSION(a, b) (((a) << 8) + (b))
-#endif
-
-/* SuSE version macro is the same as Linux kernel version */
-#ifndef SLE_VERSION
-#define SLE_VERSION(a, b, c) KERNEL_VERSION(a, b, c)
-#endif
-#ifdef CONFIG_SUSE_KERNEL
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 57))
-/* SLES12SP3 is at least 4.4.57+ based */
-#define SLE_VERSION_CODE SLE_VERSION(12, 3, 0)
-#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 12, 28))
-/* SLES12 is at least 3.12.28+ based */
-#define SLE_VERSION_CODE SLE_VERSION(12, 0, 0)
-#elif ((LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 61)) && \
-	(LINUX_VERSION_CODE < KERNEL_VERSION(3, 1, 0)))
-/* SLES11 SP3 is at least 3.0.61+ based */
-#define SLE_VERSION_CODE SLE_VERSION(11, 3, 0)
-#elif (LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 32))
-/* SLES11 SP1 is 2.6.32 based */
-#define SLE_VERSION_CODE SLE_VERSION(11, 1, 0)
-#elif (LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 27))
-/* SLES11 GA is 2.6.27 based */
-#define SLE_VERSION_CODE SLE_VERSION(11, 0, 0)
-#endif /* LINUX_VERSION_CODE == KERNEL_VERSION(x,y,z) */
-#endif /* CONFIG_SUSE_KERNEL */
-#ifndef SLE_VERSION_CODE
-#define SLE_VERSION_CODE 0
-#endif /* SLE_VERSION_CODE */
-
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 39) && \
-	(!(defined(RHEL_RELEASE_CODE) && \
-	   RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6, 4)))
-
-#define kstrtoul strict_strtoul
-
-#endif /* < 2.6.39 */
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 33)
-#define HAVE_SIMPLIFIED_PERNET_OPERATIONS
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 35)
-#define sk_sleep(s) ((s)->sk_sleep)
-#else
-#define HAVE_SOCKET_WQ
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0)
-#define HAVE_STATIC_SOCK_MAP_FD
-#else
-#define kni_sock_map_fd(s) sock_map_fd(s, 0)
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
-#define HAVE_CHANGE_CARRIER_CB
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)
-#define ether_addr_copy(dst, src) memcpy(dst, src, ETH_ALEN)
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)
-#define HAVE_IOV_ITER_MSGHDR
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 1, 0)
-#define HAVE_KIOCB_MSG_PARAM
-#define HAVE_REBUILD_HEADER
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
-#define HAVE_SK_ALLOC_KERN_PARAM
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0) || \
-	(defined(RHEL_RELEASE_CODE) && \
-	 RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7, 4)) || \
-	(SLE_VERSION_CODE && SLE_VERSION_CODE == SLE_VERSION(12, 3, 0))
-#define HAVE_TRANS_START_HELPER
-#endif
-
-/*
- * KNI uses NET_NAME_UNKNOWN macro to select correct version of alloc_netdev()
- * For old kernels just backported the commit that enables the macro
- * (685343fc3ba6) but still uses old API, it is required to undefine macro to
- * select correct version of API, this is safe since KNI doesn't use the value.
- * This fix is specific to RedHat/CentOS kernels.
- */
-#if (defined(RHEL_RELEASE_CODE) && \
-	(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6, 8)) && \
-	(LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 34)))
-#undef NET_NAME_UNKNOWN
-#endif
-
-/*
- * RHEL has two different version with different kernel version:
- * 3.10 is for AMD, Intel, IBM POWER7 and POWER8;
- * 4.14 is for ARM and IBM POWER9
- */
-#if (defined(RHEL_RELEASE_CODE) && \
-	(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7, 5)) && \
-	(RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(8, 0)) && \
-	(LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 0)))
-#define ndo_change_mtu ndo_change_mtu_rh74
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0)
-#define HAVE_MAX_MTU_PARAM
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
-#define HAVE_SIGNAL_FUNCTIONS_OWN_HEADER
-#endif
-
-/*
- * iova to kva mapping support can be provided since 4.6.0, but required
- * kernel version increased to >= 4.10.0 because of the updates in
- * get_user_pages_remote() kernel API
- */
-#if KERNEL_VERSION(4, 10, 0) <= LINUX_VERSION_CODE
-#define HAVE_IOVA_TO_KVA_MAPPING_SUPPORT
-#endif
-
-#if KERNEL_VERSION(5, 6, 0) <= LINUX_VERSION_CODE || \
-	(defined(RHEL_RELEASE_CODE) && \
-	 RHEL_RELEASE_VERSION(8, 3) <= RHEL_RELEASE_CODE) || \
-	 (defined(CONFIG_SUSE_KERNEL) && defined(HAVE_ARG_TX_QUEUE))
-#define HAVE_TX_TIMEOUT_TXQUEUE
-#endif
-
-#if KERNEL_VERSION(5, 9, 0) > LINUX_VERSION_CODE
-#define HAVE_TSK_IN_GUP
-#endif
-
-#if KERNEL_VERSION(5, 15, 0) <= LINUX_VERSION_CODE
-#define HAVE_ETH_HW_ADDR_SET
-#endif
-
-#if KERNEL_VERSION(5, 18, 0) > LINUX_VERSION_CODE && \
-	(!(defined(RHEL_RELEASE_CODE) && \
-	 RHEL_RELEASE_VERSION(9, 1) <= RHEL_RELEASE_CODE))
-#define HAVE_NETIF_RX_NI
-#endif
-
-#if KERNEL_VERSION(6, 5, 0) > LINUX_VERSION_CODE
-#define HAVE_VMA_IN_GUP
-#endif
diff --git a/kernel/linux/kni/kni_dev.h b/kernel/linux/kni/kni_dev.h
deleted file mode 100644
index 975379825b2d..000000000000
--- a/kernel/linux/kni/kni_dev.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright(c) 2010-2014 Intel Corporation.
- */
-
-#ifndef _KNI_DEV_H_
-#define _KNI_DEV_H_
-
-#ifdef pr_fmt
-#undef pr_fmt
-#endif
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
-#define KNI_VERSION	"1.0"
-
-#include "compat.h"
-
-#include <linux/if.h>
-#include <linux/wait.h>
-#ifdef HAVE_SIGNAL_FUNCTIONS_OWN_HEADER
-#include <linux/sched/signal.h>
-#else
-#include <linux/sched.h>
-#endif
-#include <linux/netdevice.h>
-#include <linux/spinlock.h>
-#include <linux/list.h>
-
-#include <rte_kni_common.h>
-#define KNI_KTHREAD_MAX_RESCHEDULE_INTERVAL 1000000 /* us */
-
-#define MBUF_BURST_SZ 32
-
-/* Default carrier state for created KNI network interfaces */
-extern uint32_t kni_dflt_carrier;
-
-/* Request processing support for bifurcated drivers. */
-extern uint32_t bifurcated_support;
-
-/**
- * A structure describing the private information for a kni device.
- */
-struct kni_dev {
-	/* kni list */
-	struct list_head list;
-
-	uint8_t iova_mode;
-
-	uint32_t core_id;            /* Core ID to bind */
-	char name[RTE_KNI_NAMESIZE]; /* Network device name */
-	struct task_struct *pthread;
-
-	/* wait queue for req/resp */
-	wait_queue_head_t wq;
-	struct mutex sync_lock;
-
-	/* kni device */
-	struct net_device *net_dev;
-
-	/* queue for packets to be sent out */
-	struct rte_kni_fifo *tx_q;
-
-	/* queue for the packets received */
-	struct rte_kni_fifo *rx_q;
-
-	/* queue for the allocated mbufs those can be used to save sk buffs */
-	struct rte_kni_fifo *alloc_q;
-
-	/* free queue for the mbufs to be freed */
-	struct rte_kni_fifo *free_q;
-
-	/* request queue */
-	struct rte_kni_fifo *req_q;
-
-	/* response queue */
-	struct rte_kni_fifo *resp_q;
-
-	void *sync_kva;
-	void *sync_va;
-
-	void *mbuf_kva;
-	void *mbuf_va;
-
-	/* mbuf size */
-	uint32_t mbuf_size;
-
-	/* buffers */
-	void *pa[MBUF_BURST_SZ];
-	void *va[MBUF_BURST_SZ];
-	void *alloc_pa[MBUF_BURST_SZ];
-	void *alloc_va[MBUF_BURST_SZ];
-
-	struct task_struct *usr_tsk;
-};
-
-#ifdef HAVE_IOVA_TO_KVA_MAPPING_SUPPORT
-static inline phys_addr_t iova_to_phys(struct task_struct *tsk,
-				       unsigned long iova)
-{
-	phys_addr_t offset, phys_addr;
-	struct page *page = NULL;
-	long ret;
-
-	offset = iova & (PAGE_SIZE - 1);
-
-	/* Read one page struct info */
-#ifdef HAVE_TSK_IN_GUP
-	ret = get_user_pages_remote(tsk, tsk->mm, iova, 1, 0, &page, NULL, NULL);
-#else
-  #ifdef HAVE_VMA_IN_GUP
-	ret = get_user_pages_remote(tsk->mm, iova, 1, 0, &page, NULL, NULL);
-  #else
-	ret = get_user_pages_remote(tsk->mm, iova, 1, 0, &page, NULL);
-  #endif
-#endif
-	if (ret < 0)
-		return 0;
-
-	phys_addr = page_to_phys(page) | offset;
-	put_page(page);
-
-	return phys_addr;
-}
-
-static inline void *iova_to_kva(struct task_struct *tsk, unsigned long iova)
-{
-	return phys_to_virt(iova_to_phys(tsk, iova));
-}
-#endif
-
-void kni_net_release_fifo_phy(struct kni_dev *kni);
-void kni_net_rx(struct kni_dev *kni);
-void kni_net_init(struct net_device *dev);
-void kni_net_config_lo_mode(char *lo_str);
-void kni_net_poll_resp(struct kni_dev *kni);
-
-#endif
diff --git a/kernel/linux/kni/kni_fifo.h b/kernel/linux/kni/kni_fifo.h
deleted file mode 100644
index 1ba5172002b6..000000000000
--- a/kernel/linux/kni/kni_fifo.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright(c) 2010-2014 Intel Corporation.
- */
-
-#ifndef _KNI_FIFO_H_
-#define _KNI_FIFO_H_
-
-#include <rte_kni_common.h>
-
-/* Skip some memory barriers on Linux < 3.14 */
-#ifndef smp_load_acquire
-#define smp_load_acquire(a) (*(a))
-#endif
-#ifndef smp_store_release
-#define smp_store_release(a, b) *(a) = (b)
-#endif
-
-/**
- * Adds num elements into the fifo. Return the number actually written
- */
-static inline uint32_t
-kni_fifo_put(struct rte_kni_fifo *fifo, void **data, uint32_t num)
-{
-	uint32_t i = 0;
-	uint32_t fifo_write = fifo->write;
-	uint32_t fifo_read = smp_load_acquire(&fifo->read);
-	uint32_t new_write = fifo_write;
-
-	for (i = 0; i < num; i++) {
-		new_write = (new_write + 1) & (fifo->len - 1);
-
-		if (new_write == fifo_read)
-			break;
-		fifo->buffer[fifo_write] = data[i];
-		fifo_write = new_write;
-	}
-	smp_store_release(&fifo->write, fifo_write);
-
-	return i;
-}
-
-/**
- * Get up to num elements from the FIFO. Return the number actually read
- */
-static inline uint32_t
-kni_fifo_get(struct rte_kni_fifo *fifo, void **data, uint32_t num)
-{
-	uint32_t i = 0;
-	uint32_t new_read = fifo->read;
-	uint32_t fifo_write = smp_load_acquire(&fifo->write);
-
-	for (i = 0; i < num; i++) {
-		if (new_read == fifo_write)
-			break;
-
-		data[i] = fifo->buffer[new_read];
-		new_read = (new_read + 1) & (fifo->len - 1);
-	}
-	smp_store_release(&fifo->read, new_read);
-
-	return i;
-}
-
-/**
- * Get the num of elements in the fifo
- */
-static inline uint32_t
-kni_fifo_count(struct rte_kni_fifo *fifo)
-{
-	uint32_t fifo_write = smp_load_acquire(&fifo->write);
-	uint32_t fifo_read = smp_load_acquire(&fifo->read);
-	return (fifo->len + fifo_write - fifo_read) & (fifo->len - 1);
-}
-
-/**
- * Get the num of available elements in the fifo
- */
-static inline uint32_t
-kni_fifo_free_count(struct rte_kni_fifo *fifo)
-{
-	uint32_t fifo_write = smp_load_acquire(&fifo->write);
-	uint32_t fifo_read = smp_load_acquire(&fifo->read);
-	return (fifo_read - fifo_write - 1) & (fifo->len - 1);
-}
-
-#endif /* _KNI_FIFO_H_ */
diff --git a/kernel/linux/kni/kni_misc.c b/kernel/linux/kni/kni_misc.c
deleted file mode 100644
index 0c3a86ee352e..000000000000
--- a/kernel/linux/kni/kni_misc.c
+++ /dev/null
@@ -1,719 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright(c) 2010-2014 Intel Corporation.
- */
-
-#include <linux/version.h>
-#include <linux/module.h>
-#include <linux/miscdevice.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/pci.h>
-#include <linux/kthread.h>
-#include <linux/rwsem.h>
-#include <linux/mutex.h>
-#include <linux/nsproxy.h>
-#include <net/net_namespace.h>
-#include <net/netns/generic.h>
-
-#include <rte_kni_common.h>
-
-#include "compat.h"
-#include "kni_dev.h"
-
-MODULE_VERSION(KNI_VERSION);
-MODULE_LICENSE("Dual BSD/GPL");
-MODULE_AUTHOR("Intel Corporation");
-MODULE_DESCRIPTION("Kernel Module for managing kni devices");
-
-#define KNI_RX_LOOP_NUM 1000
-
-#define KNI_MAX_DEVICES 32
-
-/* loopback mode */
-static char *lo_mode;
-
-/* Kernel thread mode */
-static char *kthread_mode;
-static uint32_t multiple_kthread_on;
-
-/* Default carrier state for created KNI network interfaces */
-static char *carrier;
-uint32_t kni_dflt_carrier;
-
-/* Request processing support for bifurcated drivers. */
-static char *enable_bifurcated;
-uint32_t bifurcated_support;
-
-/* KNI thread scheduling interval */
-static long min_scheduling_interval = 100; /* us */
-static long max_scheduling_interval = 200; /* us */
-
-#define KNI_DEV_IN_USE_BIT_NUM 0 /* Bit number for device in use */
-
-static int kni_net_id;
-
-struct kni_net {
-	unsigned long device_in_use; /* device in use flag */
-	struct mutex kni_kthread_lock;
-	struct task_struct *kni_kthread;
-	struct rw_semaphore kni_list_lock;
-	struct list_head kni_list_head;
-};
-
-static int __net_init
-kni_init_net(struct net *net)
-{
-#ifdef HAVE_SIMPLIFIED_PERNET_OPERATIONS
-	struct kni_net *knet = net_generic(net, kni_net_id);
-
-	memset(knet, 0, sizeof(*knet));
-#else
-	struct kni_net *knet;
-	int ret;
-
-	knet = kzalloc(sizeof(struct kni_net), GFP_KERNEL);
-	if (!knet) {
-		ret = -ENOMEM;
-		return ret;
-	}
-#endif
-
-	/* Clear the bit of device in use */
-	clear_bit(KNI_DEV_IN_USE_BIT_NUM, &knet->device_in_use);
-
-	mutex_init(&knet->kni_kthread_lock);
-
-	init_rwsem(&knet->kni_list_lock);
-	INIT_LIST_HEAD(&knet->kni_list_head);
-
-#ifdef HAVE_SIMPLIFIED_PERNET_OPERATIONS
-	return 0;
-#else
-	ret = net_assign_generic(net, kni_net_id, knet);
-	if (ret < 0)
-		kfree(knet);
-
-	return ret;
-#endif
-}
-
-static void __net_exit
-kni_exit_net(struct net *net)
-{
-	struct kni_net *knet __maybe_unused;
-
-	knet = net_generic(net, kni_net_id);
-	mutex_destroy(&knet->kni_kthread_lock);
-
-#ifndef HAVE_SIMPLIFIED_PERNET_OPERATIONS
-	kfree(knet);
-#endif
-}
-
-static struct pernet_operations kni_net_ops = {
-	.init = kni_init_net,
-	.exit = kni_exit_net,
-#ifdef HAVE_SIMPLIFIED_PERNET_OPERATIONS
-	.id   = &kni_net_id,
-	.size = sizeof(struct kni_net),
-#endif
-};
-
-static int
-kni_thread_single(void *data)
-{
-	struct kni_net *knet = data;
-	int j;
-	struct kni_dev *dev;
-
-	while (!kthread_should_stop()) {
-		down_read(&knet->kni_list_lock);
-		for (j = 0; j < KNI_RX_LOOP_NUM; j++) {
-			list_for_each_entry(dev, &knet->kni_list_head, list) {
-				kni_net_rx(dev);
-				kni_net_poll_resp(dev);
-			}
-		}
-		up_read(&knet->kni_list_lock);
-		/* reschedule out for a while */
-		usleep_range(min_scheduling_interval, max_scheduling_interval);
-	}
-
-	return 0;
-}
-
-static int
-kni_thread_multiple(void *param)
-{
-	int j;
-	struct kni_dev *dev = param;
-
-	while (!kthread_should_stop()) {
-		for (j = 0; j < KNI_RX_LOOP_NUM; j++) {
-			kni_net_rx(dev);
-			kni_net_poll_resp(dev);
-		}
-		usleep_range(min_scheduling_interval, max_scheduling_interval);
-	}
-
-	return 0;
-}
-
-static int
-kni_open(struct inode *inode, struct file *file)
-{
-	struct net *net = current->nsproxy->net_ns;
-	struct kni_net *knet = net_generic(net, kni_net_id);
-
-	/* kni device can be opened by one user only per netns */
-	if (test_and_set_bit(KNI_DEV_IN_USE_BIT_NUM, &knet->device_in_use))
-		return -EBUSY;
-
-	file->private_data = get_net(net);
-	pr_debug("/dev/kni opened\n");
-
-	return 0;
-}
-
-static int
-kni_dev_remove(struct kni_dev *dev)
-{
-	if (!dev)
-		return -ENODEV;
-
-	/*
-	 * The memory of kni device is allocated and released together
-	 * with net device. Release mbuf before freeing net device.
-	 */
-	kni_net_release_fifo_phy(dev);
-
-	if (dev->net_dev) {
-		unregister_netdev(dev->net_dev);
-		free_netdev(dev->net_dev);
-	}
-
-	return 0;
-}
-
-static int
-kni_release(struct inode *inode, struct file *file)
-{
-	struct net *net = file->private_data;
-	struct kni_net *knet = net_generic(net, kni_net_id);
-	struct kni_dev *dev, *n;
-
-	/* Stop kernel thread for single mode */
-	if (multiple_kthread_on == 0) {
-		mutex_lock(&knet->kni_kthread_lock);
-		/* Stop kernel thread */
-		if (knet->kni_kthread != NULL) {
-			kthread_stop(knet->kni_kthread);
-			knet->kni_kthread = NULL;
-		}
-		mutex_unlock(&knet->kni_kthread_lock);
-	}
-
-	down_write(&knet->kni_list_lock);
-	list_for_each_entry_safe(dev, n, &knet->kni_list_head, list) {
-		/* Stop kernel thread for multiple mode */
-		if (multiple_kthread_on && dev->pthread != NULL) {
-			kthread_stop(dev->pthread);
-			dev->pthread = NULL;
-		}
-
-		list_del(&dev->list);
-		kni_dev_remove(dev);
-	}
-	up_write(&knet->kni_list_lock);
-
-	/* Clear the bit of device in use */
-	clear_bit(KNI_DEV_IN_USE_BIT_NUM, &knet->device_in_use);
-
-	put_net(net);
-	pr_debug("/dev/kni closed\n");
-
-	return 0;
-}
-
-static int
-kni_check_param(struct kni_dev *kni, struct rte_kni_device_info *dev)
-{
-	if (!kni || !dev)
-		return -1;
-
-	/* Check if network name has been used */
-	if (!strncmp(kni->name, dev->name, RTE_KNI_NAMESIZE)) {
-		pr_err("KNI name %s duplicated\n", dev->name);
-		return -1;
-	}
-
-	return 0;
-}
-
-static int
-kni_run_thread(struct kni_net *knet, struct kni_dev *kni, uint8_t force_bind)
-{
-	/**
-	 * Create a new kernel thread for multiple mode, set its core affinity,
-	 * and finally wake it up.
-	 */
-	if (multiple_kthread_on) {
-		kni->pthread = kthread_create(kni_thread_multiple,
-			(void *)kni, "kni_%s", kni->name);
-		if (IS_ERR(kni->pthread)) {
-			kni_dev_remove(kni);
-			return -ECANCELED;
-		}
-
-		if (force_bind)
-			kthread_bind(kni->pthread, kni->core_id);
-		wake_up_process(kni->pthread);
-	} else {
-		mutex_lock(&knet->kni_kthread_lock);
-
-		if (knet->kni_kthread == NULL) {
-			knet->kni_kthread = kthread_create(kni_thread_single,
-				(void *)knet, "kni_single");
-			if (IS_ERR(knet->kni_kthread)) {
-				mutex_unlock(&knet->kni_kthread_lock);
-				kni_dev_remove(kni);
-				return -ECANCELED;
-			}
-
-			if (force_bind)
-				kthread_bind(knet->kni_kthread, kni->core_id);
-			wake_up_process(knet->kni_kthread);
-		}
-
-		mutex_unlock(&knet->kni_kthread_lock);
-	}
-
-	return 0;
-}
-
-static int
-kni_ioctl_create(struct net *net, uint32_t ioctl_num,
-		unsigned long ioctl_param)
-{
-	struct kni_net *knet = net_generic(net, kni_net_id);
-	int ret;
-	struct rte_kni_device_info dev_info;
-	struct net_device *net_dev = NULL;
-	struct kni_dev *kni, *dev, *n;
-
-	pr_info("Creating kni...\n");
-	/* Check the buffer size, to avoid warning */
-	if (_IOC_SIZE(ioctl_num) > sizeof(dev_info))
-		return -EINVAL;
-
-	/* Copy kni info from user space */
-	if (copy_from_user(&dev_info, (void *)ioctl_param, sizeof(dev_info)))
-		return -EFAULT;
-
-	/* Check if name is zero-ended */
-	if (strnlen(dev_info.name, sizeof(dev_info.name)) == sizeof(dev_info.name)) {
-		pr_err("kni.name not zero-terminated");
-		return -EINVAL;
-	}
-
-	/**
-	 * Check if the cpu core id is valid for binding.
-	 */
-	if (dev_info.force_bind && !cpu_online(dev_info.core_id)) {
-		pr_err("cpu %u is not online\n", dev_info.core_id);
-		return -EINVAL;
-	}
-
-	/* Check if it has been created */
-	down_read(&knet->kni_list_lock);
-	list_for_each_entry_safe(dev, n, &knet->kni_list_head, list) {
-		if (kni_check_param(dev, &dev_info) < 0) {
-			up_read(&knet->kni_list_lock);
-			return -EINVAL;
-		}
-	}
-	up_read(&knet->kni_list_lock);
-
-	net_dev = alloc_netdev(sizeof(struct kni_dev), dev_info.name,
-#ifdef NET_NAME_USER
-							NET_NAME_USER,
-#endif
-							kni_net_init);
-	if (net_dev == NULL) {
-		pr_err("error allocating device \"%s\"\n", dev_info.name);
-		return -EBUSY;
-	}
-
-	dev_net_set(net_dev, net);
-
-	kni = netdev_priv(net_dev);
-
-	kni->net_dev = net_dev;
-	kni->core_id = dev_info.core_id;
-	strncpy(kni->name, dev_info.name, RTE_KNI_NAMESIZE);
-
-	/* Translate user space info into kernel space info */
-	if (dev_info.iova_mode) {
-#ifdef HAVE_IOVA_TO_KVA_MAPPING_SUPPORT
-		kni->tx_q = iova_to_kva(current, dev_info.tx_phys);
-		kni->rx_q = iova_to_kva(current, dev_info.rx_phys);
-		kni->alloc_q = iova_to_kva(current, dev_info.alloc_phys);
-		kni->free_q = iova_to_kva(current, dev_info.free_phys);
-
-		kni->req_q = iova_to_kva(current, dev_info.req_phys);
-		kni->resp_q = iova_to_kva(current, dev_info.resp_phys);
-		kni->sync_va = dev_info.sync_va;
-		kni->sync_kva = iova_to_kva(current, dev_info.sync_phys);
-		kni->usr_tsk = current;
-		kni->iova_mode = 1;
-#else
-		pr_err("KNI module does not support IOVA to VA translation\n");
-		return -EINVAL;
-#endif
-	} else {
-
-		kni->tx_q = phys_to_virt(dev_info.tx_phys);
-		kni->rx_q = phys_to_virt(dev_info.rx_phys);
-		kni->alloc_q = phys_to_virt(dev_info.alloc_phys);
-		kni->free_q = phys_to_virt(dev_info.free_phys);
-
-		kni->req_q = phys_to_virt(dev_info.req_phys);
-		kni->resp_q = phys_to_virt(dev_info.resp_phys);
-		kni->sync_va = dev_info.sync_va;
-		kni->sync_kva = phys_to_virt(dev_info.sync_phys);
-		kni->iova_mode = 0;
-	}
-
-	kni->mbuf_size = dev_info.mbuf_size;
-
-	pr_debug("tx_phys:      0x%016llx, tx_q addr:      0x%p\n",
-		(unsigned long long) dev_info.tx_phys, kni->tx_q);
-	pr_debug("rx_phys:      0x%016llx, rx_q addr:      0x%p\n",
-		(unsigned long long) dev_info.rx_phys, kni->rx_q);
-	pr_debug("alloc_phys:   0x%016llx, alloc_q addr:   0x%p\n",
-		(unsigned long long) dev_info.alloc_phys, kni->alloc_q);
-	pr_debug("free_phys:    0x%016llx, free_q addr:    0x%p\n",
-		(unsigned long long) dev_info.free_phys, kni->free_q);
-	pr_debug("req_phys:     0x%016llx, req_q addr:     0x%p\n",
-		(unsigned long long) dev_info.req_phys, kni->req_q);
-	pr_debug("resp_phys:    0x%016llx, resp_q addr:    0x%p\n",
-		(unsigned long long) dev_info.resp_phys, kni->resp_q);
-	pr_debug("mbuf_size:    %u\n", kni->mbuf_size);
-
-	/* if user has provided a valid mac address */
-	if (is_valid_ether_addr(dev_info.mac_addr)) {
-#ifdef HAVE_ETH_HW_ADDR_SET
-		eth_hw_addr_set(net_dev, dev_info.mac_addr);
-#else
-		memcpy(net_dev->dev_addr, dev_info.mac_addr, ETH_ALEN);
-#endif
-	} else {
-		/* Assign random MAC address. */
-		eth_hw_addr_random(net_dev);
-	}
-
-	if (dev_info.mtu)
-		net_dev->mtu = dev_info.mtu;
-#ifdef HAVE_MAX_MTU_PARAM
-	net_dev->max_mtu = net_dev->mtu;
-
-	if (dev_info.min_mtu)
-		net_dev->min_mtu = dev_info.min_mtu;
-
-	if (dev_info.max_mtu)
-		net_dev->max_mtu = dev_info.max_mtu;
-#endif
-
-	ret = register_netdev(net_dev);
-	if (ret) {
-		pr_err("error %i registering device \"%s\"\n",
-					ret, dev_info.name);
-		kni->net_dev = NULL;
-		kni_dev_remove(kni);
-		free_netdev(net_dev);
-		return -ENODEV;
-	}
-
-	netif_carrier_off(net_dev);
-
-	ret = kni_run_thread(knet, kni, dev_info.force_bind);
-	if (ret != 0)
-		return ret;
-
-	down_write(&knet->kni_list_lock);
-	list_add(&kni->list, &knet->kni_list_head);
-	up_write(&knet->kni_list_lock);
-
-	return 0;
-}
-
-static int
-kni_ioctl_release(struct net *net, uint32_t ioctl_num,
-		unsigned long ioctl_param)
-{
-	struct kni_net *knet = net_generic(net, kni_net_id);
-	int ret = -EINVAL;
-	struct kni_dev *dev, *n;
-	struct rte_kni_device_info dev_info;
-
-	if (_IOC_SIZE(ioctl_num) > sizeof(dev_info))
-		return -EINVAL;
-
-	if (copy_from_user(&dev_info, (void *)ioctl_param, sizeof(dev_info)))
-		return -EFAULT;
-
-	/* Release the network device according to its name */
-	if (strlen(dev_info.name) == 0)
-		return -EINVAL;
-
-	down_write(&knet->kni_list_lock);
-	list_for_each_entry_safe(dev, n, &knet->kni_list_head, list) {
-		if (strncmp(dev->name, dev_info.name, RTE_KNI_NAMESIZE) != 0)
-			continue;
-
-		if (multiple_kthread_on && dev->pthread != NULL) {
-			kthread_stop(dev->pthread);
-			dev->pthread = NULL;
-		}
-
-		list_del(&dev->list);
-		kni_dev_remove(dev);
-		ret = 0;
-		break;
-	}
-	up_write(&knet->kni_list_lock);
-	pr_info("%s release kni named %s\n",
-		(ret == 0 ? "Successfully" : "Unsuccessfully"), dev_info.name);
-
-	return ret;
-}
-
-static long
-kni_ioctl(struct file *file, unsigned int ioctl_num, unsigned long ioctl_param)
-{
-	long ret = -EINVAL;
-	struct net *net = current->nsproxy->net_ns;
-
-	pr_debug("IOCTL num=0x%0x param=0x%0lx\n", ioctl_num, ioctl_param);
-
-	/*
-	 * Switch according to the ioctl called
-	 */
-	switch (_IOC_NR(ioctl_num)) {
-	case _IOC_NR(RTE_KNI_IOCTL_TEST):
-		/* For test only, not used */
-		break;
-	case _IOC_NR(RTE_KNI_IOCTL_CREATE):
-		ret = kni_ioctl_create(net, ioctl_num, ioctl_param);
-		break;
-	case _IOC_NR(RTE_KNI_IOCTL_RELEASE):
-		ret = kni_ioctl_release(net, ioctl_num, ioctl_param);
-		break;
-	default:
-		pr_debug("IOCTL default\n");
-		break;
-	}
-
-	return ret;
-}
-
-static long
-kni_compat_ioctl(struct file *file, unsigned int ioctl_num,
-		unsigned long ioctl_param)
-{
-	/* 32 bits app on 64 bits OS to be supported later */
-	pr_debug("Not implemented.\n");
-
-	return -EINVAL;
-}
-
-static const struct file_operations kni_fops = {
-	.owner = THIS_MODULE,
-	.open = kni_open,
-	.release = kni_release,
-	.unlocked_ioctl = kni_ioctl,
-	.compat_ioctl = kni_compat_ioctl,
-};
-
-static struct miscdevice kni_misc = {
-	.minor = MISC_DYNAMIC_MINOR,
-	.name = KNI_DEVICE,
-	.fops = &kni_fops,
-};
-
-static int __init
-kni_parse_kthread_mode(void)
-{
-	if (!kthread_mode)
-		return 0;
-
-	if (strcmp(kthread_mode, "single") == 0)
-		return 0;
-	else if (strcmp(kthread_mode, "multiple") == 0)
-		multiple_kthread_on = 1;
-	else
-		return -1;
-
-	return 0;
-}
-
-static int __init
-kni_parse_carrier_state(void)
-{
-	if (!carrier) {
-		kni_dflt_carrier = 0;
-		return 0;
-	}
-
-	if (strcmp(carrier, "off") == 0)
-		kni_dflt_carrier = 0;
-	else if (strcmp(carrier, "on") == 0)
-		kni_dflt_carrier = 1;
-	else
-		return -1;
-
-	return 0;
-}
-
-static int __init
-kni_parse_bifurcated_support(void)
-{
-	if (!enable_bifurcated) {
-		bifurcated_support = 0;
-		return 0;
-	}
-
-	if (strcmp(enable_bifurcated, "on") == 0)
-		bifurcated_support = 1;
-	else
-		return -1;
-
-	return 0;
-}
-
-static int __init
-kni_init(void)
-{
-	int rc;
-
-	if (kni_parse_kthread_mode() < 0) {
-		pr_err("Invalid parameter for kthread_mode\n");
-		return -EINVAL;
-	}
-
-	if (multiple_kthread_on == 0)
-		pr_debug("Single kernel thread for all KNI devices\n");
-	else
-		pr_debug("Multiple kernel thread mode enabled\n");
-
-	if (kni_parse_carrier_state() < 0) {
-		pr_err("Invalid parameter for carrier\n");
-		return -EINVAL;
-	}
-
-	if (kni_dflt_carrier == 0)
-		pr_debug("Default carrier state set to off.\n");
-	else
-		pr_debug("Default carrier state set to on.\n");
-
-	if (kni_parse_bifurcated_support() < 0) {
-		pr_err("Invalid parameter for bifurcated support\n");
-		return -EINVAL;
-	}
-	if (bifurcated_support == 1)
-		pr_debug("bifurcated support is enabled.\n");
-
-	if (min_scheduling_interval < 0 || max_scheduling_interval < 0 ||
-		min_scheduling_interval > KNI_KTHREAD_MAX_RESCHEDULE_INTERVAL ||
-		max_scheduling_interval > KNI_KTHREAD_MAX_RESCHEDULE_INTERVAL ||
-		min_scheduling_interval >= max_scheduling_interval) {
-		pr_err("Invalid parameters for scheduling interval\n");
-		return -EINVAL;
-	}
-
-#ifdef HAVE_SIMPLIFIED_PERNET_OPERATIONS
-	rc = register_pernet_subsys(&kni_net_ops);
-#else
-	rc = register_pernet_gen_subsys(&kni_net_id, &kni_net_ops);
-#endif
-	if (rc)
-		return -EPERM;
-
-	rc = misc_register(&kni_misc);
-	if (rc != 0) {
-		pr_err("Misc registration failed\n");
-		goto out;
-	}
-
-	/* Configure the lo mode according to the input parameter */
-	kni_net_config_lo_mode(lo_mode);
-
-	return 0;
-
-out:
-#ifdef HAVE_SIMPLIFIED_PERNET_OPERATIONS
-	unregister_pernet_subsys(&kni_net_ops);
-#else
-	unregister_pernet_gen_subsys(kni_net_id, &kni_net_ops);
-#endif
-	return rc;
-}
-
-static void __exit
-kni_exit(void)
-{
-	misc_deregister(&kni_misc);
-#ifdef HAVE_SIMPLIFIED_PERNET_OPERATIONS
-	unregister_pernet_subsys(&kni_net_ops);
-#else
-	unregister_pernet_gen_subsys(kni_net_id, &kni_net_ops);
-#endif
-}
-
-module_init(kni_init);
-module_exit(kni_exit);
-
-module_param(lo_mode, charp, 0644);
-MODULE_PARM_DESC(lo_mode,
-"KNI loopback mode (default=lo_mode_none):\n"
-"\t\tlo_mode_none        Kernel loopback disabled\n"
-"\t\tlo_mode_fifo        Enable kernel loopback with fifo\n"
-"\t\tlo_mode_fifo_skb    Enable kernel loopback with fifo and skb buffer\n"
-"\t\t"
-);
-
-module_param(kthread_mode, charp, 0644);
-MODULE_PARM_DESC(kthread_mode,
-"Kernel thread mode (default=single):\n"
-"\t\tsingle    Single kernel thread mode enabled.\n"
-"\t\tmultiple  Multiple kernel thread mode enabled.\n"
-"\t\t"
-);
-
-module_param(carrier, charp, 0644);
-MODULE_PARM_DESC(carrier,
-"Default carrier state for KNI interface (default=off):\n"
-"\t\toff   Interfaces will be created with carrier state set to off.\n"
-"\t\ton    Interfaces will be created with carrier state set to on.\n"
-"\t\t"
-);
-
-module_param(enable_bifurcated, charp, 0644);
-MODULE_PARM_DESC(enable_bifurcated,
-"Enable request processing support for bifurcated drivers, "
-"which means releasing rtnl_lock before calling userspace callback and "
-"supporting async requests (default=off):\n"
-"\t\ton    Enable request processing support for bifurcated drivers.\n"
-"\t\t"
-);
-
-module_param(min_scheduling_interval, long, 0644);
-MODULE_PARM_DESC(min_scheduling_interval,
-"KNI thread min scheduling interval (default=100 microseconds)"
-);
-
-module_param(max_scheduling_interval, long, 0644);
-MODULE_PARM_DESC(max_scheduling_interval,
-"KNI thread max scheduling interval (default=200 microseconds)"
-);
diff --git a/kernel/linux/kni/kni_net.c b/kernel/linux/kni/kni_net.c
deleted file mode 100644
index 779ee3451a4c..000000000000
--- a/kernel/linux/kni/kni_net.c
+++ /dev/null
@@ -1,878 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright(c) 2010-2014 Intel Corporation.
- */
-
-/*
- * This code is inspired from the book "Linux Device Drivers" by
- * Alessandro Rubini and Jonathan Corbet, published by O'Reilly & Associates
- */
-
-#include <linux/device.h>
-#include <linux/module.h>
-#include <linux/version.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h> /* eth_type_trans */
-#include <linux/ethtool.h>
-#include <linux/skbuff.h>
-#include <linux/kthread.h>
-#include <linux/delay.h>
-#include <linux/rtnetlink.h>
-
-#include <rte_kni_common.h>
-#include <kni_fifo.h>
-
-#include "compat.h"
-#include "kni_dev.h"
-
-#define WD_TIMEOUT 5 /*jiffies */
-
-#define KNI_WAIT_RESPONSE_TIMEOUT 300 /* 3 seconds */
-
-/* typedef for rx function */
-typedef void (*kni_net_rx_t)(struct kni_dev *kni);
-
-static void kni_net_rx_normal(struct kni_dev *kni);
-
-/* kni rx function pointer, with default to normal rx */
-static kni_net_rx_t kni_net_rx_func = kni_net_rx_normal;
-
-#ifdef HAVE_IOVA_TO_KVA_MAPPING_SUPPORT
-/* iova to kernel virtual address */
-static inline void *
-iova2kva(struct kni_dev *kni, void *iova)
-{
-	return phys_to_virt(iova_to_phys(kni->usr_tsk, (unsigned long)iova));
-}
-
-static inline void *
-iova2data_kva(struct kni_dev *kni, struct rte_kni_mbuf *m)
-{
-	return phys_to_virt(iova_to_phys(kni->usr_tsk, m->buf_iova) +
-			    m->data_off);
-}
-#endif
-
-/* physical address to kernel virtual address */
-static void *
-pa2kva(void *pa)
-{
-	return phys_to_virt((unsigned long)pa);
-}
-
-/* physical address to virtual address */
-static void *
-pa2va(void *pa, struct rte_kni_mbuf *m)
-{
-	void *va;
-
-	va = (void *)((unsigned long)pa +
-			(unsigned long)m->buf_addr -
-			(unsigned long)m->buf_iova);
-	return va;
-}
-
-/* mbuf data kernel virtual address from mbuf kernel virtual address */
-static void *
-kva2data_kva(struct rte_kni_mbuf *m)
-{
-	return phys_to_virt(m->buf_iova + m->data_off);
-}
-
-static inline void *
-get_kva(struct kni_dev *kni, void *pa)
-{
-#ifdef HAVE_IOVA_TO_KVA_MAPPING_SUPPORT
-	if (kni->iova_mode == 1)
-		return iova2kva(kni, pa);
-#endif
-	return pa2kva(pa);
-}
-
-static inline void *
-get_data_kva(struct kni_dev *kni, void *pkt_kva)
-{
-#ifdef HAVE_IOVA_TO_KVA_MAPPING_SUPPORT
-	if (kni->iova_mode == 1)
-		return iova2data_kva(kni, pkt_kva);
-#endif
-	return kva2data_kva(pkt_kva);
-}
-
-/*
- * It can be called to process the request.
- */
-static int
-kni_net_process_request(struct net_device *dev, struct rte_kni_request *req)
-{
-	struct kni_dev *kni = netdev_priv(dev);
-	int ret = -1;
-	void *resp_va;
-	uint32_t num;
-	int ret_val;
-
-	ASSERT_RTNL();
-
-	if (bifurcated_support) {
-		/* If we need to wait and RTNL mutex is held
-		 * drop the mutex and hold reference to keep device
-		 */
-		if (req->async == 0) {
-			dev_hold(dev);
-			rtnl_unlock();
-		}
-	}
-
-	mutex_lock(&kni->sync_lock);
-
-	/* Construct data */
-	memcpy(kni->sync_kva, req, sizeof(struct rte_kni_request));
-	num = kni_fifo_put(kni->req_q, &kni->sync_va, 1);
-	if (num < 1) {
-		pr_err("Cannot send to req_q\n");
-		ret = -EBUSY;
-		goto fail;
-	}
-
-	if (bifurcated_support) {
-		/* No result available since request is handled
-		 * asynchronously. set response to success.
-		 */
-		if (req->async != 0) {
-			req->result = 0;
-			goto async;
-		}
-	}
-
-	ret_val = wait_event_interruptible_timeout(kni->wq,
-			kni_fifo_count(kni->resp_q), 3 * HZ);
-	if (signal_pending(current) || ret_val <= 0) {
-		ret = -ETIME;
-		goto fail;
-	}
-	num = kni_fifo_get(kni->resp_q, (void **)&resp_va, 1);
-	if (num != 1 || resp_va != kni->sync_va) {
-		/* This should never happen */
-		pr_err("No data in resp_q\n");
-		ret = -ENODATA;
-		goto fail;
-	}
-
-	memcpy(req, kni->sync_kva, sizeof(struct rte_kni_request));
-async:
-	ret = 0;
-
-fail:
-	mutex_unlock(&kni->sync_lock);
-	if (bifurcated_support) {
-		if (req->async == 0) {
-			rtnl_lock();
-			dev_put(dev);
-		}
-	}
-	return ret;
-}
-
-/*
- * Open and close
- */
-static int
-kni_net_open(struct net_device *dev)
-{
-	int ret;
-	struct rte_kni_request req;
-
-	netif_start_queue(dev);
-	if (kni_dflt_carrier == 1)
-		netif_carrier_on(dev);
-	else
-		netif_carrier_off(dev);
-
-	memset(&req, 0, sizeof(req));
-	req.req_id = RTE_KNI_REQ_CFG_NETWORK_IF;
-
-	/* Setting if_up to non-zero means up */
-	req.if_up = 1;
-	ret = kni_net_process_request(dev, &req);
-
-	return (ret == 0) ? req.result : ret;
-}
-
-static int
-kni_net_release(struct net_device *dev)
-{
-	int ret;
-	struct rte_kni_request req;
-
-	netif_stop_queue(dev); /* can't transmit any more */
-	netif_carrier_off(dev);
-
-	memset(&req, 0, sizeof(req));
-	req.req_id = RTE_KNI_REQ_CFG_NETWORK_IF;
-
-	/* Setting if_up to 0 means down */
-	req.if_up = 0;
-
-	if (bifurcated_support) {
-		/* request async because of the deadlock problem */
-		req.async = 1;
-	}
-
-	ret = kni_net_process_request(dev, &req);
-
-	return (ret == 0) ? req.result : ret;
-}
-
-static void
-kni_fifo_trans_pa2va(struct kni_dev *kni,
-	struct rte_kni_fifo *src_pa, struct rte_kni_fifo *dst_va)
-{
-	uint32_t ret, i, num_dst, num_rx;
-	struct rte_kni_mbuf *kva, *prev_kva;
-	int nb_segs;
-	int kva_nb_segs;
-
-	do {
-		num_dst = kni_fifo_free_count(dst_va);
-		if (num_dst == 0)
-			return;
-
-		num_rx = min_t(uint32_t, num_dst, MBUF_BURST_SZ);
-
-		num_rx = kni_fifo_get(src_pa, kni->pa, num_rx);
-		if (num_rx == 0)
-			return;
-
-		for (i = 0; i < num_rx; i++) {
-			kva = get_kva(kni, kni->pa[i]);
-			kni->va[i] = pa2va(kni->pa[i], kva);
-
-			kva_nb_segs = kva->nb_segs;
-			for (nb_segs = 0; nb_segs < kva_nb_segs; nb_segs++) {
-				if (!kva->next)
-					break;
-
-				prev_kva = kva;
-				kva = get_kva(kni, kva->next);
-				/* Convert physical address to virtual address */
-				prev_kva->next = pa2va(prev_kva->next, kva);
-			}
-		}
-
-		ret = kni_fifo_put(dst_va, kni->va, num_rx);
-		if (ret != num_rx) {
-			/* Failing should not happen */
-			pr_err("Fail to enqueue entries into dst_va\n");
-			return;
-		}
-	} while (1);
-}
-
-/* Try to release mbufs when kni release */
-void kni_net_release_fifo_phy(struct kni_dev *kni)
-{
-	/* release rx_q first, because it can't release in userspace */
-	kni_fifo_trans_pa2va(kni, kni->rx_q, kni->free_q);
-	/* release alloc_q for speeding up kni release in userspace */
-	kni_fifo_trans_pa2va(kni, kni->alloc_q, kni->free_q);
-}
-
-/*
- * Configuration changes (passed on by ifconfig)
- */
-static int
-kni_net_config(struct net_device *dev, struct ifmap *map)
-{
-	if (dev->flags & IFF_UP) /* can't act on a running interface */
-		return -EBUSY;
-
-	/* ignore other fields */
-	return 0;
-}
-
-/*
- * Transmit a packet (called by the kernel)
- */
-static int
-kni_net_tx(struct sk_buff *skb, struct net_device *dev)
-{
-	int len = 0;
-	uint32_t ret;
-	struct kni_dev *kni = netdev_priv(dev);
-	struct rte_kni_mbuf *pkt_kva = NULL;
-	void *pkt_pa = NULL;
-	void *pkt_va = NULL;
-
-	/* save the timestamp */
-#ifdef HAVE_TRANS_START_HELPER
-	netif_trans_update(dev);
-#else
-	dev->trans_start = jiffies;
-#endif
-
-	/* Check if the length of skb is less than mbuf size */
-	if (skb->len > kni->mbuf_size)
-		goto drop;
-
-	/**
-	 * Check if it has at least one free entry in tx_q and
-	 * one entry in alloc_q.
-	 */
-	if (kni_fifo_free_count(kni->tx_q) == 0 ||
-			kni_fifo_count(kni->alloc_q) == 0) {
-		/**
-		 * If no free entry in tx_q or no entry in alloc_q,
-		 * drops skb and goes out.
-		 */
-		goto drop;
-	}
-
-	/* dequeue a mbuf from alloc_q */
-	ret = kni_fifo_get(kni->alloc_q, &pkt_pa, 1);
-	if (likely(ret == 1)) {
-		void *data_kva;
-
-		pkt_kva = get_kva(kni, pkt_pa);
-		data_kva = get_data_kva(kni, pkt_kva);
-		pkt_va = pa2va(pkt_pa, pkt_kva);
-
-		len = skb->len;
-		memcpy(data_kva, skb->data, len);
-		if (unlikely(len < ETH_ZLEN)) {
-			memset(data_kva + len, 0, ETH_ZLEN - len);
-			len = ETH_ZLEN;
-		}
-		pkt_kva->pkt_len = len;
-		pkt_kva->data_len = len;
-
-		/* enqueue mbuf into tx_q */
-		ret = kni_fifo_put(kni->tx_q, &pkt_va, 1);
-		if (unlikely(ret != 1)) {
-			/* Failing should not happen */
-			pr_err("Fail to enqueue mbuf into tx_q\n");
-			goto drop;
-		}
-	} else {
-		/* Failing should not happen */
-		pr_err("Fail to dequeue mbuf from alloc_q\n");
-		goto drop;
-	}
-
-	/* Free skb and update statistics */
-	dev_kfree_skb(skb);
-	dev->stats.tx_bytes += len;
-	dev->stats.tx_packets++;
-
-	return NETDEV_TX_OK;
-
-drop:
-	/* Free skb and update statistics */
-	dev_kfree_skb(skb);
-	dev->stats.tx_dropped++;
-
-	return NETDEV_TX_OK;
-}
-
-/*
- * RX: normal working mode
- */
-static void
-kni_net_rx_normal(struct kni_dev *kni)
-{
-	uint32_t ret;
-	uint32_t len;
-	uint32_t i, num_rx, num_fq;
-	struct rte_kni_mbuf *kva, *prev_kva;
-	void *data_kva;
-	struct sk_buff *skb;
-	struct net_device *dev = kni->net_dev;
-
-	/* Get the number of free entries in free_q */
-	num_fq = kni_fifo_free_count(kni->free_q);
-	if (num_fq == 0) {
-		/* No room on the free_q, bail out */
-		return;
-	}
-
-	/* Calculate the number of entries to dequeue from rx_q */
-	num_rx = min_t(uint32_t, num_fq, MBUF_BURST_SZ);
-
-	/* Burst dequeue from rx_q */
-	num_rx = kni_fifo_get(kni->rx_q, kni->pa, num_rx);
-	if (num_rx == 0)
-		return;
-
-	/* Transfer received packets to netif */
-	for (i = 0; i < num_rx; i++) {
-		kva = get_kva(kni, kni->pa[i]);
-		len = kva->pkt_len;
-		data_kva = get_data_kva(kni, kva);
-		kni->va[i] = pa2va(kni->pa[i], kva);
-
-		skb = netdev_alloc_skb(dev, len);
-		if (!skb) {
-			/* Update statistics */
-			dev->stats.rx_dropped++;
-			continue;
-		}
-
-		if (kva->nb_segs == 1) {
-			memcpy(skb_put(skb, len), data_kva, len);
-		} else {
-			int nb_segs;
-			int kva_nb_segs = kva->nb_segs;
-
-			for (nb_segs = 0; nb_segs < kva_nb_segs; nb_segs++) {
-				memcpy(skb_put(skb, kva->data_len),
-					data_kva, kva->data_len);
-
-				if (!kva->next)
-					break;
-
-				prev_kva = kva;
-				kva = get_kva(kni, kva->next);
-				data_kva = kva2data_kva(kva);
-				/* Convert physical address to virtual address */
-				prev_kva->next = pa2va(prev_kva->next, kva);
-			}
-		}
-
-		skb->protocol = eth_type_trans(skb, dev);
-		skb->ip_summed = CHECKSUM_UNNECESSARY;
-
-		/* Call netif interface */
-#ifdef HAVE_NETIF_RX_NI
-		netif_rx_ni(skb);
-#else
-		netif_rx(skb);
-#endif
-
-		/* Update statistics */
-		dev->stats.rx_bytes += len;
-		dev->stats.rx_packets++;
-	}
-
-	/* Burst enqueue mbufs into free_q */
-	ret = kni_fifo_put(kni->free_q, kni->va, num_rx);
-	if (ret != num_rx)
-		/* Failing should not happen */
-		pr_err("Fail to enqueue entries into free_q\n");
-}
-
-/*
- * RX: loopback with enqueue/dequeue fifos.
- */
-static void
-kni_net_rx_lo_fifo(struct kni_dev *kni)
-{
-	uint32_t ret;
-	uint32_t len;
-	uint32_t i, num, num_rq, num_tq, num_aq, num_fq;
-	struct rte_kni_mbuf *kva, *next_kva;
-	void *data_kva;
-	struct rte_kni_mbuf *alloc_kva;
-	void *alloc_data_kva;
-	struct net_device *dev = kni->net_dev;
-
-	/* Get the number of entries in rx_q */
-	num_rq = kni_fifo_count(kni->rx_q);
-
-	/* Get the number of free entries in tx_q */
-	num_tq = kni_fifo_free_count(kni->tx_q);
-
-	/* Get the number of entries in alloc_q */
-	num_aq = kni_fifo_count(kni->alloc_q);
-
-	/* Get the number of free entries in free_q */
-	num_fq = kni_fifo_free_count(kni->free_q);
-
-	/* Calculate the number of entries to be dequeued from rx_q */
-	num = min(num_rq, num_tq);
-	num = min(num, num_aq);
-	num = min(num, num_fq);
-	num = min_t(uint32_t, num, MBUF_BURST_SZ);
-
-	/* Return if no entry to dequeue from rx_q */
-	if (num == 0)
-		return;
-
-	/* Burst dequeue from rx_q */
-	ret = kni_fifo_get(kni->rx_q, kni->pa, num);
-	if (ret == 0)
-		return; /* Failing should not happen */
-
-	/* Dequeue entries from alloc_q */
-	ret = kni_fifo_get(kni->alloc_q, kni->alloc_pa, num);
-	if (ret) {
-		num = ret;
-		/* Copy mbufs */
-		for (i = 0; i < num; i++) {
-			kva = get_kva(kni, kni->pa[i]);
-			len = kva->data_len;
-			data_kva = get_data_kva(kni, kva);
-			kni->va[i] = pa2va(kni->pa[i], kva);
-
-			while (kva->next) {
-				next_kva = get_kva(kni, kva->next);
-				/* Convert physical address to virtual address */
-				kva->next = pa2va(kva->next, next_kva);
-				kva = next_kva;
-			}
-
-			alloc_kva = get_kva(kni, kni->alloc_pa[i]);
-			alloc_data_kva = get_data_kva(kni, alloc_kva);
-			kni->alloc_va[i] = pa2va(kni->alloc_pa[i], alloc_kva);
-
-			memcpy(alloc_data_kva, data_kva, len);
-			alloc_kva->pkt_len = len;
-			alloc_kva->data_len = len;
-
-			dev->stats.tx_bytes += len;
-			dev->stats.rx_bytes += len;
-		}
-
-		/* Burst enqueue mbufs into tx_q */
-		ret = kni_fifo_put(kni->tx_q, kni->alloc_va, num);
-		if (ret != num)
-			/* Failing should not happen */
-			pr_err("Fail to enqueue mbufs into tx_q\n");
-	}
-
-	/* Burst enqueue mbufs into free_q */
-	ret = kni_fifo_put(kni->free_q, kni->va, num);
-	if (ret != num)
-		/* Failing should not happen */
-		pr_err("Fail to enqueue mbufs into free_q\n");
-
-	/**
-	 * Update statistic, and enqueue/dequeue failure is impossible,
-	 * as all queues are checked at first.
-	 */
-	dev->stats.tx_packets += num;
-	dev->stats.rx_packets += num;
-}
-
-/*
- * RX: loopback with enqueue/dequeue fifos and sk buffer copies.
- */
-static void
-kni_net_rx_lo_fifo_skb(struct kni_dev *kni)
-{
-	uint32_t ret;
-	uint32_t len;
-	uint32_t i, num_rq, num_fq, num;
-	struct rte_kni_mbuf *kva, *prev_kva;
-	void *data_kva;
-	struct sk_buff *skb;
-	struct net_device *dev = kni->net_dev;
-
-	/* Get the number of entries in rx_q */
-	num_rq = kni_fifo_count(kni->rx_q);
-
-	/* Get the number of free entries in free_q */
-	num_fq = kni_fifo_free_count(kni->free_q);
-
-	/* Calculate the number of entries to dequeue from rx_q */
-	num = min(num_rq, num_fq);
-	num = min_t(uint32_t, num, MBUF_BURST_SZ);
-
-	/* Return if no entry to dequeue from rx_q */
-	if (num == 0)
-		return;
-
-	/* Burst dequeue mbufs from rx_q */
-	ret = kni_fifo_get(kni->rx_q, kni->pa, num);
-	if (ret == 0)
-		return;
-
-	/* Copy mbufs to sk buffer and then call tx interface */
-	for (i = 0; i < num; i++) {
-		kva = get_kva(kni, kni->pa[i]);
-		len = kva->pkt_len;
-		data_kva = get_data_kva(kni, kva);
-		kni->va[i] = pa2va(kni->pa[i], kva);
-
-		skb = netdev_alloc_skb(dev, len);
-		if (skb) {
-			memcpy(skb_put(skb, len), data_kva, len);
-			skb->ip_summed = CHECKSUM_UNNECESSARY;
-			dev_kfree_skb(skb);
-		}
-
-		/* Simulate real usage, allocate/copy skb twice */
-		skb = netdev_alloc_skb(dev, len);
-		if (skb == NULL) {
-			dev->stats.rx_dropped++;
-			continue;
-		}
-
-		if (kva->nb_segs == 1) {
-			memcpy(skb_put(skb, len), data_kva, len);
-		} else {
-			int nb_segs;
-			int kva_nb_segs = kva->nb_segs;
-
-			for (nb_segs = 0; nb_segs < kva_nb_segs; nb_segs++) {
-				memcpy(skb_put(skb, kva->data_len),
-					data_kva, kva->data_len);
-
-				if (!kva->next)
-					break;
-
-				prev_kva = kva;
-				kva = get_kva(kni, kva->next);
-				data_kva = get_data_kva(kni, kva);
-				/* Convert physical address to virtual address */
-				prev_kva->next = pa2va(prev_kva->next, kva);
-			}
-		}
-
-		skb->ip_summed = CHECKSUM_UNNECESSARY;
-
-		dev->stats.rx_bytes += len;
-		dev->stats.rx_packets++;
-
-		/* call tx interface */
-		kni_net_tx(skb, dev);
-	}
-
-	/* enqueue all the mbufs from rx_q into free_q */
-	ret = kni_fifo_put(kni->free_q, kni->va, num);
-	if (ret != num)
-		/* Failing should not happen */
-		pr_err("Fail to enqueue mbufs into free_q\n");
-}
-
-/* rx interface */
-void
-kni_net_rx(struct kni_dev *kni)
-{
-	/**
-	 * It doesn't need to check if it is NULL pointer,
-	 * as it has a default value
-	 */
-	(*kni_net_rx_func)(kni);
-}
-
-/*
- * Deal with a transmit timeout.
- */
-#ifdef HAVE_TX_TIMEOUT_TXQUEUE
-static void
-kni_net_tx_timeout(struct net_device *dev, unsigned int txqueue)
-#else
-static void
-kni_net_tx_timeout(struct net_device *dev)
-#endif
-{
-	pr_debug("Transmit timeout at %ld, latency %ld\n", jiffies,
-			jiffies - dev_trans_start(dev));
-
-	dev->stats.tx_errors++;
-	netif_wake_queue(dev);
-}
-
-static int
-kni_net_change_mtu(struct net_device *dev, int new_mtu)
-{
-	int ret;
-	struct rte_kni_request req;
-
-	pr_debug("kni_net_change_mtu new mtu %d to be set\n", new_mtu);
-
-	memset(&req, 0, sizeof(req));
-	req.req_id = RTE_KNI_REQ_CHANGE_MTU;
-	req.new_mtu = new_mtu;
-	ret = kni_net_process_request(dev, &req);
-	if (ret == 0 && req.result == 0)
-		dev->mtu = new_mtu;
-
-	return (ret == 0) ? req.result : ret;
-}
-
-static void
-kni_net_change_rx_flags(struct net_device *netdev, int flags)
-{
-	struct rte_kni_request req;
-
-	memset(&req, 0, sizeof(req));
-
-	if (flags & IFF_ALLMULTI) {
-		req.req_id = RTE_KNI_REQ_CHANGE_ALLMULTI;
-
-		if (netdev->flags & IFF_ALLMULTI)
-			req.allmulti = 1;
-		else
-			req.allmulti = 0;
-	}
-
-	if (flags & IFF_PROMISC) {
-		req.req_id = RTE_KNI_REQ_CHANGE_PROMISC;
-
-		if (netdev->flags & IFF_PROMISC)
-			req.promiscusity = 1;
-		else
-			req.promiscusity = 0;
-	}
-
-	kni_net_process_request(netdev, &req);
-}
-
-/*
- * Checks if the user space application provided the resp message
- */
-void
-kni_net_poll_resp(struct kni_dev *kni)
-{
-	if (kni_fifo_count(kni->resp_q))
-		wake_up_interruptible(&kni->wq);
-}
-
-/*
- *  Fill the eth header
- */
-static int
-kni_net_header(struct sk_buff *skb, struct net_device *dev,
-		unsigned short type, const void *daddr,
-		const void *saddr, uint32_t len)
-{
-	struct ethhdr *eth = (struct ethhdr *) skb_push(skb, ETH_HLEN);
-
-	memcpy(eth->h_source, saddr ? saddr : dev->dev_addr, dev->addr_len);
-	memcpy(eth->h_dest,   daddr ? daddr : dev->dev_addr, dev->addr_len);
-	eth->h_proto = htons(type);
-
-	return dev->hard_header_len;
-}
-
-/*
- * Re-fill the eth header
- */
-#ifdef HAVE_REBUILD_HEADER
-static int
-kni_net_rebuild_header(struct sk_buff *skb)
-{
-	struct net_device *dev = skb->dev;
-	struct ethhdr *eth = (struct ethhdr *) skb->data;
-
-	memcpy(eth->h_source, dev->dev_addr, dev->addr_len);
-	memcpy(eth->h_dest, dev->dev_addr, dev->addr_len);
-
-	return 0;
-}
-#endif /* < 4.1.0  */
-
-/**
- * kni_net_set_mac - Change the Ethernet Address of the KNI NIC
- * @netdev: network interface device structure
- * @p: pointer to an address structure
- *
- * Returns 0 on success, negative on failure
- **/
-static int
-kni_net_set_mac(struct net_device *netdev, void *p)
-{
-	int ret;
-	struct rte_kni_request req;
-	struct sockaddr *addr = p;
-
-	memset(&req, 0, sizeof(req));
-	req.req_id = RTE_KNI_REQ_CHANGE_MAC_ADDR;
-
-	if (!is_valid_ether_addr((unsigned char *)(addr->sa_data)))
-		return -EADDRNOTAVAIL;
-
-	memcpy(req.mac_addr, addr->sa_data, netdev->addr_len);
-#ifdef HAVE_ETH_HW_ADDR_SET
-	eth_hw_addr_set(netdev, addr->sa_data);
-#else
-	memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
-#endif
-
-	ret = kni_net_process_request(netdev, &req);
-
-	return (ret == 0 ? req.result : ret);
-}
-
-#ifdef HAVE_CHANGE_CARRIER_CB
-static int
-kni_net_change_carrier(struct net_device *dev, bool new_carrier)
-{
-	if (new_carrier)
-		netif_carrier_on(dev);
-	else
-		netif_carrier_off(dev);
-	return 0;
-}
-#endif
-
-static const struct header_ops kni_net_header_ops = {
-	.create  = kni_net_header,
-	.parse   = eth_header_parse,
-#ifdef HAVE_REBUILD_HEADER
-	.rebuild = kni_net_rebuild_header,
-#endif /* < 4.1.0  */
-	.cache   = NULL,  /* disable caching */
-};
-
-static const struct net_device_ops kni_net_netdev_ops = {
-	.ndo_open = kni_net_open,
-	.ndo_stop = kni_net_release,
-	.ndo_set_config = kni_net_config,
-	.ndo_change_rx_flags = kni_net_change_rx_flags,
-	.ndo_start_xmit = kni_net_tx,
-	.ndo_change_mtu = kni_net_change_mtu,
-	.ndo_tx_timeout = kni_net_tx_timeout,
-	.ndo_set_mac_address = kni_net_set_mac,
-#ifdef HAVE_CHANGE_CARRIER_CB
-	.ndo_change_carrier = kni_net_change_carrier,
-#endif
-};
-
-static void kni_get_drvinfo(struct net_device *dev,
-			    struct ethtool_drvinfo *info)
-{
-	strlcpy(info->version, KNI_VERSION, sizeof(info->version));
-	strlcpy(info->driver, "kni", sizeof(info->driver));
-}
-
-static const struct ethtool_ops kni_net_ethtool_ops = {
-	.get_drvinfo	= kni_get_drvinfo,
-	.get_link	= ethtool_op_get_link,
-};
-
-void
-kni_net_init(struct net_device *dev)
-{
-	struct kni_dev *kni = netdev_priv(dev);
-
-	init_waitqueue_head(&kni->wq);
-	mutex_init(&kni->sync_lock);
-
-	ether_setup(dev); /* assign some of the fields */
-	dev->netdev_ops      = &kni_net_netdev_ops;
-	dev->header_ops      = &kni_net_header_ops;
-	dev->ethtool_ops     = &kni_net_ethtool_ops;
-	dev->watchdog_timeo = WD_TIMEOUT;
-}
-
-void
-kni_net_config_lo_mode(char *lo_str)
-{
-	if (!lo_str) {
-		pr_debug("loopback disabled");
-		return;
-	}
-
-	if (!strcmp(lo_str, "lo_mode_none"))
-		pr_debug("loopback disabled");
-	else if (!strcmp(lo_str, "lo_mode_fifo")) {
-		pr_debug("loopback mode=lo_mode_fifo enabled");
-		kni_net_rx_func = kni_net_rx_lo_fifo;
-	} else if (!strcmp(lo_str, "lo_mode_fifo_skb")) {
-		pr_debug("loopback mode=lo_mode_fifo_skb enabled");
-		kni_net_rx_func = kni_net_rx_lo_fifo_skb;
-	} else {
-		pr_debug("Unknown loopback parameter, disabled");
-	}
-}
diff --git a/kernel/linux/kni/meson.build b/kernel/linux/kni/meson.build
deleted file mode 100644
index 4c90069e9989..000000000000
--- a/kernel/linux/kni/meson.build
+++ /dev/null
@@ -1,41 +0,0 @@
-# SPDX-License-Identifier: BSD-3-Clause
-# Copyright(c) 2018 Luca Boccassi <bluca@debian.org>
-
-# For SUSE build check function arguments of ndo_tx_timeout API
-# Ref: https://jira.devtools.intel.com/browse/DPDK-29263
-kmod_cflags = ''
-file_path = kernel_source_dir + '/include/linux/netdevice.h'
-run_cmd = run_command('grep', 'ndo_tx_timeout', file_path, check: false)
-
-if run_cmd.stdout().contains('txqueue') == true
-   kmod_cflags = '-DHAVE_ARG_TX_QUEUE'
-endif
-
-
-kni_mkfile = custom_target('rte_kni_makefile',
-        output: 'Makefile',
-        command: ['touch', '@OUTPUT@'])
-
-kni_sources = files(
-        'kni_misc.c',
-        'kni_net.c',
-        'Kbuild',
-)
-
-custom_target('rte_kni',
-        input: kni_sources,
-        output: 'rte_kni.ko',
-        command: ['make', '-j4', '-C', kernel_build_dir,
-            'M=' + meson.current_build_dir(),
-            'src=' + meson.current_source_dir(),
-            ' '.join(['MODULE_CFLAGS=', kmod_cflags,'-include '])
-            + dpdk_source_root + '/config/rte_config.h' +
-            ' -I' + dpdk_source_root + '/lib/eal/include' +
-            ' -I' + dpdk_source_root + '/lib/kni' +
-            ' -I' + dpdk_build_root +
-            ' -I' + meson.current_source_dir(),
-            'modules'] + cross_args,
-        depends: kni_mkfile,
-        install: install,
-        install_dir: kernel_install_dir,
-        build_by_default: get_option('enable_kmods'))
diff --git a/kernel/linux/meson.build b/kernel/linux/meson.build
deleted file mode 100644
index 16a094899446..000000000000
--- a/kernel/linux/meson.build
+++ /dev/null
@@ -1,103 +0,0 @@
-# SPDX-License-Identifier: BSD-3-Clause
-# Copyright(c) 2018 Intel Corporation
-
-subdirs = ['kni']
-
-kernel_build_dir = get_option('kernel_dir')
-kernel_source_dir = get_option('kernel_dir')
-kernel_install_dir = ''
-install = not meson.is_cross_build()
-cross_args = []
-
-if not meson.is_cross_build()
-    # native build
-    kernel_version = run_command('uname', '-r', check: true).stdout().strip()
-    if kernel_source_dir != ''
-        # Try kernel release from sources first
-        r = run_command('make', '-s', '-C', kernel_source_dir, 'kernelrelease', check: false)
-        if r.returncode() == 0
-            kernel_version = r.stdout().strip()
-        endif
-    else
-        # use default path for native builds
-        kernel_source_dir = '/lib/modules/' + kernel_version + '/source'
-    endif
-    kernel_install_dir = '/lib/modules/' + kernel_version + '/extra/dpdk'
-    if kernel_build_dir == ''
-        # use default path for native builds
-        kernel_build_dir = '/lib/modules/' + kernel_version + '/build'
-    endif
-
-    # test running make in kernel directory, using "make kernelversion"
-    make_returncode = run_command('make', '-sC', kernel_build_dir,
-            'kernelversion', check: true).returncode()
-    if make_returncode != 0
-        # backward compatibility:
-        # the headers could still be in the 'build' subdir
-        if not kernel_build_dir.endswith('build') and not kernel_build_dir.endswith('build/')
-            kernel_build_dir = join_paths(kernel_build_dir, 'build')
-            make_returncode = run_command('make', '-sC', kernel_build_dir,
-                    'kernelversion', check: true).returncode()
-        endif
-    endif
-
-    if make_returncode != 0
-        error('Cannot compile kernel modules as requested - are kernel headers installed?')
-    endif
-
-    # DO ACTUAL MODULE BUILDING
-    foreach d:subdirs
-        subdir(d)
-    endforeach
-
-    subdir_done()
-endif
-
-# cross build
-# if we are cross-compiling we need kernel_build_dir specified
-if kernel_build_dir == ''
-    error('Need "kernel_dir" option for kmod compilation when cross-compiling')
-endif
-cross_compiler = find_program('c').path()
-if cross_compiler.endswith('gcc')
-    cross_prefix = run_command([py3, '-c', 'print("' + cross_compiler + '"[:-3])'],
-            check: true).stdout().strip()
-elif cross_compiler.endswith('clang')
-    cross_prefix = ''
-    found_target = false
-    # search for '-target' and use the arg that follows
-    # (i.e. the value of '-target') as cross_prefix
-    foreach cross_c_arg : meson.get_cross_property('c_args')
-        if found_target and cross_prefix == ''
-            cross_prefix = cross_c_arg
-        endif
-        if cross_c_arg == '-target'
-            found_target = true
-        endif
-    endforeach
-    if cross_prefix == ''
-        error('Did not find -target and its value in c_args in input cross-file.')
-    endif
-    linker = 'lld'
-    foreach cross_c_link_arg : meson.get_cross_property('c_link_args')
-        if cross_c_link_arg.startswith('-fuse-ld')
-            linker = cross_c_link_arg.split('=')[1]
-        endif
-    endforeach
-    cross_args += ['CC=@0@'.format(cross_compiler), 'LD=ld.@0@'.format(linker)]
-else
-    error('Unsupported cross compiler: @0@'.format(cross_compiler))
-endif
-
-cross_arch = host_machine.cpu_family()
-if host_machine.cpu_family() == 'aarch64'
-    cross_arch = 'arm64'
-endif
-
-cross_args += ['ARCH=@0@'.format(cross_arch),
-        'CROSS_COMPILE=@0@'.format(cross_prefix)]
-
-# DO ACTUAL MODULE BUILDING
-foreach d:subdirs
-    subdir(d)
-endforeach
diff --git a/lib/eal/common/eal_common_log.c b/lib/eal/common/eal_common_log.c
index bd7b188ceb4a..0a1d219d6924 100644
--- a/lib/eal/common/eal_common_log.c
+++ b/lib/eal/common/eal_common_log.c
@@ -356,7 +356,6 @@ static const struct logtype logtype_strings[] = {
 	{RTE_LOGTYPE_PMD,        "pmd"},
 	{RTE_LOGTYPE_HASH,       "lib.hash"},
 	{RTE_LOGTYPE_LPM,        "lib.lpm"},
-	{RTE_LOGTYPE_KNI,        "lib.kni"},
 	{RTE_LOGTYPE_ACL,        "lib.acl"},
 	{RTE_LOGTYPE_POWER,      "lib.power"},
 	{RTE_LOGTYPE_METER,      "lib.meter"},
diff --git a/lib/eal/include/rte_log.h b/lib/eal/include/rte_log.h
index 6d2b0856a565..bdefff2a5933 100644
--- a/lib/eal/include/rte_log.h
+++ b/lib/eal/include/rte_log.h
@@ -34,7 +34,7 @@ extern "C" {
 #define RTE_LOGTYPE_PMD        5 /**< Log related to poll mode driver. */
 #define RTE_LOGTYPE_HASH       6 /**< Log related to hash table. */
 #define RTE_LOGTYPE_LPM        7 /**< Log related to LPM. */
-#define RTE_LOGTYPE_KNI        8 /**< Log related to KNI. */
+				 /* was RTE_LOGTYPE_KNI */
 #define RTE_LOGTYPE_ACL        9 /**< Log related to ACL. */
 #define RTE_LOGTYPE_POWER     10 /**< Log related to power. */
 #define RTE_LOGTYPE_METER     11 /**< Log related to QoS meter. */
diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c
index c6efd920145c..a1fefcd9d83a 100644
--- a/lib/eal/linux/eal.c
+++ b/lib/eal/linux/eal.c
@@ -1084,11 +1084,6 @@ rte_eal_init(int argc, char **argv)
 				 */
 				iova_mode = RTE_IOVA_VA;
 				RTE_LOG(DEBUG, EAL, "Physical addresses are unavailable, selecting IOVA as VA mode.\n");
-#if defined(RTE_LIB_KNI) && LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0)
-			} else if (rte_eal_check_module("rte_kni") == 1) {
-				iova_mode = RTE_IOVA_PA;
-				RTE_LOG(DEBUG, EAL, "KNI is loaded, selecting IOVA as PA mode for better KNI performance.\n");
-#endif
 			} else if (is_iommu_enabled()) {
 				/* we have an IOMMU, pick IOVA as VA mode */
 				iova_mode = RTE_IOVA_VA;
@@ -1101,20 +1096,6 @@ rte_eal_init(int argc, char **argv)
 				RTE_LOG(DEBUG, EAL, "IOMMU is not available, selecting IOVA as PA mode.\n");
 			}
 		}
-#if defined(RTE_LIB_KNI) && LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0)
-		/* Workaround for KNI which requires physical address to work
-		 * in kernels < 4.10
-		 */
-		if (iova_mode == RTE_IOVA_VA &&
-				rte_eal_check_module("rte_kni") == 1) {
-			if (phys_addrs) {
-				iova_mode = RTE_IOVA_PA;
-				RTE_LOG(WARNING, EAL, "Forcing IOVA as 'PA' because KNI module is loaded\n");
-			} else {
-				RTE_LOG(DEBUG, EAL, "KNI can not work since physical addresses are unavailable\n");
-			}
-		}
-#endif
 		rte_eal_get_configuration()->iova_mode = iova_mode;
 	} else {
 		rte_eal_get_configuration()->iova_mode =
diff --git a/lib/kni/meson.build b/lib/kni/meson.build
deleted file mode 100644
index 5ce410f7f2d2..000000000000
--- a/lib/kni/meson.build
+++ /dev/null
@@ -1,21 +0,0 @@
-# SPDX-License-Identifier: BSD-3-Clause
-# Copyright(c) 2017 Intel Corporation
-
-if is_windows
-    build = false
-    reason = 'not supported on Windows'
-    subdir_done()
-endif
-
-if dpdk_conf.get('RTE_IOVA_IN_MBUF') == 0
-    build = false
-    reason = 'requires IOVA in mbuf (set enable_iova_as_pa option)'
-endif
-
-if not is_linux or not dpdk_conf.get('RTE_ARCH_64')
-    build = false
-    reason = 'only supported on 64-bit Linux'
-endif
-sources = files('rte_kni.c')
-headers = files('rte_kni.h', 'rte_kni_common.h')
-deps += ['ethdev', 'pci']
diff --git a/lib/kni/rte_kni.c b/lib/kni/rte_kni.c
deleted file mode 100644
index bfa6a001ff59..000000000000
--- a/lib/kni/rte_kni.c
+++ /dev/null
@@ -1,843 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2014 Intel Corporation
- */
-
-#ifndef RTE_EXEC_ENV_LINUX
-#error "KNI is not supported"
-#endif
-
-#include <string.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <sys/ioctl.h>
-#include <linux/version.h>
-
-#include <rte_string_fns.h>
-#include <rte_ethdev.h>
-#include <rte_malloc.h>
-#include <rte_log.h>
-#include <rte_kni.h>
-#include <rte_memzone.h>
-#include <rte_tailq.h>
-#include <rte_eal_memconfig.h>
-#include <rte_kni_common.h>
-#include "rte_kni_fifo.h"
-
-#define MAX_MBUF_BURST_NUM            32
-
-/* Maximum number of ring entries */
-#define KNI_FIFO_COUNT_MAX     1024
-#define KNI_FIFO_SIZE          (KNI_FIFO_COUNT_MAX * sizeof(void *) + \
-					sizeof(struct rte_kni_fifo))
-
-#define KNI_REQUEST_MBUF_NUM_MAX      32
-
-#define KNI_MEM_CHECK(cond, fail) do { if (cond) goto fail; } while (0)
-
-#define KNI_MZ_NAME_FMT			"kni_info_%s"
-#define KNI_TX_Q_MZ_NAME_FMT		"kni_tx_%s"
-#define KNI_RX_Q_MZ_NAME_FMT		"kni_rx_%s"
-#define KNI_ALLOC_Q_MZ_NAME_FMT		"kni_alloc_%s"
-#define KNI_FREE_Q_MZ_NAME_FMT		"kni_free_%s"
-#define KNI_REQ_Q_MZ_NAME_FMT		"kni_req_%s"
-#define KNI_RESP_Q_MZ_NAME_FMT		"kni_resp_%s"
-#define KNI_SYNC_ADDR_MZ_NAME_FMT	"kni_sync_%s"
-
-TAILQ_HEAD(rte_kni_list, rte_tailq_entry);
-
-static struct rte_tailq_elem rte_kni_tailq = {
-	.name = "RTE_KNI",
-};
-EAL_REGISTER_TAILQ(rte_kni_tailq)
-
-/**
- * KNI context
- */
-struct rte_kni {
-	char name[RTE_KNI_NAMESIZE];        /**< KNI interface name */
-	uint16_t group_id;                  /**< Group ID of KNI devices */
-	uint32_t slot_id;                   /**< KNI pool slot ID */
-	struct rte_mempool *pktmbuf_pool;   /**< pkt mbuf mempool */
-	unsigned int mbuf_size;                 /**< mbuf size */
-
-	const struct rte_memzone *m_tx_q;   /**< TX queue memzone */
-	const struct rte_memzone *m_rx_q;   /**< RX queue memzone */
-	const struct rte_memzone *m_alloc_q;/**< Alloc queue memzone */
-	const struct rte_memzone *m_free_q; /**< Free queue memzone */
-
-	struct rte_kni_fifo *tx_q;          /**< TX queue */
-	struct rte_kni_fifo *rx_q;          /**< RX queue */
-	struct rte_kni_fifo *alloc_q;       /**< Allocated mbufs queue */
-	struct rte_kni_fifo *free_q;        /**< To be freed mbufs queue */
-
-	const struct rte_memzone *m_req_q;  /**< Request queue memzone */
-	const struct rte_memzone *m_resp_q; /**< Response queue memzone */
-	const struct rte_memzone *m_sync_addr;/**< Sync addr memzone */
-
-	/* For request & response */
-	struct rte_kni_fifo *req_q;         /**< Request queue */
-	struct rte_kni_fifo *resp_q;        /**< Response queue */
-	void *sync_addr;                   /**< Req/Resp Mem address */
-
-	struct rte_kni_ops ops;             /**< operations for request */
-};
-
-enum kni_ops_status {
-	KNI_REQ_NO_REGISTER = 0,
-	KNI_REQ_REGISTERED,
-};
-
-static void kni_free_mbufs(struct rte_kni *kni);
-static void kni_allocate_mbufs(struct rte_kni *kni);
-
-static volatile int kni_fd = -1;
-
-/* Shall be called before any allocation happens */
-int
-rte_kni_init(unsigned int max_kni_ifaces __rte_unused)
-{
-	RTE_LOG(WARNING, KNI, "WARNING: KNI is deprecated and will be removed in DPDK 23.11\n");
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0)
-	if (rte_eal_iova_mode() != RTE_IOVA_PA) {
-		RTE_LOG(ERR, KNI, "KNI requires IOVA as PA\n");
-		return -1;
-	}
-#endif
-
-	/* Check FD and open */
-	if (kni_fd < 0) {
-		kni_fd = open("/dev/" KNI_DEVICE, O_RDWR);
-		if (kni_fd < 0) {
-			RTE_LOG(ERR, KNI,
-				"Can not open /dev/%s\n", KNI_DEVICE);
-			return -1;
-		}
-	}
-
-	return 0;
-}
-
-static struct rte_kni *
-__rte_kni_get(const char *name)
-{
-	struct rte_kni *kni;
-	struct rte_tailq_entry *te;
-	struct rte_kni_list *kni_list;
-
-	kni_list = RTE_TAILQ_CAST(rte_kni_tailq.head, rte_kni_list);
-
-	TAILQ_FOREACH(te, kni_list, next) {
-		kni = te->data;
-		if (strncmp(name, kni->name, RTE_KNI_NAMESIZE) == 0)
-			break;
-	}
-
-	if (te == NULL)
-		kni = NULL;
-
-	return kni;
-}
-
-static int
-kni_reserve_mz(struct rte_kni *kni)
-{
-	char mz_name[RTE_MEMZONE_NAMESIZE];
-
-	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, KNI_TX_Q_MZ_NAME_FMT, kni->name);
-	kni->m_tx_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY,
-			RTE_MEMZONE_IOVA_CONTIG);
-	KNI_MEM_CHECK(kni->m_tx_q == NULL, tx_q_fail);
-
-	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, KNI_RX_Q_MZ_NAME_FMT, kni->name);
-	kni->m_rx_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY,
-			RTE_MEMZONE_IOVA_CONTIG);
-	KNI_MEM_CHECK(kni->m_rx_q == NULL, rx_q_fail);
-
-	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, KNI_ALLOC_Q_MZ_NAME_FMT, kni->name);
-	kni->m_alloc_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY,
-			RTE_MEMZONE_IOVA_CONTIG);
-	KNI_MEM_CHECK(kni->m_alloc_q == NULL, alloc_q_fail);
-
-	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, KNI_FREE_Q_MZ_NAME_FMT, kni->name);
-	kni->m_free_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY,
-			RTE_MEMZONE_IOVA_CONTIG);
-	KNI_MEM_CHECK(kni->m_free_q == NULL, free_q_fail);
-
-	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, KNI_REQ_Q_MZ_NAME_FMT, kni->name);
-	kni->m_req_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY,
-			RTE_MEMZONE_IOVA_CONTIG);
-	KNI_MEM_CHECK(kni->m_req_q == NULL, req_q_fail);
-
-	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, KNI_RESP_Q_MZ_NAME_FMT, kni->name);
-	kni->m_resp_q = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY,
-			RTE_MEMZONE_IOVA_CONTIG);
-	KNI_MEM_CHECK(kni->m_resp_q == NULL, resp_q_fail);
-
-	snprintf(mz_name, RTE_MEMZONE_NAMESIZE, KNI_SYNC_ADDR_MZ_NAME_FMT, kni->name);
-	kni->m_sync_addr = rte_memzone_reserve(mz_name, KNI_FIFO_SIZE, SOCKET_ID_ANY,
-			RTE_MEMZONE_IOVA_CONTIG);
-	KNI_MEM_CHECK(kni->m_sync_addr == NULL, sync_addr_fail);
-
-	return 0;
-
-sync_addr_fail:
-	rte_memzone_free(kni->m_resp_q);
-resp_q_fail:
-	rte_memzone_free(kni->m_req_q);
-req_q_fail:
-	rte_memzone_free(kni->m_free_q);
-free_q_fail:
-	rte_memzone_free(kni->m_alloc_q);
-alloc_q_fail:
-	rte_memzone_free(kni->m_rx_q);
-rx_q_fail:
-	rte_memzone_free(kni->m_tx_q);
-tx_q_fail:
-	return -1;
-}
-
-static void
-kni_release_mz(struct rte_kni *kni)
-{
-	rte_memzone_free(kni->m_tx_q);
-	rte_memzone_free(kni->m_rx_q);
-	rte_memzone_free(kni->m_alloc_q);
-	rte_memzone_free(kni->m_free_q);
-	rte_memzone_free(kni->m_req_q);
-	rte_memzone_free(kni->m_resp_q);
-	rte_memzone_free(kni->m_sync_addr);
-}
-
-struct rte_kni *
-rte_kni_alloc(struct rte_mempool *pktmbuf_pool,
-	      const struct rte_kni_conf *conf,
-	      struct rte_kni_ops *ops)
-{
-	int ret;
-	struct rte_kni_device_info dev_info;
-	struct rte_kni *kni;
-	struct rte_tailq_entry *te;
-	struct rte_kni_list *kni_list;
-
-	if (!pktmbuf_pool || !conf || !conf->name[0])
-		return NULL;
-
-	/* Check if KNI subsystem has been initialized */
-	if (kni_fd < 0) {
-		RTE_LOG(ERR, KNI, "KNI subsystem has not been initialized. Invoke rte_kni_init() first\n");
-		return NULL;
-	}
-
-	rte_mcfg_tailq_write_lock();
-
-	kni = __rte_kni_get(conf->name);
-	if (kni != NULL) {
-		RTE_LOG(ERR, KNI, "KNI already exists\n");
-		goto unlock;
-	}
-
-	te = rte_zmalloc("KNI_TAILQ_ENTRY", sizeof(*te), 0);
-	if (te == NULL) {
-		RTE_LOG(ERR, KNI, "Failed to allocate tailq entry\n");
-		goto unlock;
-	}
-
-	kni = rte_zmalloc("KNI", sizeof(struct rte_kni), RTE_CACHE_LINE_SIZE);
-	if (kni == NULL) {
-		RTE_LOG(ERR, KNI, "KNI memory allocation failed\n");
-		goto kni_fail;
-	}
-
-	strlcpy(kni->name, conf->name, RTE_KNI_NAMESIZE);
-
-	if (ops)
-		memcpy(&kni->ops, ops, sizeof(struct rte_kni_ops));
-	else
-		kni->ops.port_id = UINT16_MAX;
-
-	memset(&dev_info, 0, sizeof(dev_info));
-	dev_info.core_id = conf->core_id;
-	dev_info.force_bind = conf->force_bind;
-	dev_info.group_id = conf->group_id;
-	dev_info.mbuf_size = conf->mbuf_size;
-	dev_info.mtu = conf->mtu;
-	dev_info.min_mtu = conf->min_mtu;
-	dev_info.max_mtu = conf->max_mtu;
-
-	memcpy(dev_info.mac_addr, conf->mac_addr, RTE_ETHER_ADDR_LEN);
-
-	strlcpy(dev_info.name, conf->name, RTE_KNI_NAMESIZE);
-
-	ret = kni_reserve_mz(kni);
-	if (ret < 0)
-		goto mz_fail;
-
-	/* TX RING */
-	kni->tx_q = kni->m_tx_q->addr;
-	kni_fifo_init(kni->tx_q, KNI_FIFO_COUNT_MAX);
-	dev_info.tx_phys = kni->m_tx_q->iova;
-
-	/* RX RING */
-	kni->rx_q = kni->m_rx_q->addr;
-	kni_fifo_init(kni->rx_q, KNI_FIFO_COUNT_MAX);
-	dev_info.rx_phys = kni->m_rx_q->iova;
-
-	/* ALLOC RING */
-	kni->alloc_q = kni->m_alloc_q->addr;
-	kni_fifo_init(kni->alloc_q, KNI_FIFO_COUNT_MAX);
-	dev_info.alloc_phys = kni->m_alloc_q->iova;
-
-	/* FREE RING */
-	kni->free_q = kni->m_free_q->addr;
-	kni_fifo_init(kni->free_q, KNI_FIFO_COUNT_MAX);
-	dev_info.free_phys = kni->m_free_q->iova;
-
-	/* Request RING */
-	kni->req_q = kni->m_req_q->addr;
-	kni_fifo_init(kni->req_q, KNI_FIFO_COUNT_MAX);
-	dev_info.req_phys = kni->m_req_q->iova;
-
-	/* Response RING */
-	kni->resp_q = kni->m_resp_q->addr;
-	kni_fifo_init(kni->resp_q, KNI_FIFO_COUNT_MAX);
-	dev_info.resp_phys = kni->m_resp_q->iova;
-
-	/* Req/Resp sync mem area */
-	kni->sync_addr = kni->m_sync_addr->addr;
-	dev_info.sync_va = kni->m_sync_addr->addr;
-	dev_info.sync_phys = kni->m_sync_addr->iova;
-
-	kni->pktmbuf_pool = pktmbuf_pool;
-	kni->group_id = conf->group_id;
-	kni->mbuf_size = conf->mbuf_size;
-
-	dev_info.iova_mode = (rte_eal_iova_mode() == RTE_IOVA_VA) ? 1 : 0;
-
-	ret = ioctl(kni_fd, RTE_KNI_IOCTL_CREATE, &dev_info);
-	if (ret < 0)
-		goto ioctl_fail;
-
-	te->data = kni;
-
-	kni_list = RTE_TAILQ_CAST(rte_kni_tailq.head, rte_kni_list);
-	TAILQ_INSERT_TAIL(kni_list, te, next);
-
-	rte_mcfg_tailq_write_unlock();
-
-	/* Allocate mbufs and then put them into alloc_q */
-	kni_allocate_mbufs(kni);
-
-	return kni;
-
-ioctl_fail:
-	kni_release_mz(kni);
-mz_fail:
-	rte_free(kni);
-kni_fail:
-	rte_free(te);
-unlock:
-	rte_mcfg_tailq_write_unlock();
-
-	return NULL;
-}
-
-static void
-kni_free_fifo(struct rte_kni_fifo *fifo)
-{
-	int ret;
-	struct rte_mbuf *pkt;
-
-	do {
-		ret = kni_fifo_get(fifo, (void **)&pkt, 1);
-		if (ret)
-			rte_pktmbuf_free(pkt);
-	} while (ret);
-}
-
-static void *
-va2pa(struct rte_mbuf *m)
-{
-	return (void *)((unsigned long)m -
-			((unsigned long)m->buf_addr - (unsigned long)rte_mbuf_iova_get(m)));
-}
-
-static void *
-va2pa_all(struct rte_mbuf *mbuf)
-{
-	void *phy_mbuf = va2pa(mbuf);
-	struct rte_mbuf *next = mbuf->next;
-	while (next) {
-		mbuf->next = va2pa(next);
-		mbuf = next;
-		next = mbuf->next;
-	}
-	return phy_mbuf;
-}
-
-static void
-obj_free(struct rte_mempool *mp __rte_unused, void *opaque, void *obj,
-		unsigned obj_idx __rte_unused)
-{
-	struct rte_mbuf *m = obj;
-	void *mbuf_phys = opaque;
-
-	if (va2pa(m) == mbuf_phys)
-		rte_pktmbuf_free(m);
-}
-
-static void
-kni_free_fifo_phy(struct rte_mempool *mp, struct rte_kni_fifo *fifo)
-{
-	void *mbuf_phys;
-	int ret;
-
-	do {
-		ret = kni_fifo_get(fifo, &mbuf_phys, 1);
-		if (ret)
-			rte_mempool_obj_iter(mp, obj_free, mbuf_phys);
-	} while (ret);
-}
-
-int
-rte_kni_release(struct rte_kni *kni)
-{
-	struct rte_tailq_entry *te;
-	struct rte_kni_list *kni_list;
-	struct rte_kni_device_info dev_info;
-	uint32_t retry = 5;
-
-	if (!kni)
-		return -1;
-
-	kni_list = RTE_TAILQ_CAST(rte_kni_tailq.head, rte_kni_list);
-
-	rte_mcfg_tailq_write_lock();
-
-	TAILQ_FOREACH(te, kni_list, next) {
-		if (te->data == kni)
-			break;
-	}
-
-	if (te == NULL)
-		goto unlock;
-
-	strlcpy(dev_info.name, kni->name, sizeof(dev_info.name));
-	if (ioctl(kni_fd, RTE_KNI_IOCTL_RELEASE, &dev_info) < 0) {
-		RTE_LOG(ERR, KNI, "Fail to release kni device\n");
-		goto unlock;
-	}
-
-	TAILQ_REMOVE(kni_list, te, next);
-
-	rte_mcfg_tailq_write_unlock();
-
-	/* mbufs in all fifo should be released, except request/response */
-
-	/* wait until all rxq packets processed by kernel */
-	while (kni_fifo_count(kni->rx_q) && retry--)
-		usleep(1000);
-
-	if (kni_fifo_count(kni->rx_q))
-		RTE_LOG(ERR, KNI, "Fail to free all Rx-q items\n");
-
-	kni_free_fifo_phy(kni->pktmbuf_pool, kni->alloc_q);
-	kni_free_fifo(kni->tx_q);
-	kni_free_fifo(kni->free_q);
-
-	kni_release_mz(kni);
-
-	rte_free(kni);
-
-	rte_free(te);
-
-	return 0;
-
-unlock:
-	rte_mcfg_tailq_write_unlock();
-
-	return -1;
-}
-
-/* default callback for request of configuring device mac address */
-static int
-kni_config_mac_address(uint16_t port_id, uint8_t mac_addr[])
-{
-	int ret = 0;
-
-	if (!rte_eth_dev_is_valid_port(port_id)) {
-		RTE_LOG(ERR, KNI, "Invalid port id %d\n", port_id);
-		return -EINVAL;
-	}
-
-	RTE_LOG(INFO, KNI, "Configure mac address of %d", port_id);
-
-	ret = rte_eth_dev_default_mac_addr_set(port_id,
-					(struct rte_ether_addr *)mac_addr);
-	if (ret < 0)
-		RTE_LOG(ERR, KNI, "Failed to config mac_addr for port %d\n",
-			port_id);
-
-	return ret;
-}
-
-/* default callback for request of configuring promiscuous mode */
-static int
-kni_config_promiscusity(uint16_t port_id, uint8_t to_on)
-{
-	int ret;
-
-	if (!rte_eth_dev_is_valid_port(port_id)) {
-		RTE_LOG(ERR, KNI, "Invalid port id %d\n", port_id);
-		return -EINVAL;
-	}
-
-	RTE_LOG(INFO, KNI, "Configure promiscuous mode of %d to %d\n",
-		port_id, to_on);
-
-	if (to_on)
-		ret = rte_eth_promiscuous_enable(port_id);
-	else
-		ret = rte_eth_promiscuous_disable(port_id);
-
-	if (ret != 0)
-		RTE_LOG(ERR, KNI,
-			"Failed to %s promiscuous mode for port %u: %s\n",
-			to_on ? "enable" : "disable", port_id,
-			rte_strerror(-ret));
-
-	return ret;
-}
-
-/* default callback for request of configuring allmulticast mode */
-static int
-kni_config_allmulticast(uint16_t port_id, uint8_t to_on)
-{
-	int ret;
-
-	if (!rte_eth_dev_is_valid_port(port_id)) {
-		RTE_LOG(ERR, KNI, "Invalid port id %d\n", port_id);
-		return -EINVAL;
-	}
-
-	RTE_LOG(INFO, KNI, "Configure allmulticast mode of %d to %d\n",
-		port_id, to_on);
-
-	if (to_on)
-		ret = rte_eth_allmulticast_enable(port_id);
-	else
-		ret = rte_eth_allmulticast_disable(port_id);
-	if (ret != 0)
-		RTE_LOG(ERR, KNI,
-			"Failed to %s allmulticast mode for port %u: %s\n",
-			to_on ? "enable" : "disable", port_id,
-			rte_strerror(-ret));
-
-	return ret;
-}
-
-int
-rte_kni_handle_request(struct rte_kni *kni)
-{
-	unsigned int ret;
-	struct rte_kni_request *req = NULL;
-
-	if (kni == NULL)
-		return -1;
-
-	/* Get request mbuf */
-	ret = kni_fifo_get(kni->req_q, (void **)&req, 1);
-	if (ret != 1)
-		return 0; /* It is OK of can not getting the request mbuf */
-
-	if (req != kni->sync_addr) {
-		RTE_LOG(ERR, KNI, "Wrong req pointer %p\n", req);
-		return -1;
-	}
-
-	/* Analyze the request and call the relevant actions for it */
-	switch (req->req_id) {
-	case RTE_KNI_REQ_CHANGE_MTU: /* Change MTU */
-		if (kni->ops.change_mtu)
-			req->result = kni->ops.change_mtu(kni->ops.port_id,
-							req->new_mtu);
-		break;
-	case RTE_KNI_REQ_CFG_NETWORK_IF: /* Set network interface up/down */
-		if (kni->ops.config_network_if)
-			req->result = kni->ops.config_network_if(kni->ops.port_id,
-								 req->if_up);
-		break;
-	case RTE_KNI_REQ_CHANGE_MAC_ADDR: /* Change MAC Address */
-		if (kni->ops.config_mac_address)
-			req->result = kni->ops.config_mac_address(
-					kni->ops.port_id, req->mac_addr);
-		else if (kni->ops.port_id != UINT16_MAX)
-			req->result = kni_config_mac_address(
-					kni->ops.port_id, req->mac_addr);
-		break;
-	case RTE_KNI_REQ_CHANGE_PROMISC: /* Change PROMISCUOUS MODE */
-		if (kni->ops.config_promiscusity)
-			req->result = kni->ops.config_promiscusity(
-					kni->ops.port_id, req->promiscusity);
-		else if (kni->ops.port_id != UINT16_MAX)
-			req->result = kni_config_promiscusity(
-					kni->ops.port_id, req->promiscusity);
-		break;
-	case RTE_KNI_REQ_CHANGE_ALLMULTI: /* Change ALLMULTICAST MODE */
-		if (kni->ops.config_allmulticast)
-			req->result = kni->ops.config_allmulticast(
-					kni->ops.port_id, req->allmulti);
-		else if (kni->ops.port_id != UINT16_MAX)
-			req->result = kni_config_allmulticast(
-					kni->ops.port_id, req->allmulti);
-		break;
-	default:
-		RTE_LOG(ERR, KNI, "Unknown request id %u\n", req->req_id);
-		req->result = -EINVAL;
-		break;
-	}
-
-	/* if needed, construct response buffer and put it back to resp_q */
-	if (!req->async)
-		ret = kni_fifo_put(kni->resp_q, (void **)&req, 1);
-	else
-		ret = 1;
-	if (ret != 1) {
-		RTE_LOG(ERR, KNI, "Fail to put the muf back to resp_q\n");
-		return -1; /* It is an error of can't putting the mbuf back */
-	}
-
-	return 0;
-}
-
-unsigned
-rte_kni_tx_burst(struct rte_kni *kni, struct rte_mbuf **mbufs, unsigned int num)
-{
-	num = RTE_MIN(kni_fifo_free_count(kni->rx_q), num);
-	void *phy_mbufs[num];
-	unsigned int ret;
-	unsigned int i;
-
-	for (i = 0; i < num; i++)
-		phy_mbufs[i] = va2pa_all(mbufs[i]);
-
-	ret = kni_fifo_put(kni->rx_q, phy_mbufs, num);
-
-	/* Get mbufs from free_q and then free them */
-	kni_free_mbufs(kni);
-
-	return ret;
-}
-
-unsigned
-rte_kni_rx_burst(struct rte_kni *kni, struct rte_mbuf **mbufs, unsigned int num)
-{
-	unsigned int ret = kni_fifo_get(kni->tx_q, (void **)mbufs, num);
-
-	/* If buffers removed or alloc_q is empty, allocate mbufs and then put them into alloc_q */
-	if (ret || (kni_fifo_count(kni->alloc_q) == 0))
-		kni_allocate_mbufs(kni);
-
-	return ret;
-}
-
-static void
-kni_free_mbufs(struct rte_kni *kni)
-{
-	int i, ret;
-	struct rte_mbuf *pkts[MAX_MBUF_BURST_NUM];
-
-	ret = kni_fifo_get(kni->free_q, (void **)pkts, MAX_MBUF_BURST_NUM);
-	if (likely(ret > 0)) {
-		for (i = 0; i < ret; i++)
-			rte_pktmbuf_free(pkts[i]);
-	}
-}
-
-static void
-kni_allocate_mbufs(struct rte_kni *kni)
-{
-	int i, ret;
-	struct rte_mbuf *pkts[MAX_MBUF_BURST_NUM];
-	void *phys[MAX_MBUF_BURST_NUM];
-	int allocq_free;
-
-	RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, pool) !=
-			 offsetof(struct rte_kni_mbuf, pool));
-	RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, buf_addr) !=
-			 offsetof(struct rte_kni_mbuf, buf_addr));
-	RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, next) !=
-			 offsetof(struct rte_kni_mbuf, next));
-	RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, data_off) !=
-			 offsetof(struct rte_kni_mbuf, data_off));
-	RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, data_len) !=
-			 offsetof(struct rte_kni_mbuf, data_len));
-	RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, pkt_len) !=
-			 offsetof(struct rte_kni_mbuf, pkt_len));
-	RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, ol_flags) !=
-			 offsetof(struct rte_kni_mbuf, ol_flags));
-
-	/* Check if pktmbuf pool has been configured */
-	if (kni->pktmbuf_pool == NULL) {
-		RTE_LOG(ERR, KNI, "No valid mempool for allocating mbufs\n");
-		return;
-	}
-
-	allocq_free = kni_fifo_free_count(kni->alloc_q);
-	allocq_free = (allocq_free > MAX_MBUF_BURST_NUM) ?
-		MAX_MBUF_BURST_NUM : allocq_free;
-	for (i = 0; i < allocq_free; i++) {
-		pkts[i] = rte_pktmbuf_alloc(kni->pktmbuf_pool);
-		if (unlikely(pkts[i] == NULL)) {
-			/* Out of memory */
-			RTE_LOG(ERR, KNI, "Out of memory\n");
-			break;
-		}
-		phys[i] = va2pa(pkts[i]);
-	}
-
-	/* No pkt mbuf allocated */
-	if (i <= 0)
-		return;
-
-	ret = kni_fifo_put(kni->alloc_q, phys, i);
-
-	/* Check if any mbufs not put into alloc_q, and then free them */
-	if (ret >= 0 && ret < i && ret < MAX_MBUF_BURST_NUM) {
-		int j;
-
-		for (j = ret; j < i; j++)
-			rte_pktmbuf_free(pkts[j]);
-	}
-}
-
-struct rte_kni *
-rte_kni_get(const char *name)
-{
-	struct rte_kni *kni;
-
-	if (name == NULL || name[0] == '\0')
-		return NULL;
-
-	rte_mcfg_tailq_read_lock();
-
-	kni = __rte_kni_get(name);
-
-	rte_mcfg_tailq_read_unlock();
-
-	return kni;
-}
-
-const char *
-rte_kni_get_name(const struct rte_kni *kni)
-{
-	return kni->name;
-}
-
-static enum kni_ops_status
-kni_check_request_register(struct rte_kni_ops *ops)
-{
-	/* check if KNI request ops has been registered*/
-	if (ops == NULL)
-		return KNI_REQ_NO_REGISTER;
-
-	if (ops->change_mtu == NULL
-	    && ops->config_network_if == NULL
-	    && ops->config_mac_address == NULL
-	    && ops->config_promiscusity == NULL
-	    && ops->config_allmulticast == NULL)
-		return KNI_REQ_NO_REGISTER;
-
-	return KNI_REQ_REGISTERED;
-}
-
-int
-rte_kni_register_handlers(struct rte_kni *kni, struct rte_kni_ops *ops)
-{
-	enum kni_ops_status req_status;
-
-	if (ops == NULL) {
-		RTE_LOG(ERR, KNI, "Invalid KNI request operation.\n");
-		return -1;
-	}
-
-	if (kni == NULL) {
-		RTE_LOG(ERR, KNI, "Invalid kni info.\n");
-		return -1;
-	}
-
-	req_status = kni_check_request_register(&kni->ops);
-	if (req_status == KNI_REQ_REGISTERED) {
-		RTE_LOG(ERR, KNI, "The KNI request operation has already registered.\n");
-		return -1;
-	}
-
-	memcpy(&kni->ops, ops, sizeof(struct rte_kni_ops));
-	return 0;
-}
-
-int
-rte_kni_unregister_handlers(struct rte_kni *kni)
-{
-	if (kni == NULL) {
-		RTE_LOG(ERR, KNI, "Invalid kni info.\n");
-		return -1;
-	}
-
-	memset(&kni->ops, 0, sizeof(struct rte_kni_ops));
-
-	return 0;
-}
-
-int
-rte_kni_update_link(struct rte_kni *kni, unsigned int linkup)
-{
-	char path[64];
-	char old_carrier[2];
-	const char *new_carrier;
-	int old_linkup;
-	int fd, ret;
-
-	if (kni == NULL)
-		return -1;
-
-	snprintf(path, sizeof(path), "/sys/devices/virtual/net/%s/carrier",
-		kni->name);
-
-	fd = open(path, O_RDWR);
-	if (fd == -1) {
-		RTE_LOG(ERR, KNI, "Failed to open file: %s.\n", path);
-		return -1;
-	}
-
-	ret = read(fd, old_carrier, 2);
-	if (ret < 1) {
-		close(fd);
-		return -1;
-	}
-	old_linkup = (old_carrier[0] == '1');
-
-	if (old_linkup == (int)linkup)
-		goto out;
-
-	new_carrier = linkup ? "1" : "0";
-	ret = write(fd, new_carrier, 1);
-	if (ret < 1) {
-		RTE_LOG(ERR, KNI, "Failed to write file: %s.\n", path);
-		close(fd);
-		return -1;
-	}
-out:
-	close(fd);
-	return old_linkup;
-}
-
-void
-rte_kni_close(void)
-{
-	if (kni_fd < 0)
-		return;
-
-	close(kni_fd);
-	kni_fd = -1;
-}
diff --git a/lib/kni/rte_kni.h b/lib/kni/rte_kni.h
deleted file mode 100644
index 1e508acc829b..000000000000
--- a/lib/kni/rte_kni.h
+++ /dev/null
@@ -1,269 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2014 Intel Corporation
- */
-
-#ifndef _RTE_KNI_H_
-#define _RTE_KNI_H_
-
-/**
- * @file
- * RTE KNI
- *
- * The KNI library provides the ability to create and destroy kernel NIC
- * interfaces that may be used by the RTE application to receive/transmit
- * packets from/to Linux kernel net interfaces.
- *
- * This library provides two APIs to burst receive packets from KNI interfaces,
- * and burst transmit packets to KNI interfaces.
- */
-
-#include <rte_compat.h>
-#include <rte_pci.h>
-#include <rte_ether.h>
-
-#include <rte_kni_common.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct rte_kni;
-struct rte_mbuf;
-
-/**
- * Structure which has the function pointers for KNI interface.
- */
-struct rte_kni_ops {
-	uint16_t port_id; /* Port ID */
-
-	/* Pointer to function of changing MTU */
-	int (*change_mtu)(uint16_t port_id, unsigned int new_mtu);
-
-	/* Pointer to function of configuring network interface */
-	int (*config_network_if)(uint16_t port_id, uint8_t if_up);
-
-	/* Pointer to function of configuring mac address */
-	int (*config_mac_address)(uint16_t port_id, uint8_t mac_addr[]);
-
-	/* Pointer to function of configuring promiscuous mode */
-	int (*config_promiscusity)(uint16_t port_id, uint8_t to_on);
-
-	/* Pointer to function of configuring allmulticast mode */
-	int (*config_allmulticast)(uint16_t port_id, uint8_t to_on);
-};
-
-/**
- * Structure for configuring KNI device.
- */
-struct rte_kni_conf {
-	/*
-	 * KNI name which will be used in relevant network device.
-	 * Let the name as short as possible, as it will be part of
-	 * memzone name.
-	 */
-	char name[RTE_KNI_NAMESIZE];
-	uint32_t core_id;   /* Core ID to bind kernel thread on */
-	uint16_t group_id;  /* Group ID */
-	unsigned mbuf_size; /* mbuf size */
-	struct rte_pci_addr addr; /* deprecated */
-	struct rte_pci_id id; /* deprecated */
-
-	__extension__
-	uint8_t force_bind : 1; /* Flag to bind kernel thread */
-	uint8_t mac_addr[RTE_ETHER_ADDR_LEN]; /* MAC address assigned to KNI */
-	uint16_t mtu;
-	uint16_t min_mtu;
-	uint16_t max_mtu;
-};
-
-/**
- * Initialize and preallocate KNI subsystem
- *
- * This function is to be executed on the main lcore only, after EAL
- * initialization and before any KNI interface is attempted to be
- * allocated
- *
- * @param max_kni_ifaces
- *  The maximum number of KNI interfaces that can coexist concurrently
- *
- * @return
- *  - 0 indicates success.
- *  - negative value indicates failure.
- */
-int rte_kni_init(unsigned int max_kni_ifaces);
-
-
-/**
- * Allocate KNI interface according to the port id, mbuf size, mbuf pool,
- * configurations and callbacks for kernel requests.The KNI interface created
- * in the kernel space is the net interface the traditional Linux application
- * talking to.
- *
- * The rte_kni_alloc shall not be called before rte_kni_init() has been
- * called. rte_kni_alloc is thread safe.
- *
- * The mempool should have capacity of more than "2 x KNI_FIFO_COUNT_MAX"
- * elements for each KNI interface allocated.
- *
- * @param pktmbuf_pool
- *  The mempool for allocating mbufs for packets.
- * @param conf
- *  The pointer to the configurations of the KNI device.
- * @param ops
- *  The pointer to the callbacks for the KNI kernel requests.
- *
- * @return
- *  - The pointer to the context of a KNI interface.
- *  - NULL indicate error.
- */
-struct rte_kni *rte_kni_alloc(struct rte_mempool *pktmbuf_pool,
-		const struct rte_kni_conf *conf, struct rte_kni_ops *ops);
-
-/**
- * Release KNI interface according to the context. It will also release the
- * paired KNI interface in kernel space. All processing on the specific KNI
- * context need to be stopped before calling this interface.
- *
- * rte_kni_release is thread safe.
- *
- * @param kni
- *  The pointer to the context of an existent KNI interface.
- *
- * @return
- *  - 0 indicates success.
- *  - negative value indicates failure.
- */
-int rte_kni_release(struct rte_kni *kni);
-
-/**
- * It is used to handle the request mbufs sent from kernel space.
- * Then analyzes it and calls the specific actions for the specific requests.
- * Finally constructs the response mbuf and puts it back to the resp_q.
- *
- * @param kni
- *  The pointer to the context of an existent KNI interface.
- *
- * @return
- *  - 0
- *  - negative value indicates failure.
- */
-int rte_kni_handle_request(struct rte_kni *kni);
-
-/**
- * Retrieve a burst of packets from a KNI interface. The retrieved packets are
- * stored in rte_mbuf structures whose pointers are supplied in the array of
- * mbufs, and the maximum number is indicated by num. It handles allocating
- * the mbufs for KNI interface alloc queue.
- *
- * @param kni
- *  The KNI interface context.
- * @param mbufs
- *  The array to store the pointers of mbufs.
- * @param num
- *  The maximum number per burst.
- *
- * @return
- *  The actual number of packets retrieved.
- */
-unsigned rte_kni_rx_burst(struct rte_kni *kni, struct rte_mbuf **mbufs,
-		unsigned num);
-
-/**
- * Send a burst of packets to a KNI interface. The packets to be sent out are
- * stored in rte_mbuf structures whose pointers are supplied in the array of
- * mbufs, and the maximum number is indicated by num. It handles the freeing of
- * the mbufs in the free queue of KNI interface.
- *
- * @param kni
- *  The KNI interface context.
- * @param mbufs
- *  The array to store the pointers of mbufs.
- * @param num
- *  The maximum number per burst.
- *
- * @return
- *  The actual number of packets sent.
- */
-unsigned rte_kni_tx_burst(struct rte_kni *kni, struct rte_mbuf **mbufs,
-		unsigned num);
-
-/**
- * Get the KNI context of its name.
- *
- * @param name
- *  pointer to the KNI device name.
- *
- * @return
- *  On success: Pointer to KNI interface.
- *  On failure: NULL.
- */
-struct rte_kni *rte_kni_get(const char *name);
-
-/**
- * Get the name given to a KNI device
- *
- * @param kni
- *   The KNI instance to query
- * @return
- *   The pointer to the KNI name
- */
-const char *rte_kni_get_name(const struct rte_kni *kni);
-
-/**
- * Register KNI request handling for a specified port,and it can
- * be called by primary process or secondary process.
- *
- * @param kni
- *  pointer to struct rte_kni.
- * @param ops
- *  pointer to struct rte_kni_ops.
- *
- * @return
- *  On success: 0
- *  On failure: -1
- */
-int rte_kni_register_handlers(struct rte_kni *kni, struct rte_kni_ops *ops);
-
-/**
- *  Unregister KNI request handling for a specified port.
- *
- *  @param kni
- *   pointer to struct rte_kni.
- *
- *  @return
- *   On success: 0
- *   On failure: -1
- */
-int rte_kni_unregister_handlers(struct rte_kni *kni);
-
-/**
- * Update link carrier state for KNI port.
- *
- * Update the linkup/linkdown state of a KNI interface in the kernel.
- *
- * @param kni
- *  pointer to struct rte_kni.
- * @param linkup
- *  New link state:
- *  0 for linkdown.
- *  > 0 for linkup.
- *
- * @return
- *  On failure: -1
- *  Previous link state == linkdown: 0
- *  Previous link state == linkup: 1
- */
-__rte_experimental
-int
-rte_kni_update_link(struct rte_kni *kni, unsigned int linkup);
-
-/**
- *  Close KNI device.
- */
-void rte_kni_close(void);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _RTE_KNI_H_ */
diff --git a/lib/kni/rte_kni_common.h b/lib/kni/rte_kni_common.h
deleted file mode 100644
index 8d3ee0fa4fc2..000000000000
--- a/lib/kni/rte_kni_common.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/* SPDX-License-Identifier: (BSD-3-Clause OR LGPL-2.1) */
-/*
- * Copyright(c) 2007-2014 Intel Corporation.
- */
-
-#ifndef _RTE_KNI_COMMON_H_
-#define _RTE_KNI_COMMON_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef __KERNEL__
-#include <linux/if.h>
-#include <asm/barrier.h>
-#define RTE_STD_C11
-#else
-#include <rte_common.h>
-#include <rte_config.h>
-#endif
-
-/*
- * KNI name is part of memzone name. Must not exceed IFNAMSIZ.
- */
-#define RTE_KNI_NAMESIZE 16
-
-#define RTE_CACHE_LINE_MIN_SIZE 64
-
-/*
- * Request id.
- */
-enum rte_kni_req_id {
-	RTE_KNI_REQ_UNKNOWN = 0,
-	RTE_KNI_REQ_CHANGE_MTU,
-	RTE_KNI_REQ_CFG_NETWORK_IF,
-	RTE_KNI_REQ_CHANGE_MAC_ADDR,
-	RTE_KNI_REQ_CHANGE_PROMISC,
-	RTE_KNI_REQ_CHANGE_ALLMULTI,
-	RTE_KNI_REQ_MAX,
-};
-
-/*
- * Structure for KNI request.
- */
-struct rte_kni_request {
-	uint32_t req_id;             /**< Request id */
-	RTE_STD_C11
-	union {
-		uint32_t new_mtu;    /**< New MTU */
-		uint8_t if_up;       /**< 1: interface up, 0: interface down */
-		uint8_t mac_addr[6]; /**< MAC address for interface */
-		uint8_t promiscusity;/**< 1: promisc mode enable, 0: disable */
-		uint8_t allmulti;    /**< 1: all-multicast mode enable, 0: disable */
-	};
-	int32_t async : 1;            /**< 1: request is asynchronous */
-	int32_t result;               /**< Result for processing request */
-} __attribute__((__packed__));
-
-/*
- * Fifo struct mapped in a shared memory. It describes a circular buffer FIFO
- * Write and read should wrap around. Fifo is empty when write == read
- * Writing should never overwrite the read position
- */
-struct rte_kni_fifo {
-#ifdef RTE_USE_C11_MEM_MODEL
-	unsigned write;              /**< Next position to be written*/
-	unsigned read;               /**< Next position to be read */
-#else
-	volatile unsigned write;     /**< Next position to be written*/
-	volatile unsigned read;      /**< Next position to be read */
-#endif
-	unsigned len;                /**< Circular buffer length */
-	unsigned elem_size;          /**< Pointer size - for 32/64 bit OS */
-	void *volatile buffer[];     /**< The buffer contains mbuf pointers */
-};
-
-/*
- * The kernel image of the rte_mbuf struct, with only the relevant fields.
- * Padding is necessary to assure the offsets of these fields
- */
-struct rte_kni_mbuf {
-	void *buf_addr __attribute__((__aligned__(RTE_CACHE_LINE_SIZE)));
-	uint64_t buf_iova;
-	uint16_t data_off;      /**< Start address of data in segment buffer. */
-	char pad1[2];
-	uint16_t nb_segs;       /**< Number of segments. */
-	char pad4[2];
-	uint64_t ol_flags;      /**< Offload features. */
-	char pad2[4];
-	uint32_t pkt_len;       /**< Total pkt len: sum of all segment data_len. */
-	uint16_t data_len;      /**< Amount of data in segment buffer. */
-	char pad3[14];
-	void *pool;
-
-	/* fields on second cache line */
-	__attribute__((__aligned__(RTE_CACHE_LINE_MIN_SIZE)))
-	void *next;             /**< Physical address of next mbuf in kernel. */
-};
-
-/*
- * Struct used to create a KNI device. Passed to the kernel in IOCTL call
- */
-
-struct rte_kni_device_info {
-	char name[RTE_KNI_NAMESIZE];  /**< Network device name for KNI */
-
-	phys_addr_t tx_phys;
-	phys_addr_t rx_phys;
-	phys_addr_t alloc_phys;
-	phys_addr_t free_phys;
-
-	/* Used by Ethtool */
-	phys_addr_t req_phys;
-	phys_addr_t resp_phys;
-	phys_addr_t sync_phys;
-	void * sync_va;
-
-	/* mbuf mempool */
-	void * mbuf_va;
-	phys_addr_t mbuf_phys;
-
-	uint16_t group_id;            /**< Group ID */
-	uint32_t core_id;             /**< core ID to bind for kernel thread */
-
-	__extension__
-	uint8_t force_bind : 1;       /**< Flag for kernel thread binding */
-
-	/* mbuf size */
-	unsigned mbuf_size;
-	unsigned int mtu;
-	unsigned int min_mtu;
-	unsigned int max_mtu;
-	uint8_t mac_addr[6];
-	uint8_t iova_mode;
-};
-
-#define KNI_DEVICE "kni"
-
-#define RTE_KNI_IOCTL_TEST    _IOWR(0, 1, int)
-#define RTE_KNI_IOCTL_CREATE  _IOWR(0, 2, struct rte_kni_device_info)
-#define RTE_KNI_IOCTL_RELEASE _IOWR(0, 3, struct rte_kni_device_info)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _RTE_KNI_COMMON_H_ */
diff --git a/lib/kni/rte_kni_fifo.h b/lib/kni/rte_kni_fifo.h
deleted file mode 100644
index d2ec82fe87fc..000000000000
--- a/lib/kni/rte_kni_fifo.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2014 Intel Corporation
- */
-
-
-
-/**
- * @internal when c11 memory model enabled use c11 atomic memory barrier.
- * when under non c11 memory model use rte_smp_* memory barrier.
- *
- * @param src
- *   Pointer to the source data.
- * @param dst
- *   Pointer to the destination data.
- * @param value
- *   Data value.
- */
-#ifdef RTE_USE_C11_MEM_MODEL
-#define __KNI_LOAD_ACQUIRE(src) ({                         \
-		__atomic_load_n((src), __ATOMIC_ACQUIRE);           \
-	})
-#define __KNI_STORE_RELEASE(dst, value) do {               \
-		__atomic_store_n((dst), value, __ATOMIC_RELEASE);   \
-	} while(0)
-#else
-#define __KNI_LOAD_ACQUIRE(src) ({                         \
-		typeof (*(src)) val = *(src);                       \
-		rte_smp_rmb();                                      \
-		val;                                                \
-	})
-#define __KNI_STORE_RELEASE(dst, value) do {               \
-		*(dst) = value;                                     \
-		rte_smp_wmb();                                      \
-	} while(0)
-#endif
-
-/**
- * Initializes the kni fifo structure
- */
-static void
-kni_fifo_init(struct rte_kni_fifo *fifo, unsigned size)
-{
-	/* Ensure size is power of 2 */
-	if (size & (size - 1))
-		rte_panic("KNI fifo size must be power of 2\n");
-
-	fifo->write = 0;
-	fifo->read = 0;
-	fifo->len = size;
-	fifo->elem_size = sizeof(void *);
-}
-
-/**
- * Adds num elements into the fifo. Return the number actually written
- */
-static inline unsigned
-kni_fifo_put(struct rte_kni_fifo *fifo, void **data, unsigned num)
-{
-	unsigned i = 0;
-	unsigned fifo_write = fifo->write;
-	unsigned new_write = fifo_write;
-	unsigned fifo_read = __KNI_LOAD_ACQUIRE(&fifo->read);
-
-	for (i = 0; i < num; i++) {
-		new_write = (new_write + 1) & (fifo->len - 1);
-
-		if (new_write == fifo_read)
-			break;
-		fifo->buffer[fifo_write] = data[i];
-		fifo_write = new_write;
-	}
-	__KNI_STORE_RELEASE(&fifo->write, fifo_write);
-	return i;
-}
-
-/**
- * Get up to num elements from the fifo. Return the number actually read
- */
-static inline unsigned
-kni_fifo_get(struct rte_kni_fifo *fifo, void **data, unsigned num)
-{
-	unsigned i = 0;
-	unsigned new_read = fifo->read;
-	unsigned fifo_write = __KNI_LOAD_ACQUIRE(&fifo->write);
-
-	for (i = 0; i < num; i++) {
-		if (new_read == fifo_write)
-			break;
-
-		data[i] = fifo->buffer[new_read];
-		new_read = (new_read + 1) & (fifo->len - 1);
-	}
-	__KNI_STORE_RELEASE(&fifo->read, new_read);
-	return i;
-}
-
-/**
- * Get the num of elements in the fifo
- */
-static inline uint32_t
-kni_fifo_count(struct rte_kni_fifo *fifo)
-{
-	unsigned fifo_write = __KNI_LOAD_ACQUIRE(&fifo->write);
-	unsigned fifo_read = __KNI_LOAD_ACQUIRE(&fifo->read);
-	return (fifo->len + fifo_write - fifo_read) & (fifo->len - 1);
-}
-
-/**
- * Get the num of available elements in the fifo
- */
-static inline uint32_t
-kni_fifo_free_count(struct rte_kni_fifo *fifo)
-{
-	uint32_t fifo_write = __KNI_LOAD_ACQUIRE(&fifo->write);
-	uint32_t fifo_read = __KNI_LOAD_ACQUIRE(&fifo->read);
-	return (fifo_read - fifo_write - 1) & (fifo->len - 1);
-}
diff --git a/lib/kni/version.map b/lib/kni/version.map
deleted file mode 100644
index 83bbbe880f43..000000000000
--- a/lib/kni/version.map
+++ /dev/null
@@ -1,24 +0,0 @@
-DPDK_23 {
-	global:
-
-	rte_kni_alloc;
-	rte_kni_close;
-	rte_kni_get;
-	rte_kni_get_name;
-	rte_kni_handle_request;
-	rte_kni_init;
-	rte_kni_register_handlers;
-	rte_kni_release;
-	rte_kni_rx_burst;
-	rte_kni_tx_burst;
-	rte_kni_unregister_handlers;
-
-	local: *;
-};
-
-EXPERIMENTAL {
-	global:
-
-	# updated in v21.08
-	rte_kni_update_link;
-};
diff --git a/lib/meson.build b/lib/meson.build
index fac2f52cad4f..06df4f57ad6e 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -39,7 +39,6 @@ libraries = [
         'gso',
         'ip_frag',
         'jobstats',
-        'kni',
         'latencystats',
         'lpm',
         'member',
@@ -75,7 +74,6 @@ optional_libs = [
         'graph',
         'gro',
         'gso',
-        'kni',
         'jobstats',
         'latencystats',
         'metrics',
@@ -90,7 +88,6 @@ optional_libs = [
 
 dpdk_libs_deprecated += [
         'flow_classify',
-        'kni',
 ]
 
 disabled_libs = []
diff --git a/lib/port/meson.build b/lib/port/meson.build
index 3ab37e2cb4b7..b0af2b185b39 100644
--- a/lib/port/meson.build
+++ b/lib/port/meson.build
@@ -45,9 +45,3 @@ if dpdk_conf.has('RTE_HAS_LIBPCAP')
     dpdk_conf.set('RTE_PORT_PCAP', 1)
     ext_deps += pcap_dep # dependency provided in config/meson.build
 endif
-
-if dpdk_conf.has('RTE_LIB_KNI')
-    sources += files('rte_port_kni.c')
-    headers += files('rte_port_kni.h')
-    deps += 'kni'
-endif
diff --git a/lib/port/rte_port_kni.c b/lib/port/rte_port_kni.c
deleted file mode 100644
index 1c7a6cb200ea..000000000000
--- a/lib/port/rte_port_kni.c
+++ /dev/null
@@ -1,515 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2016 Ethan Zhuang <zhuangwj@gmail.com>.
- * Copyright(c) 2016 Intel Corporation.
- */
-#include <string.h>
-
-#include <rte_malloc.h>
-#include <rte_kni.h>
-
-#include "rte_port_kni.h"
-
-/*
- * Port KNI Reader
- */
-#ifdef RTE_PORT_STATS_COLLECT
-
-#define RTE_PORT_KNI_READER_STATS_PKTS_IN_ADD(port, val) \
-	port->stats.n_pkts_in += val
-#define RTE_PORT_KNI_READER_STATS_PKTS_DROP_ADD(port, val) \
-	port->stats.n_pkts_drop += val
-
-#else
-
-#define RTE_PORT_KNI_READER_STATS_PKTS_IN_ADD(port, val)
-#define RTE_PORT_KNI_READER_STATS_PKTS_DROP_ADD(port, val)
-
-#endif
-
-struct rte_port_kni_reader {
-	struct rte_port_in_stats stats;
-
-	struct rte_kni *kni;
-};
-
-static void *
-rte_port_kni_reader_create(void *params, int socket_id)
-{
-	struct rte_port_kni_reader_params *conf =
-			params;
-	struct rte_port_kni_reader *port;
-
-	/* Check input parameters */
-	if (conf == NULL) {
-		RTE_LOG(ERR, PORT, "%s: params is NULL\n", __func__);
-		return NULL;
-	}
-
-	/* Memory allocation */
-	port = rte_zmalloc_socket("PORT", sizeof(*port),
-		RTE_CACHE_LINE_SIZE, socket_id);
-	if (port == NULL) {
-		RTE_LOG(ERR, PORT, "%s: Failed to allocate port\n", __func__);
-		return NULL;
-	}
-
-	/* Initialization */
-	port->kni = conf->kni;
-
-	return port;
-}
-
-static int
-rte_port_kni_reader_rx(void *port, struct rte_mbuf **pkts, uint32_t n_pkts)
-{
-	struct rte_port_kni_reader *p =
-			port;
-	uint16_t rx_pkt_cnt;
-
-	rx_pkt_cnt = rte_kni_rx_burst(p->kni, pkts, n_pkts);
-	RTE_PORT_KNI_READER_STATS_PKTS_IN_ADD(p, rx_pkt_cnt);
-	return rx_pkt_cnt;
-}
-
-static int
-rte_port_kni_reader_free(void *port)
-{
-	if (port == NULL) {
-		RTE_LOG(ERR, PORT, "%s: port is NULL\n", __func__);
-		return -EINVAL;
-	}
-
-	rte_free(port);
-
-	return 0;
-}
-
-static int rte_port_kni_reader_stats_read(void *port,
-	struct rte_port_in_stats *stats, int clear)
-{
-	struct rte_port_kni_reader *p =
-			port;
-
-	if (stats != NULL)
-		memcpy(stats, &p->stats, sizeof(p->stats));
-
-	if (clear)
-		memset(&p->stats, 0, sizeof(p->stats));
-
-	return 0;
-}
-
-/*
- * Port KNI Writer
- */
-#ifdef RTE_PORT_STATS_COLLECT
-
-#define RTE_PORT_KNI_WRITER_STATS_PKTS_IN_ADD(port, val) \
-	port->stats.n_pkts_in += val
-#define RTE_PORT_KNI_WRITER_STATS_PKTS_DROP_ADD(port, val) \
-	port->stats.n_pkts_drop += val
-
-#else
-
-#define RTE_PORT_KNI_WRITER_STATS_PKTS_IN_ADD(port, val)
-#define RTE_PORT_KNI_WRITER_STATS_PKTS_DROP_ADD(port, val)
-
-#endif
-
-struct rte_port_kni_writer {
-	struct rte_port_out_stats stats;
-
-	struct rte_mbuf *tx_buf[2 * RTE_PORT_IN_BURST_SIZE_MAX];
-	uint32_t tx_burst_sz;
-	uint32_t tx_buf_count;
-	uint64_t bsz_mask;
-	struct rte_kni *kni;
-};
-
-static void *
-rte_port_kni_writer_create(void *params, int socket_id)
-{
-	struct rte_port_kni_writer_params *conf =
-			params;
-	struct rte_port_kni_writer *port;
-
-	/* Check input parameters */
-	if ((conf == NULL) ||
-		(conf->tx_burst_sz == 0) ||
-		(conf->tx_burst_sz > RTE_PORT_IN_BURST_SIZE_MAX) ||
-		(!rte_is_power_of_2(conf->tx_burst_sz))) {
-		RTE_LOG(ERR, PORT, "%s: Invalid input parameters\n", __func__);
-		return NULL;
-	}
-
-	/* Memory allocation */
-	port = rte_zmalloc_socket("PORT", sizeof(*port),
-		RTE_CACHE_LINE_SIZE, socket_id);
-	if (port == NULL) {
-		RTE_LOG(ERR, PORT, "%s: Failed to allocate port\n", __func__);
-		return NULL;
-	}
-
-	/* Initialization */
-	port->kni = conf->kni;
-	port->tx_burst_sz = conf->tx_burst_sz;
-	port->tx_buf_count = 0;
-	port->bsz_mask = 1LLU << (conf->tx_burst_sz - 1);
-
-	return port;
-}
-
-static inline void
-send_burst(struct rte_port_kni_writer *p)
-{
-	uint32_t nb_tx;
-
-	nb_tx = rte_kni_tx_burst(p->kni, p->tx_buf, p->tx_buf_count);
-
-	RTE_PORT_KNI_WRITER_STATS_PKTS_DROP_ADD(p, p->tx_buf_count - nb_tx);
-	for (; nb_tx < p->tx_buf_count; nb_tx++)
-		rte_pktmbuf_free(p->tx_buf[nb_tx]);
-
-	p->tx_buf_count = 0;
-}
-
-static int
-rte_port_kni_writer_tx(void *port, struct rte_mbuf *pkt)
-{
-	struct rte_port_kni_writer *p =
-			port;
-
-	p->tx_buf[p->tx_buf_count++] = pkt;
-	RTE_PORT_KNI_WRITER_STATS_PKTS_IN_ADD(p, 1);
-	if (p->tx_buf_count >= p->tx_burst_sz)
-		send_burst(p);
-
-	return 0;
-}
-
-static int
-rte_port_kni_writer_tx_bulk(void *port,
-	struct rte_mbuf **pkts,
-	uint64_t pkts_mask)
-{
-	struct rte_port_kni_writer *p =
-			port;
-	uint64_t bsz_mask = p->bsz_mask;
-	uint32_t tx_buf_count = p->tx_buf_count;
-	uint64_t expr = (pkts_mask & (pkts_mask + 1)) |
-					((pkts_mask & bsz_mask) ^ bsz_mask);
-
-	if (expr == 0) {
-		uint64_t n_pkts = __builtin_popcountll(pkts_mask);
-		uint32_t n_pkts_ok;
-
-		if (tx_buf_count)
-			send_burst(p);
-
-		RTE_PORT_KNI_WRITER_STATS_PKTS_IN_ADD(p, n_pkts);
-		n_pkts_ok = rte_kni_tx_burst(p->kni, pkts, n_pkts);
-
-		RTE_PORT_KNI_WRITER_STATS_PKTS_DROP_ADD(p, n_pkts - n_pkts_ok);
-		for (; n_pkts_ok < n_pkts; n_pkts_ok++) {
-			struct rte_mbuf *pkt = pkts[n_pkts_ok];
-
-			rte_pktmbuf_free(pkt);
-		}
-	} else {
-		for (; pkts_mask;) {
-			uint32_t pkt_index = __builtin_ctzll(pkts_mask);
-			uint64_t pkt_mask = 1LLU << pkt_index;
-			struct rte_mbuf *pkt = pkts[pkt_index];
-
-			p->tx_buf[tx_buf_count++] = pkt;
-			RTE_PORT_KNI_WRITER_STATS_PKTS_IN_ADD(p, 1);
-			pkts_mask &= ~pkt_mask;
-		}
-
-		p->tx_buf_count = tx_buf_count;
-		if (tx_buf_count >= p->tx_burst_sz)
-			send_burst(p);
-	}
-
-	return 0;
-}
-
-static int
-rte_port_kni_writer_flush(void *port)
-{
-	struct rte_port_kni_writer *p =
-			port;
-
-	if (p->tx_buf_count > 0)
-		send_burst(p);
-
-	return 0;
-}
-
-static int
-rte_port_kni_writer_free(void *port)
-{
-	if (port == NULL) {
-		RTE_LOG(ERR, PORT, "%s: Port is NULL\n", __func__);
-		return -EINVAL;
-	}
-
-	rte_port_kni_writer_flush(port);
-	rte_free(port);
-
-	return 0;
-}
-
-static int rte_port_kni_writer_stats_read(void *port,
-	struct rte_port_out_stats *stats, int clear)
-{
-	struct rte_port_kni_writer *p =
-			port;
-
-	if (stats != NULL)
-		memcpy(stats, &p->stats, sizeof(p->stats));
-
-	if (clear)
-		memset(&p->stats, 0, sizeof(p->stats));
-
-	return 0;
-}
-
-/*
- * Port KNI Writer Nodrop
- */
-#ifdef RTE_PORT_STATS_COLLECT
-
-#define RTE_PORT_KNI_WRITER_NODROP_STATS_PKTS_IN_ADD(port, val) \
-	port->stats.n_pkts_in += val
-#define RTE_PORT_KNI_WRITER_NODROP_STATS_PKTS_DROP_ADD(port, val) \
-	port->stats.n_pkts_drop += val
-
-#else
-
-#define RTE_PORT_KNI_WRITER_NODROP_STATS_PKTS_IN_ADD(port, val)
-#define RTE_PORT_KNI_WRITER_NODROP_STATS_PKTS_DROP_ADD(port, val)
-
-#endif
-
-struct rte_port_kni_writer_nodrop {
-	struct rte_port_out_stats stats;
-
-	struct rte_mbuf *tx_buf[2 * RTE_PORT_IN_BURST_SIZE_MAX];
-	uint32_t tx_burst_sz;
-	uint32_t tx_buf_count;
-	uint64_t bsz_mask;
-	uint64_t n_retries;
-	struct rte_kni *kni;
-};
-
-static void *
-rte_port_kni_writer_nodrop_create(void *params, int socket_id)
-{
-	struct rte_port_kni_writer_nodrop_params *conf =
-		params;
-	struct rte_port_kni_writer_nodrop *port;
-
-	/* Check input parameters */
-	if ((conf == NULL) ||
-		(conf->tx_burst_sz == 0) ||
-		(conf->tx_burst_sz > RTE_PORT_IN_BURST_SIZE_MAX) ||
-		(!rte_is_power_of_2(conf->tx_burst_sz))) {
-		RTE_LOG(ERR, PORT, "%s: Invalid input parameters\n", __func__);
-		return NULL;
-	}
-
-	/* Memory allocation */
-	port = rte_zmalloc_socket("PORT", sizeof(*port),
-		RTE_CACHE_LINE_SIZE, socket_id);
-	if (port == NULL) {
-		RTE_LOG(ERR, PORT, "%s: Failed to allocate port\n", __func__);
-		return NULL;
-	}
-
-	/* Initialization */
-	port->kni = conf->kni;
-	port->tx_burst_sz = conf->tx_burst_sz;
-	port->tx_buf_count = 0;
-	port->bsz_mask = 1LLU << (conf->tx_burst_sz - 1);
-
-	/*
-	 * When n_retries is 0 it means that we should wait for every packet to
-	 * send no matter how many retries should it take. To limit number of
-	 * branches in fast path, we use UINT64_MAX instead of branching.
-	 */
-	port->n_retries = (conf->n_retries == 0) ? UINT64_MAX : conf->n_retries;
-
-	return port;
-}
-
-static inline void
-send_burst_nodrop(struct rte_port_kni_writer_nodrop *p)
-{
-	uint32_t nb_tx = 0, i;
-
-	nb_tx = rte_kni_tx_burst(p->kni, p->tx_buf, p->tx_buf_count);
-
-	/* We sent all the packets in a first try */
-	if (nb_tx >= p->tx_buf_count) {
-		p->tx_buf_count = 0;
-		return;
-	}
-
-	for (i = 0; i < p->n_retries; i++) {
-		nb_tx += rte_kni_tx_burst(p->kni,
-			p->tx_buf + nb_tx,
-			p->tx_buf_count - nb_tx);
-
-		/* We sent all the packets in more than one try */
-		if (nb_tx >= p->tx_buf_count) {
-			p->tx_buf_count = 0;
-			return;
-		}
-	}
-
-	/* We didn't send the packets in maximum allowed attempts */
-	RTE_PORT_KNI_WRITER_NODROP_STATS_PKTS_DROP_ADD(p, p->tx_buf_count - nb_tx);
-	for ( ; nb_tx < p->tx_buf_count; nb_tx++)
-		rte_pktmbuf_free(p->tx_buf[nb_tx]);
-
-	p->tx_buf_count = 0;
-}
-
-static int
-rte_port_kni_writer_nodrop_tx(void *port, struct rte_mbuf *pkt)
-{
-	struct rte_port_kni_writer_nodrop *p =
-			port;
-
-	p->tx_buf[p->tx_buf_count++] = pkt;
-	RTE_PORT_KNI_WRITER_STATS_PKTS_IN_ADD(p, 1);
-	if (p->tx_buf_count >= p->tx_burst_sz)
-		send_burst_nodrop(p);
-
-	return 0;
-}
-
-static int
-rte_port_kni_writer_nodrop_tx_bulk(void *port,
-	struct rte_mbuf **pkts,
-	uint64_t pkts_mask)
-{
-	struct rte_port_kni_writer_nodrop *p =
-			port;
-
-	uint64_t bsz_mask = p->bsz_mask;
-	uint32_t tx_buf_count = p->tx_buf_count;
-	uint64_t expr = (pkts_mask & (pkts_mask + 1)) |
-					((pkts_mask & bsz_mask) ^ bsz_mask);
-
-	if (expr == 0) {
-		uint64_t n_pkts = __builtin_popcountll(pkts_mask);
-		uint32_t n_pkts_ok;
-
-		if (tx_buf_count)
-			send_burst_nodrop(p);
-
-		RTE_PORT_KNI_WRITER_NODROP_STATS_PKTS_IN_ADD(p, n_pkts);
-		n_pkts_ok = rte_kni_tx_burst(p->kni, pkts, n_pkts);
-
-		if (n_pkts_ok >= n_pkts)
-			return 0;
-
-		/*
-		 * If we didn't manage to send all packets in single burst, move
-		 * remaining packets to the buffer and call send burst.
-		 */
-		for (; n_pkts_ok < n_pkts; n_pkts_ok++) {
-			struct rte_mbuf *pkt = pkts[n_pkts_ok];
-			p->tx_buf[p->tx_buf_count++] = pkt;
-		}
-		send_burst_nodrop(p);
-	} else {
-		for ( ; pkts_mask; ) {
-			uint32_t pkt_index = __builtin_ctzll(pkts_mask);
-			uint64_t pkt_mask = 1LLU << pkt_index;
-			struct rte_mbuf *pkt = pkts[pkt_index];
-
-			p->tx_buf[tx_buf_count++] = pkt;
-			RTE_PORT_KNI_WRITER_NODROP_STATS_PKTS_IN_ADD(p, 1);
-			pkts_mask &= ~pkt_mask;
-		}
-
-		p->tx_buf_count = tx_buf_count;
-		if (tx_buf_count >= p->tx_burst_sz)
-			send_burst_nodrop(p);
-	}
-
-	return 0;
-}
-
-static int
-rte_port_kni_writer_nodrop_flush(void *port)
-{
-	struct rte_port_kni_writer_nodrop *p =
-		port;
-
-	if (p->tx_buf_count > 0)
-		send_burst_nodrop(p);
-
-	return 0;
-}
-
-static int
-rte_port_kni_writer_nodrop_free(void *port)
-{
-	if (port == NULL) {
-		RTE_LOG(ERR, PORT, "%s: Port is NULL\n", __func__);
-		return -EINVAL;
-	}
-
-	rte_port_kni_writer_nodrop_flush(port);
-	rte_free(port);
-
-	return 0;
-}
-
-static int rte_port_kni_writer_nodrop_stats_read(void *port,
-	struct rte_port_out_stats *stats, int clear)
-{
-	struct rte_port_kni_writer_nodrop *p =
-			port;
-
-	if (stats != NULL)
-		memcpy(stats, &p->stats, sizeof(p->stats));
-
-	if (clear)
-		memset(&p->stats, 0, sizeof(p->stats));
-
-	return 0;
-}
-
-
-/*
- * Summary of port operations
- */
-struct rte_port_in_ops rte_port_kni_reader_ops = {
-	.f_create = rte_port_kni_reader_create,
-	.f_free = rte_port_kni_reader_free,
-	.f_rx = rte_port_kni_reader_rx,
-	.f_stats = rte_port_kni_reader_stats_read,
-};
-
-struct rte_port_out_ops rte_port_kni_writer_ops = {
-	.f_create = rte_port_kni_writer_create,
-	.f_free = rte_port_kni_writer_free,
-	.f_tx = rte_port_kni_writer_tx,
-	.f_tx_bulk = rte_port_kni_writer_tx_bulk,
-	.f_flush = rte_port_kni_writer_flush,
-	.f_stats = rte_port_kni_writer_stats_read,
-};
-
-struct rte_port_out_ops rte_port_kni_writer_nodrop_ops = {
-	.f_create = rte_port_kni_writer_nodrop_create,
-	.f_free = rte_port_kni_writer_nodrop_free,
-	.f_tx = rte_port_kni_writer_nodrop_tx,
-	.f_tx_bulk = rte_port_kni_writer_nodrop_tx_bulk,
-	.f_flush = rte_port_kni_writer_nodrop_flush,
-	.f_stats = rte_port_kni_writer_nodrop_stats_read,
-};
diff --git a/lib/port/rte_port_kni.h b/lib/port/rte_port_kni.h
deleted file mode 100644
index 280f58c121e2..000000000000
--- a/lib/port/rte_port_kni.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2016 Ethan Zhuang <zhuangwj@gmail.com>.
- * Copyright(c) 2016 Intel Corporation.
- */
-
-#ifndef __INCLUDE_RTE_PORT_KNI_H__
-#define __INCLUDE_RTE_PORT_KNI_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @file
- * RTE Port KNI Interface
- *
- * kni_reader: input port built on top of pre-initialized KNI interface
- * kni_writer: output port built on top of pre-initialized KNI interface
- */
-
-#include <stdint.h>
-
-#include "rte_port.h"
-
-/** kni_reader port parameters */
-struct rte_port_kni_reader_params {
-	/** KNI interface reference */
-	struct rte_kni *kni;
-};
-
-/** kni_reader port operations */
-extern struct rte_port_in_ops rte_port_kni_reader_ops;
-
-
-/** kni_writer port parameters */
-struct rte_port_kni_writer_params {
-	/** KNI interface reference */
-	struct rte_kni *kni;
-	/** Burst size to KNI interface. */
-	uint32_t tx_burst_sz;
-};
-
-/** kni_writer port operations */
-extern struct rte_port_out_ops rte_port_kni_writer_ops;
-
-/** kni_writer_nodrop port parameters */
-struct rte_port_kni_writer_nodrop_params {
-	/** KNI interface reference */
-	struct rte_kni *kni;
-	/** Burst size to KNI interface. */
-	uint32_t tx_burst_sz;
-	/** Maximum number of retries, 0 for no limit */
-	uint32_t n_retries;
-};
-
-/** kni_writer_nodrop port operations */
-extern struct rte_port_out_ops rte_port_kni_writer_nodrop_ops;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/lib/port/version.map b/lib/port/version.map
index af6cf696fd54..d67a03650d8b 100644
--- a/lib/port/version.map
+++ b/lib/port/version.map
@@ -7,9 +7,6 @@ DPDK_23 {
 	rte_port_fd_reader_ops;
 	rte_port_fd_writer_nodrop_ops;
 	rte_port_fd_writer_ops;
-	rte_port_kni_reader_ops;
-	rte_port_kni_writer_nodrop_ops;
-	rte_port_kni_writer_ops;
 	rte_port_ring_multi_reader_ops;
 	rte_port_ring_multi_writer_nodrop_ops;
 	rte_port_ring_multi_writer_ops;
diff --git a/meson_options.txt b/meson_options.txt
index 82c8297065f0..7b67e0203f8f 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -10,7 +10,7 @@ option('disable_apps', type: 'string', value: '', description:
        'Comma-separated list of apps to explicitly disable.')
 option('disable_drivers', type: 'string', value: '', description:
        'Comma-separated list of drivers to explicitly disable.')
-option('disable_libs', type: 'string', value: 'flow_classify,kni', description:
+option('disable_libs', type: 'string', value: 'flow_classify', description:
        'Comma-separated list of libraries to explicitly disable. [NOTE: not all libs can be disabled]')
 option('drivers_install_subdir', type: 'string', value: 'dpdk/pmds-<VERSION>', description:
        'Subdirectory of libdir where to install PMDs. Defaults to using a versioned subdirectory.')
-- 
2.39.2


^ permalink raw reply	[relevance 1%]

* DPDK 23.07 released
@ 2023-07-28 20:37  3% Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2023-07-28 20:37 UTC (permalink / raw)
  To: announce

A new major release is available:
	https://fast.dpdk.org/rel/dpdk-23.07.tar.xz

The number of commits is not that big
but the number of changed lines is quite significant:
	1028 commits from 178 authors
	1554 files changed, 157260 insertions(+), 58411 deletions(-)

This release happens on July 28, and 23.03 was on March 31.
Later would be too late :)
It looks like more help would be welcome at any stage of the process:
feel free to give a boost in test, review or merge tasks.


It is not planned to start a maintenance branch for 23.07.
This version is ABI-compatible with 22.11 and 23.03.

Below are some new features:
	- AMD CDX bus
	- PCI MMIO read/write
	- new flow patterns: Tx queue, Infiniband BTH
	- new flow actions: push/remove IPv6 extension
	- indirect flow rule list
	- flow rule update
	- vhost interrupt callback
	- VDUSE in vhost library
	- more ShangMi crypto algorithms
	- PDCP library
	- removed LiquidIO driver
	- DMA device performance test application
	- DTS basic UDP test

More details in the release notes:
	https://doc.dpdk.org/guides/rel_notes/release_23_07.html


There are 37 new contributors (including authors, reviewers and testers).
Welcome to Abhijit Gangurde, Abhiram R N, Akihiko Odaki, Arnaud Fiorini,
Artemii Morozov, Bar Neuman, Bartosz Staszewski, Benjamin Mikailenko,
Charles Stoll, Dave Johnson, Dengdui Huang, Denis Pryazhennikov,
Eric Joyner, Heng Jiang, Itamar Gozlan, Jeroen de Borst, Jieqiang Wang,
Julien Aube, Kaijun Zeng, Kaisen You, Kaiyu Zhang, Kazatsker Kirill,
Lukasz Plachno, Manish Kurup, Nizan Zorea, Pavan Kumar Linga,
Pengfei Sun, Philip Prindeville, Pier Damouny, Priyalee Kushwaha,
Qin Ke, Ron Beider, Ronak Doshi, Samina Arshad, Sandilya Bhagi,
Vladimir Ratnikov, and Yutang Jiang.

Below is the number of commits per employer (with authors count):
	252     Intel (45)
	225     Marvell (29)
	127     NVIDIA (28)
	 88     Red Hat (7)
	 73     Corigine (7)
	 54     Ark Networks (4)
	 53     Huawei (7)
	 32     Microsoft (2)
	 16     AMD (4)
	 13     Arm (3)
	 12     Broadcom (5)
	 11     VMware (2)
	 11     Trustnet (1)
	        ...

A big thank to all courageous people who took on the non rewarding task
of reviewing other's job.
Based on Reviewed-by and Acked-by tags, the top non-PMD reviewers are:
	 44     Ferruh Yigit <ferruh.yigit@amd.com>
	 43     Akhil Goyal <gakhil@marvell.com>
	 38     David Marchand <david.marchand@redhat.com>
	 32     Chenbo Xia <chenbo.xia@intel.com>
	 31     Bruce Richardson <bruce.richardson@intel.com>
	 26     Jerin Jacob <jerinj@marvell.com>
	 21     Ori Kam <orika@nvidia.com>
	 20     Ciara Power <ciara.power@intel.com>
	 16     Morten Brørup <mb@smartsharesystems.com>
	 16     Anatoly Burakov <anatoly.burakov@intel.com>

More numbers? There are more than 300 open bugs in our Bugzilla.
The number of comments in half-done work (TODO, FIXME) keeps increasing,
especially in drivers code (159 lines found). Complete report is coming.
We must do more effort in cleaning such code.


The next version will be 23.11 in November.
The new features for 23.11 can be submitted during the next 2 weeks:
        http://core.dpdk.org/roadmap#dates
Please share your roadmap.


Don't forget to register for the DPDK Summit in September:
	https://events.linuxfoundation.org/dpdk-summit/

Thanks everyone, see you in Dublin



^ permalink raw reply	[relevance 3%]

* Re: [PATCH v2] doc: announce new major ABI version
  2023-07-28 17:02  7%       ` Patrick Robb
@ 2023-07-28 17:33  4%         ` Thomas Monjalon
  2023-07-31  4:42  8%         ` [EXT] " Akhil Goyal
  1 sibling, 0 replies; 200+ results
From: Thomas Monjalon @ 2023-07-28 17:33 UTC (permalink / raw)
  To: Patrick Robb; +Cc: Bruce Richardson, dev, david.marchand

28/07/2023 19:02, Patrick Robb:
> The Community Lab's ABI testing on new patchseries is now disabled until
> the 23.11 release. Thanks.

Perfect, thank you.




^ permalink raw reply	[relevance 4%]

* Re: [PATCH v2] doc: announce new major ABI version
  2023-07-28 16:03  4%     ` Thomas Monjalon
@ 2023-07-28 17:02  7%       ` Patrick Robb
  2023-07-28 17:33  4%         ` Thomas Monjalon
  2023-07-31  4:42  8%         ` [EXT] " Akhil Goyal
  0 siblings, 2 replies; 200+ results
From: Patrick Robb @ 2023-07-28 17:02 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: Bruce Richardson, dev

[-- Attachment #1: Type: text/plain, Size: 100 bytes --]

The Community Lab's ABI testing on new patchseries is now disabled until
the 23.11 release. Thanks.

[-- Attachment #2: Type: text/html, Size: 128 bytes --]

^ permalink raw reply	[relevance 7%]

* Re: [PATCH v2] doc: announce new major ABI version
  2023-07-28 15:23  4%   ` Bruce Richardson
@ 2023-07-28 16:03  4%     ` Thomas Monjalon
  2023-07-28 17:02  7%       ` Patrick Robb
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2023-07-28 16:03 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: dev

28/07/2023 17:23, Bruce Richardson:
> On Fri, Jul 28, 2023 at 05:18:40PM +0200, Thomas Monjalon wrote:
> > The next DPDK release 23.11 won't keep ABI compatibility.
> > Only the changes impacting the users should be announced in advance.
> > 
> > Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> > ---
> > v2: improve wording (thanks Bruce)
> > ---
> >  doc/guides/rel_notes/deprecation.rst | 12 +++++++++---
> >  1 file changed, 9 insertions(+), 3 deletions(-)
> > 
> > diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
> > index 91ac8f0229..18281d7304 100644
> > --- a/doc/guides/rel_notes/deprecation.rst
> > +++ b/doc/guides/rel_notes/deprecation.rst
> > @@ -4,9 +4,15 @@
> >  ABI and API Deprecation
> >  =======================
> >  
> > -See the guidelines document for details of the :doc:`ABI policy
> > -<../contributing/abi_policy>`. API and ABI deprecation notices are to be posted
> > -here.
> > +See the guidelines document for details
> > +of the :doc:`ABI policy <../contributing/abi_policy>`.
> > +
> This has a strange line-break position. It can probably be a single line.

Will keep the original break which was better looking.

> > +With DPDK 23.11, there will be a new major ABI version: 24.
> > +This means that during the development of 23.11,
> > +new items may be added to structs or enums,
> > +even if those additions involve an ABI compatibility breakage.
> > +
> > +Other API and ABI deprecation notices are to be posted below.
> 
> Acked-by: Bruce Richardson <bruce.richardson@intel.com>

Applied



^ permalink raw reply	[relevance 4%]

* Re: [PATCH] doc: postpone deprecation of pipeline legacy API
  2023-07-20 10:37  0%   ` Dumitrescu, Cristian
@ 2023-07-28 16:02  0%     ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2023-07-28 16:02 UTC (permalink / raw)
  To: Dumitrescu, Cristian
  Cc: Richardson, Bruce, dev, Nicolau, Radu, R, Kamalakannan,
	Suresh Narayane, Harshad

> > > Postpone the deprecation of the legacy pipeline, table and port
> > > library API and gradual stabilization of the new API.
> > >
> > > Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
> > > ---
> > >  doc/guides/rel_notes/deprecation.rst | 21 +++++++++------------
> > >  1 file changed, 9 insertions(+), 12 deletions(-)
> > >
> > 
> > No objection to this, though it would be really good to get the new
> > functions stabilized in 23.11 when we lock down the 24 ABI.
> > 
> 
> Yes, fully agree, let's see if we can make this happen for 23.11
> 
> > Acked-by: Bruce Richardson <bruce.richardson@intel.com>

Applied, thanks.



^ permalink raw reply	[relevance 0%]

* RE: [PATCH] doc: announce ethdev operation struct changes
  2023-07-28 15:37  0%         ` Thomas Monjalon
@ 2023-07-28 15:55  0%           ` Morten Brørup
  2023-08-01  3:19  0%             ` Feifei Wang
  0 siblings, 1 reply; 200+ results
From: Morten Brørup @ 2023-07-28 15:55 UTC (permalink / raw)
  To: Thomas Monjalon
  Cc: dev, nd, Honnappa.Nagarahalli, Feifei Wang, Ruifeng Wang,
	Feifei Wang, ferruh.yigit, konstantin.ananyev, andrew.rybchenko

> From: Thomas Monjalon [mailto:thomas@monjalon.net]
> Sent: Friday, 28 July 2023 17.38
> 
> 28/07/2023 17:33, Morten Brørup:
> > > From: Thomas Monjalon [mailto:thomas@monjalon.net]
> > > Sent: Friday, 28 July 2023 17.20
> > >
> > > 28/07/2023 17:08, Morten Brørup:
> > > > > From: Thomas Monjalon [mailto:thomas@monjalon.net]
> > > > > Sent: Friday, 28 July 2023 16.57
> > > > >
> > > > > 04/07/2023 10:10, Feifei Wang:
> > > > > > To support mbufs recycle mode, announce the coming ABI changes
> > > > > > from DPDK 23.11.
> > > > > >
> > > > > > Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
> > > > > > Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
> > > > > > ---
> > > > > >  doc/guides/rel_notes/deprecation.rst | 4 ++++
> > > > > >  1 file changed, 4 insertions(+)
> > > > > >
> > > > > > diff --git a/doc/guides/rel_notes/deprecation.rst
> > > > > b/doc/guides/rel_notes/deprecation.rst
> > > > > > index 66431789b0..c7e1ffafb2 100644
> > > > > > --- a/doc/guides/rel_notes/deprecation.rst
> > > > > > +++ b/doc/guides/rel_notes/deprecation.rst
> > > > > > @@ -118,6 +118,10 @@ Deprecation Notices
> > > > > >    The legacy actions should be removed
> > > > > >    once ``MODIFY_FIELD`` alternative is implemented in drivers.
> > > > > >
> > > > > > +* ethdev: The Ethernet device data structure ``struct rte_eth_dev``
> and
> > > > > > +  the fast-path ethdev flat array ``struct rte_eth_fp_ops`` will be
> > > updated
> > > > > > +  with new fields to support mbufs recycle mode from DPDK 23.11.
> > > >
> > > > Existing fields will also be moved around [1]:
> > > >
> > > > @@ -83,15 +90,17 @@  struct rte_eth_fp_ops {
> > > >  	 * Rx fast-path functions and related data.
> > > >  	 * 64-bit systems: occupies first 64B line
> > > >  	 */
> > > > +	/** Rx queues data. */
> > > > +	struct rte_ethdev_qdata rxq;
> > > >  	/** PMD receive function. */
> > > >  	eth_rx_burst_t rx_pkt_burst;
> > > >  	/** Get the number of used Rx descriptors. */
> > > >  	eth_rx_queue_count_t rx_queue_count;
> > > >  	/** Check the status of a Rx descriptor. */
> > > >  	eth_rx_descriptor_status_t rx_descriptor_status;
> > > > -	/** Rx queues data. */
> > > > -	struct rte_ethdev_qdata rxq;
> > > > -	uintptr_t reserved1[3];
> > > > +	/** Refill Rx descriptors with the recycling mbufs. */
> > > > +	eth_recycle_rx_descriptors_refill_t
> recycle_rx_descriptors_refill;
> > > > +	uintptr_t reserved1[2];
> > > >  	/**@}*/
> > > >
> > > >  	/**@{*/
> > > > @@ -99,15 +108,17 @@  struct rte_eth_fp_ops {
> > > >  	 * Tx fast-path functions and related data.
> > > >  	 * 64-bit systems: occupies second 64B line
> > > >  	 */
> > > > +	/** Tx queues data. */
> > > > +	struct rte_ethdev_qdata txq;
> > > >  	/** PMD transmit function. */
> > > >  	eth_tx_burst_t tx_pkt_burst;
> > > >  	/** PMD transmit prepare function. */
> > > >  	eth_tx_prep_t tx_pkt_prepare;
> > > >  	/** Check the status of a Tx descriptor. */
> > > >  	eth_tx_descriptor_status_t tx_descriptor_status;
> > > > -	/** Tx queues data. */
> > > > -	struct rte_ethdev_qdata txq;
> > > > -	uintptr_t reserved2[3];
> > > > +	/** Copy used mbufs from Tx mbuf ring into Rx. */
> > > > +	eth_recycle_tx_mbufs_reuse_t recycle_tx_mbufs_reuse;
> > > > +	uintptr_t reserved2[2];
> > > >  	/**@}*/
> > >
> > > Removing existing fields should be announced explicitly.
> >
> > Agreed. And the patch misses this. The "rxq" and "txq" fields are not being
> removed, they are being moved up in the structures. Your comment about
> explicit mentioning still applies!
> >
> > If there's no time to wait for a new patch version from Feifei, perhaps you
> improve the description while merging.
> 
> If it's only moving fields, we can skip.

OK. Thank you for elaborating.

> The real change is the size of the reserved fields,
> so it looks acceptable without notice.

Agree.

Thoughts for later: We should perhaps document that changing the size of reserved fields is acceptable. And with that, if completely removing a reserved field is also acceptable or not.

^ permalink raw reply	[relevance 0%]

* Re: [EXT] Re: [PATCH v2] doc: announce single-event enqueue/dequeue ABI change
  2023-07-05 13:02  4%     ` [EXT] " Pavan Nikhilesh Bhagavatula
@ 2023-07-28 15:51  4%       ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2023-07-28 15:51 UTC (permalink / raw)
  To: Jerin Jacob, Mattias Rönnblom
  Cc: dev, Jerin Jacob Kollanukkaran, hofors, dev, Timothy McDaniel,
	Hemant Agrawal, Sachin Saxena, Harry van Haaren, Liang Ma,
	Peter Mccarthy, Pavan Nikhilesh Bhagavatula

05/07/2023 15:02, Pavan Nikhilesh Bhagavatula:
> > On Wed, Jul 5, 2023 at 4:48 PM Mattias Rönnblom
> > <mattias.ronnblom@ericsson.com> wrote:
> > >
> > > Announce the removal of the single-event enqueue and dequeue
> > > operations from the eventdev ABI.
> > >
> > > Signed-off-by: Mattias Rönnblom <mattias.ronnblom@ericsson.com>
> > 
> > Acked-by: Jerin Jacob <jerinj@marvell.com>
> 
> Acked-by: Pavan Nikhilesh <pbhagavatula@marvell.com>

Acked-by: Thomas Monjalon <thomas@monjalon.net>

Applied, thanks.



^ permalink raw reply	[relevance 4%]

* Re: [PATCH v1] doc: deprecation notice to add callback data to rte_event_fp_ops
  2023-07-25  8:40  0%   ` Ferruh Yigit
  2023-07-25 16:46  0%     ` Hemant Agrawal
@ 2023-07-28 15:42  3%     ` Thomas Monjalon
  1 sibling, 0 replies; 200+ results
From: Thomas Monjalon @ 2023-07-28 15:42 UTC (permalink / raw)
  To: Sivaprasad Tummala
  Cc: dev, bruce.richardson, david.marchand, jerinjacobk, techboard,
	Ferruh Yigit

25/07/2023 10:40, Ferruh Yigit:
> On 7/17/2023 12:24 PM, Sivaprasad Tummala wrote:
> > Deprecation notice to add "rte_eventdev_port_data" field to
> > ``rte_event_fp_ops`` for callback support.
> > 
> > Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
> > ---
> >  doc/guides/rel_notes/deprecation.rst | 7 +++++++
> >  1 file changed, 7 insertions(+)
> > 
> > diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
> > index fb771a0305..057f97ce5a 100644
> > --- a/doc/guides/rel_notes/deprecation.rst
> > +++ b/doc/guides/rel_notes/deprecation.rst
> > @@ -130,6 +130,13 @@ Deprecation Notices
> >    ``rte_cryptodev_get_auth_algo_string``, ``rte_cryptodev_get_aead_algo_string`` and
> >    ``rte_cryptodev_asym_get_xform_string`` respectively.
> >  
> > +* eventdev: The struct rte_event_fp_ops will be updated with a new element
> > +  rte_eventdev_port_data to support optional callbacks in DPDK 23.11.
> > +  rte_eventdev_port_data is used to hold callbacks registered optionally
> > +  per event device port and associated callback data. By adding rte_eventdev_port_data
> > +  to rte_event_fp_ops, allows to fetch this data for fastpath eventdev inline functions
> > +  in advance. This changes the size of rte_event_fp_ops and result in ABI change.
> > +
> >  * security: Hide structures ``rte_security_ops`` and ``rte_security_ctx``
> >    as these are internal to DPDK library and drivers.
> >  
> 
> +techboard,
> 
> Request for review/ack, patch is to extend eventdev to support callbacks
> per packet.


It does not look necessary to announce adding new fields.
The ABI compatibility breakage should be covered by this patch:
https://patches.dpdk.org/project/dpdk/patch/20230728152052.1204486-1-thomas@monjalon.net/

Marking as superseded.



^ permalink raw reply	[relevance 3%]

* Re: [PATCH] doc: announce ethdev operation struct changes
  2023-07-28 15:33  0%       ` Morten Brørup
@ 2023-07-28 15:37  0%         ` Thomas Monjalon
  2023-07-28 15:55  0%           ` Morten Brørup
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2023-07-28 15:37 UTC (permalink / raw)
  To: Morten Brørup
  Cc: dev, nd, Honnappa.Nagarahalli, Feifei Wang, Ruifeng Wang,
	Feifei Wang, ferruh.yigit, konstantin.ananyev, andrew.rybchenko

28/07/2023 17:33, Morten Brørup:
> > From: Thomas Monjalon [mailto:thomas@monjalon.net]
> > Sent: Friday, 28 July 2023 17.20
> > 
> > 28/07/2023 17:08, Morten Brørup:
> > > > From: Thomas Monjalon [mailto:thomas@monjalon.net]
> > > > Sent: Friday, 28 July 2023 16.57
> > > >
> > > > 04/07/2023 10:10, Feifei Wang:
> > > > > To support mbufs recycle mode, announce the coming ABI changes
> > > > > from DPDK 23.11.
> > > > >
> > > > > Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
> > > > > Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
> > > > > ---
> > > > >  doc/guides/rel_notes/deprecation.rst | 4 ++++
> > > > >  1 file changed, 4 insertions(+)
> > > > >
> > > > > diff --git a/doc/guides/rel_notes/deprecation.rst
> > > > b/doc/guides/rel_notes/deprecation.rst
> > > > > index 66431789b0..c7e1ffafb2 100644
> > > > > --- a/doc/guides/rel_notes/deprecation.rst
> > > > > +++ b/doc/guides/rel_notes/deprecation.rst
> > > > > @@ -118,6 +118,10 @@ Deprecation Notices
> > > > >    The legacy actions should be removed
> > > > >    once ``MODIFY_FIELD`` alternative is implemented in drivers.
> > > > >
> > > > > +* ethdev: The Ethernet device data structure ``struct rte_eth_dev`` and
> > > > > +  the fast-path ethdev flat array ``struct rte_eth_fp_ops`` will be
> > updated
> > > > > +  with new fields to support mbufs recycle mode from DPDK 23.11.
> > >
> > > Existing fields will also be moved around [1]:
> > >
> > > @@ -83,15 +90,17 @@  struct rte_eth_fp_ops {
> > >  	 * Rx fast-path functions and related data.
> > >  	 * 64-bit systems: occupies first 64B line
> > >  	 */
> > > +	/** Rx queues data. */
> > > +	struct rte_ethdev_qdata rxq;
> > >  	/** PMD receive function. */
> > >  	eth_rx_burst_t rx_pkt_burst;
> > >  	/** Get the number of used Rx descriptors. */
> > >  	eth_rx_queue_count_t rx_queue_count;
> > >  	/** Check the status of a Rx descriptor. */
> > >  	eth_rx_descriptor_status_t rx_descriptor_status;
> > > -	/** Rx queues data. */
> > > -	struct rte_ethdev_qdata rxq;
> > > -	uintptr_t reserved1[3];
> > > +	/** Refill Rx descriptors with the recycling mbufs. */
> > > +	eth_recycle_rx_descriptors_refill_t recycle_rx_descriptors_refill;
> > > +	uintptr_t reserved1[2];
> > >  	/**@}*/
> > >
> > >  	/**@{*/
> > > @@ -99,15 +108,17 @@  struct rte_eth_fp_ops {
> > >  	 * Tx fast-path functions and related data.
> > >  	 * 64-bit systems: occupies second 64B line
> > >  	 */
> > > +	/** Tx queues data. */
> > > +	struct rte_ethdev_qdata txq;
> > >  	/** PMD transmit function. */
> > >  	eth_tx_burst_t tx_pkt_burst;
> > >  	/** PMD transmit prepare function. */
> > >  	eth_tx_prep_t tx_pkt_prepare;
> > >  	/** Check the status of a Tx descriptor. */
> > >  	eth_tx_descriptor_status_t tx_descriptor_status;
> > > -	/** Tx queues data. */
> > > -	struct rte_ethdev_qdata txq;
> > > -	uintptr_t reserved2[3];
> > > +	/** Copy used mbufs from Tx mbuf ring into Rx. */
> > > +	eth_recycle_tx_mbufs_reuse_t recycle_tx_mbufs_reuse;
> > > +	uintptr_t reserved2[2];
> > >  	/**@}*/
> > 
> > Removing existing fields should be announced explicitly.
> 
> Agreed. And the patch misses this. The "rxq" and "txq" fields are not being removed, they are being moved up in the structures. Your comment about explicit mentioning still applies!
> 
> If there's no time to wait for a new patch version from Feifei, perhaps you improve the description while merging.

If it's only moving fields, we can skip.
The real change is the size of the reserved fields,
so it looks acceptable without notice.



^ permalink raw reply	[relevance 0%]

* RE: [PATCH] doc: announce ethdev operation struct changes
  2023-07-28 15:20  0%     ` Thomas Monjalon
@ 2023-07-28 15:33  0%       ` Morten Brørup
  2023-07-28 15:37  0%         ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Morten Brørup @ 2023-07-28 15:33 UTC (permalink / raw)
  To: Thomas Monjalon
  Cc: dev, nd, Honnappa.Nagarahalli, Feifei Wang, Ruifeng Wang,
	Feifei Wang, ferruh.yigit, konstantin.ananyev, andrew.rybchenko

> From: Thomas Monjalon [mailto:thomas@monjalon.net]
> Sent: Friday, 28 July 2023 17.20
> 
> 28/07/2023 17:08, Morten Brørup:
> > > From: Thomas Monjalon [mailto:thomas@monjalon.net]
> > > Sent: Friday, 28 July 2023 16.57
> > >
> > > 04/07/2023 10:10, Feifei Wang:
> > > > To support mbufs recycle mode, announce the coming ABI changes
> > > > from DPDK 23.11.
> > > >
> > > > Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
> > > > Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
> > > > ---
> > > >  doc/guides/rel_notes/deprecation.rst | 4 ++++
> > > >  1 file changed, 4 insertions(+)
> > > >
> > > > diff --git a/doc/guides/rel_notes/deprecation.rst
> > > b/doc/guides/rel_notes/deprecation.rst
> > > > index 66431789b0..c7e1ffafb2 100644
> > > > --- a/doc/guides/rel_notes/deprecation.rst
> > > > +++ b/doc/guides/rel_notes/deprecation.rst
> > > > @@ -118,6 +118,10 @@ Deprecation Notices
> > > >    The legacy actions should be removed
> > > >    once ``MODIFY_FIELD`` alternative is implemented in drivers.
> > > >
> > > > +* ethdev: The Ethernet device data structure ``struct rte_eth_dev`` and
> > > > +  the fast-path ethdev flat array ``struct rte_eth_fp_ops`` will be
> updated
> > > > +  with new fields to support mbufs recycle mode from DPDK 23.11.
> >
> > Existing fields will also be moved around [1]:
> >
> > @@ -83,15 +90,17 @@  struct rte_eth_fp_ops {
> >  	 * Rx fast-path functions and related data.
> >  	 * 64-bit systems: occupies first 64B line
> >  	 */
> > +	/** Rx queues data. */
> > +	struct rte_ethdev_qdata rxq;
> >  	/** PMD receive function. */
> >  	eth_rx_burst_t rx_pkt_burst;
> >  	/** Get the number of used Rx descriptors. */
> >  	eth_rx_queue_count_t rx_queue_count;
> >  	/** Check the status of a Rx descriptor. */
> >  	eth_rx_descriptor_status_t rx_descriptor_status;
> > -	/** Rx queues data. */
> > -	struct rte_ethdev_qdata rxq;
> > -	uintptr_t reserved1[3];
> > +	/** Refill Rx descriptors with the recycling mbufs. */
> > +	eth_recycle_rx_descriptors_refill_t recycle_rx_descriptors_refill;
> > +	uintptr_t reserved1[2];
> >  	/**@}*/
> >
> >  	/**@{*/
> > @@ -99,15 +108,17 @@  struct rte_eth_fp_ops {
> >  	 * Tx fast-path functions and related data.
> >  	 * 64-bit systems: occupies second 64B line
> >  	 */
> > +	/** Tx queues data. */
> > +	struct rte_ethdev_qdata txq;
> >  	/** PMD transmit function. */
> >  	eth_tx_burst_t tx_pkt_burst;
> >  	/** PMD transmit prepare function. */
> >  	eth_tx_prep_t tx_pkt_prepare;
> >  	/** Check the status of a Tx descriptor. */
> >  	eth_tx_descriptor_status_t tx_descriptor_status;
> > -	/** Tx queues data. */
> > -	struct rte_ethdev_qdata txq;
> > -	uintptr_t reserved2[3];
> > +	/** Copy used mbufs from Tx mbuf ring into Rx. */
> > +	eth_recycle_tx_mbufs_reuse_t recycle_tx_mbufs_reuse;
> > +	uintptr_t reserved2[2];
> >  	/**@}*/
> 
> Removing existing fields should be announced explicitly.

Agreed. And the patch misses this. The "rxq" and "txq" fields are not being removed, they are being moved up in the structures. Your comment about explicit mentioning still applies!

If there's no time to wait for a new patch version from Feifei, perhaps you improve the description while merging.


^ permalink raw reply	[relevance 0%]

* RE: [PATCH v2] doc: announce new major ABI version
  2023-07-28 15:18 27% ` [PATCH v2] " Thomas Monjalon
  2023-07-28 15:23  4%   ` Bruce Richardson
@ 2023-07-28 15:25  4%   ` Morten Brørup
  1 sibling, 0 replies; 200+ results
From: Morten Brørup @ 2023-07-28 15:25 UTC (permalink / raw)
  To: Thomas Monjalon, dev

> From: Thomas Monjalon [mailto:thomas@monjalon.net]
> Sent: Friday, 28 July 2023 17.19
> 
> The next DPDK release 23.11 won't keep ABI compatibility.
> Only the changes impacting the users should be announced in advance.
> 
> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> ---

Acked-by: Morten Brørup <mb@smartsharesystems.com>


^ permalink raw reply	[relevance 4%]

* Re: [PATCH v2] doc: announce new major ABI version
  2023-07-28 15:18 27% ` [PATCH v2] " Thomas Monjalon
@ 2023-07-28 15:23  4%   ` Bruce Richardson
  2023-07-28 16:03  4%     ` Thomas Monjalon
  2023-07-28 15:25  4%   ` Morten Brørup
  1 sibling, 1 reply; 200+ results
From: Bruce Richardson @ 2023-07-28 15:23 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Fri, Jul 28, 2023 at 05:18:40PM +0200, Thomas Monjalon wrote:
> The next DPDK release 23.11 won't keep ABI compatibility.
> Only the changes impacting the users should be announced in advance.
> 
> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> ---
> v2: improve wording (thanks Bruce)
> ---
>  doc/guides/rel_notes/deprecation.rst | 12 +++++++++---
>  1 file changed, 9 insertions(+), 3 deletions(-)
> 
> diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
> index 91ac8f0229..18281d7304 100644
> --- a/doc/guides/rel_notes/deprecation.rst
> +++ b/doc/guides/rel_notes/deprecation.rst
> @@ -4,9 +4,15 @@
>  ABI and API Deprecation
>  =======================
>  
> -See the guidelines document for details of the :doc:`ABI policy
> -<../contributing/abi_policy>`. API and ABI deprecation notices are to be posted
> -here.
> +See the guidelines document for details
> +of the :doc:`ABI policy <../contributing/abi_policy>`.
> +
This has a strange line-break position. It can probably be a single line.

> +With DPDK 23.11, there will be a new major ABI version: 24.
> +This means that during the development of 23.11,
> +new items may be added to structs or enums,
> +even if those additions involve an ABI compatibility breakage.
> +
> +Other API and ABI deprecation notices are to be posted below.
>  

Acked-by: Bruce Richardson <bruce.richardson@intel.com>

^ permalink raw reply	[relevance 4%]

* [PATCH v2] doc: announce new major ABI version
  2023-07-28 14:29 27% [PATCH] doc: announce new major ABI version Thomas Monjalon
@ 2023-07-28 15:18 27% ` Thomas Monjalon
  2023-07-28 15:23  4%   ` Bruce Richardson
  2023-07-28 15:25  4%   ` Morten Brørup
  0 siblings, 2 replies; 200+ results
From: Thomas Monjalon @ 2023-07-28 15:18 UTC (permalink / raw)
  To: dev

The next DPDK release 23.11 won't keep ABI compatibility.
Only the changes impacting the users should be announced in advance.

Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
---
v2: improve wording (thanks Bruce)
---
 doc/guides/rel_notes/deprecation.rst | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 91ac8f0229..18281d7304 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -4,9 +4,15 @@
 ABI and API Deprecation
 =======================
 
-See the guidelines document for details of the :doc:`ABI policy
-<../contributing/abi_policy>`. API and ABI deprecation notices are to be posted
-here.
+See the guidelines document for details
+of the :doc:`ABI policy <../contributing/abi_policy>`.
+
+With DPDK 23.11, there will be a new major ABI version: 24.
+This means that during the development of 23.11,
+new items may be added to structs or enums,
+even if those additions involve an ABI compatibility breakage.
+
+Other API and ABI deprecation notices are to be posted below.
 
 Deprecation Notices
 -------------------
-- 
2.41.0


^ permalink raw reply	[relevance 27%]

* Re: [PATCH] doc: announce ethdev operation struct changes
  2023-07-28 15:08  0%   ` Morten Brørup
@ 2023-07-28 15:20  0%     ` Thomas Monjalon
  2023-07-28 15:33  0%       ` Morten Brørup
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2023-07-28 15:20 UTC (permalink / raw)
  To: Morten Brørup
  Cc: dev, nd, Honnappa.Nagarahalli, Feifei Wang, Ruifeng Wang,
	Feifei Wang, ferruh.yigit, konstantin.ananyev, andrew.rybchenko

28/07/2023 17:08, Morten Brørup:
> > From: Thomas Monjalon [mailto:thomas@monjalon.net]
> > Sent: Friday, 28 July 2023 16.57
> > 
> > 04/07/2023 10:10, Feifei Wang:
> > > To support mbufs recycle mode, announce the coming ABI changes
> > > from DPDK 23.11.
> > >
> > > Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
> > > Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
> > > ---
> > >  doc/guides/rel_notes/deprecation.rst | 4 ++++
> > >  1 file changed, 4 insertions(+)
> > >
> > > diff --git a/doc/guides/rel_notes/deprecation.rst
> > b/doc/guides/rel_notes/deprecation.rst
> > > index 66431789b0..c7e1ffafb2 100644
> > > --- a/doc/guides/rel_notes/deprecation.rst
> > > +++ b/doc/guides/rel_notes/deprecation.rst
> > > @@ -118,6 +118,10 @@ Deprecation Notices
> > >    The legacy actions should be removed
> > >    once ``MODIFY_FIELD`` alternative is implemented in drivers.
> > >
> > > +* ethdev: The Ethernet device data structure ``struct rte_eth_dev`` and
> > > +  the fast-path ethdev flat array ``struct rte_eth_fp_ops`` will be updated
> > > +  with new fields to support mbufs recycle mode from DPDK 23.11.
> 
> Existing fields will also be moved around [1]:
> 
> @@ -83,15 +90,17 @@  struct rte_eth_fp_ops {
>  	 * Rx fast-path functions and related data.
>  	 * 64-bit systems: occupies first 64B line
>  	 */
> +	/** Rx queues data. */
> +	struct rte_ethdev_qdata rxq;
>  	/** PMD receive function. */
>  	eth_rx_burst_t rx_pkt_burst;
>  	/** Get the number of used Rx descriptors. */
>  	eth_rx_queue_count_t rx_queue_count;
>  	/** Check the status of a Rx descriptor. */
>  	eth_rx_descriptor_status_t rx_descriptor_status;
> -	/** Rx queues data. */
> -	struct rte_ethdev_qdata rxq;
> -	uintptr_t reserved1[3];
> +	/** Refill Rx descriptors with the recycling mbufs. */
> +	eth_recycle_rx_descriptors_refill_t recycle_rx_descriptors_refill;
> +	uintptr_t reserved1[2];
>  	/**@}*/
>  
>  	/**@{*/
> @@ -99,15 +108,17 @@  struct rte_eth_fp_ops {
>  	 * Tx fast-path functions and related data.
>  	 * 64-bit systems: occupies second 64B line
>  	 */
> +	/** Tx queues data. */
> +	struct rte_ethdev_qdata txq;
>  	/** PMD transmit function. */
>  	eth_tx_burst_t tx_pkt_burst;
>  	/** PMD transmit prepare function. */
>  	eth_tx_prep_t tx_pkt_prepare;
>  	/** Check the status of a Tx descriptor. */
>  	eth_tx_descriptor_status_t tx_descriptor_status;
> -	/** Tx queues data. */
> -	struct rte_ethdev_qdata txq;
> -	uintptr_t reserved2[3];
> +	/** Copy used mbufs from Tx mbuf ring into Rx. */
> +	eth_recycle_tx_mbufs_reuse_t recycle_tx_mbufs_reuse;
> +	uintptr_t reserved2[2];
>  	/**@}*/

Removing existing fields should be announced explicitly.



^ permalink raw reply	[relevance 0%]

* Re: [PATCH v2] doc: announce changes to event device structures
  @ 2023-07-28 15:14  3%     ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2023-07-28 15:14 UTC (permalink / raw)
  To: pbhagavatula
  Cc: dev, jerinj, jay.jayatheerthan, erik.g.carrillo,
	abhinandan.gujjar, timothy.mcdaniel, sthotton, hemant.agrawal,
	nipun.gupta, harry.van.haaren, mattias.ronnblom, liangma,
	peter.mccarthy, Jerin Jacob

27/07/2023 11:01, Jerin Jacob:
> On Wed, Jul 26, 2023 at 9:25 PM <pbhagavatula@marvell.com> wrote:
> >
> > From: Pavan Nikhilesh <pbhagavatula@marvell.com>
> >
> > The structures ``rte_event_dev_info``, ``rte_event_fp_ops`` will be
> > modified to add new elements to support link profiles.
> > A new field ``max_profiles_per_port`` will be added to
> > ``rte_event_dev_info`` and ``switch_profile`` will be added to
> > ``rte_event_fp_ops``.
> >
> > A profile is a unique identifier for a set of event queues linked to
> > an event port. The unique identifier spans from 0 to the value
> > advertised in ``rte_event_dev_info.max_profiles_per_port`` - 1.
> >
> > Two new experimental APIs will be added, one to associate a set of
> > event queues with a profile which can be linked to an event port and
> > another to switch the profile which would affect the next dequeue call.
> >
> > Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
> 
> > +
> > +* eventdev: The structures ``rte_event_dev_info``, ``rte_event_fp_ops`` will be
> > +  modified to add new elements to support link profiles.A new field
> > +  ``max_profiles_per_port`` will be added to ``rte_event_dev_info`` and
> > +  ``switch_profile`` will be added to ``rte_event_fp_ops``.
> 
> There are other  deprecation notices to update rte_event_fp_ops.
> Exact  fields  in rte_event_dev_info be decided later along with patch.
> With that
> 
> Acked-by: Jerin Jacob <jerinj@marvell.com>

Actually it does not look necessary to announce adding new fields.
The ABI compatibility breakage should be covered by this patch:
https://patches.dpdk.org/project/dpdk/patch/20230728142946.1201459-1-thomas@monjalon.net/

Marking as superseded.



^ permalink raw reply	[relevance 3%]

* RE: [PATCH] doc: announce ethdev operation struct changes
  2023-07-28 14:56  3% ` Thomas Monjalon
  2023-07-28 15:04  0%   ` Thomas Monjalon
@ 2023-07-28 15:08  0%   ` Morten Brørup
  2023-07-28 15:20  0%     ` Thomas Monjalon
  1 sibling, 1 reply; 200+ results
From: Morten Brørup @ 2023-07-28 15:08 UTC (permalink / raw)
  To: Thomas Monjalon, dev
  Cc: nd, Honnappa.Nagarahalli, Feifei Wang, Ruifeng Wang, Feifei Wang,
	ferruh.yigit, konstantin.ananyev, andrew.rybchenko

> From: Thomas Monjalon [mailto:thomas@monjalon.net]
> Sent: Friday, 28 July 2023 16.57
> 
> 04/07/2023 10:10, Feifei Wang:
> > To support mbufs recycle mode, announce the coming ABI changes
> > from DPDK 23.11.
> >
> > Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
> > Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
> > ---
> >  doc/guides/rel_notes/deprecation.rst | 4 ++++
> >  1 file changed, 4 insertions(+)
> >
> > diff --git a/doc/guides/rel_notes/deprecation.rst
> b/doc/guides/rel_notes/deprecation.rst
> > index 66431789b0..c7e1ffafb2 100644
> > --- a/doc/guides/rel_notes/deprecation.rst
> > +++ b/doc/guides/rel_notes/deprecation.rst
> > @@ -118,6 +118,10 @@ Deprecation Notices
> >    The legacy actions should be removed
> >    once ``MODIFY_FIELD`` alternative is implemented in drivers.
> >
> > +* ethdev: The Ethernet device data structure ``struct rte_eth_dev`` and
> > +  the fast-path ethdev flat array ``struct rte_eth_fp_ops`` will be updated
> > +  with new fields to support mbufs recycle mode from DPDK 23.11.

Existing fields will also be moved around [1]:

@@ -83,15 +90,17 @@  struct rte_eth_fp_ops {
 	 * Rx fast-path functions and related data.
 	 * 64-bit systems: occupies first 64B line
 	 */
+	/** Rx queues data. */
+	struct rte_ethdev_qdata rxq;
 	/** PMD receive function. */
 	eth_rx_burst_t rx_pkt_burst;
 	/** Get the number of used Rx descriptors. */
 	eth_rx_queue_count_t rx_queue_count;
 	/** Check the status of a Rx descriptor. */
 	eth_rx_descriptor_status_t rx_descriptor_status;
-	/** Rx queues data. */
-	struct rte_ethdev_qdata rxq;
-	uintptr_t reserved1[3];
+	/** Refill Rx descriptors with the recycling mbufs. */
+	eth_recycle_rx_descriptors_refill_t recycle_rx_descriptors_refill;
+	uintptr_t reserved1[2];
 	/**@}*/
 
 	/**@{*/
@@ -99,15 +108,17 @@  struct rte_eth_fp_ops {
 	 * Tx fast-path functions and related data.
 	 * 64-bit systems: occupies second 64B line
 	 */
+	/** Tx queues data. */
+	struct rte_ethdev_qdata txq;
 	/** PMD transmit function. */
 	eth_tx_burst_t tx_pkt_burst;
 	/** PMD transmit prepare function. */
 	eth_tx_prep_t tx_pkt_prepare;
 	/** Check the status of a Tx descriptor. */
 	eth_tx_descriptor_status_t tx_descriptor_status;
-	/** Tx queues data. */
-	struct rte_ethdev_qdata txq;
-	uintptr_t reserved2[3];
+	/** Copy used mbufs from Tx mbuf ring into Rx. */
+	eth_recycle_tx_mbufs_reuse_t recycle_tx_mbufs_reuse;
+	uintptr_t reserved2[2];
 	/**@}*/

[1]: https://patchwork.dpdk.org/project/dpdk/patch/20230706095004.1848199-2-feifei.wang2@arm.com/

> 
> It does seem to be an impacting change for existing applications,
> except that it is allowed only during ABI breakage window.
> 
> I think my patch should be enough:
> https://patches.dpdk.org/project/dpdk/patch/20230728142946.1201459-1-
> thomas@monjalon.net/
> 


^ permalink raw reply	[relevance 0%]

* Re: [PATCH] doc: deprecation notice to add RSS hash algorithm field
  2023-06-06 16:35  3%     ` Stephen Hemminger
@ 2023-07-28 15:06  0%       ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2023-07-28 15:06 UTC (permalink / raw)
  To: Ferruh Yigit, Stephen Hemminger; +Cc: dev, Dongdong Liu

06/06/2023 18:35, Stephen Hemminger:
> On Tue, 6 Jun 2023 16:50:53 +0100
> Ferruh Yigit <ferruh.yigit@amd.com> wrote:
> 
> > On 6/6/2023 4:39 PM, Stephen Hemminger wrote:
> > > On Tue, 6 Jun 2023 20:11:26 +0800
> > > Dongdong Liu <liudongdong3@huawei.com> wrote:
> > >   
> > >> Deprecation notice to add "func" field to ``rte_eth_rss_conf``
> > >> structure for RSS hash algorithm.
> > >>
> > >> Signed-off-by: Dongdong Liu <liudongdong3@huawei.com>
> > >> ---  
> > > 
> > > New fields do not require deprecation notice.
> > > Since this seems to be a repeated issue, perhaps someone should
> > > add this to the documentation.

I've just sent such a patch:
https://patches.dpdk.org/project/dpdk/patch/20230728142946.1201459-1-thomas@monjalon.net/


> > Hi Stephen,
> > 
> > This is follow up to an existing patchset:
> > https://patches.dpdk.org/project/dpdk/list/?series=27400&state=*
> > 
> > Although field is addition to the "struct rte_eth_rss_conf" struct, it
> > is embedded into "struct rte_eth_conf" which is parameter to an API, so
> > change cause size increase in outer struct and causes ABI breakage,
> > requiring deprecation notice.
> 
> It will change ABI so will have to wait for 23.11.
> But the purpose of deprecation notice is more about telling users that API
> will change.
> 
> The automated tools may give false complaint. Ok to add to deprecation,
> but really not necessary.


This deprecation notice is marked as superseded,
given my patch above should be enough.



^ permalink raw reply	[relevance 0%]

* Re: [PATCH] doc: announce ethdev operation struct changes
  2023-07-28 14:56  3% ` Thomas Monjalon
@ 2023-07-28 15:04  0%   ` Thomas Monjalon
  2023-07-28 15:08  0%   ` Morten Brørup
  1 sibling, 0 replies; 200+ results
From: Thomas Monjalon @ 2023-07-28 15:04 UTC (permalink / raw)
  To: dev
  Cc: nd, Honnappa.Nagarahalli, Feifei Wang, Ruifeng Wang, Feifei Wang,
	ferruh.yigit, konstantin.ananyev, Morten Brørup,
	andrew.rybchenko

28/07/2023 16:56, Thomas Monjalon:
> 04/07/2023 10:10, Feifei Wang:
> > To support mbufs recycle mode, announce the coming ABI changes
> > from DPDK 23.11.
> > 
> > Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
> > Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
> > ---
> >  doc/guides/rel_notes/deprecation.rst | 4 ++++
> >  1 file changed, 4 insertions(+)
> > 
> > diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
> > index 66431789b0..c7e1ffafb2 100644
> > --- a/doc/guides/rel_notes/deprecation.rst
> > +++ b/doc/guides/rel_notes/deprecation.rst
> > @@ -118,6 +118,10 @@ Deprecation Notices
> >    The legacy actions should be removed
> >    once ``MODIFY_FIELD`` alternative is implemented in drivers.
> >  
> > +* ethdev: The Ethernet device data structure ``struct rte_eth_dev`` and
> > +  the fast-path ethdev flat array ``struct rte_eth_fp_ops`` will be updated
> > +  with new fields to support mbufs recycle mode from DPDK 23.11.
> 
> It does seem to be an impacting change for existing applications,

I meant "It does NOT seem"

> except that it is allowed only during ABI breakage window.
> 
> I think my patch should be enough:
> https://patches.dpdk.org/project/dpdk/patch/20230728142946.1201459-1-thomas@monjalon.net/

This deprecation notice is marked as superseded,
given my patch above should be enough.




^ permalink raw reply	[relevance 0%]

* Re: [PATCH] doc: announce ethdev operation struct changes
  2023-07-04  8:10  3% [PATCH] doc: announce ethdev operation struct changes Feifei Wang
  2023-07-04  8:17  0% ` Feifei Wang
  2023-07-05 11:32  0% ` Konstantin Ananyev
@ 2023-07-28 14:56  3% ` Thomas Monjalon
  2023-07-28 15:04  0%   ` Thomas Monjalon
  2023-07-28 15:08  0%   ` Morten Brørup
  2 siblings, 2 replies; 200+ results
From: Thomas Monjalon @ 2023-07-28 14:56 UTC (permalink / raw)
  To: dev
  Cc: nd, Honnappa.Nagarahalli, Feifei Wang, Ruifeng Wang, Feifei Wang,
	ferruh.yigit, konstantin.ananyev, Morten Brørup,
	andrew.rybchenko

04/07/2023 10:10, Feifei Wang:
> To support mbufs recycle mode, announce the coming ABI changes
> from DPDK 23.11.
> 
> Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
> Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
> ---
>  doc/guides/rel_notes/deprecation.rst | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
> index 66431789b0..c7e1ffafb2 100644
> --- a/doc/guides/rel_notes/deprecation.rst
> +++ b/doc/guides/rel_notes/deprecation.rst
> @@ -118,6 +118,10 @@ Deprecation Notices
>    The legacy actions should be removed
>    once ``MODIFY_FIELD`` alternative is implemented in drivers.
>  
> +* ethdev: The Ethernet device data structure ``struct rte_eth_dev`` and
> +  the fast-path ethdev flat array ``struct rte_eth_fp_ops`` will be updated
> +  with new fields to support mbufs recycle mode from DPDK 23.11.

It does seem to be an impacting change for existing applications,
except that it is allowed only during ABI breakage window.

I think my patch should be enough:
https://patches.dpdk.org/project/dpdk/patch/20230728142946.1201459-1-thomas@monjalon.net/



^ permalink raw reply	[relevance 3%]

* [PATCH] doc: announce new major ABI version
@ 2023-07-28 14:29 27% Thomas Monjalon
  2023-07-28 15:18 27% ` [PATCH v2] " Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2023-07-28 14:29 UTC (permalink / raw)
  To: dev

The next DPDK release 23.11 won't keep ABI compatibility.
Only the changes impacting the users should be announced in advance.

Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
---
 doc/guides/rel_notes/deprecation.rst | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 91ac8f0229..55e4b2253e 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -4,9 +4,14 @@
 ABI and API Deprecation
 =======================
 
-See the guidelines document for details of the :doc:`ABI policy
-<../contributing/abi_policy>`. API and ABI deprecation notices are to be posted
-here.
+See the guidelines document for details
+of the :doc:`ABI policy <../contributing/abi_policy>`.
+
+With DPDK 23.11, there will be a new major ABI version: 24.
+It means that during the development of 23.11, it will be allowed
+to add new items in a struct or enum involving ABI compatibility breakage.
+
+Other API and ABI deprecation notices are to be posted here.
 
 Deprecation Notices
 -------------------
-- 
2.41.0


^ permalink raw reply	[relevance 27%]

* Re: [PATCH] doc: announce deprecation of RTE_CPUFLAG_NUMFLAGS
  2023-07-25 16:45  0%       ` Hemant Agrawal
@ 2023-07-28 10:11  0%         ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2023-07-28 10:11 UTC (permalink / raw)
  To: Sivaprasad Tummala
  Cc: Jerin Jacob, Tyler Retzlaff, dev, Ferruh Yigit, bruce.richardson,
	david.marchand, Hemant Agrawal

> > > > > To allow new cpu features to be added without ABI breakage,
> > > > > RTE_CPUFLAG_NUMFLAGS will be removed in DPDK 23.11 release.
> > > > >
> > > > > Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
> > > >
> > > > +techboard,
> > > >
> > > > Request for review/ack, patch is to remove ABI restriction to add
> > > > new CPU flags.
> > >
> > > Acked-by: Tyler Retzlaff <roretzla@linux.microsoft.com>
> > 
> > Acked-by: Jerin Jacob <jerinj@marvell.com>
> Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>

Applied, thanks.




^ permalink raw reply	[relevance 0%]

* Re: [PATCH v2] doc: announce single-event enqueue/dequeue ABI change
  2023-07-05 13:00  4%   ` Jerin Jacob
  2023-07-05 13:02  4%     ` [EXT] " Pavan Nikhilesh Bhagavatula
@ 2023-07-26 12:04  4%     ` Jerin Jacob
  1 sibling, 0 replies; 200+ results
From: Jerin Jacob @ 2023-07-26 12:04 UTC (permalink / raw)
  To: Mattias Rönnblom
  Cc: jerinj, Thomas Monjalon, hofors, dev, Pavan Nikhilesh,
	Timothy McDaniel, Hemant Agrawal, Sachin Saxena,
	Harry van Haaren, Liang Ma, Peter Mccarthy, techboard

On Wed, Jul 5, 2023 at 6:30 PM Jerin Jacob <jerinjacobk@gmail.com> wrote:
>
> On Wed, Jul 5, 2023 at 4:48 PM Mattias Rönnblom
> <mattias.ronnblom@ericsson.com> wrote:
> >
> > Announce the removal of the single-event enqueue and dequeue
> > operations from the eventdev ABI.
> >
> > Signed-off-by: Mattias Rönnblom <mattias.ronnblom@ericsson.com>
>
> Acked-by: Jerin Jacob <jerinj@marvell.com>

+ Techboard for review

>
>
> >
> > ---
> > PATCH v2: Fix commit subject prefix.
> > ---
> >  doc/guides/rel_notes/deprecation.rst | 8 ++++++++
> >  1 file changed, 8 insertions(+)
> >
> > diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
> > index 66431789b0..ca192d838d 100644
> > --- a/doc/guides/rel_notes/deprecation.rst
> > +++ b/doc/guides/rel_notes/deprecation.rst
> > @@ -153,3 +153,11 @@ Deprecation Notices
> >    The new port library API (functions rte_swx_port_*)
> >    will gradually transition from experimental to stable status
> >    starting with DPDK 23.07 release.
> > +
> > +* eventdev: The single-event (non-burst) enqueue and dequeue
> > +  operations, used by static inline burst enqueue and dequeue
> > +  functions in <rte_eventdev.h>, will be removed in DPDK 23.11. This
> > +  simplification includes changing the layout and potentially also the
> > +  size of the public rte_event_fp_ops struct, breaking the ABI. Since
> > +  these functions are not called directly by the application, the API
> > +  remains unaffected.
> > --
> > 2.34.1
> >

^ permalink raw reply	[relevance 4%]

* RE: [PATCH v1] doc: deprecation notice to add callback data to rte_event_fp_ops
  2023-07-25 16:46  0%     ` Hemant Agrawal
@ 2023-07-25 18:44  0%       ` Pavan Nikhilesh Bhagavatula
  0 siblings, 0 replies; 200+ results
From: Pavan Nikhilesh Bhagavatula @ 2023-07-25 18:44 UTC (permalink / raw)
  To: Hemant Agrawal, Ferruh Yigit, Sivaprasad Tummala, dev
  Cc: bruce.richardson, david.marchand, thomas, jerinjacobk, techboard

> > -----Original Message-----
> > From: Ferruh Yigit <ferruh.yigit@amd.com>
> > Sent: Tuesday, July 25, 2023 2:11 PM
> > To: Sivaprasad Tummala <sivaprasad.tummala@amd.com>; dev@dpdk.org
> > Cc: bruce.richardson@intel.com; david.marchand@redhat.com;
> > thomas@monjalon.net; jerinjacobk@gmail.com; techboard@dpdk.org
> > Subject: Re: [PATCH v1] doc: deprecation notice to add callback data to
> > rte_event_fp_ops
> >
> > On 7/17/2023 12:24 PM, Sivaprasad Tummala wrote:
> > > Deprecation notice to add "rte_eventdev_port_data" field to
> > > ``rte_event_fp_ops`` for callback support.
> > >
> > > Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
> > > ---
> > >  doc/guides/rel_notes/deprecation.rst | 7 +++++++
> > >  1 file changed, 7 insertions(+)
> > >
> > > diff --git a/doc/guides/rel_notes/deprecation.rst
> > > b/doc/guides/rel_notes/deprecation.rst
> > > index fb771a0305..057f97ce5a 100644
> > > --- a/doc/guides/rel_notes/deprecation.rst
> > > +++ b/doc/guides/rel_notes/deprecation.rst
> > > @@ -130,6 +130,13 @@ Deprecation Notices
> > >    ``rte_cryptodev_get_auth_algo_string``,
> > ``rte_cryptodev_get_aead_algo_string`` and
> > >    ``rte_cryptodev_asym_get_xform_string`` respectively.
> > >
> > > +* eventdev: The struct rte_event_fp_ops will be updated with a new
> > > +element
> > > +  rte_eventdev_port_data to support optional callbacks in DPDK 23.11.
> > > +  rte_eventdev_port_data is used to hold callbacks registered
> > > +optionally
> > > +  per event device port and associated callback data. By adding
> > > +rte_eventdev_port_data
> > > +  to rte_event_fp_ops, allows to fetch this data for fastpath
> > > +eventdev inline functions
> > > +  in advance. This changes the size of rte_event_fp_ops and result in ABI
> > change.
> > > +
> > >  * security: Hide structures ``rte_security_ops`` and ``rte_security_ctx``
> > >    as these are internal to DPDK library and drivers.
> > >
> >
> > +techboard,
> >
> > Request for review/ack, patch is to extend eventdev to support callbacks
> per
> > packet.
> Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>

Acked-by: Pavan Nikhilesh <pbhagavatula@marvell.com>


^ permalink raw reply	[relevance 0%]

* RE: [PATCH v1] doc: deprecation notice to add callback data to rte_event_fp_ops
  2023-07-25  8:40  0%   ` Ferruh Yigit
@ 2023-07-25 16:46  0%     ` Hemant Agrawal
  2023-07-25 18:44  0%       ` Pavan Nikhilesh Bhagavatula
  2023-07-28 15:42  3%     ` Thomas Monjalon
  1 sibling, 1 reply; 200+ results
From: Hemant Agrawal @ 2023-07-25 16:46 UTC (permalink / raw)
  To: Ferruh Yigit, Sivaprasad Tummala, dev
  Cc: bruce.richardson, david.marchand, thomas, jerinjacobk, techboard

> -----Original Message-----
> From: Ferruh Yigit <ferruh.yigit@amd.com>
> Sent: Tuesday, July 25, 2023 2:11 PM
> To: Sivaprasad Tummala <sivaprasad.tummala@amd.com>; dev@dpdk.org
> Cc: bruce.richardson@intel.com; david.marchand@redhat.com;
> thomas@monjalon.net; jerinjacobk@gmail.com; techboard@dpdk.org
> Subject: Re: [PATCH v1] doc: deprecation notice to add callback data to
> rte_event_fp_ops
> 
> On 7/17/2023 12:24 PM, Sivaprasad Tummala wrote:
> > Deprecation notice to add "rte_eventdev_port_data" field to
> > ``rte_event_fp_ops`` for callback support.
> >
> > Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
> > ---
> >  doc/guides/rel_notes/deprecation.rst | 7 +++++++
> >  1 file changed, 7 insertions(+)
> >
> > diff --git a/doc/guides/rel_notes/deprecation.rst
> > b/doc/guides/rel_notes/deprecation.rst
> > index fb771a0305..057f97ce5a 100644
> > --- a/doc/guides/rel_notes/deprecation.rst
> > +++ b/doc/guides/rel_notes/deprecation.rst
> > @@ -130,6 +130,13 @@ Deprecation Notices
> >    ``rte_cryptodev_get_auth_algo_string``,
> ``rte_cryptodev_get_aead_algo_string`` and
> >    ``rte_cryptodev_asym_get_xform_string`` respectively.
> >
> > +* eventdev: The struct rte_event_fp_ops will be updated with a new
> > +element
> > +  rte_eventdev_port_data to support optional callbacks in DPDK 23.11.
> > +  rte_eventdev_port_data is used to hold callbacks registered
> > +optionally
> > +  per event device port and associated callback data. By adding
> > +rte_eventdev_port_data
> > +  to rte_event_fp_ops, allows to fetch this data for fastpath
> > +eventdev inline functions
> > +  in advance. This changes the size of rte_event_fp_ops and result in ABI
> change.
> > +
> >  * security: Hide structures ``rte_security_ops`` and ``rte_security_ctx``
> >    as these are internal to DPDK library and drivers.
> >
> 
> +techboard,
> 
> Request for review/ack, patch is to extend eventdev to support callbacks per
> packet.
Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>

^ permalink raw reply	[relevance 0%]

* RE: [PATCH] doc: announce deprecation of RTE_CPUFLAG_NUMFLAGS
  2023-07-25 14:24  0%     ` Jerin Jacob
@ 2023-07-25 16:45  0%       ` Hemant Agrawal
  2023-07-28 10:11  0%         ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Hemant Agrawal @ 2023-07-25 16:45 UTC (permalink / raw)
  To: Jerin Jacob, Tyler Retzlaff
  Cc: Ferruh Yigit, Sivaprasad Tummala, dev, bruce.richardson,
	david.marchand, thomas, techboard



> -----Original Message-----
> 
> On Tue, Jul 25, 2023 at 7:48 PM Tyler Retzlaff <roretzla@linux.microsoft.com>
> wrote:
> >
> > On Tue, Jul 25, 2023 at 09:39:15AM +0100, Ferruh Yigit wrote:
> > > On 7/12/2023 11:18 AM, Sivaprasad Tummala wrote:
> > > > To allow new cpu features to be added without ABI breakage,
> > > > RTE_CPUFLAG_NUMFLAGS will be removed in DPDK 23.11 release.
> > > >
> > > > Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
> > > > ---
> > > >  doc/guides/rel_notes/deprecation.rst | 3 +++
> > > >  1 file changed, 3 insertions(+)
> > > >
> > > > diff --git a/doc/guides/rel_notes/deprecation.rst
> > > > b/doc/guides/rel_notes/deprecation.rst
> > > > index 8e1cdd677a..92db59d9c2 100644
> > > > --- a/doc/guides/rel_notes/deprecation.rst
> > > > +++ b/doc/guides/rel_notes/deprecation.rst
> > > > @@ -28,6 +28,9 @@ Deprecation Notices
> > > >    the replacement API rte_thread_set_name and
> rte_thread_create_control being
> > > >    marked as stable, and planned to be removed by the 23.11 release.
> > > >
> > > > +* eal: RTE_CPUFLAG_NUMFLAGS will be removed in DPDK 23.11
> > > > +release. This is
> > > > +  to allow new cpu features to be added without ABI breakage.
> > > > +
> > > >  * rte_atomicNN_xxx: These APIs do not take memory order parameter.
> This does
> > > >    not allow for writing optimized code for all the CPU architectures
> supported
> > > >    in DPDK. DPDK has adopted the atomic operations from
> > >
> > > +techboard,
> > >
> > > Request for review/ack, patch is to remove ABI restriction to add
> > > new CPU flags.
> >
> > Acked-by: Tyler Retzlaff <roretzla@linux.microsoft.com>
> 
> Acked-by: Jerin Jacob <jerinj@marvell.com>
Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>

^ permalink raw reply	[relevance 0%]

* Re: [PATCH] doc: announce deprecation of RTE_CPUFLAG_NUMFLAGS
  2023-07-25 14:18  0%   ` Tyler Retzlaff
@ 2023-07-25 14:24  0%     ` Jerin Jacob
  2023-07-25 16:45  0%       ` Hemant Agrawal
  0 siblings, 1 reply; 200+ results
From: Jerin Jacob @ 2023-07-25 14:24 UTC (permalink / raw)
  To: Tyler Retzlaff
  Cc: Ferruh Yigit, Sivaprasad Tummala, dev, bruce.richardson,
	david.marchand, thomas, techboard

On Tue, Jul 25, 2023 at 7:48 PM Tyler Retzlaff
<roretzla@linux.microsoft.com> wrote:
>
> On Tue, Jul 25, 2023 at 09:39:15AM +0100, Ferruh Yigit wrote:
> > On 7/12/2023 11:18 AM, Sivaprasad Tummala wrote:
> > > To allow new cpu features to be added without ABI breakage,
> > > RTE_CPUFLAG_NUMFLAGS will be removed in DPDK 23.11 release.
> > >
> > > Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
> > > ---
> > >  doc/guides/rel_notes/deprecation.rst | 3 +++
> > >  1 file changed, 3 insertions(+)
> > >
> > > diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
> > > index 8e1cdd677a..92db59d9c2 100644
> > > --- a/doc/guides/rel_notes/deprecation.rst
> > > +++ b/doc/guides/rel_notes/deprecation.rst
> > > @@ -28,6 +28,9 @@ Deprecation Notices
> > >    the replacement API rte_thread_set_name and rte_thread_create_control being
> > >    marked as stable, and planned to be removed by the 23.11 release.
> > >
> > > +* eal: RTE_CPUFLAG_NUMFLAGS will be removed in DPDK 23.11 release. This is
> > > +  to allow new cpu features to be added without ABI breakage.
> > > +
> > >  * rte_atomicNN_xxx: These APIs do not take memory order parameter. This does
> > >    not allow for writing optimized code for all the CPU architectures supported
> > >    in DPDK. DPDK has adopted the atomic operations from
> >
> > +techboard,
> >
> > Request for review/ack, patch is to remove ABI restriction to add new
> > CPU flags.
>
> Acked-by: Tyler Retzlaff <roretzla@linux.microsoft.com>

Acked-by: Jerin Jacob <jerinj@marvell.com>

^ permalink raw reply	[relevance 0%]

* Re: [PATCH] doc: announce deprecation of RTE_CPUFLAG_NUMFLAGS
  2023-07-25  8:39  3% ` Ferruh Yigit
                     ` (2 preceding siblings ...)
  2023-07-25  9:36  0%   ` Kevin Traynor
@ 2023-07-25 14:18  0%   ` Tyler Retzlaff
  2023-07-25 14:24  0%     ` Jerin Jacob
  3 siblings, 1 reply; 200+ results
From: Tyler Retzlaff @ 2023-07-25 14:18 UTC (permalink / raw)
  To: Ferruh Yigit
  Cc: Sivaprasad Tummala, dev, bruce.richardson, david.marchand,
	thomas, techboard

On Tue, Jul 25, 2023 at 09:39:15AM +0100, Ferruh Yigit wrote:
> On 7/12/2023 11:18 AM, Sivaprasad Tummala wrote:
> > To allow new cpu features to be added without ABI breakage,
> > RTE_CPUFLAG_NUMFLAGS will be removed in DPDK 23.11 release.
> > 
> > Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
> > ---
> >  doc/guides/rel_notes/deprecation.rst | 3 +++
> >  1 file changed, 3 insertions(+)
> > 
> > diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
> > index 8e1cdd677a..92db59d9c2 100644
> > --- a/doc/guides/rel_notes/deprecation.rst
> > +++ b/doc/guides/rel_notes/deprecation.rst
> > @@ -28,6 +28,9 @@ Deprecation Notices
> >    the replacement API rte_thread_set_name and rte_thread_create_control being
> >    marked as stable, and planned to be removed by the 23.11 release.
> >  
> > +* eal: RTE_CPUFLAG_NUMFLAGS will be removed in DPDK 23.11 release. This is
> > +  to allow new cpu features to be added without ABI breakage.
> > +
> >  * rte_atomicNN_xxx: These APIs do not take memory order parameter. This does
> >    not allow for writing optimized code for all the CPU architectures supported
> >    in DPDK. DPDK has adopted the atomic operations from
> 
> +techboard,
> 
> Request for review/ack, patch is to remove ABI restriction to add new
> CPU flags.

Acked-by: Tyler Retzlaff <roretzla@linux.microsoft.com>

^ permalink raw reply	[relevance 0%]

* Re: [PATCH] doc: announce deprecation of RTE_CPUFLAG_NUMFLAGS
  2023-07-25  8:39  3% ` Ferruh Yigit
  2023-07-25  8:40  0%   ` Bruce Richardson
  2023-07-25  9:24  0%   ` Morten Brørup
@ 2023-07-25  9:36  0%   ` Kevin Traynor
  2023-07-25 14:18  0%   ` Tyler Retzlaff
  3 siblings, 0 replies; 200+ results
From: Kevin Traynor @ 2023-07-25  9:36 UTC (permalink / raw)
  To: Ferruh Yigit, Sivaprasad Tummala, dev
  Cc: bruce.richardson, david.marchand, thomas, techboard

On 25/07/2023 09:39, Ferruh Yigit wrote:
> On 7/12/2023 11:18 AM, Sivaprasad Tummala wrote:
>> To allow new cpu features to be added without ABI breakage,
>> RTE_CPUFLAG_NUMFLAGS will be removed in DPDK 23.11 release.
>>
>> Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
>> ---
>>   doc/guides/rel_notes/deprecation.rst | 3 +++
>>   1 file changed, 3 insertions(+)
>>
>> diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
>> index 8e1cdd677a..92db59d9c2 100644
>> --- a/doc/guides/rel_notes/deprecation.rst
>> +++ b/doc/guides/rel_notes/deprecation.rst
>> @@ -28,6 +28,9 @@ Deprecation Notices
>>     the replacement API rte_thread_set_name and rte_thread_create_control being
>>     marked as stable, and planned to be removed by the 23.11 release.
>>   
>> +* eal: RTE_CPUFLAG_NUMFLAGS will be removed in DPDK 23.11 release. This is
>> +  to allow new cpu features to be added without ABI breakage.
>> +
>>   * rte_atomicNN_xxx: These APIs do not take memory order parameter. This does
>>     not allow for writing optimized code for all the CPU architectures supported
>>     in DPDK. DPDK has adopted the atomic operations from
> 
> +techboard,
> 
> Request for review/ack, patch is to remove ABI restriction to add new
> CPU flags.
> 

Acked-by: Kevin Traynor <ktraynor@redhat.com>



^ permalink raw reply	[relevance 0%]

* RE: [PATCH] doc: announce deprecation of RTE_CPUFLAG_NUMFLAGS
  2023-07-25  8:39  3% ` Ferruh Yigit
  2023-07-25  8:40  0%   ` Bruce Richardson
@ 2023-07-25  9:24  0%   ` Morten Brørup
  2023-07-25  9:36  0%   ` Kevin Traynor
  2023-07-25 14:18  0%   ` Tyler Retzlaff
  3 siblings, 0 replies; 200+ results
From: Morten Brørup @ 2023-07-25  9:24 UTC (permalink / raw)
  To: Ferruh Yigit, Sivaprasad Tummala, dev
  Cc: bruce.richardson, david.marchand, thomas, techboard

> From: Ferruh Yigit [mailto:ferruh.yigit@amd.com]
> Sent: Tuesday, 25 July 2023 10.39
> 
> On 7/12/2023 11:18 AM, Sivaprasad Tummala wrote:
> > To allow new cpu features to be added without ABI breakage,
> > RTE_CPUFLAG_NUMFLAGS will be removed in DPDK 23.11 release.
> >
> > Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
> > ---

Acked-by: Morten Brørup <mb@smartsharesystems.com>


^ permalink raw reply	[relevance 0%]

* Re: [PATCH] doc: announce deprecation of RTE_CPUFLAG_NUMFLAGS
  2023-07-25  8:39  3% ` Ferruh Yigit
@ 2023-07-25  8:40  0%   ` Bruce Richardson
  2023-07-25  9:24  0%   ` Morten Brørup
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 200+ results
From: Bruce Richardson @ 2023-07-25  8:40 UTC (permalink / raw)
  To: Ferruh Yigit; +Cc: Sivaprasad Tummala, dev, david.marchand, thomas, techboard

On Tue, Jul 25, 2023 at 09:39:15AM +0100, Ferruh Yigit wrote:
> On 7/12/2023 11:18 AM, Sivaprasad Tummala wrote:
> > To allow new cpu features to be added without ABI breakage,
> > RTE_CPUFLAG_NUMFLAGS will be removed in DPDK 23.11 release.
> > 
> > Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
> > ---
> >  doc/guides/rel_notes/deprecation.rst | 3 +++
> >  1 file changed, 3 insertions(+)
> > 
> > diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
> > index 8e1cdd677a..92db59d9c2 100644
> > --- a/doc/guides/rel_notes/deprecation.rst
> > +++ b/doc/guides/rel_notes/deprecation.rst
> > @@ -28,6 +28,9 @@ Deprecation Notices
> >    the replacement API rte_thread_set_name and rte_thread_create_control being
> >    marked as stable, and planned to be removed by the 23.11 release.
> >  
> > +* eal: RTE_CPUFLAG_NUMFLAGS will be removed in DPDK 23.11 release. This is
> > +  to allow new cpu features to be added without ABI breakage.
> > +
> >  * rte_atomicNN_xxx: These APIs do not take memory order parameter. This does
> >    not allow for writing optimized code for all the CPU architectures supported
> >    in DPDK. DPDK has adopted the atomic operations from
> 
> +techboard,
> 
> Request for review/ack, patch is to remove ABI restriction to add new
> CPU flags.
Acked-by: Bruce Richardson <bruce.richardson@intel.com>

^ permalink raw reply	[relevance 0%]

* Re: [PATCH v1] doc: deprecation notice to add callback data to rte_event_fp_ops
  2023-07-17 11:24  5% ` [PATCH v1] " Sivaprasad Tummala
  2023-07-17 11:43  0%   ` Jerin Jacob
@ 2023-07-25  8:40  0%   ` Ferruh Yigit
  2023-07-25 16:46  0%     ` Hemant Agrawal
  2023-07-28 15:42  3%     ` Thomas Monjalon
  1 sibling, 2 replies; 200+ results
From: Ferruh Yigit @ 2023-07-25  8:40 UTC (permalink / raw)
  To: Sivaprasad Tummala, dev
  Cc: bruce.richardson, david.marchand, thomas, jerinjacobk, techboard

On 7/17/2023 12:24 PM, Sivaprasad Tummala wrote:
> Deprecation notice to add "rte_eventdev_port_data" field to
> ``rte_event_fp_ops`` for callback support.
> 
> Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
> ---
>  doc/guides/rel_notes/deprecation.rst | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
> index fb771a0305..057f97ce5a 100644
> --- a/doc/guides/rel_notes/deprecation.rst
> +++ b/doc/guides/rel_notes/deprecation.rst
> @@ -130,6 +130,13 @@ Deprecation Notices
>    ``rte_cryptodev_get_auth_algo_string``, ``rte_cryptodev_get_aead_algo_string`` and
>    ``rte_cryptodev_asym_get_xform_string`` respectively.
>  
> +* eventdev: The struct rte_event_fp_ops will be updated with a new element
> +  rte_eventdev_port_data to support optional callbacks in DPDK 23.11.
> +  rte_eventdev_port_data is used to hold callbacks registered optionally
> +  per event device port and associated callback data. By adding rte_eventdev_port_data
> +  to rte_event_fp_ops, allows to fetch this data for fastpath eventdev inline functions
> +  in advance. This changes the size of rte_event_fp_ops and result in ABI change.
> +
>  * security: Hide structures ``rte_security_ops`` and ``rte_security_ctx``
>    as these are internal to DPDK library and drivers.
>  

+techboard,

Request for review/ack, patch is to extend eventdev to support callbacks
per packet.

^ permalink raw reply	[relevance 0%]

* Re: [PATCH] doc: announce deprecation of RTE_CPUFLAG_NUMFLAGS
  2023-07-12 10:18  8% [PATCH] doc: announce deprecation of RTE_CPUFLAG_NUMFLAGS Sivaprasad Tummala
  2023-07-12 10:21  0% ` Ferruh Yigit
@ 2023-07-25  8:39  3% ` Ferruh Yigit
  2023-07-25  8:40  0%   ` Bruce Richardson
                     ` (3 more replies)
  1 sibling, 4 replies; 200+ results
From: Ferruh Yigit @ 2023-07-25  8:39 UTC (permalink / raw)
  To: Sivaprasad Tummala, dev
  Cc: bruce.richardson, david.marchand, thomas, techboard

On 7/12/2023 11:18 AM, Sivaprasad Tummala wrote:
> To allow new cpu features to be added without ABI breakage,
> RTE_CPUFLAG_NUMFLAGS will be removed in DPDK 23.11 release.
> 
> Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
> ---
>  doc/guides/rel_notes/deprecation.rst | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
> index 8e1cdd677a..92db59d9c2 100644
> --- a/doc/guides/rel_notes/deprecation.rst
> +++ b/doc/guides/rel_notes/deprecation.rst
> @@ -28,6 +28,9 @@ Deprecation Notices
>    the replacement API rte_thread_set_name and rte_thread_create_control being
>    marked as stable, and planned to be removed by the 23.11 release.
>  
> +* eal: RTE_CPUFLAG_NUMFLAGS will be removed in DPDK 23.11 release. This is
> +  to allow new cpu features to be added without ABI breakage.
> +
>  * rte_atomicNN_xxx: These APIs do not take memory order parameter. This does
>    not allow for writing optimized code for all the CPU architectures supported
>    in DPDK. DPDK has adopted the atomic operations from

+techboard,

Request for review/ack, patch is to remove ABI restriction to add new
CPU flags.

^ permalink raw reply	[relevance 3%]

* [PATCH v4] tap: fix build of TAP BPF program
  2023-07-16 21:25  1% [RFC] MAINTAINERS: add status information Stephen Hemminger
                   ` (3 preceding siblings ...)
  2023-07-20 23:25  4% ` [PATCH v3] " Stephen Hemminger
@ 2023-07-22 16:32  4% ` Stephen Hemminger
  4 siblings, 0 replies; 200+ results
From: Stephen Hemminger @ 2023-07-22 16:32 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger

Move the BPF program related code into a subdirectory.
And add a Makefile for building it.

The code depends on include files from iproute2.
But these are not public headers which iproute2 exports
as a package API. Therefore make a local copy here.

The standalone build was also broken because by
commit ef5baf3486e0 ("replace packed attributes")
which introduced __rte_packed into this code.

Add a python program to extract the resulting BPF into
a format that can be consumed by the TAP driver.

Update the documentation.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
v4 - update bpf_api.h and bpf_elf.h with SPDK headers from upstream

 doc/guides/nics/tap.rst                     |  11 +-
 drivers/net/tap/bpf/.gitignore              |   1 +
 drivers/net/tap/bpf/Makefile                |  18 ++
 drivers/net/tap/bpf/bpf_api.h               | 275 ++++++++++++++++++++
 drivers/net/tap/bpf/bpf_elf.h               |  53 ++++
 drivers/net/tap/bpf/bpf_extract.py          |  80 ++++++
 drivers/net/tap/{ => bpf}/tap_bpf_program.c |   9 +-
 drivers/net/tap/tap_rss.h                   |   2 +-
 8 files changed, 437 insertions(+), 12 deletions(-)
 create mode 100644 drivers/net/tap/bpf/.gitignore
 create mode 100644 drivers/net/tap/bpf/Makefile
 create mode 100644 drivers/net/tap/bpf/bpf_api.h
 create mode 100644 drivers/net/tap/bpf/bpf_elf.h
 create mode 100644 drivers/net/tap/bpf/bpf_extract.py
 rename drivers/net/tap/{ => bpf}/tap_bpf_program.c (97%)

diff --git a/doc/guides/nics/tap.rst b/doc/guides/nics/tap.rst
index 07df0d35a2ec..449e747994bd 100644
--- a/doc/guides/nics/tap.rst
+++ b/doc/guides/nics/tap.rst
@@ -256,15 +256,12 @@ C functions under different ELF sections.
 
 2. Install ``LLVM`` library and ``clang`` compiler versions 3.7 and above
 
-3. Compile ``tap_bpf_program.c`` via ``LLVM`` into an object file::
+3. Use make to compile  `tap_bpf_program.c`` via ``LLVM`` into an object file
+   and extract the resulting instructions into ``tap_bpf_insn.h``.
 
-    clang -O2 -emit-llvm -c tap_bpf_program.c -o - | llc -march=bpf \
-    -filetype=obj -o <tap_bpf_program.o>
+    cd bpf; make
 
-
-4. Use a tool that receives two parameters: an eBPF object file and a section
-name, and prints out the section as a C array of eBPF instructions.
-Embed the C array in your TAP PMD tree.
+4. Recompile the TAP PMD.
 
 The C arrays are uploaded to the kernel using BPF system calls.
 
diff --git a/drivers/net/tap/bpf/.gitignore b/drivers/net/tap/bpf/.gitignore
new file mode 100644
index 000000000000..30a258f1af3b
--- /dev/null
+++ b/drivers/net/tap/bpf/.gitignore
@@ -0,0 +1 @@
+tap_bpf_program.o
diff --git a/drivers/net/tap/bpf/Makefile b/drivers/net/tap/bpf/Makefile
new file mode 100644
index 000000000000..e5ae4e1f5adc
--- /dev/null
+++ b/drivers/net/tap/bpf/Makefile
@@ -0,0 +1,18 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# This file is not built as part of normal DPDK build.
+# It is used to generate the eBPF code for TAP RSS.
+CLANG=clang
+CLANG_OPTS=-O2
+TARGET=../tap_bpf_insns.h
+
+all: $(TARGET)
+
+clean:
+	rm tap_bpf_program.o $(TARGET)
+
+tap_bpf_program.o: tap_bpf_program.c
+	$(CLANG) $(CLANG_OPTS) -emit-llvm -c $< -o - | \
+	llc -march=bpf -filetype=obj -o $@
+
+$(TARGET): bpf_extract.py tap_bpf_program.o
+	python3 bpf_extract.py tap_bpf_program.o $@
diff --git a/drivers/net/tap/bpf/bpf_api.h b/drivers/net/tap/bpf/bpf_api.h
new file mode 100644
index 000000000000..5887d3a851cf
--- /dev/null
+++ b/drivers/net/tap/bpf/bpf_api.h
@@ -0,0 +1,275 @@
+/* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */
+#ifndef __BPF_API__
+#define __BPF_API__
+
+/* Note:
+ *
+ * This file can be included into eBPF kernel programs. It contains
+ * a couple of useful helper functions, map/section ABI (bpf_elf.h),
+ * misc macros and some eBPF specific LLVM built-ins.
+ */
+
+#include <stdint.h>
+
+#include <linux/pkt_cls.h>
+#include <linux/bpf.h>
+#include <linux/filter.h>
+
+#include <asm/byteorder.h>
+
+#include "bpf_elf.h"
+
+/** libbpf pin type. */
+enum libbpf_pin_type {
+	LIBBPF_PIN_NONE,
+	/* PIN_BY_NAME: pin maps by name (in /sys/fs/bpf by default) */
+	LIBBPF_PIN_BY_NAME,
+};
+
+/** Type helper macros. */
+
+#define __uint(name, val) int (*name)[val]
+#define __type(name, val) typeof(val) *name
+#define __array(name, val) typeof(val) *name[]
+
+/** Misc macros. */
+
+#ifndef __stringify
+# define __stringify(X)		#X
+#endif
+
+#ifndef __maybe_unused
+# define __maybe_unused		__attribute__((__unused__))
+#endif
+
+#ifndef offsetof
+# define offsetof(TYPE, MEMBER)	__builtin_offsetof(TYPE, MEMBER)
+#endif
+
+#ifndef likely
+# define likely(X)		__builtin_expect(!!(X), 1)
+#endif
+
+#ifndef unlikely
+# define unlikely(X)		__builtin_expect(!!(X), 0)
+#endif
+
+#ifndef htons
+# define htons(X)		__constant_htons((X))
+#endif
+
+#ifndef ntohs
+# define ntohs(X)		__constant_ntohs((X))
+#endif
+
+#ifndef htonl
+# define htonl(X)		__constant_htonl((X))
+#endif
+
+#ifndef ntohl
+# define ntohl(X)		__constant_ntohl((X))
+#endif
+
+#ifndef __inline__
+# define __inline__		__attribute__((always_inline))
+#endif
+
+/** Section helper macros. */
+
+#ifndef __section
+# define __section(NAME)						\
+	__attribute__((section(NAME), used))
+#endif
+
+#ifndef __section_tail
+# define __section_tail(ID, KEY)					\
+	__section(__stringify(ID) "/" __stringify(KEY))
+#endif
+
+#ifndef __section_xdp_entry
+# define __section_xdp_entry						\
+	__section(ELF_SECTION_PROG)
+#endif
+
+#ifndef __section_cls_entry
+# define __section_cls_entry						\
+	__section(ELF_SECTION_CLASSIFIER)
+#endif
+
+#ifndef __section_act_entry
+# define __section_act_entry						\
+	__section(ELF_SECTION_ACTION)
+#endif
+
+#ifndef __section_lwt_entry
+# define __section_lwt_entry						\
+	__section(ELF_SECTION_PROG)
+#endif
+
+#ifndef __section_license
+# define __section_license						\
+	__section(ELF_SECTION_LICENSE)
+#endif
+
+#ifndef __section_maps
+# define __section_maps							\
+	__section(ELF_SECTION_MAPS)
+#endif
+
+/** Declaration helper macros. */
+
+#ifndef BPF_LICENSE
+# define BPF_LICENSE(NAME)						\
+	char ____license[] __section_license = NAME
+#endif
+
+/** Classifier helper */
+
+#ifndef BPF_H_DEFAULT
+# define BPF_H_DEFAULT	-1
+#endif
+
+/** BPF helper functions for tc. Individual flags are in linux/bpf.h */
+
+#ifndef __BPF_FUNC
+# define __BPF_FUNC(NAME, ...)						\
+	(* NAME)(__VA_ARGS__) __maybe_unused
+#endif
+
+#ifndef BPF_FUNC
+# define BPF_FUNC(NAME, ...)						\
+	__BPF_FUNC(NAME, __VA_ARGS__) = (void *) BPF_FUNC_##NAME
+#endif
+
+/* Map access/manipulation */
+static void *BPF_FUNC(map_lookup_elem, void *map, const void *key);
+static int BPF_FUNC(map_update_elem, void *map, const void *key,
+		    const void *value, uint32_t flags);
+static int BPF_FUNC(map_delete_elem, void *map, const void *key);
+
+/* Time access */
+static uint64_t BPF_FUNC(ktime_get_ns);
+
+/* Debugging */
+
+/* FIXME: __attribute__ ((format(printf, 1, 3))) not possible unless
+ * llvm bug https://llvm.org/bugs/show_bug.cgi?id=26243 gets resolved.
+ * It would require ____fmt to be made const, which generates a reloc
+ * entry (non-map).
+ */
+static void BPF_FUNC(trace_printk, const char *fmt, int fmt_size, ...);
+
+#ifndef printt
+# define printt(fmt, ...)						\
+	({								\
+		char ____fmt[] = fmt;					\
+		trace_printk(____fmt, sizeof(____fmt), ##__VA_ARGS__);	\
+	})
+#endif
+
+/* Random numbers */
+static uint32_t BPF_FUNC(get_prandom_u32);
+
+/* Tail calls */
+static void BPF_FUNC(tail_call, struct __sk_buff *skb, void *map,
+		     uint32_t index);
+
+/* System helpers */
+static uint32_t BPF_FUNC(get_smp_processor_id);
+static uint32_t BPF_FUNC(get_numa_node_id);
+
+/* Packet misc meta data */
+static uint32_t BPF_FUNC(get_cgroup_classid, struct __sk_buff *skb);
+static int BPF_FUNC(skb_under_cgroup, void *map, uint32_t index);
+
+static uint32_t BPF_FUNC(get_route_realm, struct __sk_buff *skb);
+static uint32_t BPF_FUNC(get_hash_recalc, struct __sk_buff *skb);
+static uint32_t BPF_FUNC(set_hash_invalid, struct __sk_buff *skb);
+
+/* Packet redirection */
+static int BPF_FUNC(redirect, int ifindex, uint32_t flags);
+static int BPF_FUNC(clone_redirect, struct __sk_buff *skb, int ifindex,
+		    uint32_t flags);
+
+/* Packet manipulation */
+static int BPF_FUNC(skb_load_bytes, struct __sk_buff *skb, uint32_t off,
+		    void *to, uint32_t len);
+static int BPF_FUNC(skb_store_bytes, struct __sk_buff *skb, uint32_t off,
+		    const void *from, uint32_t len, uint32_t flags);
+
+static int BPF_FUNC(l3_csum_replace, struct __sk_buff *skb, uint32_t off,
+		    uint32_t from, uint32_t to, uint32_t flags);
+static int BPF_FUNC(l4_csum_replace, struct __sk_buff *skb, uint32_t off,
+		    uint32_t from, uint32_t to, uint32_t flags);
+static int BPF_FUNC(csum_diff, const void *from, uint32_t from_size,
+		    const void *to, uint32_t to_size, uint32_t seed);
+static int BPF_FUNC(csum_update, struct __sk_buff *skb, uint32_t wsum);
+
+static int BPF_FUNC(skb_change_type, struct __sk_buff *skb, uint32_t type);
+static int BPF_FUNC(skb_change_proto, struct __sk_buff *skb, uint32_t proto,
+		    uint32_t flags);
+static int BPF_FUNC(skb_change_tail, struct __sk_buff *skb, uint32_t nlen,
+		    uint32_t flags);
+
+static int BPF_FUNC(skb_pull_data, struct __sk_buff *skb, uint32_t len);
+
+/* Event notification */
+static int __BPF_FUNC(skb_event_output, struct __sk_buff *skb, void *map,
+		      uint64_t index, const void *data, uint32_t size) =
+		      (void *) BPF_FUNC_perf_event_output;
+
+/* Packet vlan encap/decap */
+static int BPF_FUNC(skb_vlan_push, struct __sk_buff *skb, uint16_t proto,
+		    uint16_t vlan_tci);
+static int BPF_FUNC(skb_vlan_pop, struct __sk_buff *skb);
+
+/* Packet tunnel encap/decap */
+static int BPF_FUNC(skb_get_tunnel_key, struct __sk_buff *skb,
+		    struct bpf_tunnel_key *to, uint32_t size, uint32_t flags);
+static int BPF_FUNC(skb_set_tunnel_key, struct __sk_buff *skb,
+		    const struct bpf_tunnel_key *from, uint32_t size,
+		    uint32_t flags);
+
+static int BPF_FUNC(skb_get_tunnel_opt, struct __sk_buff *skb,
+		    void *to, uint32_t size);
+static int BPF_FUNC(skb_set_tunnel_opt, struct __sk_buff *skb,
+		    const void *from, uint32_t size);
+
+/** LLVM built-ins, mem*() routines work for constant size */
+
+#ifndef lock_xadd
+# define lock_xadd(ptr, val)	((void) __sync_fetch_and_add(ptr, val))
+#endif
+
+#ifndef memset
+# define memset(s, c, n)	__builtin_memset((s), (c), (n))
+#endif
+
+#ifndef memcpy
+# define memcpy(d, s, n)	__builtin_memcpy((d), (s), (n))
+#endif
+
+#ifndef memmove
+# define memmove(d, s, n)	__builtin_memmove((d), (s), (n))
+#endif
+
+/* FIXME: __builtin_memcmp() is not yet fully useable unless llvm bug
+ * https://llvm.org/bugs/show_bug.cgi?id=26218 gets resolved. Also
+ * this one would generate a reloc entry (non-map), otherwise.
+ */
+#if 0
+#ifndef memcmp
+# define memcmp(a, b, n)	__builtin_memcmp((a), (b), (n))
+#endif
+#endif
+
+unsigned long long load_byte(void *skb, unsigned long long off)
+	asm ("llvm.bpf.load.byte");
+
+unsigned long long load_half(void *skb, unsigned long long off)
+	asm ("llvm.bpf.load.half");
+
+unsigned long long load_word(void *skb, unsigned long long off)
+	asm ("llvm.bpf.load.word");
+
+#endif /* __BPF_API__ */
diff --git a/drivers/net/tap/bpf/bpf_elf.h b/drivers/net/tap/bpf/bpf_elf.h
new file mode 100644
index 000000000000..ea8a11c95c0f
--- /dev/null
+++ b/drivers/net/tap/bpf/bpf_elf.h
@@ -0,0 +1,53 @@
+/* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */
+#ifndef __BPF_ELF__
+#define __BPF_ELF__
+
+#include <asm/types.h>
+
+/* Note:
+ *
+ * Below ELF section names and bpf_elf_map structure definition
+ * are not (!) kernel ABI. It's rather a "contract" between the
+ * application and the BPF loader in tc. For compatibility, the
+ * section names should stay as-is. Introduction of aliases, if
+ * needed, are a possibility, though.
+ */
+
+/* ELF section names, etc */
+#define ELF_SECTION_LICENSE	"license"
+#define ELF_SECTION_MAPS	"maps"
+#define ELF_SECTION_PROG	"prog"
+#define ELF_SECTION_CLASSIFIER	"classifier"
+#define ELF_SECTION_ACTION	"action"
+
+#define ELF_MAX_MAPS		64
+#define ELF_MAX_LICENSE_LEN	128
+
+/* Object pinning settings */
+#define PIN_NONE		0
+#define PIN_OBJECT_NS		1
+#define PIN_GLOBAL_NS		2
+
+/* ELF map definition */
+struct bpf_elf_map {
+	__u32 type;
+	__u32 size_key;
+	__u32 size_value;
+	__u32 max_elem;
+	__u32 flags;
+	__u32 id;
+	__u32 pinning;
+	__u32 inner_id;
+	__u32 inner_idx;
+};
+
+#define BPF_ANNOTATE_KV_PAIR(name, type_key, type_val)		\
+	struct ____btf_map_##name {				\
+		type_key key;					\
+		type_val value;					\
+	};							\
+	struct ____btf_map_##name				\
+	    __attribute__ ((section(".maps." #name), used))	\
+	    ____btf_map_##name = { }
+
+#endif /* __BPF_ELF__ */
diff --git a/drivers/net/tap/bpf/bpf_extract.py b/drivers/net/tap/bpf/bpf_extract.py
new file mode 100644
index 000000000000..d79fc61020b3
--- /dev/null
+++ b/drivers/net/tap/bpf/bpf_extract.py
@@ -0,0 +1,80 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright (c) 2023 Stephen Hemminger <stephen@networkplumber.org>
+
+import argparse
+import sys
+import struct
+from tempfile import TemporaryFile
+from elftools.elf.elffile import ELFFile
+
+
+def load_sections(elffile):
+    result = []
+    DATA = [("cls_q", "cls_q_insns"), ("l3_l4", "l3_l4_hash_insns")]
+    for name, tag in DATA:
+        section = elffile.get_section_by_name(name)
+        if section:
+            insns = struct.iter_unpack('<BBhL', section.data())
+            result.append([tag, insns])
+    return result
+
+
+def dump_sections(sections, out):
+    for name, insns in sections:
+        print(f'\nstatic const struct bpf_insn {name} = {{', file=out)
+        for bpf in insns:
+            code = bpf[0]
+            src = bpf[1] >> 4
+            dst = bpf[1] & 0xf
+            off = bpf[2]
+            imm = bpf[3]
+            print('\t{{{:#02x}, {:4d}, {:4d}, {:8d}, {:#010x}}},'.format(
+                code, dst, src, off, imm),
+                  file=out)
+        print('};', file=out)
+
+
+def parse_args():
+    parser = argparse.ArgumentParser()
+    parser.add_argument("input",
+                        nargs='+',
+                        help="input object file path or '-' for stdin")
+    parser.add_argument("output", help="output C file path or '-' for stdout")
+    return parser.parse_args()
+
+
+def open_input(path):
+    if path == "-":
+        temp = TemporaryFile()
+        temp.write(sys.stdin.buffer.read())
+        return temp
+    return open(path, "rb")
+
+
+def open_output(path):
+    if path == "-":
+        return sys.stdout
+    return open(path, "w")
+
+
+def write_header(output):
+    print("/* SPDX-License-Identifier: BSD-3-Clause", file=output)
+    print(" * Compiled BPF instructions do not edit", file=output)
+    print(" */\n", file=output)
+    print("#include <tap_bpf.h>", file=output)
+
+
+def main():
+    args = parse_args()
+
+    output = open_output(args.output)
+    write_header(output)
+    for path in args.input:
+        elffile = ELFFile(open_input(path))
+        sections = load_sections(elffile)
+        dump_sections(sections, output)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/drivers/net/tap/tap_bpf_program.c b/drivers/net/tap/bpf/tap_bpf_program.c
similarity index 97%
rename from drivers/net/tap/tap_bpf_program.c
rename to drivers/net/tap/bpf/tap_bpf_program.c
index 20c310e5e7ba..ff6f1606fb38 100644
--- a/drivers/net/tap/tap_bpf_program.c
+++ b/drivers/net/tap/bpf/tap_bpf_program.c
@@ -14,9 +14,10 @@
 #include <linux/ipv6.h>
 #include <linux/if_tunnel.h>
 #include <linux/filter.h>
-#include <linux/bpf.h>
 
-#include "tap_rss.h"
+#include "bpf_api.h"
+#include "bpf_elf.h"
+#include "../tap_rss.h"
 
 /** Create IPv4 address */
 #define IPv4(a, b, c, d) ((__u32)(((a) & 0xff) << 24) | \
@@ -75,14 +76,14 @@ struct ipv4_l3_l4_tuple {
 	__u32    dst_addr;
 	__u16    dport;
 	__u16    sport;
-} __rte_packed;
+} __attribute__((packed));
 
 struct ipv6_l3_l4_tuple {
 	__u8        src_addr[16];
 	__u8        dst_addr[16];
 	__u16       dport;
 	__u16       sport;
-} __rte_packed;
+} __attribute__((packed));
 
 static const __u8 def_rss_key[TAP_RSS_HASH_KEY_SIZE] = {
 	0xd1, 0x81, 0xc6, 0x2c,
diff --git a/drivers/net/tap/tap_rss.h b/drivers/net/tap/tap_rss.h
index 48c151cf6b68..dff46a012f94 100644
--- a/drivers/net/tap/tap_rss.h
+++ b/drivers/net/tap/tap_rss.h
@@ -35,6 +35,6 @@ struct rss_key {
 	__u32 key_size;
 	__u32 queues[TAP_MAX_QUEUES];
 	__u32 nb_queues;
-} __rte_packed;
+} __attribute__((packed));
 
 #endif /* _TAP_RSS_H_ */
-- 
2.39.2


^ permalink raw reply	[relevance 4%]

* [PATCH v3] tap: fix build of TAP BPF program
  2023-07-16 21:25  1% [RFC] MAINTAINERS: add status information Stephen Hemminger
                   ` (2 preceding siblings ...)
  2023-07-20 17:45  5% ` [PATCH v2 ] tap: fix build of TAP BPF program Stephen Hemminger
@ 2023-07-20 23:25  4% ` Stephen Hemminger
  2023-07-22 16:32  4% ` [PATCH v4] " Stephen Hemminger
  4 siblings, 0 replies; 200+ results
From: Stephen Hemminger @ 2023-07-20 23:25 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger

Move the BPF program related code into a subdirectory.
And add a Makefile for building it.

The code was depending on old versions of headers from iproute2.
Include those headers here so that build works.

The standalone build was also broken because by
commit ef5baf3486e0 ("replace packed attributes")
which introduced __rte_packed into this code.

Add a python program to extract the resulting BPF into
a format that can be consumed by the TAP driver.

Update the documentation.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 doc/guides/nics/tap.rst                     |  11 +-
 drivers/net/tap/bpf/.gitignore              |   1 +
 drivers/net/tap/bpf/Makefile                |  18 ++
 drivers/net/tap/bpf/bpf_api.h               | 261 ++++++++++++++++++++
 drivers/net/tap/bpf/bpf_elf.h               |  43 ++++
 drivers/net/tap/bpf/bpf_extract.py          |  80 ++++++
 drivers/net/tap/{ => bpf}/tap_bpf_program.c |   9 +-
 drivers/net/tap/tap_rss.h                   |   2 +-
 8 files changed, 413 insertions(+), 12 deletions(-)
 create mode 100644 drivers/net/tap/bpf/.gitignore
 create mode 100644 drivers/net/tap/bpf/Makefile
 create mode 100644 drivers/net/tap/bpf/bpf_api.h
 create mode 100644 drivers/net/tap/bpf/bpf_elf.h
 create mode 100644 drivers/net/tap/bpf/bpf_extract.py
 rename drivers/net/tap/{ => bpf}/tap_bpf_program.c (97%)

diff --git a/doc/guides/nics/tap.rst b/doc/guides/nics/tap.rst
index 07df0d35a2ec..449e747994bd 100644
--- a/doc/guides/nics/tap.rst
+++ b/doc/guides/nics/tap.rst
@@ -256,15 +256,12 @@ C functions under different ELF sections.
 
 2. Install ``LLVM`` library and ``clang`` compiler versions 3.7 and above
 
-3. Compile ``tap_bpf_program.c`` via ``LLVM`` into an object file::
+3. Use make to compile  `tap_bpf_program.c`` via ``LLVM`` into an object file
+   and extract the resulting instructions into ``tap_bpf_insn.h``.
 
-    clang -O2 -emit-llvm -c tap_bpf_program.c -o - | llc -march=bpf \
-    -filetype=obj -o <tap_bpf_program.o>
+    cd bpf; make
 
-
-4. Use a tool that receives two parameters: an eBPF object file and a section
-name, and prints out the section as a C array of eBPF instructions.
-Embed the C array in your TAP PMD tree.
+4. Recompile the TAP PMD.
 
 The C arrays are uploaded to the kernel using BPF system calls.
 
diff --git a/drivers/net/tap/bpf/.gitignore b/drivers/net/tap/bpf/.gitignore
new file mode 100644
index 000000000000..30a258f1af3b
--- /dev/null
+++ b/drivers/net/tap/bpf/.gitignore
@@ -0,0 +1 @@
+tap_bpf_program.o
diff --git a/drivers/net/tap/bpf/Makefile b/drivers/net/tap/bpf/Makefile
new file mode 100644
index 000000000000..e5ae4e1f5adc
--- /dev/null
+++ b/drivers/net/tap/bpf/Makefile
@@ -0,0 +1,18 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# This file is not built as part of normal DPDK build.
+# It is used to generate the eBPF code for TAP RSS.
+CLANG=clang
+CLANG_OPTS=-O2
+TARGET=../tap_bpf_insns.h
+
+all: $(TARGET)
+
+clean:
+	rm tap_bpf_program.o $(TARGET)
+
+tap_bpf_program.o: tap_bpf_program.c
+	$(CLANG) $(CLANG_OPTS) -emit-llvm -c $< -o - | \
+	llc -march=bpf -filetype=obj -o $@
+
+$(TARGET): bpf_extract.py tap_bpf_program.o
+	python3 bpf_extract.py tap_bpf_program.o $@
diff --git a/drivers/net/tap/bpf/bpf_api.h b/drivers/net/tap/bpf/bpf_api.h
new file mode 100644
index 000000000000..d13247199c9a
--- /dev/null
+++ b/drivers/net/tap/bpf/bpf_api.h
@@ -0,0 +1,261 @@
+#ifndef __BPF_API__
+#define __BPF_API__
+
+/* Note:
+ *
+ * This file can be included into eBPF kernel programs. It contains
+ * a couple of useful helper functions, map/section ABI (bpf_elf.h),
+ * misc macros and some eBPF specific LLVM built-ins.
+ */
+
+#include <stdint.h>
+
+#include <linux/pkt_cls.h>
+#include <linux/bpf.h>
+#include <linux/filter.h>
+
+#include <asm/byteorder.h>
+
+#include "bpf_elf.h"
+
+/** Misc macros. */
+
+#ifndef __stringify
+# define __stringify(X)		#X
+#endif
+
+#ifndef __maybe_unused
+# define __maybe_unused		__attribute__((__unused__))
+#endif
+
+#ifndef offsetof
+# define offsetof(TYPE, MEMBER)	__builtin_offsetof(TYPE, MEMBER)
+#endif
+
+#ifndef likely
+# define likely(X)		__builtin_expect(!!(X), 1)
+#endif
+
+#ifndef unlikely
+# define unlikely(X)		__builtin_expect(!!(X), 0)
+#endif
+
+#ifndef htons
+# define htons(X)		__constant_htons((X))
+#endif
+
+#ifndef ntohs
+# define ntohs(X)		__constant_ntohs((X))
+#endif
+
+#ifndef htonl
+# define htonl(X)		__constant_htonl((X))
+#endif
+
+#ifndef ntohl
+# define ntohl(X)		__constant_ntohl((X))
+#endif
+
+#ifndef __inline__
+# define __inline__		__attribute__((always_inline))
+#endif
+
+/** Section helper macros. */
+
+#ifndef __section
+# define __section(NAME)						\
+	__attribute__((section(NAME), used))
+#endif
+
+#ifndef __section_tail
+# define __section_tail(ID, KEY)					\
+	__section(__stringify(ID) "/" __stringify(KEY))
+#endif
+
+#ifndef __section_xdp_entry
+# define __section_xdp_entry						\
+	__section(ELF_SECTION_PROG)
+#endif
+
+#ifndef __section_cls_entry
+# define __section_cls_entry						\
+	__section(ELF_SECTION_CLASSIFIER)
+#endif
+
+#ifndef __section_act_entry
+# define __section_act_entry						\
+	__section(ELF_SECTION_ACTION)
+#endif
+
+#ifndef __section_lwt_entry
+# define __section_lwt_entry						\
+	__section(ELF_SECTION_PROG)
+#endif
+
+#ifndef __section_license
+# define __section_license						\
+	__section(ELF_SECTION_LICENSE)
+#endif
+
+#ifndef __section_maps
+# define __section_maps							\
+	__section(ELF_SECTION_MAPS)
+#endif
+
+/** Declaration helper macros. */
+
+#ifndef BPF_LICENSE
+# define BPF_LICENSE(NAME)						\
+	char ____license[] __section_license = NAME
+#endif
+
+/** Classifier helper */
+
+#ifndef BPF_H_DEFAULT
+# define BPF_H_DEFAULT	-1
+#endif
+
+/** BPF helper functions for tc. Individual flags are in linux/bpf.h */
+
+#ifndef __BPF_FUNC
+# define __BPF_FUNC(NAME, ...)						\
+	(* NAME)(__VA_ARGS__) __maybe_unused
+#endif
+
+#ifndef BPF_FUNC
+# define BPF_FUNC(NAME, ...)						\
+	__BPF_FUNC(NAME, __VA_ARGS__) = (void *) BPF_FUNC_##NAME
+#endif
+
+/* Map access/manipulation */
+static void *BPF_FUNC(map_lookup_elem, void *map, const void *key);
+static int BPF_FUNC(map_update_elem, void *map, const void *key,
+		    const void *value, uint32_t flags);
+static int BPF_FUNC(map_delete_elem, void *map, const void *key);
+
+/* Time access */
+static uint64_t BPF_FUNC(ktime_get_ns);
+
+/* Debugging */
+
+/* FIXME: __attribute__ ((format(printf, 1, 3))) not possible unless
+ * llvm bug https://llvm.org/bugs/show_bug.cgi?id=26243 gets resolved.
+ * It would require ____fmt to be made const, which generates a reloc
+ * entry (non-map).
+ */
+static void BPF_FUNC(trace_printk, const char *fmt, int fmt_size, ...);
+
+#ifndef printt
+# define printt(fmt, ...)						\
+	({								\
+		char ____fmt[] = fmt;					\
+		trace_printk(____fmt, sizeof(____fmt), ##__VA_ARGS__);	\
+	})
+#endif
+
+/* Random numbers */
+static uint32_t BPF_FUNC(get_prandom_u32);
+
+/* Tail calls */
+static void BPF_FUNC(tail_call, struct __sk_buff *skb, void *map,
+		     uint32_t index);
+
+/* System helpers */
+static uint32_t BPF_FUNC(get_smp_processor_id);
+static uint32_t BPF_FUNC(get_numa_node_id);
+
+/* Packet misc meta data */
+static uint32_t BPF_FUNC(get_cgroup_classid, struct __sk_buff *skb);
+static int BPF_FUNC(skb_under_cgroup, void *map, uint32_t index);
+
+static uint32_t BPF_FUNC(get_route_realm, struct __sk_buff *skb);
+static uint32_t BPF_FUNC(get_hash_recalc, struct __sk_buff *skb);
+static uint32_t BPF_FUNC(set_hash_invalid, struct __sk_buff *skb);
+
+/* Packet redirection */
+static int BPF_FUNC(redirect, int ifindex, uint32_t flags);
+static int BPF_FUNC(clone_redirect, struct __sk_buff *skb, int ifindex,
+		    uint32_t flags);
+
+/* Packet manipulation */
+static int BPF_FUNC(skb_load_bytes, struct __sk_buff *skb, uint32_t off,
+		    void *to, uint32_t len);
+static int BPF_FUNC(skb_store_bytes, struct __sk_buff *skb, uint32_t off,
+		    const void *from, uint32_t len, uint32_t flags);
+
+static int BPF_FUNC(l3_csum_replace, struct __sk_buff *skb, uint32_t off,
+		    uint32_t from, uint32_t to, uint32_t flags);
+static int BPF_FUNC(l4_csum_replace, struct __sk_buff *skb, uint32_t off,
+		    uint32_t from, uint32_t to, uint32_t flags);
+static int BPF_FUNC(csum_diff, const void *from, uint32_t from_size,
+		    const void *to, uint32_t to_size, uint32_t seed);
+static int BPF_FUNC(csum_update, struct __sk_buff *skb, uint32_t wsum);
+
+static int BPF_FUNC(skb_change_type, struct __sk_buff *skb, uint32_t type);
+static int BPF_FUNC(skb_change_proto, struct __sk_buff *skb, uint32_t proto,
+		    uint32_t flags);
+static int BPF_FUNC(skb_change_tail, struct __sk_buff *skb, uint32_t nlen,
+		    uint32_t flags);
+
+static int BPF_FUNC(skb_pull_data, struct __sk_buff *skb, uint32_t len);
+
+/* Event notification */
+static int __BPF_FUNC(skb_event_output, struct __sk_buff *skb, void *map,
+		      uint64_t index, const void *data, uint32_t size) =
+		      (void *) BPF_FUNC_perf_event_output;
+
+/* Packet vlan encap/decap */
+static int BPF_FUNC(skb_vlan_push, struct __sk_buff *skb, uint16_t proto,
+		    uint16_t vlan_tci);
+static int BPF_FUNC(skb_vlan_pop, struct __sk_buff *skb);
+
+/* Packet tunnel encap/decap */
+static int BPF_FUNC(skb_get_tunnel_key, struct __sk_buff *skb,
+		    struct bpf_tunnel_key *to, uint32_t size, uint32_t flags);
+static int BPF_FUNC(skb_set_tunnel_key, struct __sk_buff *skb,
+		    const struct bpf_tunnel_key *from, uint32_t size,
+		    uint32_t flags);
+
+static int BPF_FUNC(skb_get_tunnel_opt, struct __sk_buff *skb,
+		    void *to, uint32_t size);
+static int BPF_FUNC(skb_set_tunnel_opt, struct __sk_buff *skb,
+		    const void *from, uint32_t size);
+
+/** LLVM built-ins, mem*() routines work for constant size */
+
+#ifndef lock_xadd
+# define lock_xadd(ptr, val)	((void) __sync_fetch_and_add(ptr, val))
+#endif
+
+#ifndef memset
+# define memset(s, c, n)	__builtin_memset((s), (c), (n))
+#endif
+
+#ifndef memcpy
+# define memcpy(d, s, n)	__builtin_memcpy((d), (s), (n))
+#endif
+
+#ifndef memmove
+# define memmove(d, s, n)	__builtin_memmove((d), (s), (n))
+#endif
+
+/* FIXME: __builtin_memcmp() is not yet fully useable unless llvm bug
+ * https://llvm.org/bugs/show_bug.cgi?id=26218 gets resolved. Also
+ * this one would generate a reloc entry (non-map), otherwise.
+ */
+#if 0
+#ifndef memcmp
+# define memcmp(a, b, n)	__builtin_memcmp((a), (b), (n))
+#endif
+#endif
+
+unsigned long long load_byte(void *skb, unsigned long long off)
+	asm ("llvm.bpf.load.byte");
+
+unsigned long long load_half(void *skb, unsigned long long off)
+	asm ("llvm.bpf.load.half");
+
+unsigned long long load_word(void *skb, unsigned long long off)
+	asm ("llvm.bpf.load.word");
+
+#endif /* __BPF_API__ */
diff --git a/drivers/net/tap/bpf/bpf_elf.h b/drivers/net/tap/bpf/bpf_elf.h
new file mode 100644
index 000000000000..406c30874ac3
--- /dev/null
+++ b/drivers/net/tap/bpf/bpf_elf.h
@@ -0,0 +1,43 @@
+#ifndef __BPF_ELF__
+#define __BPF_ELF__
+
+#include <asm/types.h>
+
+/* Note:
+ *
+ * Below ELF section names and bpf_elf_map structure definition
+ * are not (!) kernel ABI. It's rather a "contract" between the
+ * application and the BPF loader in tc. For compatibility, the
+ * section names should stay as-is. Introduction of aliases, if
+ * needed, are a possibility, though.
+ */
+
+/* ELF section names, etc */
+#define ELF_SECTION_LICENSE	"license"
+#define ELF_SECTION_MAPS	"maps"
+#define ELF_SECTION_PROG	"prog"
+#define ELF_SECTION_CLASSIFIER	"classifier"
+#define ELF_SECTION_ACTION	"action"
+
+#define ELF_MAX_MAPS		64
+#define ELF_MAX_LICENSE_LEN	128
+
+/* Object pinning settings */
+#define PIN_NONE		0
+#define PIN_OBJECT_NS		1
+#define PIN_GLOBAL_NS		2
+
+/* ELF map definition */
+struct bpf_elf_map {
+	__u32 type;
+	__u32 size_key;
+	__u32 size_value;
+	__u32 max_elem;
+	__u32 flags;
+	__u32 id;
+	__u32 pinning;
+	__u32 inner_id;
+	__u32 inner_idx;
+};
+
+#endif /* __BPF_ELF__ */
diff --git a/drivers/net/tap/bpf/bpf_extract.py b/drivers/net/tap/bpf/bpf_extract.py
new file mode 100644
index 000000000000..d79fc61020b3
--- /dev/null
+++ b/drivers/net/tap/bpf/bpf_extract.py
@@ -0,0 +1,80 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright (c) 2023 Stephen Hemminger <stephen@networkplumber.org>
+
+import argparse
+import sys
+import struct
+from tempfile import TemporaryFile
+from elftools.elf.elffile import ELFFile
+
+
+def load_sections(elffile):
+    result = []
+    DATA = [("cls_q", "cls_q_insns"), ("l3_l4", "l3_l4_hash_insns")]
+    for name, tag in DATA:
+        section = elffile.get_section_by_name(name)
+        if section:
+            insns = struct.iter_unpack('<BBhL', section.data())
+            result.append([tag, insns])
+    return result
+
+
+def dump_sections(sections, out):
+    for name, insns in sections:
+        print(f'\nstatic const struct bpf_insn {name} = {{', file=out)
+        for bpf in insns:
+            code = bpf[0]
+            src = bpf[1] >> 4
+            dst = bpf[1] & 0xf
+            off = bpf[2]
+            imm = bpf[3]
+            print('\t{{{:#02x}, {:4d}, {:4d}, {:8d}, {:#010x}}},'.format(
+                code, dst, src, off, imm),
+                  file=out)
+        print('};', file=out)
+
+
+def parse_args():
+    parser = argparse.ArgumentParser()
+    parser.add_argument("input",
+                        nargs='+',
+                        help="input object file path or '-' for stdin")
+    parser.add_argument("output", help="output C file path or '-' for stdout")
+    return parser.parse_args()
+
+
+def open_input(path):
+    if path == "-":
+        temp = TemporaryFile()
+        temp.write(sys.stdin.buffer.read())
+        return temp
+    return open(path, "rb")
+
+
+def open_output(path):
+    if path == "-":
+        return sys.stdout
+    return open(path, "w")
+
+
+def write_header(output):
+    print("/* SPDX-License-Identifier: BSD-3-Clause", file=output)
+    print(" * Compiled BPF instructions do not edit", file=output)
+    print(" */\n", file=output)
+    print("#include <tap_bpf.h>", file=output)
+
+
+def main():
+    args = parse_args()
+
+    output = open_output(args.output)
+    write_header(output)
+    for path in args.input:
+        elffile = ELFFile(open_input(path))
+        sections = load_sections(elffile)
+        dump_sections(sections, output)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/drivers/net/tap/tap_bpf_program.c b/drivers/net/tap/bpf/tap_bpf_program.c
similarity index 97%
rename from drivers/net/tap/tap_bpf_program.c
rename to drivers/net/tap/bpf/tap_bpf_program.c
index 20c310e5e7ba..ff6f1606fb38 100644
--- a/drivers/net/tap/tap_bpf_program.c
+++ b/drivers/net/tap/bpf/tap_bpf_program.c
@@ -14,9 +14,10 @@
 #include <linux/ipv6.h>
 #include <linux/if_tunnel.h>
 #include <linux/filter.h>
-#include <linux/bpf.h>
 
-#include "tap_rss.h"
+#include "bpf_api.h"
+#include "bpf_elf.h"
+#include "../tap_rss.h"
 
 /** Create IPv4 address */
 #define IPv4(a, b, c, d) ((__u32)(((a) & 0xff) << 24) | \
@@ -75,14 +76,14 @@ struct ipv4_l3_l4_tuple {
 	__u32    dst_addr;
 	__u16    dport;
 	__u16    sport;
-} __rte_packed;
+} __attribute__((packed));
 
 struct ipv6_l3_l4_tuple {
 	__u8        src_addr[16];
 	__u8        dst_addr[16];
 	__u16       dport;
 	__u16       sport;
-} __rte_packed;
+} __attribute__((packed));
 
 static const __u8 def_rss_key[TAP_RSS_HASH_KEY_SIZE] = {
 	0xd1, 0x81, 0xc6, 0x2c,
diff --git a/drivers/net/tap/tap_rss.h b/drivers/net/tap/tap_rss.h
index 48c151cf6b68..dff46a012f94 100644
--- a/drivers/net/tap/tap_rss.h
+++ b/drivers/net/tap/tap_rss.h
@@ -35,6 +35,6 @@ struct rss_key {
 	__u32 key_size;
 	__u32 queues[TAP_MAX_QUEUES];
 	__u32 nb_queues;
-} __rte_packed;
+} __attribute__((packed));
 
 #endif /* _TAP_RSS_H_ */
-- 
2.39.2


^ permalink raw reply	[relevance 4%]

* [PATCH v2 ] tap: fix build of TAP BPF program
  2023-07-16 21:25  1% [RFC] MAINTAINERS: add status information Stephen Hemminger
  2023-07-19 16:07  1% ` [PATCH v2] " Stephen Hemminger
  2023-07-20 17:21  1% ` [PATCH v3] " Stephen Hemminger
@ 2023-07-20 17:45  5% ` Stephen Hemminger
  2023-07-20 23:25  4% ` [PATCH v3] " Stephen Hemminger
  2023-07-22 16:32  4% ` [PATCH v4] " Stephen Hemminger
  4 siblings, 0 replies; 200+ results
From: Stephen Hemminger @ 2023-07-20 17:45 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger

The code was depending on old versions of headers from iproute2.
Include those headers here so that build works.

The standalone build was also broken because by
commit ef5baf3486e0 ("replace packed attributes")
which introduced __rte_packed into this code.

This patch does not address several other issues with this
BPF code. It should be using BTF and the conversion into
array is a mess.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 drivers/net/tap/bpf_api.h         | 261 ++++++++++++++++++++++++++++++
 drivers/net/tap/bpf_elf.h         |  43 +++++
 drivers/net/tap/tap_bpf_program.c |  14 +-
 drivers/net/tap/tap_rss.h         |   2 +-
 4 files changed, 316 insertions(+), 4 deletions(-)
 create mode 100644 drivers/net/tap/bpf_api.h
 create mode 100644 drivers/net/tap/bpf_elf.h

diff --git a/drivers/net/tap/bpf_api.h b/drivers/net/tap/bpf_api.h
new file mode 100644
index 000000000000..d13247199c9a
--- /dev/null
+++ b/drivers/net/tap/bpf_api.h
@@ -0,0 +1,261 @@
+#ifndef __BPF_API__
+#define __BPF_API__
+
+/* Note:
+ *
+ * This file can be included into eBPF kernel programs. It contains
+ * a couple of useful helper functions, map/section ABI (bpf_elf.h),
+ * misc macros and some eBPF specific LLVM built-ins.
+ */
+
+#include <stdint.h>
+
+#include <linux/pkt_cls.h>
+#include <linux/bpf.h>
+#include <linux/filter.h>
+
+#include <asm/byteorder.h>
+
+#include "bpf_elf.h"
+
+/** Misc macros. */
+
+#ifndef __stringify
+# define __stringify(X)		#X
+#endif
+
+#ifndef __maybe_unused
+# define __maybe_unused		__attribute__((__unused__))
+#endif
+
+#ifndef offsetof
+# define offsetof(TYPE, MEMBER)	__builtin_offsetof(TYPE, MEMBER)
+#endif
+
+#ifndef likely
+# define likely(X)		__builtin_expect(!!(X), 1)
+#endif
+
+#ifndef unlikely
+# define unlikely(X)		__builtin_expect(!!(X), 0)
+#endif
+
+#ifndef htons
+# define htons(X)		__constant_htons((X))
+#endif
+
+#ifndef ntohs
+# define ntohs(X)		__constant_ntohs((X))
+#endif
+
+#ifndef htonl
+# define htonl(X)		__constant_htonl((X))
+#endif
+
+#ifndef ntohl
+# define ntohl(X)		__constant_ntohl((X))
+#endif
+
+#ifndef __inline__
+# define __inline__		__attribute__((always_inline))
+#endif
+
+/** Section helper macros. */
+
+#ifndef __section
+# define __section(NAME)						\
+	__attribute__((section(NAME), used))
+#endif
+
+#ifndef __section_tail
+# define __section_tail(ID, KEY)					\
+	__section(__stringify(ID) "/" __stringify(KEY))
+#endif
+
+#ifndef __section_xdp_entry
+# define __section_xdp_entry						\
+	__section(ELF_SECTION_PROG)
+#endif
+
+#ifndef __section_cls_entry
+# define __section_cls_entry						\
+	__section(ELF_SECTION_CLASSIFIER)
+#endif
+
+#ifndef __section_act_entry
+# define __section_act_entry						\
+	__section(ELF_SECTION_ACTION)
+#endif
+
+#ifndef __section_lwt_entry
+# define __section_lwt_entry						\
+	__section(ELF_SECTION_PROG)
+#endif
+
+#ifndef __section_license
+# define __section_license						\
+	__section(ELF_SECTION_LICENSE)
+#endif
+
+#ifndef __section_maps
+# define __section_maps							\
+	__section(ELF_SECTION_MAPS)
+#endif
+
+/** Declaration helper macros. */
+
+#ifndef BPF_LICENSE
+# define BPF_LICENSE(NAME)						\
+	char ____license[] __section_license = NAME
+#endif
+
+/** Classifier helper */
+
+#ifndef BPF_H_DEFAULT
+# define BPF_H_DEFAULT	-1
+#endif
+
+/** BPF helper functions for tc. Individual flags are in linux/bpf.h */
+
+#ifndef __BPF_FUNC
+# define __BPF_FUNC(NAME, ...)						\
+	(* NAME)(__VA_ARGS__) __maybe_unused
+#endif
+
+#ifndef BPF_FUNC
+# define BPF_FUNC(NAME, ...)						\
+	__BPF_FUNC(NAME, __VA_ARGS__) = (void *) BPF_FUNC_##NAME
+#endif
+
+/* Map access/manipulation */
+static void *BPF_FUNC(map_lookup_elem, void *map, const void *key);
+static int BPF_FUNC(map_update_elem, void *map, const void *key,
+		    const void *value, uint32_t flags);
+static int BPF_FUNC(map_delete_elem, void *map, const void *key);
+
+/* Time access */
+static uint64_t BPF_FUNC(ktime_get_ns);
+
+/* Debugging */
+
+/* FIXME: __attribute__ ((format(printf, 1, 3))) not possible unless
+ * llvm bug https://llvm.org/bugs/show_bug.cgi?id=26243 gets resolved.
+ * It would require ____fmt to be made const, which generates a reloc
+ * entry (non-map).
+ */
+static void BPF_FUNC(trace_printk, const char *fmt, int fmt_size, ...);
+
+#ifndef printt
+# define printt(fmt, ...)						\
+	({								\
+		char ____fmt[] = fmt;					\
+		trace_printk(____fmt, sizeof(____fmt), ##__VA_ARGS__);	\
+	})
+#endif
+
+/* Random numbers */
+static uint32_t BPF_FUNC(get_prandom_u32);
+
+/* Tail calls */
+static void BPF_FUNC(tail_call, struct __sk_buff *skb, void *map,
+		     uint32_t index);
+
+/* System helpers */
+static uint32_t BPF_FUNC(get_smp_processor_id);
+static uint32_t BPF_FUNC(get_numa_node_id);
+
+/* Packet misc meta data */
+static uint32_t BPF_FUNC(get_cgroup_classid, struct __sk_buff *skb);
+static int BPF_FUNC(skb_under_cgroup, void *map, uint32_t index);
+
+static uint32_t BPF_FUNC(get_route_realm, struct __sk_buff *skb);
+static uint32_t BPF_FUNC(get_hash_recalc, struct __sk_buff *skb);
+static uint32_t BPF_FUNC(set_hash_invalid, struct __sk_buff *skb);
+
+/* Packet redirection */
+static int BPF_FUNC(redirect, int ifindex, uint32_t flags);
+static int BPF_FUNC(clone_redirect, struct __sk_buff *skb, int ifindex,
+		    uint32_t flags);
+
+/* Packet manipulation */
+static int BPF_FUNC(skb_load_bytes, struct __sk_buff *skb, uint32_t off,
+		    void *to, uint32_t len);
+static int BPF_FUNC(skb_store_bytes, struct __sk_buff *skb, uint32_t off,
+		    const void *from, uint32_t len, uint32_t flags);
+
+static int BPF_FUNC(l3_csum_replace, struct __sk_buff *skb, uint32_t off,
+		    uint32_t from, uint32_t to, uint32_t flags);
+static int BPF_FUNC(l4_csum_replace, struct __sk_buff *skb, uint32_t off,
+		    uint32_t from, uint32_t to, uint32_t flags);
+static int BPF_FUNC(csum_diff, const void *from, uint32_t from_size,
+		    const void *to, uint32_t to_size, uint32_t seed);
+static int BPF_FUNC(csum_update, struct __sk_buff *skb, uint32_t wsum);
+
+static int BPF_FUNC(skb_change_type, struct __sk_buff *skb, uint32_t type);
+static int BPF_FUNC(skb_change_proto, struct __sk_buff *skb, uint32_t proto,
+		    uint32_t flags);
+static int BPF_FUNC(skb_change_tail, struct __sk_buff *skb, uint32_t nlen,
+		    uint32_t flags);
+
+static int BPF_FUNC(skb_pull_data, struct __sk_buff *skb, uint32_t len);
+
+/* Event notification */
+static int __BPF_FUNC(skb_event_output, struct __sk_buff *skb, void *map,
+		      uint64_t index, const void *data, uint32_t size) =
+		      (void *) BPF_FUNC_perf_event_output;
+
+/* Packet vlan encap/decap */
+static int BPF_FUNC(skb_vlan_push, struct __sk_buff *skb, uint16_t proto,
+		    uint16_t vlan_tci);
+static int BPF_FUNC(skb_vlan_pop, struct __sk_buff *skb);
+
+/* Packet tunnel encap/decap */
+static int BPF_FUNC(skb_get_tunnel_key, struct __sk_buff *skb,
+		    struct bpf_tunnel_key *to, uint32_t size, uint32_t flags);
+static int BPF_FUNC(skb_set_tunnel_key, struct __sk_buff *skb,
+		    const struct bpf_tunnel_key *from, uint32_t size,
+		    uint32_t flags);
+
+static int BPF_FUNC(skb_get_tunnel_opt, struct __sk_buff *skb,
+		    void *to, uint32_t size);
+static int BPF_FUNC(skb_set_tunnel_opt, struct __sk_buff *skb,
+		    const void *from, uint32_t size);
+
+/** LLVM built-ins, mem*() routines work for constant size */
+
+#ifndef lock_xadd
+# define lock_xadd(ptr, val)	((void) __sync_fetch_and_add(ptr, val))
+#endif
+
+#ifndef memset
+# define memset(s, c, n)	__builtin_memset((s), (c), (n))
+#endif
+
+#ifndef memcpy
+# define memcpy(d, s, n)	__builtin_memcpy((d), (s), (n))
+#endif
+
+#ifndef memmove
+# define memmove(d, s, n)	__builtin_memmove((d), (s), (n))
+#endif
+
+/* FIXME: __builtin_memcmp() is not yet fully useable unless llvm bug
+ * https://llvm.org/bugs/show_bug.cgi?id=26218 gets resolved. Also
+ * this one would generate a reloc entry (non-map), otherwise.
+ */
+#if 0
+#ifndef memcmp
+# define memcmp(a, b, n)	__builtin_memcmp((a), (b), (n))
+#endif
+#endif
+
+unsigned long long load_byte(void *skb, unsigned long long off)
+	asm ("llvm.bpf.load.byte");
+
+unsigned long long load_half(void *skb, unsigned long long off)
+	asm ("llvm.bpf.load.half");
+
+unsigned long long load_word(void *skb, unsigned long long off)
+	asm ("llvm.bpf.load.word");
+
+#endif /* __BPF_API__ */
diff --git a/drivers/net/tap/bpf_elf.h b/drivers/net/tap/bpf_elf.h
new file mode 100644
index 000000000000..406c30874ac3
--- /dev/null
+++ b/drivers/net/tap/bpf_elf.h
@@ -0,0 +1,43 @@
+#ifndef __BPF_ELF__
+#define __BPF_ELF__
+
+#include <asm/types.h>
+
+/* Note:
+ *
+ * Below ELF section names and bpf_elf_map structure definition
+ * are not (!) kernel ABI. It's rather a "contract" between the
+ * application and the BPF loader in tc. For compatibility, the
+ * section names should stay as-is. Introduction of aliases, if
+ * needed, are a possibility, though.
+ */
+
+/* ELF section names, etc */
+#define ELF_SECTION_LICENSE	"license"
+#define ELF_SECTION_MAPS	"maps"
+#define ELF_SECTION_PROG	"prog"
+#define ELF_SECTION_CLASSIFIER	"classifier"
+#define ELF_SECTION_ACTION	"action"
+
+#define ELF_MAX_MAPS		64
+#define ELF_MAX_LICENSE_LEN	128
+
+/* Object pinning settings */
+#define PIN_NONE		0
+#define PIN_OBJECT_NS		1
+#define PIN_GLOBAL_NS		2
+
+/* ELF map definition */
+struct bpf_elf_map {
+	__u32 type;
+	__u32 size_key;
+	__u32 size_value;
+	__u32 max_elem;
+	__u32 flags;
+	__u32 id;
+	__u32 pinning;
+	__u32 inner_id;
+	__u32 inner_idx;
+};
+
+#endif /* __BPF_ELF__ */
diff --git a/drivers/net/tap/tap_bpf_program.c b/drivers/net/tap/tap_bpf_program.c
index 20c310e5e7ba..daf30c4aba86 100644
--- a/drivers/net/tap/tap_bpf_program.c
+++ b/drivers/net/tap/tap_bpf_program.c
@@ -1,5 +1,12 @@
 /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
  * Copyright 2017 Mellanox Technologies, Ltd
+ *
+ * This file is not built as part of normal DPDK build.
+ * It is used to generate the eBPF code for TAP RSS.
+ *
+ * To build it use:
+ *  clang -O2 -emit-llvm -c tap_bpf_program.c -o - | \
+ *   llc -march=bpf -filetype=obj -o tap_bpf_program.o
  */
 
 #include <stdint.h>
@@ -14,8 +21,9 @@
 #include <linux/ipv6.h>
 #include <linux/if_tunnel.h>
 #include <linux/filter.h>
-#include <linux/bpf.h>
 
+#include "bpf_api.h"
+#include "bpf_elf.h"
 #include "tap_rss.h"
 
 /** Create IPv4 address */
@@ -75,14 +83,14 @@ struct ipv4_l3_l4_tuple {
 	__u32    dst_addr;
 	__u16    dport;
 	__u16    sport;
-} __rte_packed;
+} __attribute__((packed));
 
 struct ipv6_l3_l4_tuple {
 	__u8        src_addr[16];
 	__u8        dst_addr[16];
 	__u16       dport;
 	__u16       sport;
-} __rte_packed;
+} __attribute__((packed));
 
 static const __u8 def_rss_key[TAP_RSS_HASH_KEY_SIZE] = {
 	0xd1, 0x81, 0xc6, 0x2c,
diff --git a/drivers/net/tap/tap_rss.h b/drivers/net/tap/tap_rss.h
index 48c151cf6b68..dff46a012f94 100644
--- a/drivers/net/tap/tap_rss.h
+++ b/drivers/net/tap/tap_rss.h
@@ -35,6 +35,6 @@ struct rss_key {
 	__u32 key_size;
 	__u32 queues[TAP_MAX_QUEUES];
 	__u32 nb_queues;
-} __rte_packed;
+} __attribute__((packed));
 
 #endif /* _TAP_RSS_H_ */
-- 
2.39.2


^ permalink raw reply	[relevance 5%]

* [PATCH v3] MAINTAINERS: add status information
  2023-07-16 21:25  1% [RFC] MAINTAINERS: add status information Stephen Hemminger
  2023-07-19 16:07  1% ` [PATCH v2] " Stephen Hemminger
@ 2023-07-20 17:21  1% ` Stephen Hemminger
  2023-07-20 17:45  5% ` [PATCH v2 ] tap: fix build of TAP BPF program Stephen Hemminger
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 200+ results
From: Stephen Hemminger @ 2023-07-20 17:21 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger

Add a new field S: which indicates the status of support for
individual sub-trees. Almost everything is marked as supported
but components without any maintainer are listed as Orphan.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
v3 - add back Makefile
     mark vdev_netvsc as Odd Fixes

 MAINTAINERS | 266 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 266 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index 18bc05fccd0d..42cc29e6c475 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -17,6 +17,16 @@ Descriptions of section entries:
 	X: Files and directories exclusion, same rules as F:
 	K: Keyword regex pattern to match content.
 	   One regex pattern per line. Multiple K: lines acceptable.
+	S: *Status*, one of the following:
+	   Supported:	Someone is actually paid to look after this.
+	   Maintained:	Someone actually looks after it.
+	   Odd Fixes:	It has a maintainer but they don't have time to do
+			much other than throw the odd patch in. See below..
+	   Orphan:	No current maintainer [but maybe you could take the
+			role as you write your new code].
+	   Obsolete:	Old code. Something tagged obsolete generally means
+			it has been replaced by a better system and you
+			should be using that.
 
 
 General Project Administration
@@ -25,44 +35,54 @@ General Project Administration
 Main Branch
 M: Thomas Monjalon <thomas@monjalon.net>
 M: David Marchand <david.marchand@redhat.com>
+S: Supported
 T: git://dpdk.org/dpdk
 
 Next-net Tree
 M: Ferruh Yigit <ferruh.yigit@amd.com>
 M: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net
 
 Next-net-brcm Tree
 M: Ajit Khaparde <ajit.khaparde@broadcom.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-brcm
 
 Next-net-intel Tree
 M: Qi Zhang <qi.z.zhang@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 
 Next-net-mrvl Tree
 M: Jerin Jacob <jerinj@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 
 Next-net-mlx Tree
 M: Raslan Darawsheh <rasland@nvidia.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mlx
 
 Next-virtio Tree
 M: Maxime Coquelin <maxime.coquelin@redhat.com>
 M: Chenbo Xia <chenbo.xia@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-virtio
 
 Next-crypto Tree
 M: Akhil Goyal <gakhil@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-crypto
 
 Next-eventdev Tree
 M: Jerin Jacob <jerinj@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-eventdev
 
 Next-baseband Tree
 M: Maxime Coquelin <maxime.coquelin@redhat.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-baseband
 
 Stable Branches
@@ -70,17 +90,21 @@ M: Luca Boccassi <bluca@debian.org>
 M: Kevin Traynor <ktraynor@redhat.com>
 M: Christian Ehrhardt <christian.ehrhardt@canonical.com>
 M: Xueming Li <xuemingl@nvidia.com>
+S: Supported
 T: git://dpdk.org/dpdk-stable
 
 Security Issues
 M: maintainers@dpdk.org
+S: Supported
 
 Documentation (with overlaps)
 F: README
 F: doc/
+S: Supported
 
 Developers and Maintainers Tools
 M: Thomas Monjalon <thomas@monjalon.net>
+S: Supported
 F: MAINTAINERS
 F: devtools/build-dict.sh
 F: devtools/check-abi.sh
@@ -110,6 +134,7 @@ F: .mailmap
 
 Build System
 M: Bruce Richardson <bruce.richardson@intel.com>
+S: Supported
 F: Makefile
 F: meson.build
 F: meson_options.txt
@@ -130,11 +155,13 @@ F: devtools/check-meson.py
 Public CI
 M: Aaron Conole <aconole@redhat.com>
 M: Michael Santana <maicolgabriel@hotmail.com>
+S: Supported
 F: .github/workflows/build.yml
 F: .ci/
 
 Driver information
 M: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
+S: Maintained
 F: buildtools/coff.py
 F: buildtools/gen-pmdinfo-cfile.py
 F: buildtools/pmdinfogen.py
@@ -147,6 +174,7 @@ Environment Abstraction Layer
 T: git://dpdk.org/dpdk
 
 EAL API and common code
+S: Supported
 F: lib/eal/common/
 F: lib/eal/unix/
 F: lib/eal/include/
@@ -180,6 +208,7 @@ F: app/test/test_version.c
 Trace - EXPERIMENTAL
 M: Jerin Jacob <jerinj@marvell.com>
 M: Sunil Kumar Kori <skori@marvell.com>
+S: Supported
 F: lib/eal/include/rte_trace*.h
 F: lib/eal/common/eal_common_trace*.c
 F: lib/eal/common/eal_trace.h
@@ -188,6 +217,7 @@ F: app/test/test_trace*
 
 Memory Allocation
 M: Anatoly Burakov <anatoly.burakov@intel.com>
+S: Supported
 F: lib/eal/include/rte_fbarray.h
 F: lib/eal/include/rte_mem*
 F: lib/eal/include/rte_malloc.h
@@ -209,11 +239,13 @@ F: app/test/test_memzone.c
 
 Interrupt Subsystem
 M: Harman Kalra <hkalra@marvell.com>
+S: Supported
 F: lib/eal/include/rte_epoll.h
 F: lib/eal/*/*interrupts.*
 F: app/test/test_interrupts.c
 
 Keep alive
+S: Orphan
 F: lib/eal/include/rte_keepalive.h
 F: lib/eal/common/rte_keepalive.c
 F: examples/l2fwd-keepalive/
@@ -221,6 +253,7 @@ F: doc/guides/sample_app_ug/keep_alive.rst
 
 Secondary process
 M: Anatoly Burakov <anatoly.burakov@intel.com>
+S: Maintained
 K: RTE_PROC_
 F: lib/eal/common/eal_common_proc.c
 F: doc/guides/prog_guide/multi_proc_support.rst
@@ -230,6 +263,7 @@ F: doc/guides/sample_app_ug/multi_process.rst
 
 Service Cores
 M: Harry van Haaren <harry.van.haaren@intel.com>
+S: Supported
 F: lib/eal/include/rte_service.h
 F: lib/eal/include/rte_service_component.h
 F: lib/eal/common/rte_service.c
@@ -240,44 +274,52 @@ F: doc/guides/sample_app_ug/service_cores.rst
 
 Bitops
 M: Joyce Kong <joyce.kong@arm.com>
+S: Supported
 F: lib/eal/include/rte_bitops.h
 F: app/test/test_bitops.c
 
 Bitmap
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
+S: Supported
 F: lib/eal/include/rte_bitmap.h
 F: app/test/test_bitmap.c
 
 MCSlock
 M: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
+S: Supported
 F: lib/eal/include/rte_mcslock.h
 F: app/test/test_mcslock.c
 
 Sequence Lock
 M: Mattias Rönnblom <mattias.ronnblom@ericsson.com>
+S: Supported
 F: lib/eal/include/rte_seqcount.h
 F: lib/eal/include/rte_seqlock.h
 F: app/test/test_seqlock.c
 
 Ticketlock
 M: Joyce Kong <joyce.kong@arm.com>
+S: Supported
 F: lib/eal/include/rte_ticketlock.h
 F: app/test/test_ticketlock.c
 
 Pseudo-random Number Generation
 M: Mattias Rönnblom <mattias.ronnblom@ericsson.com>
+S: Supported
 F: lib/eal/include/rte_random.h
 F: lib/eal/common/rte_random.c
 F: app/test/test_rand_perf.c
 
 ARM v7
 M: Ruifeng Wang <ruifeng.wang@arm.com>
+S: Supported
 F: config/arm/
 F: lib/eal/arm/
 X: lib/eal/arm/include/*_64.h
 
 ARM v8
 M: Ruifeng Wang <ruifeng.wang@arm.com>
+S: Supported
 F: config/arm/
 F: doc/guides/linux_gsg/cross_build_dpdk_for_arm64.rst
 F: lib/eal/arm/
@@ -291,12 +333,14 @@ F: examples/common/neon/
 
 LoongArch
 M: Min Zhou <zhoumin@loongson.cn>
+S: Supported
 F: config/loongarch/
 F: doc/guides/linux_gsg/cross_build_dpdk_for_loongarch.rst
 F: lib/eal/loongarch/
 
 IBM POWER (alpha)
 M: David Christensen <drc@linux.vnet.ibm.com>
+S: Supported
 F: config/ppc/
 F: lib/eal/ppc/
 F: lib/*/*_altivec*
@@ -307,6 +351,7 @@ F: examples/common/altivec/
 
 RISC-V
 M: Stanislaw Kardach <kda@semihalf.com>
+S: Supported
 F: config/riscv/
 F: doc/guides/linux_gsg/cross_build_dpdk_for_riscv.rst
 F: lib/eal/riscv/
@@ -314,6 +359,7 @@ F: lib/eal/riscv/
 Intel x86
 M: Bruce Richardson <bruce.richardson@intel.com>
 M: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
+S: Supported
 F: config/x86/
 F: doc/guides/linux_gsg/nic_perf_intel_platform.rst
 F: buildtools/binutils-avx512-check.py
@@ -330,28 +376,34 @@ F: examples/*/*_avx*
 F: examples/common/sse/
 
 Linux EAL (with overlaps)
+S: Supported
 F: lib/eal/linux/
 F: doc/guides/linux_gsg/
 
 Linux UIO
+S: Supported
 F: drivers/bus/pci/linux/*uio*
 
 Linux VFIO
 M: Anatoly Burakov <anatoly.burakov@intel.com>
+S: Supported
 F: lib/eal/linux/*vfio*
 F: drivers/bus/pci/linux/*vfio*
 
 FreeBSD EAL (with overlaps)
 M: Bruce Richardson <bruce.richardson@intel.com>
+S: Odd Fixes
 F: lib/eal/freebsd/
 F: doc/guides/freebsd_gsg/
 
 FreeBSD contigmem
 M: Bruce Richardson <bruce.richardson@intel.com>
+S: Oddd Fixes
 F: kernel/freebsd/contigmem/
 
 FreeBSD UIO
 M: Bruce Richardson <bruce.richardson@intel.com>
+S: Odd Fixes
 F: kernel/freebsd/nic_uio/
 
 Windows support
@@ -359,12 +411,14 @@ M: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
 M: Narcisa Ana Maria Vasile <navasile@linux.microsoft.com>
 M: Dmitry Malloy <dmitrym@microsoft.com>
 M: Pallavi Kadam <pallavi.kadam@intel.com>
+S: Supported
 F: lib/eal/windows/
 F: buildtools/map_to_win.py
 F: doc/guides/windows_gsg/
 
 Windows memory allocation
 M: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
+S: Supported
 F: lib/eal/windows/eal_hugepages.c
 F: lib/eal/windows/eal_mem*
 
@@ -372,10 +426,12 @@ F: lib/eal/windows/eal_mem*
 Core Libraries
 --------------
 T: git://dpdk.org/dpdk
+S: Maintained
 
 Memory pool
 M: Olivier Matz <olivier.matz@6wind.com>
 M: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
+S: Supported
 F: lib/mempool/
 F: drivers/mempool/ring/
 F: doc/guides/prog_guide/mempool_lib.rst
@@ -385,6 +441,7 @@ F: app/test/test_func_reentrancy.c
 Ring queue
 M: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
 M: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
+S: Supported
 F: lib/ring/
 F: doc/guides/prog_guide/ring_lib.rst
 F: app/test/test_ring*
@@ -392,6 +449,7 @@ F: app/test/test_func_reentrancy.c
 
 Stack
 M: Olivier Matz <olivier.matz@6wind.com>
+S: Supported
 F: lib/stack/
 F: drivers/mempool/stack/
 F: app/test/test_stack*
@@ -399,6 +457,7 @@ F: doc/guides/prog_guide/stack_lib.rst
 
 Packet buffer
 M: Olivier Matz <olivier.matz@6wind.com>
+S: Supported
 F: lib/mbuf/
 F: doc/guides/prog_guide/mbuf_lib.rst
 F: app/test/test_mbuf.c
@@ -407,6 +466,7 @@ Ethernet API
 M: Thomas Monjalon <thomas@monjalon.net>
 M: Ferruh Yigit <ferruh.yigit@amd.com>
 M: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net
 F: lib/ethdev/
 F: app/test/test_ethdev*
@@ -415,6 +475,7 @@ F: doc/guides/prog_guide/switch_representation.rst
 
 Flow API
 M: Ori Kam <orika@nvidia.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net
 F: app/test-pmd/cmdline_flow.c
 F: doc/guides/prog_guide/rte_flow.rst
@@ -422,18 +483,21 @@ F: lib/ethdev/rte_flow*
 
 Traffic Management API - EXPERIMENTAL
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net
 F: lib/ethdev/rte_tm*
 F: app/test-pmd/cmdline_tm.*
 
 Traffic Metering and Policing API - EXPERIMENTAL
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net
 F: lib/ethdev/rte_mtr*
 F: app/test-pmd/cmdline_mtr.*
 
 Baseband API
 M: Nicolas Chautru <nicolas.chautru@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-baseband
 F: lib/bbdev/
 F: doc/guides/prog_guide/bbdev.rst
@@ -446,6 +510,7 @@ F: doc/guides/sample_app_ug/bbdev_app.rst
 Crypto API
 M: Akhil Goyal <gakhil@marvell.com>
 M: Fan Zhang <fanzhang.oss@gmail.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-crypto
 F: lib/cryptodev/
 F: app/test/test_cryptodev*
@@ -453,6 +518,7 @@ F: examples/l2fwd-crypto/
 
 Security API
 M: Akhil Goyal <gakhil@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-crypto
 F: lib/security/
 F: doc/guides/prog_guide/rte_security.rst
@@ -461,6 +527,7 @@ F: app/test/test_security*
 Compression API - EXPERIMENTAL
 M: Fan Zhang <fanzhang.oss@gmail.com>
 M: Ashish Gupta <ashish.gupta@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-crypto
 F: lib/compressdev/
 F: drivers/compress/
@@ -470,6 +537,7 @@ F: doc/guides/compressdevs/features/default.ini
 
 RegEx API - EXPERIMENTAL
 M: Ori Kam <orika@nvidia.com>
+S: Supported
 F: lib/regexdev/
 F: app/test-regex/
 F: doc/guides/prog_guide/regexdev.rst
@@ -477,6 +545,7 @@ F: doc/guides/regexdevs/features/default.ini
 
 Machine Learning device API - EXPERIMENTAL
 M: Srikanth Yalavarthi <syalavarthi@marvell.com>
+S: Supported
 F: lib/mldev/
 F: doc/guides/prog_guide/mldev.rst
 F: app/test-mldev/
@@ -484,6 +553,7 @@ F: doc/guides/tools/testmldev.rst
 
 DMA device API - EXPERIMENTAL
 M: Chengwen Feng <fengchengwen@huawei.com>
+S: Supported
 F: lib/dmadev/
 F: drivers/dma/skeleton/
 F: app/test/test_dmadev*
@@ -495,6 +565,7 @@ F: doc/guides/sample_app_ug/dma.rst
 
 General-Purpose Graphics Processing Unit (GPU) API - EXPERIMENTAL
 M: Elena Agostini <eagostini@nvidia.com>
+S: Supported
 F: lib/gpudev/
 F: doc/guides/prog_guide/gpudev.rst
 F: doc/guides/gpus/features/default.ini
@@ -502,6 +573,7 @@ F: app/test-gpudev/
 
 Eventdev API
 M: Jerin Jacob <jerinj@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-eventdev
 F: lib/eventdev/
 F: drivers/event/skeleton/
@@ -510,6 +582,7 @@ F: examples/l3fwd/l3fwd_event*
 
 Eventdev Ethdev Rx Adapter API
 M: Naga Harish K S V <s.v.naga.harish.k@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-eventdev
 F: lib/eventdev/*eth_rx_adapter*
 F: app/test/test_event_eth_rx_adapter.c
@@ -517,6 +590,7 @@ F: doc/guides/prog_guide/event_ethernet_rx_adapter.rst
 
 Eventdev Ethdev Tx Adapter API
 M: Naga Harish K S V <s.v.naga.harish.k@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-eventdev
 F: lib/eventdev/*eth_tx_adapter*
 F: app/test/test_event_eth_tx_adapter.c
@@ -524,6 +598,7 @@ F: doc/guides/prog_guide/event_ethernet_tx_adapter.rst
 
 Eventdev Timer Adapter API
 M: Erik Gabriel Carrillo <erik.g.carrillo@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-eventdev
 F: lib/eventdev/*timer_adapter*
 F: app/test/test_event_timer_adapter.c
@@ -531,6 +606,7 @@ F: doc/guides/prog_guide/event_timer_adapter.rst
 
 Eventdev Crypto Adapter API
 M: Abhinandan Gujjar <abhinandan.gujjar@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-eventdev
 F: lib/eventdev/*crypto_adapter*
 F: app/test/test_event_crypto_adapter.c
@@ -539,6 +615,7 @@ F: doc/guides/prog_guide/event_crypto_adapter.rst
 Raw device API
 M: Sachin Saxena <sachin.saxena@oss.nxp.com>
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
+S: Supported
 F: lib/rawdev/
 F: drivers/raw/skeleton/
 F: app/test/test_rawdev.c
@@ -551,11 +628,13 @@ Memory Pool Drivers
 Bucket memory pool
 M: Artem V. Andreev <artem.andreev@oktetlabs.ru>
 M: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
+S: Supported
 F: drivers/mempool/bucket/
 
 Marvell cnxk
 M: Ashwin Sekhar T K <asekhar@marvell.com>
 M: Pavan Nikhilesh <pbhagavatula@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/mempool/cnxk/
 F: doc/guides/mempool/cnxk.rst
@@ -567,20 +646,24 @@ Bus Drivers
 AMD CDX bus
 M: Nipun Gupta <nipun.gupta@amd.com>
 M: Nikhil Agarwal <nikhil.agarwal@amd.com>
+S: Supported
 F: drivers/bus/cdx/
 
 Auxiliary bus driver - EXPERIMENTAL
 M: Parav Pandit <parav@nvidia.com>
 M: Xueming Li <xuemingl@nvidia.com>
+S: Supported
 F: drivers/bus/auxiliary/
 
 Intel FPGA bus
 M: Rosen Xu <rosen.xu@intel.com>
+S: Supported
 F: drivers/bus/ifpga/
 
 NXP buses
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
 M: Sachin Saxena <sachin.saxena@oss.nxp.com>
+S: Supported
 F: drivers/common/dpaax/
 F: drivers/bus/dpaa/
 F: drivers/bus/fslmc/
@@ -588,36 +671,43 @@ F: drivers/bus/fslmc/
 PCI bus driver
 M: Chenbo Xia <chenbo.xia@intel.com>
 M: Nipun Gupta <nipun.gupta@amd.com>
+S: Supported
 F: drivers/bus/pci/
 
 Platform bus driver
 M: Tomasz Duszynski <tduszynski@marvell.com>
+S: Supported
 F: drivers/bus/platform/
 
 VDEV bus driver
+S: Maintained
 F: drivers/bus/vdev/
 F: app/test/test_vdev.c
 
 VMBUS bus driver
 M: Long Li <longli@microsoft.com>
+S: Supported
 F: drivers/bus/vmbus/
 
 
 Networking Drivers
 ------------------
 M: Ferruh Yigit <ferruh.yigit@amd.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net
 F: doc/guides/nics/features/default.ini
 
 Link bonding
 M: Chas Williams <chas3@att.com>
 M: Min Hu (Connor) <humin29@huawei.com>
+S: Supported
 F: drivers/net/bonding/
 F: doc/guides/prog_guide/link_bonding_poll_mode_drv_lib.rst
 F: app/test/test_link_bonding*
 F: examples/bond/
 
 Linux KNI
+S: Obsolete
 F: kernel/linux/kni/
 F: lib/kni/
 F: doc/guides/prog_guide/kernel_nic_interface.rst
@@ -625,12 +715,14 @@ F: app/test/test_kni.c
 
 Linux AF_PACKET
 M: John W. Linville <linville@tuxdriver.com>
+S: Odd Fixes
 F: drivers/net/af_packet/
 F: doc/guides/nics/features/afpacket.ini
 
 Linux AF_XDP
 M: Ciara Loftus <ciara.loftus@intel.com>
 M: Qi Zhang <qi.z.zhang@intel.com>
+S: Supported
 F: drivers/net/af_xdp/
 F: doc/guides/nics/af_xdp.rst
 F: doc/guides/nics/features/af_xdp.ini
@@ -641,24 +733,28 @@ M: Shai Brandes <shaibran@amazon.com>
 M: Evgeny Schemeilin <evgenys@amazon.com>
 M: Igor Chauskin <igorch@amazon.com>
 M: Ron Beider <rbeider@amazon.com>
+S: Supported
 F: drivers/net/ena/
 F: doc/guides/nics/ena.rst
 F: doc/guides/nics/features/ena.ini
 
 AMD axgbe
 M: Chandubabu Namburu <chandu@amd.com>
+S: Supported
 F: drivers/net/axgbe/
 F: doc/guides/nics/axgbe.rst
 F: doc/guides/nics/features/axgbe.ini
 
 AMD Pensando ionic
 M: Andrew Boyer <andrew.boyer@amd.com>
+S: Supported
 F: drivers/net/ionic/
 F: doc/guides/nics/ionic.rst
 F: doc/guides/nics/features/ionic.ini
 
 Marvell/Aquantia atlantic
 M: Igor Russkikh <irusskikh@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/net/atlantic/
 F: doc/guides/nics/atlantic.rst
@@ -668,6 +764,7 @@ Atomic Rules ARK
 M: Shepard Siegel <shepard.siegel@atomicrules.com>
 M: Ed Czeck <ed.czeck@atomicrules.com>
 M: John Miller <john.miller@atomicrules.com>
+S: Supported
 F: drivers/net/ark/
 F: doc/guides/nics/ark.rst
 F: doc/guides/nics/features/ark.ini
@@ -675,6 +772,7 @@ F: doc/guides/nics/features/ark.ini
 Broadcom bnxt
 M: Ajit Khaparde <ajit.khaparde@broadcom.com>
 M: Somnath Kotur <somnath.kotur@broadcom.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-brcm
 F: drivers/net/bnxt/
 F: doc/guides/nics/bnxt.rst
@@ -683,6 +781,7 @@ F: doc/guides/nics/features/bnxt.ini
 Cavium ThunderX nicvf
 M: Jerin Jacob <jerinj@marvell.com>
 M: Maciej Czekaj <mczekaj@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/net/thunderx/
 F: doc/guides/nics/thunderx.rst
@@ -690,6 +789,7 @@ F: doc/guides/nics/features/thunderx.ini
 
 Cavium OCTEON TX
 M: Harman Kalra <hkalra@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/common/octeontx/
 F: drivers/mempool/octeontx/
@@ -699,6 +799,7 @@ F: doc/guides/nics/features/octeontx.ini
 
 Chelsio cxgbe
 M: Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>
+S: Supported
 F: drivers/net/cxgbe/
 F: doc/guides/nics/cxgbe.rst
 F: doc/guides/nics/features/cxgbe.ini
@@ -706,6 +807,7 @@ F: doc/guides/nics/features/cxgbe.ini
 Cisco enic
 M: John Daley <johndale@cisco.com>
 M: Hyong Youb Kim <hyonkim@cisco.com>
+S: Supported
 F: drivers/net/enic/
 F: doc/guides/nics/enic.rst
 F: doc/guides/nics/features/enic.ini
@@ -715,6 +817,7 @@ M: Junfeng Guo <junfeng.guo@intel.com>
 M: Jeroen de Borst <jeroendb@google.com>
 M: Rushil Gupta <rushilg@google.com>
 M: Joshua Washington <joshwash@google.com>
+S: Supported
 F: drivers/net/gve/
 F: doc/guides/nics/gve.rst
 F: doc/guides/nics/features/gve.ini
@@ -722,6 +825,7 @@ F: doc/guides/nics/features/gve.ini
 Hisilicon hns3
 M: Dongdong Liu <liudongdong3@huawei.com>
 M: Yisen Zhuang <yisen.zhuang@huawei.com>
+S: Supported
 F: drivers/net/hns3/
 F: doc/guides/nics/hns3.rst
 F: doc/guides/nics/features/hns3.ini
@@ -730,6 +834,7 @@ Huawei hinic
 M: Ziyang Xuan <xuanziyang2@huawei.com>
 M: Xiaoyun Wang <cloud.wangxiaoyun@huawei.com>
 M: Guoyang Zhou <zhouguoyang@huawei.com>
+S: Supported
 F: drivers/net/hinic/
 F: doc/guides/nics/hinic.rst
 F: doc/guides/nics/features/hinic.ini
@@ -737,6 +842,7 @@ F: doc/guides/nics/features/hinic.ini
 Intel e1000
 M: Simei Su <simei.su@intel.com>
 M: Wenjun Wu <wenjun1.wu@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/e1000/
 F: doc/guides/nics/e1000em.rst
@@ -747,6 +853,7 @@ F: doc/guides/nics/features/igb*.ini
 Intel ixgbe
 M: Qiming Yang <qiming.yang@intel.com>
 M: Wenjun Wu <wenjun1.wu@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/ixgbe/
 F: doc/guides/nics/ixgbe.rst
@@ -756,6 +863,7 @@ F: doc/guides/nics/features/ixgbe*.ini
 Intel i40e
 M: Yuying Zhang <Yuying.Zhang@intel.com>
 M: Beilei Xing <beilei.xing@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/i40e/
 F: doc/guides/nics/i40e.rst
@@ -765,6 +873,7 @@ F: doc/guides/nics/features/i40e*.ini
 Intel fm10k
 M: Qi Zhang <qi.z.zhang@intel.com>
 M: Xiao Wang <xiao.w.wang@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/fm10k/
 F: doc/guides/nics/fm10k.rst
@@ -773,6 +882,7 @@ F: doc/guides/nics/features/fm10k*.ini
 Intel iavf
 M: Jingjing Wu <jingjing.wu@intel.com>
 M: Beilei Xing <beilei.xing@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/iavf/
 F: drivers/common/iavf/
@@ -781,6 +891,7 @@ F: doc/guides/nics/features/iavf*.ini
 Intel ice
 M: Qiming Yang <qiming.yang@intel.com>
 M: Qi Zhang <qi.z.zhang@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/ice/
 F: doc/guides/nics/ice.rst
@@ -789,6 +900,7 @@ F: doc/guides/nics/features/ice.ini
 Intel idpf
 M: Jingjing Wu <jingjing.wu@intel.com>
 M: Beilei Xing <beilei.xing@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/idpf/
 F: drivers/common/idpf/
@@ -798,6 +910,7 @@ F: doc/guides/nics/features/idpf.ini
 Intel cpfl - EXPERIMENTAL
 M: Yuying Zhang <yuying.zhang@intel.com>
 M: Beilei Xing <beilei.xing@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/cpfl/
 F: doc/guides/nics/cpfl.rst
@@ -806,6 +919,7 @@ F: doc/guides/nics/features/cpfl.ini
 Intel igc
 M: Junfeng Guo <junfeng.guo@intel.com>
 M: Simei Su <simei.su@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/igc/
 F: doc/guides/nics/igc.rst
@@ -814,6 +928,7 @@ F: doc/guides/nics/features/igc.ini
 Intel ipn3ke
 M: Rosen Xu <rosen.xu@intel.com>
 T: git://dpdk.org/next/dpdk-next-net-intel
+S: Supported
 F: drivers/net/ipn3ke/
 F: doc/guides/nics/ipn3ke.rst
 F: doc/guides/nics/features/ipn3ke.ini
@@ -823,6 +938,7 @@ M: Nithin Dabilpuram <ndabilpuram@marvell.com>
 M: Kiran Kumar K <kirankumark@marvell.com>
 M: Sunil Kumar Kori <skori@marvell.com>
 M: Satha Rao <skoteshwar@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/common/cnxk/
 F: drivers/net/cnxk/
@@ -832,6 +948,7 @@ F: doc/guides/platform/cnxk.rst
 
 Marvell mvpp2
 M: Liron Himi <lironh@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/common/mvep/
 F: drivers/net/mvpp2/
@@ -841,6 +958,7 @@ F: doc/guides/nics/features/mvpp2.ini
 Marvell mvneta
 M: Zyta Szpak <zr@semihalf.com>
 M: Liron Himi <lironh@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/net/mvneta/
 F: doc/guides/nics/mvneta.rst
@@ -848,6 +966,7 @@ F: doc/guides/nics/features/mvneta.ini
 
 Marvell OCTEON TX EP - endpoint
 M: Vamsi Attunuru <vattunuru@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/net/octeon_ep/
 F: doc/guides/nics/features/octeon_ep.ini
@@ -856,6 +975,7 @@ F: doc/guides/nics/octeon_ep.rst
 NVIDIA mlx4
 M: Matan Azrad <matan@nvidia.com>
 M: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mlx
 F: drivers/net/mlx4/
 F: doc/guides/nics/mlx4.rst
@@ -866,6 +986,7 @@ M: Matan Azrad <matan@nvidia.com>
 M: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
 M: Ori Kam <orika@nvidia.com>
 M: Suanming Mou <suanmingm@nvidia.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mlx
 F: drivers/common/mlx5/
 F: drivers/net/mlx5/
@@ -875,23 +996,27 @@ F: doc/guides/nics/features/mlx5.ini
 
 Microsoft mana
 M: Long Li <longli@microsoft.com>
+S: Supported
 F: drivers/net/mana/
 F: doc/guides/nics/mana.rst
 F: doc/guides/nics/features/mana.ini
 
 Microsoft vdev_netvsc - EXPERIMENTAL
 M: Matan Azrad <matan@nvidia.com>
+S: Odd Fixes
 F: drivers/net/vdev_netvsc/
 F: doc/guides/nics/vdev_netvsc.rst
 
 Microsoft Hyper-V netvsc
 M: Long Li <longli@microsoft.com>
+S: Supported
 F: drivers/net/netvsc/
 F: doc/guides/nics/netvsc.rst
 F: doc/guides/nics/features/netvsc.ini
 
 Netcope nfb
 M: Martin Spinler <spinler@cesnet.cz>
+S: Supported
 F: drivers/net/nfb/
 F: doc/guides/nics/nfb.rst
 F: doc/guides/nics/features/nfb.ini
@@ -899,6 +1024,7 @@ F: doc/guides/nics/features/nfb.ini
 Netronome nfp
 M: Chaoyong He <chaoyong.he@corigine.com>
 M: Niklas Soderlund <niklas.soderlund@corigine.com>
+S: Supported
 F: drivers/net/nfp/
 F: doc/guides/nics/nfp.rst
 F: doc/guides/nics/features/nfp*.ini
@@ -906,6 +1032,7 @@ F: doc/guides/nics/features/nfp*.ini
 NXP dpaa
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
 M: Sachin Saxena <sachin.saxena@oss.nxp.com>
+S: Supported
 F: drivers/mempool/dpaa/
 F: drivers/net/dpaa/
 F: doc/guides/nics/dpaa.rst
@@ -914,6 +1041,7 @@ F: doc/guides/nics/features/dpaa.ini
 NXP dpaa2
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
 M: Sachin Saxena <sachin.saxena@oss.nxp.com>
+S: Supported
 F: drivers/mempool/dpaa2/
 F: drivers/net/dpaa2/
 F: doc/guides/nics/dpaa2.rst
@@ -922,6 +1050,7 @@ F: doc/guides/nics/features/dpaa2.ini
 NXP enetc
 M: Gagandeep Singh <g.singh@nxp.com>
 M: Sachin Saxena <sachin.saxena@oss.nxp.com>
+S: Supported
 F: drivers/net/enetc/
 F: doc/guides/nics/enetc.rst
 F: doc/guides/nics/features/enetc.ini
@@ -929,18 +1058,21 @@ F: doc/guides/nics/features/enetc.ini
 NXP enetfec - EXPERIMENTAL
 M: Apeksha Gupta <apeksha.gupta@nxp.com>
 M: Sachin Saxena <sachin.saxena@nxp.com>
+S: Supported
 F: drivers/net/enetfec/
 F: doc/guides/nics/enetfec.rst
 F: doc/guides/nics/features/enetfec.ini
 
 NXP pfe
 M: Gagandeep Singh <g.singh@nxp.com>
+S: Supported
 F: doc/guides/nics/pfe.rst
 F: drivers/net/pfe/
 F: doc/guides/nics/features/pfe.ini
 
 Marvell QLogic bnx2x
 M: Julien Aube <julien_dpdk@jaube.fr>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/net/bnx2x/
 F: doc/guides/nics/bnx2x.rst
@@ -949,6 +1081,7 @@ F: doc/guides/nics/features/bnx2x*.ini
 Marvell QLogic qede PMD
 M: Devendra Singh Rawat <dsinghrawat@marvell.com>
 M: Alok Prasad <palok@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/net/qede/
 F: doc/guides/nics/qede.rst
@@ -956,6 +1089,7 @@ F: doc/guides/nics/features/qede*.ini
 
 Solarflare sfc_efx
 M: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
+S: Supported
 F: drivers/common/sfc_efx/
 F: drivers/net/sfc/
 F: doc/guides/nics/sfc_efx.rst
@@ -963,6 +1097,7 @@ F: doc/guides/nics/features/sfc.ini
 
 Wangxun ngbe
 M: Jiawen Wu <jiawenwu@trustnetic.com>
+S: Supported
 F: drivers/net/ngbe/
 F: doc/guides/nics/ngbe.rst
 F: doc/guides/nics/features/ngbe.ini
@@ -970,12 +1105,14 @@ F: doc/guides/nics/features/ngbe.ini
 Wangxun txgbe
 M: Jiawen Wu <jiawenwu@trustnetic.com>
 M: Jian Wang <jianwang@trustnetic.com>
+S: Supported
 F: drivers/net/txgbe/
 F: doc/guides/nics/txgbe.rst
 F: doc/guides/nics/features/txgbe.ini
 
 VMware vmxnet3
 M: Jochen Behrens <jbehrens@vmware.com>
+S: Supported
 F: drivers/net/vmxnet3/
 F: doc/guides/nics/vmxnet3.rst
 F: doc/guides/nics/features/vmxnet3.ini
@@ -983,6 +1120,7 @@ F: doc/guides/nics/features/vmxnet3.ini
 Vhost-user
 M: Maxime Coquelin <maxime.coquelin@redhat.com>
 M: Chenbo Xia <chenbo.xia@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-virtio
 F: lib/vhost/
 F: doc/guides/prog_guide/vhost_lib.rst
@@ -997,6 +1135,7 @@ F: doc/guides/sample_app_ug/vdpa.rst
 Vhost PMD
 M: Maxime Coquelin <maxime.coquelin@redhat.com>
 M: Chenbo Xia <chenbo.xia@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-virtio
 F: drivers/net/vhost/
 F: doc/guides/nics/vhost.rst
@@ -1005,6 +1144,7 @@ F: doc/guides/nics/features/vhost.ini
 Virtio PMD
 M: Maxime Coquelin <maxime.coquelin@redhat.com>
 M: Chenbo Xia <chenbo.xia@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-virtio
 F: drivers/net/virtio/
 F: doc/guides/nics/virtio.rst
@@ -1013,26 +1153,31 @@ F: doc/guides/nics/features/virtio*.ini
 Wind River AVP
 M: Steven Webster <steven.webster@windriver.com>
 M: Matt Peters <matt.peters@windriver.com>
+S: Supported
 F: drivers/net/avp/
 F: doc/guides/nics/avp.rst
 F: doc/guides/nics/features/avp.ini
 
 PCAP PMD
+S: Orphan
 F: drivers/net/pcap/
 F: doc/guides/nics/pcap_ring.rst
 F: doc/guides/nics/features/pcap.ini
 
 Tap PMD
+S: Orphan
 F: drivers/net/tap/
 F: doc/guides/nics/tap.rst
 F: doc/guides/nics/features/tap.ini
 
 KNI PMD
+S: Obsolete
 F: drivers/net/kni/
 F: doc/guides/nics/kni.rst
 
 Ring PMD
 M: Bruce Richardson <bruce.richardson@intel.com>
+S: Supported
 F: drivers/net/ring/
 F: doc/guides/nics/pcap_ring.rst
 F: app/test/test_pmd_ring.c
@@ -1040,21 +1185,25 @@ F: app/test/test_pmd_ring_perf.c
 
 Null Networking PMD
 M: Tetsuya Mukawa <mtetsuyah@gmail.com>
+S: Supported
 F: drivers/net/null/
 
 Fail-safe PMD
 M: Gaetan Rivet <grive@u256.net>
+S: Odd Fixes
 F: drivers/net/failsafe/
 F: doc/guides/nics/fail_safe.rst
 F: doc/guides/nics/features/failsafe.ini
 
 Softnic PMD
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
+S: Supported
 F: drivers/net/softnic/
 F: doc/guides/nics/softnic.rst
 
 Memif PMD
 M: Jakub Grajciar <jgrajcia@cisco.com>
+S: Supported
 F: drivers/net/memif/
 F: doc/guides/nics/memif.rst
 F: doc/guides/nics/features/memif.ini
@@ -1062,17 +1211,20 @@ F: doc/guides/nics/features/memif.ini
 
 Crypto Drivers
 --------------
+S: Maintained
 T: git://dpdk.org/next/dpdk-next-crypto
 F: doc/guides/cryptodevs/features/default.ini
 
 AMD CCP Crypto
 M: Sunil Uttarwar <sunilprakashrao.uttarwar@amd.com>
+S: Supported
 F: drivers/crypto/ccp/
 F: doc/guides/cryptodevs/ccp.rst
 F: doc/guides/cryptodevs/features/ccp.ini
 
 ARMv8 Crypto
 M: Ruifeng Wang <ruifeng.wang@arm.com>
+S: Supported
 F: drivers/crypto/armv8/
 F: doc/guides/cryptodevs/armv8.rst
 F: doc/guides/cryptodevs/features/armv8.ini
@@ -1081,12 +1233,14 @@ Broadcom FlexSparc
 M: Ajit Khaparde <ajit.khaparde@broadcom.com>
 M: Raveendra Padasalagi <raveendra.padasalagi@broadcom.com>
 M: Vikas Gupta <vikas.gupta@broadcom.com>
+S: Supported
 F: drivers/crypto/bcmfs/
 F: doc/guides/cryptodevs/bcmfs.rst
 F: doc/guides/cryptodevs/features/bcmfs.ini
 
 Cavium OCTEON TX crypto
 M: Anoob Joseph <anoobj@marvell.com>
+S: Supported
 F: drivers/common/cpt/
 F: drivers/crypto/octeontx/
 F: doc/guides/cryptodevs/octeontx.rst
@@ -1094,17 +1248,20 @@ F: doc/guides/cryptodevs/features/octeontx.ini
 
 Crypto Scheduler
 M: Kai Ji <kai.ji@intel.com>
+S: Supported
 F: drivers/crypto/scheduler/
 F: doc/guides/cryptodevs/scheduler.rst
 
 HiSilicon UADK crypto
 M: Zhangfei Gao <zhangfei.gao@linaro.org>
+S: Supported
 F: drivers/crypto/uadk/
 F: doc/guides/cryptodevs/uadk.rst
 F: doc/guides/cryptodevs/features/uadk.ini
 
 Intel QuickAssist
 M: Kai Ji <kai.ji@intel.com>
+S: Supported
 F: drivers/crypto/qat/
 F: drivers/common/qat/
 F: doc/guides/cryptodevs/qat.rst
@@ -1113,6 +1270,7 @@ F: doc/guides/cryptodevs/features/qat.ini
 IPsec MB
 M: Kai Ji <kai.ji@intel.com>
 M: Pablo de Lara <pablo.de.lara.guarch@intel.com>
+S: Supported
 F: drivers/crypto/ipsec_mb/
 F: doc/guides/cryptodevs/aesni_gcm.rst
 F: doc/guides/cryptodevs/aesni_mb.rst
@@ -1131,6 +1289,7 @@ Marvell cnxk crypto
 M: Ankur Dwivedi <adwivedi@marvell.com>
 M: Anoob Joseph <anoobj@marvell.com>
 M: Tejasree Kondoj <ktejasree@marvell.com>
+S: Supported
 F: drivers/crypto/cnxk/
 F: doc/guides/cryptodevs/cnxk.rst
 F: doc/guides/cryptodevs/features/cn9k.ini
@@ -1139,6 +1298,7 @@ F: doc/guides/cryptodevs/features/cn10k.ini
 Marvell mvsam
 M: Michael Shamis <michaelsh@marvell.com>
 M: Liron Himi <lironh@marvell.com>
+S: Supported
 F: drivers/crypto/mvsam/
 F: doc/guides/cryptodevs/mvsam.rst
 F: doc/guides/cryptodevs/features/mvsam.ini
@@ -1146,18 +1306,21 @@ F: doc/guides/cryptodevs/features/mvsam.ini
 Marvell Nitrox
 M: Nagadheeraj Rottela <rnagadheeraj@marvell.com>
 M: Srikanth Jampala <jsrikanth@marvell.com>
+S: Supported
 F: drivers/crypto/nitrox/
 F: doc/guides/cryptodevs/nitrox.rst
 F: doc/guides/cryptodevs/features/nitrox.ini
 
 NVIDIA mlx5
 M: Matan Azrad <matan@nvidia.com>
+S: Supported
 F: drivers/crypto/mlx5/
 F: doc/guides/cryptodevs/mlx5.rst
 F: doc/guides/cryptodevs/features/mlx5.ini
 
 Null Crypto
 M: Kai Ji <kai.ji@intel.com>
+S: Supported
 F: drivers/crypto/null/
 F: doc/guides/cryptodevs/null.rst
 F: doc/guides/cryptodevs/features/null.ini
@@ -1165,6 +1328,7 @@ F: doc/guides/cryptodevs/features/null.ini
 NXP CAAM JR
 M: Gagandeep Singh <g.singh@nxp.com>
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
+S: Supported
 F: drivers/crypto/caam_jr/
 F: doc/guides/cryptodevs/caam_jr.rst
 F: doc/guides/cryptodevs/features/caam_jr.ini
@@ -1172,6 +1336,7 @@ F: doc/guides/cryptodevs/features/caam_jr.ini
 NXP DPAA_SEC
 M: Gagandeep Singh <g.singh@nxp.com>
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
+S: Supported
 F: drivers/crypto/dpaa_sec/
 F: doc/guides/cryptodevs/dpaa_sec.rst
 F: doc/guides/cryptodevs/features/dpaa_sec.ini
@@ -1179,18 +1344,21 @@ F: doc/guides/cryptodevs/features/dpaa_sec.ini
 NXP DPAA2_SEC
 M: Gagandeep Singh <g.singh@nxp.com>
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
+S: Supported
 F: drivers/crypto/dpaa2_sec/
 F: doc/guides/cryptodevs/dpaa2_sec.rst
 F: doc/guides/cryptodevs/features/dpaa2_sec.ini
 
 OpenSSL
 M: Kai Ji <kai.ji@intel.com>
+S: Supported
 F: drivers/crypto/openssl/
 F: doc/guides/cryptodevs/openssl.rst
 F: doc/guides/cryptodevs/features/openssl.ini
 
 Virtio
 M: Jay Zhou <jianjay.zhou@huawei.com>
+S: Supported
 F: drivers/crypto/virtio/
 F: doc/guides/cryptodevs/virtio.rst
 F: doc/guides/cryptodevs/features/virtio.ini
@@ -1198,31 +1366,37 @@ F: doc/guides/cryptodevs/features/virtio.ini
 
 Compression Drivers
 -------------------
+S: Maintained
 T: git://dpdk.org/next/dpdk-next-crypto
 
 Cavium OCTEON TX zipvf
 M: Ashish Gupta <ashish.gupta@marvell.com>
+S: Supported
 F: drivers/compress/octeontx/
 F: doc/guides/compressdevs/octeontx.rst
 F: doc/guides/compressdevs/features/octeontx.ini
 
 Intel QuickAssist
 M: Kai Ji <kai.ji@intel.com>
+S: Supported
 F: drivers/compress/qat/
 F: drivers/common/qat/
 
 ISA-L
 M: Lee Daly <lee.daly@intel.com>
+S: Supported
 F: drivers/compress/isal/
 F: doc/guides/compressdevs/isal.rst
 F: doc/guides/compressdevs/features/isal.ini
 
 NVIDIA mlx5
 M: Matan Azrad <matan@nvidia.com>
+S: Supported
 F: drivers/compress/mlx5/
 
 ZLIB
 M: Sunila Sahu <ssahu@marvell.com>
+S: Supported
 F: drivers/compress/zlib/
 F: doc/guides/compressdevs/zlib.rst
 F: doc/guides/compressdevs/features/zlib.ini
@@ -1234,34 +1408,40 @@ DMAdev Drivers
 Intel IDXD - EXPERIMENTAL
 M: Bruce Richardson <bruce.richardson@intel.com>
 M: Kevin Laatz <kevin.laatz@intel.com>
+S: Supported
 F: drivers/dma/idxd/
 F: doc/guides/dmadevs/idxd.rst
 
 Intel IOAT
 M: Bruce Richardson <bruce.richardson@intel.com>
 M: Conor Walsh <conor.walsh@intel.com>
+S: Supported
 F: drivers/dma/ioat/
 F: doc/guides/dmadevs/ioat.rst
 
 HiSilicon DMA
 M: Chengwen Feng <fengchengwen@huawei.com>
+S: Supported
 F: drivers/dma/hisilicon/
 F: doc/guides/dmadevs/hisilicon.rst
 
 Marvell CNXK DPI DMA
 M: Vamsi Attunuru <vattunuru@marvell.com>
+S: Supported
 F: drivers/dma/cnxk/
 F: doc/guides/dmadevs/cnxk.rst
 
 NXP DPAA DMA
 M: Gagandeep Singh <g.singh@nxp.com>
 M: Sachin Saxena <sachin.saxena@oss.nxp.com>
+S: Supported
 F: drivers/dma/dpaa/
 F: doc/guides/dmadevs/dpaa.rst
 
 NXP DPAA2 QDMA
 M: Gagandeep Singh <g.singh@nxp.com>
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
+S: Supported
 F: drivers/dma/dpaa2/
 F: doc/guides/dmadevs/dpaa2.rst
 
@@ -1271,12 +1451,14 @@ RegEx Drivers
 
 Marvell OCTEON CN9K regex
 M: Liron Himi <lironh@marvell.com>
+S: Supported
 F: drivers/regex/cn9k/
 F: doc/guides/regexdevs/cn9k.rst
 F: doc/guides/regexdevs/features/cn9k.ini
 
 NVIDIA mlx5
 M: Ori Kam <orika@nvidia.com>
+S: Supported
 F: drivers/regex/mlx5/
 F: doc/guides/regexdevs/mlx5.rst
 F: doc/guides/regexdevs/features/mlx5.ini
@@ -1287,6 +1469,7 @@ MLdev Drivers
 
 Marvell ML CNXK
 M: Srikanth Yalavarthi <syalavarthi@marvell.com>
+S: Supported
 F: drivers/common/cnxk/hw/ml.h
 F: drivers/common/cnxk/roc_ml*
 F: drivers/ml/cnxk/
@@ -1299,6 +1482,7 @@ T: git://dpdk.org/next/dpdk-next-virtio
 
 Intel ifc
 M: Xiao Wang <xiao.w.wang@intel.com>
+S: Supported
 F: drivers/vdpa/ifc/
 F: doc/guides/vdpadevs/ifc.rst
 F: doc/guides/vdpadevs/features/ifcvf.ini
@@ -1306,12 +1490,14 @@ F: doc/guides/vdpadevs/features/ifcvf.ini
 NVIDIA mlx5 vDPA
 M: Matan Azrad <matan@nvidia.com>
 M: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
+S: Supported
 F: drivers/vdpa/mlx5/
 F: doc/guides/vdpadevs/mlx5.rst
 F: doc/guides/vdpadevs/features/mlx5.ini
 
 Xilinx sfc vDPA
 M: Vijay Kumar Srivastava <vsrivast@xilinx.com>
+S: Supported
 F: drivers/vdpa/sfc/
 F: doc/guides/vdpadevs/sfc.rst
 F: doc/guides/vdpadevs/features/sfc.ini
@@ -1320,42 +1506,50 @@ F: doc/guides/vdpadevs/features/sfc.ini
 Eventdev Drivers
 ----------------
 M: Jerin Jacob <jerinj@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-eventdev
 
 Cavium OCTEON TX ssovf
 M: Jerin Jacob <jerinj@marvell.com>
+S: Supported
 F: drivers/event/octeontx/
 F: doc/guides/eventdevs/octeontx.rst
 
 Cavium OCTEON TX timvf
 M: Pavan Nikhilesh <pbhagavatula@marvell.com>
+S: Supported
 F: drivers/event/octeontx/timvf_*
 
 Intel DLB2
 M: Timothy McDaniel <timothy.mcdaniel@intel.com>
+S: Supported
 F: drivers/event/dlb2/
 F: doc/guides/eventdevs/dlb2.rst
 
 Marvell cnxk
 M: Pavan Nikhilesh <pbhagavatula@marvell.com>
 M: Shijith Thotton <sthotton@marvell.com>
+S: Supported
 F: drivers/event/cnxk/
 F: doc/guides/eventdevs/cnxk.rst
 
 NXP DPAA eventdev
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
 M: Sachin Saxena <sachin.saxena@oss.nxp.com>
+S: Supported
 F: drivers/event/dpaa/
 F: doc/guides/eventdevs/dpaa.rst
 
 NXP DPAA2 eventdev
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
 M: Sachin Saxena <sachin.saxena@oss.nxp.com>
+S: Supported
 F: drivers/event/dpaa2/
 F: doc/guides/eventdevs/dpaa2.rst
 
 Software Eventdev PMD
 M: Harry van Haaren <harry.van.haaren@intel.com>
+S: Supported
 F: drivers/event/sw/
 F: doc/guides/eventdevs/sw.rst
 F: examples/eventdev_pipeline/
@@ -1363,11 +1557,13 @@ F: doc/guides/sample_app_ug/eventdev_pipeline.rst
 
 Distributed Software Eventdev PMD
 M: Mattias Rönnblom <mattias.ronnblom@ericsson.com>
+S: Supported
 F: drivers/event/dsw/
 F: doc/guides/eventdevs/dsw.rst
 
 Software OPDL Eventdev PMD
 M: Liang Ma <liangma@liangbit.com>
+S: Supported
 M: Peter Mccarthy <peter.mccarthy@intel.com>
 F: drivers/event/opdl/
 F: doc/guides/eventdevs/opdl.rst
@@ -1378,6 +1574,7 @@ Baseband Drivers
 
 Intel baseband
 M: Nicolas Chautru <nicolas.chautru@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-baseband
 F: drivers/baseband/turbo_sw/
 F: doc/guides/bbdevs/turbo_sw.rst
@@ -1397,6 +1594,7 @@ F: doc/guides/bbdevs/features/vrb1.ini
 
 Null baseband
 M: Nicolas Chautru <nicolas.chautru@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-baseband
 F: drivers/baseband/null/
 F: doc/guides/bbdevs/null.rst
@@ -1405,6 +1603,7 @@ F: doc/guides/bbdevs/features/null.ini
 NXP LA12xx
 M: Gagandeep Singh <g.singh@nxp.com>
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-baseband
 F: drivers/baseband/la12xx/
 F: doc/guides/bbdevs/la12xx.rst
@@ -1416,6 +1615,7 @@ GPU Drivers
 
 NVIDIA CUDA
 M: Elena Agostini <eagostini@nvidia.com>
+S: Supported
 F: drivers/gpu/cuda/
 F: doc/guides/gpus/cuda.rst
 
@@ -1426,6 +1626,7 @@ Rawdev Drivers
 Intel FPGA
 M: Rosen Xu <rosen.xu@intel.com>
 M: Tianfei zhang <tianfei.zhang@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/raw/ifpga/
 F: doc/guides/rawdevs/ifpga.rst
@@ -1433,18 +1634,21 @@ F: doc/guides/rawdevs/ifpga.rst
 Marvell CNXK BPHY
 M: Jakub Palider <jpalider@marvell.com>
 M: Tomasz Duszynski <tduszynski@marvell.com>
+S: Supported
 F: doc/guides/rawdevs/cnxk_bphy.rst
 F: drivers/raw/cnxk_bphy/
 
 Marvell CNXK GPIO
 M: Jakub Palider <jpalider@marvell.com>
 M: Tomasz Duszynski <tduszynski@marvell.com>
+S: Supported
 F: doc/guides/rawdevs/cnxk_gpio.rst
 F: drivers/raw/cnxk_gpio/
 
 NTB
 M: Jingjing Wu <jingjing.wu@intel.com>
 M: Junfeng Guo <junfeng.guo@intel.com>
+S: Supported
 F: drivers/raw/ntb/
 F: doc/guides/rawdevs/ntb.rst
 F: examples/ntb/
@@ -1452,6 +1656,7 @@ F: doc/guides/sample_app_ug/ntb.rst
 
 NXP DPAA2 CMDIF
 M: Gagandeep Singh <g.singh@nxp.com>
+S: Supported
 F: drivers/raw/dpaa2_cmdif/
 F: doc/guides/rawdevs/dpaa2_cmdif.rst
 
@@ -1461,12 +1666,14 @@ Packet processing
 
 Network headers
 M: Olivier Matz <olivier.matz@6wind.com>
+S: Supported
 F: lib/net/
 F: app/test/test_cksum.c
 F: app/test/test_cksum_perf.c
 
 Packet CRC
 M: Jasvinder Singh <jasvinder.singh@intel.com>
+S: Supported
 F: lib/net/net_crc.h
 F: lib/net/rte_net_crc*
 F: lib/net/net_crc_avx512.c
@@ -1475,6 +1682,7 @@ F: app/test/test_crc.c
 
 IP fragmentation & reassembly
 M: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
+S: Supported
 F: lib/ip_frag/
 F: doc/guides/prog_guide/ip_fragment_reassembly_lib.rst
 F: app/test/test_ipfrag.c
@@ -1486,16 +1694,19 @@ F: doc/guides/sample_app_ug/ip_reassembly.rst
 
 Generic Receive Offload - EXPERIMENTAL
 M: Jiayu Hu <jiayu.hu@intel.com>
+S: Supported
 F: lib/gro/
 F: doc/guides/prog_guide/generic_receive_offload_lib.rst
 
 Generic Segmentation Offload
 M: Jiayu Hu <jiayu.hu@intel.com>
+S: Supported
 F: lib/gso/
 F: doc/guides/prog_guide/generic_segmentation_offload_lib.rst
 
 IPsec
 M: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-crypto
 F: lib/ipsec/
 F: app/test/test_ipsec*
@@ -1506,12 +1717,14 @@ F: app/test-sad/
 PDCP - EXPERIMENTAL
 M: Anoob Joseph <anoobj@marvell.com>
 M: Volodymyr Fialko <vfialko@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-crypto
 F: lib/pdcp/
 F: doc/guides/prog_guide/pdcp_lib.rst
 F: app/test/test_pdcp*
 
 Flow Classify - EXPERIMENTAL - UNMAINTAINED
+S: Orphan
 F: lib/flow_classify/
 F: app/test/test_flow_classify*
 F: doc/guides/prog_guide/flow_classify_lib.rst
@@ -1520,6 +1733,7 @@ F: doc/guides/sample_app_ug/flow_classify.rst
 
 Distributor
 M: David Hunt <david.hunt@intel.com>
+S: Supported
 F: lib/distributor/
 F: doc/guides/prog_guide/packet_distrib_lib.rst
 F: app/test/test_distributor*
@@ -1528,6 +1742,7 @@ F: doc/guides/sample_app_ug/dist_app.rst
 
 Reorder
 M: Volodymyr Fialko <vfialko@marvell.com>
+S: Supported
 F: lib/reorder/
 F: doc/guides/prog_guide/reorder_lib.rst
 F: app/test/test_reorder*
@@ -1536,6 +1751,7 @@ F: doc/guides/sample_app_ug/packet_ordering.rst
 
 Hierarchical scheduler
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
+S: Supported
 F: lib/sched/
 F: doc/guides/prog_guide/qos_framework.rst
 F: app/test/test_pie.c
@@ -1547,6 +1763,7 @@ F: doc/guides/sample_app_ug/qos_scheduler.rst
 Packet capture
 M: Reshma Pattan <reshma.pattan@intel.com>
 M: Stephen Hemminger <stephen@networkplumber.org>
+S: Maintained
 F: lib/pdump/
 F: doc/guides/prog_guide/pdump_lib.rst
 F: app/test/test_pdump.*
@@ -1562,6 +1779,7 @@ F: doc/guides/tools/dumpcap.rst
 Packet Framework
 ----------------
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
+S: Obsolete
 F: lib/pipeline/
 F: lib/port/
 F: lib/table/
@@ -1579,6 +1797,7 @@ Algorithms
 
 ACL
 M: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
+S: Supported
 F: lib/acl/
 F: doc/guides/prog_guide/packet_classif_access_ctrl.rst
 F: app/test-acl/
@@ -1587,6 +1806,7 @@ F: app/test/test_acl.*
 EFD
 M: Byron Marohn <byron.marohn@intel.com>
 M: Yipeng Wang <yipeng1.wang@intel.com>
+S: Supported
 F: lib/efd/
 F: doc/guides/prog_guide/efd_lib.rst
 F: app/test/test_efd*
@@ -1598,6 +1818,7 @@ M: Yipeng Wang <yipeng1.wang@intel.com>
 M: Sameh Gobriel <sameh.gobriel@intel.com>
 M: Bruce Richardson <bruce.richardson@intel.com>
 M: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
+S: Supported
 F: lib/hash/
 F: doc/guides/prog_guide/hash_lib.rst
 F: doc/guides/prog_guide/toeplitz_hash_lib.rst
@@ -1607,6 +1828,7 @@ F: app/test/test_func_reentrancy.c
 LPM
 M: Bruce Richardson <bruce.richardson@intel.com>
 M: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
+S: Supported
 F: lib/lpm/
 F: doc/guides/prog_guide/lpm*
 F: app/test/test_lpm*
@@ -1616,12 +1838,14 @@ F: app/test/test_xmmt_ops.h
 Membership - EXPERIMENTAL
 M: Yipeng Wang <yipeng1.wang@intel.com>
 M: Sameh Gobriel <sameh.gobriel@intel.com>
+S: Supported
 F: lib/member/
 F: doc/guides/prog_guide/member_lib.rst
 F: app/test/test_member*
 
 RIB/FIB
 M: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
+S: Supported
 F: lib/rib/
 F: app/test/test_rib*
 F: lib/fib/
@@ -1630,6 +1854,7 @@ F: app/test-fib/
 
 Traffic metering
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
+S: Supported
 F: lib/meter/
 F: doc/guides/sample_app_ug/qos_scheduler.rst
 F: app/test/test_meter.c
@@ -1642,12 +1867,14 @@ Other libraries
 
 Configuration file
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
+S: Supported
 F: lib/cfgfile/
 F: app/test/test_cfgfile.c
 F: app/test/test_cfgfiles/
 
 Interactive command line
 M: Olivier Matz <olivier.matz@6wind.com>
+S: Supported
 F: lib/cmdline/
 F: app/test-cmdline/
 F: app/test/test_cmdline*
@@ -1656,11 +1883,13 @@ F: doc/guides/sample_app_ug/cmd_line.rst
 
 Key/Value parsing
 M: Olivier Matz <olivier.matz@6wind.com>
+S: Supported
 F: lib/kvargs/
 F: app/test/test_kvargs.c
 
 RCU
 M: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
+S: Supported
 F: lib/rcu/
 F: app/test/test_rcu*
 F: doc/guides/prog_guide/rcu_lib.rst
@@ -1668,11 +1897,13 @@ F: doc/guides/prog_guide/rcu_lib.rst
 PCI
 M: Chenbo Xia <chenbo.xia@intel.com>
 M: Gaetan Rivet <grive@u256.net>
+S: Supported
 F: lib/pci/
 
 Power management
 M: Anatoly Burakov <anatoly.burakov@intel.com>
 M: David Hunt <david.hunt@intel.com>
+S: Supported
 F: lib/power/
 F: doc/guides/prog_guide/power_man.rst
 F: app/test/test_power*
@@ -1683,6 +1914,7 @@ F: doc/guides/sample_app_ug/vm_power_management.rst
 
 Timers
 M: Erik Gabriel Carrillo <erik.g.carrillo@intel.com>
+S: Supported
 F: lib/timer/
 F: doc/guides/prog_guide/timer_lib.rst
 F: app/test/test_timer*
@@ -1690,25 +1922,30 @@ F: examples/timer/
 F: doc/guides/sample_app_ug/timer.rst
 
 Job statistics
+S: Orphan
 F: lib/jobstats/
 F: examples/l2fwd-jobstats/
 F: doc/guides/sample_app_ug/l2_forward_job_stats.rst
 
 Metrics
+S: Orphan
 F: lib/metrics/
 F: app/test/test_metrics.c
 
 Bit-rate statistics
+S: Orphan
 F: lib/bitratestats/
 F: app/test/test_bitratestats.c
 
 Latency statistics
 M: Reshma Pattan <reshma.pattan@intel.com>
+S: Supported
 F: lib/latencystats/
 F: app/test/test_latencystats.c
 
 Telemetry
 M: Ciara Power <ciara.power@intel.com>
+S: Supported
 F: lib/telemetry/
 F: app/test/test_telemetry*
 F: usertools/dpdk-telemetry*
@@ -1716,6 +1953,7 @@ F: doc/guides/howto/telemetry.rst
 
 BPF
 M: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
+S: Supported
 F: lib/bpf/
 F: examples/bpf/
 F: app/test/test_bpf.c
@@ -1727,6 +1965,7 @@ M: Jerin Jacob <jerinj@marvell.com>
 M: Kiran Kumar K <kirankumark@marvell.com>
 M: Nithin Dabilpuram <ndabilpuram@marvell.com>
 M: Zhirun Yan <zhirun.yan@intel.com>
+S: Supported
 F: lib/graph/
 F: doc/guides/prog_guide/graph_lib.rst
 F: app/test/test_graph*
@@ -1736,6 +1975,7 @@ F: doc/guides/sample_app_ug/l3_forward_graph.rst
 Nodes - EXPERIMENTAL
 M: Nithin Dabilpuram <ndabilpuram@marvell.com>
 M: Pavan Nikhilesh <pbhagavatula@marvell.com>
+S: Supported
 F: lib/node/
 
 
@@ -1743,6 +1983,7 @@ Test Applications
 -----------------
 
 Unit tests framework
+S: Maintained
 F: app/test/commands.c
 F: app/test/has_hugepage.py
 F: app/test/packet_burst_generator.c
@@ -1758,45 +1999,53 @@ F: app/test/virtual_pmd.h
 
 Sample packet helper functions for unit test
 M: Reshma Pattan <reshma.pattan@intel.com>
+S: Supported
 F: app/test/sample_packet_forward.c
 F: app/test/sample_packet_forward.h
 
 Networking drivers testing tool
 M: Aman Singh <aman.deep.singh@intel.com>
 M: Yuying Zhang <yuying.zhang@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net
 F: app/test-pmd/
 F: doc/guides/testpmd_app_ug/
 
 DMA device performance tool
 M: Cheng Jiang <cheng1.jiang@intel.com>
+S: Supported
 F: app/test-dma-perf/
 F: doc/guides/tools/dmaperf.rst
 
 Flow performance tool
 M: Wisam Jaddo <wisamm@nvidia.com>
+S: Supported
 F: app/test-flow-perf/
 F: doc/guides/tools/flow-perf.rst
 
 Security performance tool
 M: Anoob Joseph <anoobj@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-crypto
 F: app/test-security-perf/
 F: doc/guides/tools/securityperf.rst
 
 Compression performance test application
 T: git://dpdk.org/next/dpdk-next-crypto
+S: Orphan
 F: app/test-compress-perf/
 F: doc/guides/tools/comp_perf.rst
 
 Crypto performance test application
 M: Ciara Power <ciara.power@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-crypto
 F: app/test-crypto-perf/
 F: doc/guides/tools/cryptoperf.rst
 
 Eventdev test application
 M: Jerin Jacob <jerinj@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-eventdev
 F: app/test-eventdev/
 F: doc/guides/tools/testeventdev.rst
@@ -1805,12 +2054,14 @@ F: app/test/test_event_ring.c
 
 Procinfo tool
 M: Reshma Pattan <reshma.pattan@intel.com>
+S: Supported
 F: app/proc-info/
 F: doc/guides/tools/proc_info.rst
 
 DTS
 M: Lijuan Tu <lijuan.tu@intel.com>
 M: Juraj Linkeš <juraj.linkes@pantheon.tech>
+S: Supported
 F: dts/
 F: devtools/dts-check-format.sh
 F: doc/guides/tools/dts.rst
@@ -1820,77 +2071,92 @@ Other Example Applications
 --------------------------
 
 Ethtool example
+S: Orphan
 F: examples/ethtool/
 F: doc/guides/sample_app_ug/ethtool.rst
 
 FIPS validation example
 M: Brian Dooley <brian.dooley@intel.com>
 M: Gowrishankar Muthukrishnan <gmuthukrishn@marvell.com>
+S: Supported
 F: examples/fips_validation/
 F: doc/guides/sample_app_ug/fips_validation.rst
 
 Flow filtering example
 M: Ori Kam <orika@nvidia.com>
+S: Supported
 F: examples/flow_filtering/
 F: doc/guides/sample_app_ug/flow_filtering.rst
 
 Helloworld example
 M: Bruce Richardson <bruce.richardson@intel.com>
+S: Supported
 F: examples/helloworld/
 F: doc/guides/sample_app_ug/hello_world.rst
 
 IPsec security gateway example
 M: Radu Nicolau <radu.nicolau@intel.com>
 M: Akhil Goyal <gakhil@marvell.com>
+S: Supported
 F: examples/ipsec-secgw/
 F: doc/guides/sample_app_ug/ipsec_secgw.rst
 
 IPv4 multicast example
+S: Orphan
 F: examples/ipv4_multicast/
 F: doc/guides/sample_app_ug/ipv4_multicast.rst
 
 L2 forwarding example
 M: Bruce Richardson <bruce.richardson@intel.com>
+S: Supported
 F: examples/l2fwd/
 F: doc/guides/sample_app_ug/l2_forward_real_virtual.rst
 
 L2 forwarding with cache allocation example
 M: Tomasz Kantecki <tomasz.kantecki@intel.com>
+S: Supported
 F: doc/guides/sample_app_ug/l2_forward_cat.rst
 F: examples/l2fwd-cat/
 
 L2 forwarding with eventdev example
 M: Sunil Kumar Kori <skori@marvell.com>
 M: Pavan Nikhilesh <pbhagavatula@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-eventdev
 F: examples/l2fwd-event/
 F: doc/guides/sample_app_ug/l2_forward_event.rst
 
 L3 forwarding example
+S: Maintained
 F: examples/l3fwd/
 F: doc/guides/sample_app_ug/l3_forward.rst
 
 Link status interrupt example
+S: Maintained
 F: examples/link_status_interrupt/
 F: doc/guides/sample_app_ug/link_status_intr.rst
 
 PTP client example
 M: Kirill Rybalchenko <kirill.rybalchenko@intel.com>
+S: Supported
 F: examples/ptpclient/
 
 Rx/Tx callbacks example
 M: Bruce Richardson <bruce.richardson@intel.com>
 M: John McNamara <john.mcnamara@intel.com>
+S: Supported
 F: examples/rxtx_callbacks/
 F: doc/guides/sample_app_ug/rxtx_callbacks.rst
 
 Skeleton example
 M: Bruce Richardson <bruce.richardson@intel.com>
 M: John McNamara <john.mcnamara@intel.com>
+S: Supported
 F: examples/skeleton/
 F: doc/guides/sample_app_ug/skeleton.rst
 
 VMDq examples
+S: Orphan
 F: examples/vmdq/
 F: doc/guides/sample_app_ug/vmdq_forwarding.rst
 F: examples/vmdq_dcb/
-- 
2.39.2


^ permalink raw reply	[relevance 1%]

* RE: [PATCH] doc: postpone deprecation of pipeline legacy API
  2023-07-19 16:08  3% ` Bruce Richardson
@ 2023-07-20 10:37  0%   ` Dumitrescu, Cristian
  2023-07-28 16:02  0%     ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Dumitrescu, Cristian @ 2023-07-20 10:37 UTC (permalink / raw)
  To: Richardson, Bruce
  Cc: dev, Nicolau, Radu, R, Kamalakannan, Suresh Narayane, Harshad



> -----Original Message-----
> From: Richardson, Bruce <bruce.richardson@intel.com>
> Sent: Wednesday, July 19, 2023 5:09 PM
> To: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>
> Cc: dev@dpdk.org; Nicolau, Radu <radu.nicolau@intel.com>; R,
> Kamalakannan <kamalakannan.r@intel.com>; Suresh Narayane, Harshad
> <harshad.suresh.narayane@intel.com>
> Subject: Re: [PATCH] doc: postpone deprecation of pipeline legacy API
> 
> On Wed, Jul 19, 2023 at 03:12:25PM +0000, Cristian Dumitrescu wrote:
> > Postpone the deprecation of the legacy pipeline, table and port
> > library API and gradual stabilization of the new API.
> >
> > Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
> > ---
> >  doc/guides/rel_notes/deprecation.rst | 21 +++++++++------------
> >  1 file changed, 9 insertions(+), 12 deletions(-)
> >
> 
> No objection to this, though it would be really good to get the new
> functions stabilized in 23.11 when we lock down the 24 ABI.
> 

Yes, fully agree, let's see if we can make this happen for 23.11

> Acked-by: Bruce Richardson <bruce.richardson@intel.com>
> 
> > diff --git a/doc/guides/rel_notes/deprecation.rst
> b/doc/guides/rel_notes/deprecation.rst
> > index fb771a0305..56ef906cdb 100644
> > --- a/doc/guides/rel_notes/deprecation.rst
> > +++ b/doc/guides/rel_notes/deprecation.rst
> > @@ -145,19 +145,16 @@ Deprecation Notices
> >    In the absence of such interest, this library will be removed in DPDK 23.11.
> >
> >  * pipeline: The pipeline library legacy API (functions rte_pipeline_*)
> > -  will be deprecated in DPDK 23.07 release and removed in DPDK 23.11
> release.
> > -  The new pipeline library API (functions rte_swx_pipeline_*)
> > -  will gradually transition from experimental to stable status
> > -  starting with DPDK 23.07 release.
> > +  will be deprecated and subsequently removed in DPDK 24.11 release.
> > +  Before this, the new pipeline library API (functions rte_swx_pipeline_*)
> > +  will gradually transition from experimental to stable status.
> >
> >  * table: The table library legacy API (functions rte_table_*)
> > -  will be deprecated in DPDK 23.07 release and removed in DPDK 23.11
> release.
> > -  The new table library API (functions rte_swx_table_*)
> > -  will gradually transition from experimental to stable status
> > -  starting with DPDK 23.07 release.
> > +  will be deprecated and subsequently removed in DPDK 24.11 release.
> > +  Before this, the new table library API (functions rte_swx_table_*)
> > +  will gradually transition from experimental to stable status.
> >
> >  * port: The port library legacy API (functions rte_port_*)
> > -  will be deprecated in DPDK 23.07 release and removed in DPDK 23.11
> release.
> > -  The new port library API (functions rte_swx_port_*)
> > -  will gradually transition from experimental to stable status
> > -  starting with DPDK 23.07 release.
> > +  will be deprecated and subsequently removed in DPDK 24.11 release.
> > +  Before this, the new port library API (functions rte_swx_port_*)
> > +  will gradually transition from experimental to stable status.
> > --
> > 2.34.1
> >

^ permalink raw reply	[relevance 0%]

* Re: [PATCH] doc: postpone deprecation of pipeline legacy API
  @ 2023-07-19 16:08  3% ` Bruce Richardson
  2023-07-20 10:37  0%   ` Dumitrescu, Cristian
  0 siblings, 1 reply; 200+ results
From: Bruce Richardson @ 2023-07-19 16:08 UTC (permalink / raw)
  To: Cristian Dumitrescu
  Cc: dev, radu.nicolau, kamalakannan.r, harshad.suresh.narayane

On Wed, Jul 19, 2023 at 03:12:25PM +0000, Cristian Dumitrescu wrote:
> Postpone the deprecation of the legacy pipeline, table and port
> library API and gradual stabilization of the new API.
> 
> Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
> ---
>  doc/guides/rel_notes/deprecation.rst | 21 +++++++++------------
>  1 file changed, 9 insertions(+), 12 deletions(-)
>

No objection to this, though it would be really good to get the new
functions stabilized in 23.11 when we lock down the 24 ABI.

Acked-by: Bruce Richardson <bruce.richardson@intel.com>
 
> diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
> index fb771a0305..56ef906cdb 100644
> --- a/doc/guides/rel_notes/deprecation.rst
> +++ b/doc/guides/rel_notes/deprecation.rst
> @@ -145,19 +145,16 @@ Deprecation Notices
>    In the absence of such interest, this library will be removed in DPDK 23.11.
>  
>  * pipeline: The pipeline library legacy API (functions rte_pipeline_*)
> -  will be deprecated in DPDK 23.07 release and removed in DPDK 23.11 release.
> -  The new pipeline library API (functions rte_swx_pipeline_*)
> -  will gradually transition from experimental to stable status
> -  starting with DPDK 23.07 release.
> +  will be deprecated and subsequently removed in DPDK 24.11 release.
> +  Before this, the new pipeline library API (functions rte_swx_pipeline_*)
> +  will gradually transition from experimental to stable status.
>  
>  * table: The table library legacy API (functions rte_table_*)
> -  will be deprecated in DPDK 23.07 release and removed in DPDK 23.11 release.
> -  The new table library API (functions rte_swx_table_*)
> -  will gradually transition from experimental to stable status
> -  starting with DPDK 23.07 release.
> +  will be deprecated and subsequently removed in DPDK 24.11 release.
> +  Before this, the new table library API (functions rte_swx_table_*)
> +  will gradually transition from experimental to stable status.
>  
>  * port: The port library legacy API (functions rte_port_*)
> -  will be deprecated in DPDK 23.07 release and removed in DPDK 23.11 release.
> -  The new port library API (functions rte_swx_port_*)
> -  will gradually transition from experimental to stable status
> -  starting with DPDK 23.07 release.
> +  will be deprecated and subsequently removed in DPDK 24.11 release.
> +  Before this, the new port library API (functions rte_swx_port_*)
> +  will gradually transition from experimental to stable status.
> -- 
> 2.34.1
> 

^ permalink raw reply	[relevance 3%]

* [PATCH v2] MAINTAINERS: add status information
  2023-07-16 21:25  1% [RFC] MAINTAINERS: add status information Stephen Hemminger
@ 2023-07-19 16:07  1% ` Stephen Hemminger
  2023-07-20 17:21  1% ` [PATCH v3] " Stephen Hemminger
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 200+ results
From: Stephen Hemminger @ 2023-07-19 16:07 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger

Add a new field S: which indicates the status of support for
individual sub-trees. Almost everything is marked as supported
but components without any maintainer are listed as Orphan.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
v2 - mark FreeBSD as Odd Fixes
   - pipeline, table, port are marked as deprecated so should be Obsolete

 MAINTAINERS | 267 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 266 insertions(+), 1 deletion(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index 5bb8090ebe7e..7882a3c020bc 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -17,6 +17,16 @@ Descriptions of section entries:
 	X: Files and directories exclusion, same rules as F:
 	K: Keyword regex pattern to match content.
 	   One regex pattern per line. Multiple K: lines acceptable.
+	S: *Status*, one of the following:
+	   Supported:	Someone is actually paid to look after this.
+	   Maintained:	Someone actually looks after it.
+	   Odd Fixes:	It has a maintainer but they don't have time to do
+			much other than throw the odd patch in. See below..
+	   Orphan:	No current maintainer [but maybe you could take the
+			role as you write your new code].
+	   Obsolete:	Old code. Something tagged obsolete generally means
+			it has been replaced by a better system and you
+			should be using that.
 
 
 General Project Administration
@@ -25,44 +35,54 @@ General Project Administration
 Main Branch
 M: Thomas Monjalon <thomas@monjalon.net>
 M: David Marchand <david.marchand@redhat.com>
+S: Supported
 T: git://dpdk.org/dpdk
 
 Next-net Tree
 M: Ferruh Yigit <ferruh.yigit@amd.com>
 M: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net
 
 Next-net-brcm Tree
 M: Ajit Khaparde <ajit.khaparde@broadcom.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-brcm
 
 Next-net-intel Tree
 M: Qi Zhang <qi.z.zhang@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 
 Next-net-mrvl Tree
 M: Jerin Jacob <jerinj@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 
 Next-net-mlx Tree
 M: Raslan Darawsheh <rasland@nvidia.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mlx
 
 Next-virtio Tree
 M: Maxime Coquelin <maxime.coquelin@redhat.com>
 M: Chenbo Xia <chenbo.xia@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-virtio
 
 Next-crypto Tree
 M: Akhil Goyal <gakhil@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-crypto
 
 Next-eventdev Tree
 M: Jerin Jacob <jerinj@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-eventdev
 
 Next-baseband Tree
 M: Maxime Coquelin <maxime.coquelin@redhat.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-baseband
 
 Stable Branches
@@ -70,17 +90,21 @@ M: Luca Boccassi <bluca@debian.org>
 M: Kevin Traynor <ktraynor@redhat.com>
 M: Christian Ehrhardt <christian.ehrhardt@canonical.com>
 M: Xueming Li <xuemingl@nvidia.com>
+S: Supported
 T: git://dpdk.org/dpdk-stable
 
 Security Issues
 M: maintainers@dpdk.org
+S: Supported
 
 Documentation (with overlaps)
 F: README
 F: doc/
+S: Supported
 
 Developers and Maintainers Tools
 M: Thomas Monjalon <thomas@monjalon.net>
+S: Supported
 F: MAINTAINERS
 F: devtools/build-dict.sh
 F: devtools/check-abi.sh
@@ -110,7 +134,7 @@ F: .mailmap
 
 Build System
 M: Bruce Richardson <bruce.richardson@intel.com>
-F: Makefile
+S: Maintained
 F: meson.build
 F: meson_options.txt
 F: config/
@@ -130,11 +154,13 @@ F: devtools/check-meson.py
 Public CI
 M: Aaron Conole <aconole@redhat.com>
 M: Michael Santana <maicolgabriel@hotmail.com>
+S: Supported
 F: .github/workflows/build.yml
 F: .ci/
 
 Driver information
 M: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
+S: Maintained
 F: buildtools/coff.py
 F: buildtools/gen-pmdinfo-cfile.py
 F: buildtools/pmdinfogen.py
@@ -147,6 +173,7 @@ Environment Abstraction Layer
 T: git://dpdk.org/dpdk
 
 EAL API and common code
+S: Supported
 F: lib/eal/common/
 F: lib/eal/unix/
 F: lib/eal/include/
@@ -180,6 +207,7 @@ F: app/test/test_version.c
 Trace - EXPERIMENTAL
 M: Jerin Jacob <jerinj@marvell.com>
 M: Sunil Kumar Kori <skori@marvell.com>
+S: Supported
 F: lib/eal/include/rte_trace*.h
 F: lib/eal/common/eal_common_trace*.c
 F: lib/eal/common/eal_trace.h
@@ -188,6 +216,7 @@ F: app/test/test_trace*
 
 Memory Allocation
 M: Anatoly Burakov <anatoly.burakov@intel.com>
+S: Supported
 F: lib/eal/include/rte_fbarray.h
 F: lib/eal/include/rte_mem*
 F: lib/eal/include/rte_malloc.h
@@ -209,11 +238,13 @@ F: app/test/test_memzone.c
 
 Interrupt Subsystem
 M: Harman Kalra <hkalra@marvell.com>
+S: Supported
 F: lib/eal/include/rte_epoll.h
 F: lib/eal/*/*interrupts.*
 F: app/test/test_interrupts.c
 
 Keep alive
+S: Orphan
 F: lib/eal/include/rte_keepalive.h
 F: lib/eal/common/rte_keepalive.c
 F: examples/l2fwd-keepalive/
@@ -221,6 +252,7 @@ F: doc/guides/sample_app_ug/keep_alive.rst
 
 Secondary process
 M: Anatoly Burakov <anatoly.burakov@intel.com>
+S: Maintained
 K: RTE_PROC_
 F: lib/eal/common/eal_common_proc.c
 F: doc/guides/prog_guide/multi_proc_support.rst
@@ -230,6 +262,7 @@ F: doc/guides/sample_app_ug/multi_process.rst
 
 Service Cores
 M: Harry van Haaren <harry.van.haaren@intel.com>
+S: Supported
 F: lib/eal/include/rte_service.h
 F: lib/eal/include/rte_service_component.h
 F: lib/eal/common/rte_service.c
@@ -240,44 +273,52 @@ F: doc/guides/sample_app_ug/service_cores.rst
 
 Bitops
 M: Joyce Kong <joyce.kong@arm.com>
+S: Supported
 F: lib/eal/include/rte_bitops.h
 F: app/test/test_bitops.c
 
 Bitmap
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
+S: Supported
 F: lib/eal/include/rte_bitmap.h
 F: app/test/test_bitmap.c
 
 MCSlock
 M: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
+S: Supported
 F: lib/eal/include/rte_mcslock.h
 F: app/test/test_mcslock.c
 
 Sequence Lock
 M: Mattias Rönnblom <mattias.ronnblom@ericsson.com>
+S: Supported
 F: lib/eal/include/rte_seqcount.h
 F: lib/eal/include/rte_seqlock.h
 F: app/test/test_seqlock.c
 
 Ticketlock
 M: Joyce Kong <joyce.kong@arm.com>
+S: Supported
 F: lib/eal/include/rte_ticketlock.h
 F: app/test/test_ticketlock.c
 
 Pseudo-random Number Generation
 M: Mattias Rönnblom <mattias.ronnblom@ericsson.com>
+S: Supported
 F: lib/eal/include/rte_random.h
 F: lib/eal/common/rte_random.c
 F: app/test/test_rand_perf.c
 
 ARM v7
 M: Ruifeng Wang <ruifeng.wang@arm.com>
+S: Supported
 F: config/arm/
 F: lib/eal/arm/
 X: lib/eal/arm/include/*_64.h
 
 ARM v8
 M: Ruifeng Wang <ruifeng.wang@arm.com>
+S: Supported
 F: config/arm/
 F: doc/guides/linux_gsg/cross_build_dpdk_for_arm64.rst
 F: lib/eal/arm/
@@ -291,12 +332,14 @@ F: examples/common/neon/
 
 LoongArch
 M: Min Zhou <zhoumin@loongson.cn>
+S: Supported
 F: config/loongarch/
 F: doc/guides/linux_gsg/cross_build_dpdk_for_loongarch.rst
 F: lib/eal/loongarch/
 
 IBM POWER (alpha)
 M: David Christensen <drc@linux.vnet.ibm.com>
+S: Supported
 F: config/ppc/
 F: lib/eal/ppc/
 F: lib/*/*_altivec*
@@ -307,6 +350,7 @@ F: examples/common/altivec/
 
 RISC-V
 M: Stanislaw Kardach <kda@semihalf.com>
+S: Supported
 F: config/riscv/
 F: doc/guides/linux_gsg/cross_build_dpdk_for_riscv.rst
 F: lib/eal/riscv/
@@ -314,6 +358,7 @@ F: lib/eal/riscv/
 Intel x86
 M: Bruce Richardson <bruce.richardson@intel.com>
 M: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
+S: Supported
 F: config/x86/
 F: doc/guides/linux_gsg/nic_perf_intel_platform.rst
 F: buildtools/binutils-avx512-check.py
@@ -330,28 +375,34 @@ F: examples/*/*_avx*
 F: examples/common/sse/
 
 Linux EAL (with overlaps)
+S: Maintained
 F: lib/eal/linux/
 F: doc/guides/linux_gsg/
 
 Linux UIO
+S: Maintained
 F: drivers/bus/pci/linux/*uio*
 
 Linux VFIO
 M: Anatoly Burakov <anatoly.burakov@intel.com>
+S: Supported
 F: lib/eal/linux/*vfio*
 F: drivers/bus/pci/linux/*vfio*
 
 FreeBSD EAL (with overlaps)
 M: Bruce Richardson <bruce.richardson@intel.com>
+S: Odd Fixes
 F: lib/eal/freebsd/
 F: doc/guides/freebsd_gsg/
 
 FreeBSD contigmem
 M: Bruce Richardson <bruce.richardson@intel.com>
+S: Oddd Fixes
 F: kernel/freebsd/contigmem/
 
 FreeBSD UIO
 M: Bruce Richardson <bruce.richardson@intel.com>
+S: Odd Fixes
 F: kernel/freebsd/nic_uio/
 
 Windows support
@@ -359,12 +410,14 @@ M: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
 M: Narcisa Ana Maria Vasile <navasile@linux.microsoft.com>
 M: Dmitry Malloy <dmitrym@microsoft.com>
 M: Pallavi Kadam <pallavi.kadam@intel.com>
+S: Supported
 F: lib/eal/windows/
 F: buildtools/map_to_win.py
 F: doc/guides/windows_gsg/
 
 Windows memory allocation
 M: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
+S: Supported
 F: lib/eal/windows/eal_hugepages.c
 F: lib/eal/windows/eal_mem*
 
@@ -372,10 +425,12 @@ F: lib/eal/windows/eal_mem*
 Core Libraries
 --------------
 T: git://dpdk.org/dpdk
+S: Maintained
 
 Memory pool
 M: Olivier Matz <olivier.matz@6wind.com>
 M: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
+S: Supported
 F: lib/mempool/
 F: drivers/mempool/ring/
 F: doc/guides/prog_guide/mempool_lib.rst
@@ -385,6 +440,7 @@ F: app/test/test_func_reentrancy.c
 Ring queue
 M: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
 M: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
+S: Supported
 F: lib/ring/
 F: doc/guides/prog_guide/ring_lib.rst
 F: app/test/test_ring*
@@ -392,6 +448,7 @@ F: app/test/test_func_reentrancy.c
 
 Stack
 M: Olivier Matz <olivier.matz@6wind.com>
+S: Supported
 F: lib/stack/
 F: drivers/mempool/stack/
 F: app/test/test_stack*
@@ -399,6 +456,7 @@ F: doc/guides/prog_guide/stack_lib.rst
 
 Packet buffer
 M: Olivier Matz <olivier.matz@6wind.com>
+S: Supported
 F: lib/mbuf/
 F: doc/guides/prog_guide/mbuf_lib.rst
 F: app/test/test_mbuf.c
@@ -407,6 +465,7 @@ Ethernet API
 M: Thomas Monjalon <thomas@monjalon.net>
 M: Ferruh Yigit <ferruh.yigit@amd.com>
 M: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net
 F: lib/ethdev/
 F: app/test/test_ethdev*
@@ -415,6 +474,7 @@ F: doc/guides/prog_guide/switch_representation.rst
 
 Flow API
 M: Ori Kam <orika@nvidia.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net
 F: app/test-pmd/cmdline_flow.c
 F: doc/guides/prog_guide/rte_flow.rst
@@ -422,18 +482,21 @@ F: lib/ethdev/rte_flow*
 
 Traffic Management API - EXPERIMENTAL
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net
 F: lib/ethdev/rte_tm*
 F: app/test-pmd/cmdline_tm.*
 
 Traffic Metering and Policing API - EXPERIMENTAL
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net
 F: lib/ethdev/rte_mtr*
 F: app/test-pmd/cmdline_mtr.*
 
 Baseband API
 M: Nicolas Chautru <nicolas.chautru@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-baseband
 F: lib/bbdev/
 F: doc/guides/prog_guide/bbdev.rst
@@ -446,6 +509,7 @@ F: doc/guides/sample_app_ug/bbdev_app.rst
 Crypto API
 M: Akhil Goyal <gakhil@marvell.com>
 M: Fan Zhang <fanzhang.oss@gmail.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-crypto
 F: lib/cryptodev/
 F: app/test/test_cryptodev*
@@ -453,6 +517,7 @@ F: examples/l2fwd-crypto/
 
 Security API
 M: Akhil Goyal <gakhil@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-crypto
 F: lib/security/
 F: doc/guides/prog_guide/rte_security.rst
@@ -461,6 +526,7 @@ F: app/test/test_security*
 Compression API - EXPERIMENTAL
 M: Fan Zhang <fanzhang.oss@gmail.com>
 M: Ashish Gupta <ashish.gupta@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-crypto
 F: lib/compressdev/
 F: drivers/compress/
@@ -470,6 +536,7 @@ F: doc/guides/compressdevs/features/default.ini
 
 RegEx API - EXPERIMENTAL
 M: Ori Kam <orika@nvidia.com>
+S: Supported
 F: lib/regexdev/
 F: app/test-regex/
 F: doc/guides/prog_guide/regexdev.rst
@@ -477,6 +544,7 @@ F: doc/guides/regexdevs/features/default.ini
 
 Machine Learning device API - EXPERIMENTAL
 M: Srikanth Yalavarthi <syalavarthi@marvell.com>
+S: Supported
 F: lib/mldev/
 F: doc/guides/prog_guide/mldev.rst
 F: app/test-mldev/
@@ -484,6 +552,7 @@ F: doc/guides/tools/testmldev.rst
 
 DMA device API - EXPERIMENTAL
 M: Chengwen Feng <fengchengwen@huawei.com>
+S: Supported
 F: lib/dmadev/
 F: drivers/dma/skeleton/
 F: app/test/test_dmadev*
@@ -495,6 +564,7 @@ F: doc/guides/sample_app_ug/dma.rst
 
 General-Purpose Graphics Processing Unit (GPU) API - EXPERIMENTAL
 M: Elena Agostini <eagostini@nvidia.com>
+S: Supported
 F: lib/gpudev/
 F: doc/guides/prog_guide/gpudev.rst
 F: doc/guides/gpus/features/default.ini
@@ -502,6 +572,7 @@ F: app/test-gpudev/
 
 Eventdev API
 M: Jerin Jacob <jerinj@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-eventdev
 F: lib/eventdev/
 F: drivers/event/skeleton/
@@ -510,6 +581,7 @@ F: examples/l3fwd/l3fwd_event*
 
 Eventdev Ethdev Rx Adapter API
 M: Naga Harish K S V <s.v.naga.harish.k@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-eventdev
 F: lib/eventdev/*eth_rx_adapter*
 F: app/test/test_event_eth_rx_adapter.c
@@ -517,6 +589,7 @@ F: doc/guides/prog_guide/event_ethernet_rx_adapter.rst
 
 Eventdev Ethdev Tx Adapter API
 M: Naga Harish K S V <s.v.naga.harish.k@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-eventdev
 F: lib/eventdev/*eth_tx_adapter*
 F: app/test/test_event_eth_tx_adapter.c
@@ -524,6 +597,7 @@ F: doc/guides/prog_guide/event_ethernet_tx_adapter.rst
 
 Eventdev Timer Adapter API
 M: Erik Gabriel Carrillo <erik.g.carrillo@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-eventdev
 F: lib/eventdev/*timer_adapter*
 F: app/test/test_event_timer_adapter.c
@@ -531,6 +605,7 @@ F: doc/guides/prog_guide/event_timer_adapter.rst
 
 Eventdev Crypto Adapter API
 M: Abhinandan Gujjar <abhinandan.gujjar@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-eventdev
 F: lib/eventdev/*crypto_adapter*
 F: app/test/test_event_crypto_adapter.c
@@ -539,6 +614,7 @@ F: doc/guides/prog_guide/event_crypto_adapter.rst
 Raw device API
 M: Sachin Saxena <sachin.saxena@oss.nxp.com>
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
+S: Supported
 F: lib/rawdev/
 F: drivers/raw/skeleton/
 F: app/test/test_rawdev.c
@@ -551,11 +627,13 @@ Memory Pool Drivers
 Bucket memory pool
 M: Artem V. Andreev <artem.andreev@oktetlabs.ru>
 M: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
+S: Supported
 F: drivers/mempool/bucket/
 
 Marvell cnxk
 M: Ashwin Sekhar T K <asekhar@marvell.com>
 M: Pavan Nikhilesh <pbhagavatula@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/mempool/cnxk/
 F: doc/guides/mempool/cnxk.rst
@@ -567,20 +645,24 @@ Bus Drivers
 AMD CDX bus
 M: Nipun Gupta <nipun.gupta@amd.com>
 M: Nikhil Agarwal <nikhil.agarwal@amd.com>
+S: Supported
 F: drivers/bus/cdx/
 
 Auxiliary bus driver - EXPERIMENTAL
 M: Parav Pandit <parav@nvidia.com>
 M: Xueming Li <xuemingl@nvidia.com>
+S: Supported
 F: drivers/bus/auxiliary/
 
 Intel FPGA bus
 M: Rosen Xu <rosen.xu@intel.com>
+S: Supported
 F: drivers/bus/ifpga/
 
 NXP buses
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
 M: Sachin Saxena <sachin.saxena@oss.nxp.com>
+S: Supported
 F: drivers/common/dpaax/
 F: drivers/bus/dpaa/
 F: drivers/bus/fslmc/
@@ -588,36 +670,43 @@ F: drivers/bus/fslmc/
 PCI bus driver
 M: Chenbo Xia <chenbo.xia@intel.com>
 M: Nipun Gupta <nipun.gupta@amd.com>
+S: Supported
 F: drivers/bus/pci/
 
 Platform bus driver
 M: Tomasz Duszynski <tduszynski@marvell.com>
+S: Supported
 F: drivers/bus/platform/
 
 VDEV bus driver
+S: Maintained
 F: drivers/bus/vdev/
 F: app/test/test_vdev.c
 
 VMBUS bus driver
 M: Long Li <longli@microsoft.com>
+S: Supported
 F: drivers/bus/vmbus/
 
 
 Networking Drivers
 ------------------
 M: Ferruh Yigit <ferruh.yigit@amd.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net
 F: doc/guides/nics/features/default.ini
 
 Link bonding
 M: Chas Williams <chas3@att.com>
 M: Min Hu (Connor) <humin29@huawei.com>
+S: Supported
 F: drivers/net/bonding/
 F: doc/guides/prog_guide/link_bonding_poll_mode_drv_lib.rst
 F: app/test/test_link_bonding*
 F: examples/bond/
 
 Linux KNI
+S: Obsolete
 F: kernel/linux/kni/
 F: lib/kni/
 F: doc/guides/prog_guide/kernel_nic_interface.rst
@@ -625,12 +714,14 @@ F: app/test/test_kni.c
 
 Linux AF_PACKET
 M: John W. Linville <linville@tuxdriver.com>
+S: Odd Fixes
 F: drivers/net/af_packet/
 F: doc/guides/nics/features/afpacket.ini
 
 Linux AF_XDP
 M: Ciara Loftus <ciara.loftus@intel.com>
 M: Qi Zhang <qi.z.zhang@intel.com>
+S: Supported
 F: drivers/net/af_xdp/
 F: doc/guides/nics/af_xdp.rst
 F: doc/guides/nics/features/af_xdp.ini
@@ -641,24 +732,28 @@ M: Shai Brandes <shaibran@amazon.com>
 M: Evgeny Schemeilin <evgenys@amazon.com>
 M: Igor Chauskin <igorch@amazon.com>
 M: Ron Beider <rbeider@amazon.com>
+S: Supported
 F: drivers/net/ena/
 F: doc/guides/nics/ena.rst
 F: doc/guides/nics/features/ena.ini
 
 AMD axgbe
 M: Chandubabu Namburu <chandu@amd.com>
+S: Supported
 F: drivers/net/axgbe/
 F: doc/guides/nics/axgbe.rst
 F: doc/guides/nics/features/axgbe.ini
 
 AMD Pensando ionic
 M: Andrew Boyer <andrew.boyer@amd.com>
+S: Supported
 F: drivers/net/ionic/
 F: doc/guides/nics/ionic.rst
 F: doc/guides/nics/features/ionic.ini
 
 Marvell/Aquantia atlantic
 M: Igor Russkikh <irusskikh@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/net/atlantic/
 F: doc/guides/nics/atlantic.rst
@@ -668,6 +763,7 @@ Atomic Rules ARK
 M: Shepard Siegel <shepard.siegel@atomicrules.com>
 M: Ed Czeck <ed.czeck@atomicrules.com>
 M: John Miller <john.miller@atomicrules.com>
+S: Supported
 F: drivers/net/ark/
 F: doc/guides/nics/ark.rst
 F: doc/guides/nics/features/ark.ini
@@ -675,6 +771,7 @@ F: doc/guides/nics/features/ark.ini
 Broadcom bnxt
 M: Ajit Khaparde <ajit.khaparde@broadcom.com>
 M: Somnath Kotur <somnath.kotur@broadcom.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-brcm
 F: drivers/net/bnxt/
 F: doc/guides/nics/bnxt.rst
@@ -683,6 +780,7 @@ F: doc/guides/nics/features/bnxt.ini
 Cavium ThunderX nicvf
 M: Jerin Jacob <jerinj@marvell.com>
 M: Maciej Czekaj <mczekaj@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/net/thunderx/
 F: doc/guides/nics/thunderx.rst
@@ -690,6 +788,7 @@ F: doc/guides/nics/features/thunderx.ini
 
 Cavium OCTEON TX
 M: Harman Kalra <hkalra@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/common/octeontx/
 F: drivers/mempool/octeontx/
@@ -699,6 +798,7 @@ F: doc/guides/nics/features/octeontx.ini
 
 Chelsio cxgbe
 M: Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>
+S: Supported
 F: drivers/net/cxgbe/
 F: doc/guides/nics/cxgbe.rst
 F: doc/guides/nics/features/cxgbe.ini
@@ -706,6 +806,7 @@ F: doc/guides/nics/features/cxgbe.ini
 Cisco enic
 M: John Daley <johndale@cisco.com>
 M: Hyong Youb Kim <hyonkim@cisco.com>
+S: Supported
 F: drivers/net/enic/
 F: doc/guides/nics/enic.rst
 F: doc/guides/nics/features/enic.ini
@@ -715,6 +816,7 @@ M: Junfeng Guo <junfeng.guo@intel.com>
 M: Jeroen de Borst <jeroendb@google.com>
 M: Rushil Gupta <rushilg@google.com>
 M: Joshua Washington <joshwash@google.com>
+S: Supported
 F: drivers/net/gve/
 F: doc/guides/nics/gve.rst
 F: doc/guides/nics/features/gve.ini
@@ -722,6 +824,7 @@ F: doc/guides/nics/features/gve.ini
 Hisilicon hns3
 M: Dongdong Liu <liudongdong3@huawei.com>
 M: Yisen Zhuang <yisen.zhuang@huawei.com>
+S: Supported
 F: drivers/net/hns3/
 F: doc/guides/nics/hns3.rst
 F: doc/guides/nics/features/hns3.ini
@@ -730,6 +833,7 @@ Huawei hinic
 M: Ziyang Xuan <xuanziyang2@huawei.com>
 M: Xiaoyun Wang <cloud.wangxiaoyun@huawei.com>
 M: Guoyang Zhou <zhouguoyang@huawei.com>
+S: Supported
 F: drivers/net/hinic/
 F: doc/guides/nics/hinic.rst
 F: doc/guides/nics/features/hinic.ini
@@ -737,6 +841,7 @@ F: doc/guides/nics/features/hinic.ini
 Intel e1000
 M: Simei Su <simei.su@intel.com>
 M: Wenjun Wu <wenjun1.wu@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/e1000/
 F: doc/guides/nics/e1000em.rst
@@ -747,6 +852,7 @@ F: doc/guides/nics/features/igb*.ini
 Intel ixgbe
 M: Qiming Yang <qiming.yang@intel.com>
 M: Wenjun Wu <wenjun1.wu@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/ixgbe/
 F: doc/guides/nics/ixgbe.rst
@@ -756,6 +862,7 @@ F: doc/guides/nics/features/ixgbe*.ini
 Intel i40e
 M: Yuying Zhang <Yuying.Zhang@intel.com>
 M: Beilei Xing <beilei.xing@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/i40e/
 F: doc/guides/nics/i40e.rst
@@ -765,6 +872,7 @@ F: doc/guides/nics/features/i40e*.ini
 Intel fm10k
 M: Qi Zhang <qi.z.zhang@intel.com>
 M: Xiao Wang <xiao.w.wang@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/fm10k/
 F: doc/guides/nics/fm10k.rst
@@ -773,6 +881,7 @@ F: doc/guides/nics/features/fm10k*.ini
 Intel iavf
 M: Jingjing Wu <jingjing.wu@intel.com>
 M: Beilei Xing <beilei.xing@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/iavf/
 F: drivers/common/iavf/
@@ -781,6 +890,7 @@ F: doc/guides/nics/features/iavf*.ini
 Intel ice
 M: Qiming Yang <qiming.yang@intel.com>
 M: Qi Zhang <qi.z.zhang@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/ice/
 F: doc/guides/nics/ice.rst
@@ -789,6 +899,7 @@ F: doc/guides/nics/features/ice.ini
 Intel idpf
 M: Jingjing Wu <jingjing.wu@intel.com>
 M: Beilei Xing <beilei.xing@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/idpf/
 F: drivers/common/idpf/
@@ -798,6 +909,7 @@ F: doc/guides/nics/features/idpf.ini
 Intel cpfl - EXPERIMENTAL
 M: Yuying Zhang <yuying.zhang@intel.com>
 M: Beilei Xing <beilei.xing@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/cpfl/
 F: doc/guides/nics/cpfl.rst
@@ -806,6 +918,7 @@ F: doc/guides/nics/features/cpfl.ini
 Intel igc
 M: Junfeng Guo <junfeng.guo@intel.com>
 M: Simei Su <simei.su@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/igc/
 F: doc/guides/nics/igc.rst
@@ -814,6 +927,7 @@ F: doc/guides/nics/features/igc.ini
 Intel ipn3ke
 M: Rosen Xu <rosen.xu@intel.com>
 T: git://dpdk.org/next/dpdk-next-net-intel
+S: Supported
 F: drivers/net/ipn3ke/
 F: doc/guides/nics/ipn3ke.rst
 F: doc/guides/nics/features/ipn3ke.ini
@@ -823,6 +937,7 @@ M: Nithin Dabilpuram <ndabilpuram@marvell.com>
 M: Kiran Kumar K <kirankumark@marvell.com>
 M: Sunil Kumar Kori <skori@marvell.com>
 M: Satha Rao <skoteshwar@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/common/cnxk/
 F: drivers/net/cnxk/
@@ -832,6 +947,7 @@ F: doc/guides/platform/cnxk.rst
 
 Marvell mvpp2
 M: Liron Himi <lironh@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/common/mvep/
 F: drivers/net/mvpp2/
@@ -841,6 +957,7 @@ F: doc/guides/nics/features/mvpp2.ini
 Marvell mvneta
 M: Zyta Szpak <zr@semihalf.com>
 M: Liron Himi <lironh@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/net/mvneta/
 F: doc/guides/nics/mvneta.rst
@@ -848,6 +965,7 @@ F: doc/guides/nics/features/mvneta.ini
 
 Marvell OCTEON TX EP - endpoint
 M: Vamsi Attunuru <vattunuru@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/net/octeon_ep/
 F: doc/guides/nics/features/octeon_ep.ini
@@ -856,6 +974,7 @@ F: doc/guides/nics/octeon_ep.rst
 NVIDIA mlx4
 M: Matan Azrad <matan@nvidia.com>
 M: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mlx
 F: drivers/net/mlx4/
 F: doc/guides/nics/mlx4.rst
@@ -866,6 +985,7 @@ M: Matan Azrad <matan@nvidia.com>
 M: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
 M: Ori Kam <orika@nvidia.com>
 M: Suanming Mou <suanmingm@nvidia.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mlx
 F: drivers/common/mlx5/
 F: drivers/net/mlx5/
@@ -875,23 +995,27 @@ F: doc/guides/nics/features/mlx5.ini
 
 Microsoft mana
 M: Long Li <longli@microsoft.com>
+S: Supported
 F: drivers/net/mana/
 F: doc/guides/nics/mana.rst
 F: doc/guides/nics/features/mana.ini
 
 Microsoft vdev_netvsc - EXPERIMENTAL
 M: Matan Azrad <matan@nvidia.com>
+S: Supported
 F: drivers/net/vdev_netvsc/
 F: doc/guides/nics/vdev_netvsc.rst
 
 Microsoft Hyper-V netvsc
 M: Long Li <longli@microsoft.com>
+S: Supported
 F: drivers/net/netvsc/
 F: doc/guides/nics/netvsc.rst
 F: doc/guides/nics/features/netvsc.ini
 
 Netcope nfb
 M: Martin Spinler <spinler@cesnet.cz>
+S: Supported
 F: drivers/net/nfb/
 F: doc/guides/nics/nfb.rst
 F: doc/guides/nics/features/nfb.ini
@@ -899,6 +1023,7 @@ F: doc/guides/nics/features/nfb.ini
 Netronome nfp
 M: Chaoyong He <chaoyong.he@corigine.com>
 M: Niklas Soderlund <niklas.soderlund@corigine.com>
+S: Supported
 F: drivers/net/nfp/
 F: doc/guides/nics/nfp.rst
 F: doc/guides/nics/features/nfp*.ini
@@ -906,6 +1031,7 @@ F: doc/guides/nics/features/nfp*.ini
 NXP dpaa
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
 M: Sachin Saxena <sachin.saxena@oss.nxp.com>
+S: Supported
 F: drivers/mempool/dpaa/
 F: drivers/net/dpaa/
 F: doc/guides/nics/dpaa.rst
@@ -914,6 +1040,7 @@ F: doc/guides/nics/features/dpaa.ini
 NXP dpaa2
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
 M: Sachin Saxena <sachin.saxena@oss.nxp.com>
+S: Supported
 F: drivers/mempool/dpaa2/
 F: drivers/net/dpaa2/
 F: doc/guides/nics/dpaa2.rst
@@ -922,6 +1049,7 @@ F: doc/guides/nics/features/dpaa2.ini
 NXP enetc
 M: Gagandeep Singh <g.singh@nxp.com>
 M: Sachin Saxena <sachin.saxena@oss.nxp.com>
+S: Supported
 F: drivers/net/enetc/
 F: doc/guides/nics/enetc.rst
 F: doc/guides/nics/features/enetc.ini
@@ -929,18 +1057,21 @@ F: doc/guides/nics/features/enetc.ini
 NXP enetfec - EXPERIMENTAL
 M: Apeksha Gupta <apeksha.gupta@nxp.com>
 M: Sachin Saxena <sachin.saxena@nxp.com>
+S: Supported
 F: drivers/net/enetfec/
 F: doc/guides/nics/enetfec.rst
 F: doc/guides/nics/features/enetfec.ini
 
 NXP pfe
 M: Gagandeep Singh <g.singh@nxp.com>
+S: Supported
 F: doc/guides/nics/pfe.rst
 F: drivers/net/pfe/
 F: doc/guides/nics/features/pfe.ini
 
 Marvell QLogic bnx2x
 M: Julien Aube <julien_dpdk@jaube.fr>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/net/bnx2x/
 F: doc/guides/nics/bnx2x.rst
@@ -949,6 +1080,7 @@ F: doc/guides/nics/features/bnx2x*.ini
 Marvell QLogic qede PMD
 M: Devendra Singh Rawat <dsinghrawat@marvell.com>
 M: Alok Prasad <palok@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/net/qede/
 F: doc/guides/nics/qede.rst
@@ -956,6 +1088,7 @@ F: doc/guides/nics/features/qede*.ini
 
 Solarflare sfc_efx
 M: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
+S: Supported
 F: drivers/common/sfc_efx/
 F: drivers/net/sfc/
 F: doc/guides/nics/sfc_efx.rst
@@ -963,6 +1096,7 @@ F: doc/guides/nics/features/sfc.ini
 
 Wangxun ngbe
 M: Jiawen Wu <jiawenwu@trustnetic.com>
+S: Supported
 F: drivers/net/ngbe/
 F: doc/guides/nics/ngbe.rst
 F: doc/guides/nics/features/ngbe.ini
@@ -970,12 +1104,14 @@ F: doc/guides/nics/features/ngbe.ini
 Wangxun txgbe
 M: Jiawen Wu <jiawenwu@trustnetic.com>
 M: Jian Wang <jianwang@trustnetic.com>
+S: Supported
 F: drivers/net/txgbe/
 F: doc/guides/nics/txgbe.rst
 F: doc/guides/nics/features/txgbe.ini
 
 VMware vmxnet3
 M: Jochen Behrens <jbehrens@vmware.com>
+S: Supported
 F: drivers/net/vmxnet3/
 F: doc/guides/nics/vmxnet3.rst
 F: doc/guides/nics/features/vmxnet3.ini
@@ -983,6 +1119,7 @@ F: doc/guides/nics/features/vmxnet3.ini
 Vhost-user
 M: Maxime Coquelin <maxime.coquelin@redhat.com>
 M: Chenbo Xia <chenbo.xia@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-virtio
 F: lib/vhost/
 F: doc/guides/prog_guide/vhost_lib.rst
@@ -997,6 +1134,7 @@ F: doc/guides/sample_app_ug/vdpa.rst
 Vhost PMD
 M: Maxime Coquelin <maxime.coquelin@redhat.com>
 M: Chenbo Xia <chenbo.xia@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-virtio
 F: drivers/net/vhost/
 F: doc/guides/nics/vhost.rst
@@ -1005,6 +1143,7 @@ F: doc/guides/nics/features/vhost.ini
 Virtio PMD
 M: Maxime Coquelin <maxime.coquelin@redhat.com>
 M: Chenbo Xia <chenbo.xia@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-virtio
 F: drivers/net/virtio/
 F: doc/guides/nics/virtio.rst
@@ -1013,26 +1152,31 @@ F: doc/guides/nics/features/virtio*.ini
 Wind River AVP
 M: Steven Webster <steven.webster@windriver.com>
 M: Matt Peters <matt.peters@windriver.com>
+S: Supported
 F: drivers/net/avp/
 F: doc/guides/nics/avp.rst
 F: doc/guides/nics/features/avp.ini
 
 PCAP PMD
+S: Orphan
 F: drivers/net/pcap/
 F: doc/guides/nics/pcap_ring.rst
 F: doc/guides/nics/features/pcap.ini
 
 Tap PMD
+S: Orphan
 F: drivers/net/tap/
 F: doc/guides/nics/tap.rst
 F: doc/guides/nics/features/tap.ini
 
 KNI PMD
+S: Obsolete
 F: drivers/net/kni/
 F: doc/guides/nics/kni.rst
 
 Ring PMD
 M: Bruce Richardson <bruce.richardson@intel.com>
+S: Supported
 F: drivers/net/ring/
 F: doc/guides/nics/pcap_ring.rst
 F: app/test/test_pmd_ring.c
@@ -1040,21 +1184,25 @@ F: app/test/test_pmd_ring_perf.c
 
 Null Networking PMD
 M: Tetsuya Mukawa <mtetsuyah@gmail.com>
+S: Supported
 F: drivers/net/null/
 
 Fail-safe PMD
 M: Gaetan Rivet <grive@u256.net>
+S: Supported
 F: drivers/net/failsafe/
 F: doc/guides/nics/fail_safe.rst
 F: doc/guides/nics/features/failsafe.ini
 
 Softnic PMD
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
+S: Supported
 F: drivers/net/softnic/
 F: doc/guides/nics/softnic.rst
 
 Memif PMD
 M: Jakub Grajciar <jgrajcia@cisco.com>
+S: Supported
 F: drivers/net/memif/
 F: doc/guides/nics/memif.rst
 F: doc/guides/nics/features/memif.ini
@@ -1062,17 +1210,20 @@ F: doc/guides/nics/features/memif.ini
 
 Crypto Drivers
 --------------
+S: Maintained
 T: git://dpdk.org/next/dpdk-next-crypto
 F: doc/guides/cryptodevs/features/default.ini
 
 AMD CCP Crypto
 M: Sunil Uttarwar <sunilprakashrao.uttarwar@amd.com>
+S: Supported
 F: drivers/crypto/ccp/
 F: doc/guides/cryptodevs/ccp.rst
 F: doc/guides/cryptodevs/features/ccp.ini
 
 ARMv8 Crypto
 M: Ruifeng Wang <ruifeng.wang@arm.com>
+S: Supported
 F: drivers/crypto/armv8/
 F: doc/guides/cryptodevs/armv8.rst
 F: doc/guides/cryptodevs/features/armv8.ini
@@ -1081,12 +1232,14 @@ Broadcom FlexSparc
 M: Ajit Khaparde <ajit.khaparde@broadcom.com>
 M: Raveendra Padasalagi <raveendra.padasalagi@broadcom.com>
 M: Vikas Gupta <vikas.gupta@broadcom.com>
+S: Supported
 F: drivers/crypto/bcmfs/
 F: doc/guides/cryptodevs/bcmfs.rst
 F: doc/guides/cryptodevs/features/bcmfs.ini
 
 Cavium OCTEON TX crypto
 M: Anoob Joseph <anoobj@marvell.com>
+S: Supported
 F: drivers/common/cpt/
 F: drivers/crypto/octeontx/
 F: doc/guides/cryptodevs/octeontx.rst
@@ -1094,17 +1247,20 @@ F: doc/guides/cryptodevs/features/octeontx.ini
 
 Crypto Scheduler
 M: Kai Ji <kai.ji@intel.com>
+S: Supported
 F: drivers/crypto/scheduler/
 F: doc/guides/cryptodevs/scheduler.rst
 
 HiSilicon UADK crypto
 M: Zhangfei Gao <zhangfei.gao@linaro.org>
+S: Supported
 F: drivers/crypto/uadk/
 F: doc/guides/cryptodevs/uadk.rst
 F: doc/guides/cryptodevs/features/uadk.ini
 
 Intel QuickAssist
 M: Kai Ji <kai.ji@intel.com>
+S: Supported
 F: drivers/crypto/qat/
 F: drivers/common/qat/
 F: doc/guides/cryptodevs/qat.rst
@@ -1113,6 +1269,7 @@ F: doc/guides/cryptodevs/features/qat.ini
 IPsec MB
 M: Kai Ji <kai.ji@intel.com>
 M: Pablo de Lara <pablo.de.lara.guarch@intel.com>
+S: Supported
 F: drivers/crypto/ipsec_mb/
 F: doc/guides/cryptodevs/aesni_gcm.rst
 F: doc/guides/cryptodevs/aesni_mb.rst
@@ -1131,6 +1288,7 @@ Marvell cnxk crypto
 M: Ankur Dwivedi <adwivedi@marvell.com>
 M: Anoob Joseph <anoobj@marvell.com>
 M: Tejasree Kondoj <ktejasree@marvell.com>
+S: Supported
 F: drivers/crypto/cnxk/
 F: doc/guides/cryptodevs/cnxk.rst
 F: doc/guides/cryptodevs/features/cn9k.ini
@@ -1139,6 +1297,7 @@ F: doc/guides/cryptodevs/features/cn10k.ini
 Marvell mvsam
 M: Michael Shamis <michaelsh@marvell.com>
 M: Liron Himi <lironh@marvell.com>
+S: Supported
 F: drivers/crypto/mvsam/
 F: doc/guides/cryptodevs/mvsam.rst
 F: doc/guides/cryptodevs/features/mvsam.ini
@@ -1146,18 +1305,21 @@ F: doc/guides/cryptodevs/features/mvsam.ini
 Marvell Nitrox
 M: Nagadheeraj Rottela <rnagadheeraj@marvell.com>
 M: Srikanth Jampala <jsrikanth@marvell.com>
+S: Supported
 F: drivers/crypto/nitrox/
 F: doc/guides/cryptodevs/nitrox.rst
 F: doc/guides/cryptodevs/features/nitrox.ini
 
 NVIDIA mlx5
 M: Matan Azrad <matan@nvidia.com>
+S: Supported
 F: drivers/crypto/mlx5/
 F: doc/guides/cryptodevs/mlx5.rst
 F: doc/guides/cryptodevs/features/mlx5.ini
 
 Null Crypto
 M: Kai Ji <kai.ji@intel.com>
+S: Supported
 F: drivers/crypto/null/
 F: doc/guides/cryptodevs/null.rst
 F: doc/guides/cryptodevs/features/null.ini
@@ -1165,6 +1327,7 @@ F: doc/guides/cryptodevs/features/null.ini
 NXP CAAM JR
 M: Gagandeep Singh <g.singh@nxp.com>
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
+S: Supported
 F: drivers/crypto/caam_jr/
 F: doc/guides/cryptodevs/caam_jr.rst
 F: doc/guides/cryptodevs/features/caam_jr.ini
@@ -1172,6 +1335,7 @@ F: doc/guides/cryptodevs/features/caam_jr.ini
 NXP DPAA_SEC
 M: Gagandeep Singh <g.singh@nxp.com>
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
+S: Supported
 F: drivers/crypto/dpaa_sec/
 F: doc/guides/cryptodevs/dpaa_sec.rst
 F: doc/guides/cryptodevs/features/dpaa_sec.ini
@@ -1179,18 +1343,21 @@ F: doc/guides/cryptodevs/features/dpaa_sec.ini
 NXP DPAA2_SEC
 M: Gagandeep Singh <g.singh@nxp.com>
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
+S: Supported
 F: drivers/crypto/dpaa2_sec/
 F: doc/guides/cryptodevs/dpaa2_sec.rst
 F: doc/guides/cryptodevs/features/dpaa2_sec.ini
 
 OpenSSL
 M: Kai Ji <kai.ji@intel.com>
+S: Supported
 F: drivers/crypto/openssl/
 F: doc/guides/cryptodevs/openssl.rst
 F: doc/guides/cryptodevs/features/openssl.ini
 
 Virtio
 M: Jay Zhou <jianjay.zhou@huawei.com>
+S: Supported
 F: drivers/crypto/virtio/
 F: doc/guides/cryptodevs/virtio.rst
 F: doc/guides/cryptodevs/features/virtio.ini
@@ -1198,31 +1365,37 @@ F: doc/guides/cryptodevs/features/virtio.ini
 
 Compression Drivers
 -------------------
+S: Maintained
 T: git://dpdk.org/next/dpdk-next-crypto
 
 Cavium OCTEON TX zipvf
 M: Ashish Gupta <ashish.gupta@marvell.com>
+S: Supported
 F: drivers/compress/octeontx/
 F: doc/guides/compressdevs/octeontx.rst
 F: doc/guides/compressdevs/features/octeontx.ini
 
 Intel QuickAssist
 M: Kai Ji <kai.ji@intel.com>
+S: Supported
 F: drivers/compress/qat/
 F: drivers/common/qat/
 
 ISA-L
 M: Lee Daly <lee.daly@intel.com>
+S: Supported
 F: drivers/compress/isal/
 F: doc/guides/compressdevs/isal.rst
 F: doc/guides/compressdevs/features/isal.ini
 
 NVIDIA mlx5
 M: Matan Azrad <matan@nvidia.com>
+S: Supported
 F: drivers/compress/mlx5/
 
 ZLIB
 M: Sunila Sahu <ssahu@marvell.com>
+S: Supported
 F: drivers/compress/zlib/
 F: doc/guides/compressdevs/zlib.rst
 F: doc/guides/compressdevs/features/zlib.ini
@@ -1234,34 +1407,40 @@ DMAdev Drivers
 Intel IDXD - EXPERIMENTAL
 M: Bruce Richardson <bruce.richardson@intel.com>
 M: Kevin Laatz <kevin.laatz@intel.com>
+S: Supported
 F: drivers/dma/idxd/
 F: doc/guides/dmadevs/idxd.rst
 
 Intel IOAT
 M: Bruce Richardson <bruce.richardson@intel.com>
 M: Conor Walsh <conor.walsh@intel.com>
+S: Supported
 F: drivers/dma/ioat/
 F: doc/guides/dmadevs/ioat.rst
 
 HiSilicon DMA
 M: Chengwen Feng <fengchengwen@huawei.com>
+S: Supported
 F: drivers/dma/hisilicon/
 F: doc/guides/dmadevs/hisilicon.rst
 
 Marvell CNXK DPI DMA
 M: Vamsi Attunuru <vattunuru@marvell.com>
+S: Supported
 F: drivers/dma/cnxk/
 F: doc/guides/dmadevs/cnxk.rst
 
 NXP DPAA DMA
 M: Gagandeep Singh <g.singh@nxp.com>
 M: Sachin Saxena <sachin.saxena@oss.nxp.com>
+S: Supported
 F: drivers/dma/dpaa/
 F: doc/guides/dmadevs/dpaa.rst
 
 NXP DPAA2 QDMA
 M: Gagandeep Singh <g.singh@nxp.com>
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
+S: Supported
 F: drivers/dma/dpaa2/
 F: doc/guides/dmadevs/dpaa2.rst
 
@@ -1271,12 +1450,14 @@ RegEx Drivers
 
 Marvell OCTEON CN9K regex
 M: Liron Himi <lironh@marvell.com>
+S: Supported
 F: drivers/regex/cn9k/
 F: doc/guides/regexdevs/cn9k.rst
 F: doc/guides/regexdevs/features/cn9k.ini
 
 NVIDIA mlx5
 M: Ori Kam <orika@nvidia.com>
+S: Supported
 F: drivers/regex/mlx5/
 F: doc/guides/regexdevs/mlx5.rst
 F: doc/guides/regexdevs/features/mlx5.ini
@@ -1287,6 +1468,7 @@ MLdev Drivers
 
 Marvell ML CNXK
 M: Srikanth Yalavarthi <syalavarthi@marvell.com>
+S: Supported
 F: drivers/common/cnxk/hw/ml.h
 F: drivers/common/cnxk/roc_ml*
 F: drivers/ml/cnxk/
@@ -1299,6 +1481,7 @@ T: git://dpdk.org/next/dpdk-next-virtio
 
 Intel ifc
 M: Xiao Wang <xiao.w.wang@intel.com>
+S: Supported
 F: drivers/vdpa/ifc/
 F: doc/guides/vdpadevs/ifc.rst
 F: doc/guides/vdpadevs/features/ifcvf.ini
@@ -1306,12 +1489,14 @@ F: doc/guides/vdpadevs/features/ifcvf.ini
 NVIDIA mlx5 vDPA
 M: Matan Azrad <matan@nvidia.com>
 M: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
+S: Supported
 F: drivers/vdpa/mlx5/
 F: doc/guides/vdpadevs/mlx5.rst
 F: doc/guides/vdpadevs/features/mlx5.ini
 
 Xilinx sfc vDPA
 M: Vijay Kumar Srivastava <vsrivast@xilinx.com>
+S: Supported
 F: drivers/vdpa/sfc/
 F: doc/guides/vdpadevs/sfc.rst
 F: doc/guides/vdpadevs/features/sfc.ini
@@ -1320,42 +1505,50 @@ F: doc/guides/vdpadevs/features/sfc.ini
 Eventdev Drivers
 ----------------
 M: Jerin Jacob <jerinj@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-eventdev
 
 Cavium OCTEON TX ssovf
 M: Jerin Jacob <jerinj@marvell.com>
+S: Supported
 F: drivers/event/octeontx/
 F: doc/guides/eventdevs/octeontx.rst
 
 Cavium OCTEON TX timvf
 M: Pavan Nikhilesh <pbhagavatula@marvell.com>
+S: Supported
 F: drivers/event/octeontx/timvf_*
 
 Intel DLB2
 M: Timothy McDaniel <timothy.mcdaniel@intel.com>
+S: Supported
 F: drivers/event/dlb2/
 F: doc/guides/eventdevs/dlb2.rst
 
 Marvell cnxk
 M: Pavan Nikhilesh <pbhagavatula@marvell.com>
 M: Shijith Thotton <sthotton@marvell.com>
+S: Supported
 F: drivers/event/cnxk/
 F: doc/guides/eventdevs/cnxk.rst
 
 NXP DPAA eventdev
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
 M: Sachin Saxena <sachin.saxena@oss.nxp.com>
+S: Supported
 F: drivers/event/dpaa/
 F: doc/guides/eventdevs/dpaa.rst
 
 NXP DPAA2 eventdev
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
 M: Sachin Saxena <sachin.saxena@oss.nxp.com>
+S: Supported
 F: drivers/event/dpaa2/
 F: doc/guides/eventdevs/dpaa2.rst
 
 Software Eventdev PMD
 M: Harry van Haaren <harry.van.haaren@intel.com>
+S: Supported
 F: drivers/event/sw/
 F: doc/guides/eventdevs/sw.rst
 F: examples/eventdev_pipeline/
@@ -1363,11 +1556,13 @@ F: doc/guides/sample_app_ug/eventdev_pipeline.rst
 
 Distributed Software Eventdev PMD
 M: Mattias Rönnblom <mattias.ronnblom@ericsson.com>
+S: Supported
 F: drivers/event/dsw/
 F: doc/guides/eventdevs/dsw.rst
 
 Software OPDL Eventdev PMD
 M: Liang Ma <liangma@liangbit.com>
+S: Supported
 M: Peter Mccarthy <peter.mccarthy@intel.com>
 F: drivers/event/opdl/
 F: doc/guides/eventdevs/opdl.rst
@@ -1378,6 +1573,7 @@ Baseband Drivers
 
 Intel baseband
 M: Nicolas Chautru <nicolas.chautru@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-baseband
 F: drivers/baseband/turbo_sw/
 F: doc/guides/bbdevs/turbo_sw.rst
@@ -1397,6 +1593,7 @@ F: doc/guides/bbdevs/features/vrb1.ini
 
 Null baseband
 M: Nicolas Chautru <nicolas.chautru@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-baseband
 F: drivers/baseband/null/
 F: doc/guides/bbdevs/null.rst
@@ -1405,6 +1602,7 @@ F: doc/guides/bbdevs/features/null.ini
 NXP LA12xx
 M: Gagandeep Singh <g.singh@nxp.com>
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-baseband
 F: drivers/baseband/la12xx/
 F: doc/guides/bbdevs/la12xx.rst
@@ -1416,6 +1614,7 @@ GPU Drivers
 
 NVIDIA CUDA
 M: Elena Agostini <eagostini@nvidia.com>
+S: Supported
 F: drivers/gpu/cuda/
 F: doc/guides/gpus/cuda.rst
 
@@ -1426,6 +1625,7 @@ Rawdev Drivers
 Intel FPGA
 M: Rosen Xu <rosen.xu@intel.com>
 M: Tianfei zhang <tianfei.zhang@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/raw/ifpga/
 F: doc/guides/rawdevs/ifpga.rst
@@ -1433,18 +1633,21 @@ F: doc/guides/rawdevs/ifpga.rst
 Marvell CNXK BPHY
 M: Jakub Palider <jpalider@marvell.com>
 M: Tomasz Duszynski <tduszynski@marvell.com>
+S: Supported
 F: doc/guides/rawdevs/cnxk_bphy.rst
 F: drivers/raw/cnxk_bphy/
 
 Marvell CNXK GPIO
 M: Jakub Palider <jpalider@marvell.com>
 M: Tomasz Duszynski <tduszynski@marvell.com>
+S: Supported
 F: doc/guides/rawdevs/cnxk_gpio.rst
 F: drivers/raw/cnxk_gpio/
 
 NTB
 M: Jingjing Wu <jingjing.wu@intel.com>
 M: Junfeng Guo <junfeng.guo@intel.com>
+S: Supported
 F: drivers/raw/ntb/
 F: doc/guides/rawdevs/ntb.rst
 F: examples/ntb/
@@ -1452,6 +1655,7 @@ F: doc/guides/sample_app_ug/ntb.rst
 
 NXP DPAA2 CMDIF
 M: Gagandeep Singh <g.singh@nxp.com>
+S: Supported
 F: drivers/raw/dpaa2_cmdif/
 F: doc/guides/rawdevs/dpaa2_cmdif.rst
 
@@ -1461,12 +1665,14 @@ Packet processing
 
 Network headers
 M: Olivier Matz <olivier.matz@6wind.com>
+S: Supported
 F: lib/net/
 F: app/test/test_cksum.c
 F: app/test/test_cksum_perf.c
 
 Packet CRC
 M: Jasvinder Singh <jasvinder.singh@intel.com>
+S: Supported
 F: lib/net/net_crc.h
 F: lib/net/rte_net_crc*
 F: lib/net/net_crc_avx512.c
@@ -1475,6 +1681,7 @@ F: app/test/test_crc.c
 
 IP fragmentation & reassembly
 M: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
+S: Supported
 F: lib/ip_frag/
 F: doc/guides/prog_guide/ip_fragment_reassembly_lib.rst
 F: app/test/test_ipfrag.c
@@ -1486,16 +1693,19 @@ F: doc/guides/sample_app_ug/ip_reassembly.rst
 
 Generic Receive Offload - EXPERIMENTAL
 M: Jiayu Hu <jiayu.hu@intel.com>
+S: Supported
 F: lib/gro/
 F: doc/guides/prog_guide/generic_receive_offload_lib.rst
 
 Generic Segmentation Offload
 M: Jiayu Hu <jiayu.hu@intel.com>
+S: Supported
 F: lib/gso/
 F: doc/guides/prog_guide/generic_segmentation_offload_lib.rst
 
 IPsec
 M: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-crypto
 F: lib/ipsec/
 F: app/test/test_ipsec*
@@ -1506,12 +1716,14 @@ F: app/test-sad/
 PDCP - EXPERIMENTAL
 M: Anoob Joseph <anoobj@marvell.com>
 M: Volodymyr Fialko <vfialko@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-crypto
 F: lib/pdcp/
 F: doc/guides/prog_guide/pdcp_lib.rst
 F: app/test/test_pdcp*
 
 Flow Classify - EXPERIMENTAL - UNMAINTAINED
+S: Orphan
 F: lib/flow_classify/
 F: app/test/test_flow_classify*
 F: doc/guides/prog_guide/flow_classify_lib.rst
@@ -1520,6 +1732,7 @@ F: doc/guides/sample_app_ug/flow_classify.rst
 
 Distributor
 M: David Hunt <david.hunt@intel.com>
+S: Supported
 F: lib/distributor/
 F: doc/guides/prog_guide/packet_distrib_lib.rst
 F: app/test/test_distributor*
@@ -1528,6 +1741,7 @@ F: doc/guides/sample_app_ug/dist_app.rst
 
 Reorder
 M: Volodymyr Fialko <vfialko@marvell.com>
+S: Supported
 F: lib/reorder/
 F: doc/guides/prog_guide/reorder_lib.rst
 F: app/test/test_reorder*
@@ -1536,6 +1750,7 @@ F: doc/guides/sample_app_ug/packet_ordering.rst
 
 Hierarchical scheduler
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
+S: Supported
 F: lib/sched/
 F: doc/guides/prog_guide/qos_framework.rst
 F: app/test/test_pie.c
@@ -1547,6 +1762,7 @@ F: doc/guides/sample_app_ug/qos_scheduler.rst
 Packet capture
 M: Reshma Pattan <reshma.pattan@intel.com>
 M: Stephen Hemminger <stephen@networkplumber.org>
+S: Maintained
 F: lib/pdump/
 F: doc/guides/prog_guide/pdump_lib.rst
 F: app/test/test_pdump.*
@@ -1562,6 +1778,7 @@ F: doc/guides/tools/dumpcap.rst
 Packet Framework
 ----------------
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
+S: Obsolete
 F: lib/pipeline/
 F: lib/port/
 F: lib/table/
@@ -1579,6 +1796,7 @@ Algorithms
 
 ACL
 M: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
+S: Supported
 F: lib/acl/
 F: doc/guides/prog_guide/packet_classif_access_ctrl.rst
 F: app/test-acl/
@@ -1587,6 +1805,7 @@ F: app/test/test_acl.*
 EFD
 M: Byron Marohn <byron.marohn@intel.com>
 M: Yipeng Wang <yipeng1.wang@intel.com>
+S: Supported
 F: lib/efd/
 F: doc/guides/prog_guide/efd_lib.rst
 F: app/test/test_efd*
@@ -1598,6 +1817,7 @@ M: Yipeng Wang <yipeng1.wang@intel.com>
 M: Sameh Gobriel <sameh.gobriel@intel.com>
 M: Bruce Richardson <bruce.richardson@intel.com>
 M: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
+S: Supported
 F: lib/hash/
 F: doc/guides/prog_guide/hash_lib.rst
 F: doc/guides/prog_guide/toeplitz_hash_lib.rst
@@ -1607,6 +1827,7 @@ F: app/test/test_func_reentrancy.c
 LPM
 M: Bruce Richardson <bruce.richardson@intel.com>
 M: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
+S: Supported
 F: lib/lpm/
 F: doc/guides/prog_guide/lpm*
 F: app/test/test_lpm*
@@ -1616,12 +1837,14 @@ F: app/test/test_xmmt_ops.h
 Membership - EXPERIMENTAL
 M: Yipeng Wang <yipeng1.wang@intel.com>
 M: Sameh Gobriel <sameh.gobriel@intel.com>
+S: Supported
 F: lib/member/
 F: doc/guides/prog_guide/member_lib.rst
 F: app/test/test_member*
 
 RIB/FIB
 M: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
+S: Supported
 F: lib/rib/
 F: app/test/test_rib*
 F: lib/fib/
@@ -1630,6 +1853,7 @@ F: app/test-fib/
 
 Traffic metering
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
+S: Supported
 F: lib/meter/
 F: doc/guides/sample_app_ug/qos_scheduler.rst
 F: app/test/test_meter.c
@@ -1642,12 +1866,14 @@ Other libraries
 
 Configuration file
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
+S: Supported
 F: lib/cfgfile/
 F: app/test/test_cfgfile.c
 F: app/test/test_cfgfiles/
 
 Interactive command line
 M: Olivier Matz <olivier.matz@6wind.com>
+S: Supported
 F: lib/cmdline/
 F: app/test-cmdline/
 F: app/test/test_cmdline*
@@ -1656,11 +1882,13 @@ F: doc/guides/sample_app_ug/cmd_line.rst
 
 Key/Value parsing
 M: Olivier Matz <olivier.matz@6wind.com>
+S: Supported
 F: lib/kvargs/
 F: app/test/test_kvargs.c
 
 RCU
 M: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
+S: Supported
 F: lib/rcu/
 F: app/test/test_rcu*
 F: doc/guides/prog_guide/rcu_lib.rst
@@ -1668,11 +1896,13 @@ F: doc/guides/prog_guide/rcu_lib.rst
 PCI
 M: Chenbo Xia <chenbo.xia@intel.com>
 M: Gaetan Rivet <grive@u256.net>
+S: Supported
 F: lib/pci/
 
 Power management
 M: Anatoly Burakov <anatoly.burakov@intel.com>
 M: David Hunt <david.hunt@intel.com>
+S: Supported
 F: lib/power/
 F: doc/guides/prog_guide/power_man.rst
 F: app/test/test_power*
@@ -1683,6 +1913,7 @@ F: doc/guides/sample_app_ug/vm_power_management.rst
 
 Timers
 M: Erik Gabriel Carrillo <erik.g.carrillo@intel.com>
+S: Supported
 F: lib/timer/
 F: doc/guides/prog_guide/timer_lib.rst
 F: app/test/test_timer*
@@ -1690,25 +1921,30 @@ F: examples/timer/
 F: doc/guides/sample_app_ug/timer.rst
 
 Job statistics
+S: Orphan
 F: lib/jobstats/
 F: examples/l2fwd-jobstats/
 F: doc/guides/sample_app_ug/l2_forward_job_stats.rst
 
 Metrics
+S: Orphan
 F: lib/metrics/
 F: app/test/test_metrics.c
 
 Bit-rate statistics
+S: Orphan
 F: lib/bitratestats/
 F: app/test/test_bitratestats.c
 
 Latency statistics
 M: Reshma Pattan <reshma.pattan@intel.com>
+S: Supported
 F: lib/latencystats/
 F: app/test/test_latencystats.c
 
 Telemetry
 M: Ciara Power <ciara.power@intel.com>
+S: Supported
 F: lib/telemetry/
 F: app/test/test_telemetry*
 F: usertools/dpdk-telemetry*
@@ -1716,6 +1952,7 @@ F: doc/guides/howto/telemetry.rst
 
 BPF
 M: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
+S: Supported
 F: lib/bpf/
 F: examples/bpf/
 F: app/test/test_bpf.c
@@ -1727,6 +1964,7 @@ M: Jerin Jacob <jerinj@marvell.com>
 M: Kiran Kumar K <kirankumark@marvell.com>
 M: Nithin Dabilpuram <ndabilpuram@marvell.com>
 M: Zhirun Yan <zhirun.yan@intel.com>
+S: Supported
 F: lib/graph/
 F: doc/guides/prog_guide/graph_lib.rst
 F: app/test/test_graph*
@@ -1736,6 +1974,7 @@ F: doc/guides/sample_app_ug/l3_forward_graph.rst
 Nodes - EXPERIMENTAL
 M: Nithin Dabilpuram <ndabilpuram@marvell.com>
 M: Pavan Nikhilesh <pbhagavatula@marvell.com>
+S: Supported
 F: lib/node/
 
 
@@ -1743,6 +1982,7 @@ Test Applications
 -----------------
 
 Unit tests framework
+S: Maintained
 F: app/test/commands.c
 F: app/test/has_hugepage.py
 F: app/test/packet_burst_generator.c
@@ -1758,45 +1998,53 @@ F: app/test/virtual_pmd.h
 
 Sample packet helper functions for unit test
 M: Reshma Pattan <reshma.pattan@intel.com>
+S: Supported
 F: app/test/sample_packet_forward.c
 F: app/test/sample_packet_forward.h
 
 Networking drivers testing tool
 M: Aman Singh <aman.deep.singh@intel.com>
 M: Yuying Zhang <yuying.zhang@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net
 F: app/test-pmd/
 F: doc/guides/testpmd_app_ug/
 
 DMA device performance tool
 M: Cheng Jiang <cheng1.jiang@intel.com>
+S: Supported
 F: app/test-dma-perf/
 F: doc/guides/tools/dmaperf.rst
 
 Flow performance tool
 M: Wisam Jaddo <wisamm@nvidia.com>
+S: Supported
 F: app/test-flow-perf/
 F: doc/guides/tools/flow-perf.rst
 
 Security performance tool
 M: Anoob Joseph <anoobj@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-crypto
 F: app/test-security-perf/
 F: doc/guides/tools/securityperf.rst
 
 Compression performance test application
 T: git://dpdk.org/next/dpdk-next-crypto
+S: Orphan
 F: app/test-compress-perf/
 F: doc/guides/tools/comp_perf.rst
 
 Crypto performance test application
 M: Ciara Power <ciara.power@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-crypto
 F: app/test-crypto-perf/
 F: doc/guides/tools/cryptoperf.rst
 
 Eventdev test application
 M: Jerin Jacob <jerinj@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-eventdev
 F: app/test-eventdev/
 F: doc/guides/tools/testeventdev.rst
@@ -1806,12 +2054,14 @@ F: app/test/test_event_ring.c
 Procinfo tool
 M: Maryam Tahhan <maryam.tahhan@intel.com>
 M: Reshma Pattan <reshma.pattan@intel.com>
+S: Supported
 F: app/proc-info/
 F: doc/guides/tools/proc_info.rst
 
 DTS
 M: Lijuan Tu <lijuan.tu@intel.com>
 M: Juraj Linkeš <juraj.linkes@pantheon.tech>
+S: Supported
 F: dts/
 F: devtools/dts-check-format.sh
 F: doc/guides/tools/dts.rst
@@ -1821,77 +2071,92 @@ Other Example Applications
 --------------------------
 
 Ethtool example
+S: Orphan
 F: examples/ethtool/
 F: doc/guides/sample_app_ug/ethtool.rst
 
 FIPS validation example
 M: Brian Dooley <brian.dooley@intel.com>
 M: Gowrishankar Muthukrishnan <gmuthukrishn@marvell.com>
+S: Supported
 F: examples/fips_validation/
 F: doc/guides/sample_app_ug/fips_validation.rst
 
 Flow filtering example
 M: Ori Kam <orika@nvidia.com>
+S: Supported
 F: examples/flow_filtering/
 F: doc/guides/sample_app_ug/flow_filtering.rst
 
 Helloworld example
 M: Bruce Richardson <bruce.richardson@intel.com>
+S: Supported
 F: examples/helloworld/
 F: doc/guides/sample_app_ug/hello_world.rst
 
 IPsec security gateway example
 M: Radu Nicolau <radu.nicolau@intel.com>
 M: Akhil Goyal <gakhil@marvell.com>
+S: Supported
 F: examples/ipsec-secgw/
 F: doc/guides/sample_app_ug/ipsec_secgw.rst
 
 IPv4 multicast example
+S: Orphan
 F: examples/ipv4_multicast/
 F: doc/guides/sample_app_ug/ipv4_multicast.rst
 
 L2 forwarding example
 M: Bruce Richardson <bruce.richardson@intel.com>
+S: Supported
 F: examples/l2fwd/
 F: doc/guides/sample_app_ug/l2_forward_real_virtual.rst
 
 L2 forwarding with cache allocation example
 M: Tomasz Kantecki <tomasz.kantecki@intel.com>
+S: Supported
 F: doc/guides/sample_app_ug/l2_forward_cat.rst
 F: examples/l2fwd-cat/
 
 L2 forwarding with eventdev example
 M: Sunil Kumar Kori <skori@marvell.com>
 M: Pavan Nikhilesh <pbhagavatula@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-eventdev
 F: examples/l2fwd-event/
 F: doc/guides/sample_app_ug/l2_forward_event.rst
 
 L3 forwarding example
+S: Maintained
 F: examples/l3fwd/
 F: doc/guides/sample_app_ug/l3_forward.rst
 
 Link status interrupt example
+S: Maintained
 F: examples/link_status_interrupt/
 F: doc/guides/sample_app_ug/link_status_intr.rst
 
 PTP client example
 M: Kirill Rybalchenko <kirill.rybalchenko@intel.com>
+S: Supported
 F: examples/ptpclient/
 
 Rx/Tx callbacks example
 M: Bruce Richardson <bruce.richardson@intel.com>
 M: John McNamara <john.mcnamara@intel.com>
+S: Supported
 F: examples/rxtx_callbacks/
 F: doc/guides/sample_app_ug/rxtx_callbacks.rst
 
 Skeleton example
 M: Bruce Richardson <bruce.richardson@intel.com>
 M: John McNamara <john.mcnamara@intel.com>
+S: Supported
 F: examples/skeleton/
 F: doc/guides/sample_app_ug/skeleton.rst
 
 VMDq examples
+S: Orphan
 F: examples/vmdq/
 F: doc/guides/sample_app_ug/vmdq_forwarding.rst
 F: examples/vmdq_dcb/
-- 
2.39.2


^ permalink raw reply	[relevance 1%]

* [PATCH 1/1] node: remove MAX macro from all nodes
@ 2023-07-19 12:30  3% Rakesh Kudurumalla
  0 siblings, 0 replies; 200+ results
From: Rakesh Kudurumalla @ 2023-07-19 12:30 UTC (permalink / raw)
  To: Nithin Dabilpuram, Pavan Nikhilesh; +Cc: dev, jerinj, Rakesh Kudurumalla

Removed MAX macro from all graph nodes to extend
edges to nodes without ABI breakage

Signed-off-by: Rakesh Kudurumalla <rkudurumalla@marvell.com>
---
Depends-on: series-28807 ("add UDP v4 support")

 lib/node/ip4_lookup.c       | 2 +-
 lib/node/ip6_lookup.c       | 2 +-
 lib/node/rte_node_ip4_api.h | 2 --
 lib/node/rte_node_ip6_api.h | 2 --
 4 files changed, 2 insertions(+), 6 deletions(-)

diff --git a/lib/node/ip4_lookup.c b/lib/node/ip4_lookup.c
index d3fc48baf7..21a135a674 100644
--- a/lib/node/ip4_lookup.c
+++ b/lib/node/ip4_lookup.c
@@ -225,7 +225,7 @@ static struct rte_node_register ip4_lookup_node = {
 
 	.init = ip4_lookup_node_init,
 
-	.nb_edges = RTE_NODE_IP4_LOOKUP_NEXT_MAX,
+	.nb_edges = RTE_NODE_IP4_LOOKUP_NEXT_IP4_LOCAL + 1,
 	.next_nodes = {
 		[RTE_NODE_IP4_LOOKUP_NEXT_IP4_LOCAL] = "ip4_local",
 		[RTE_NODE_IP4_LOOKUP_NEXT_REWRITE] = "ip4_rewrite",
diff --git a/lib/node/ip6_lookup.c b/lib/node/ip6_lookup.c
index 646e466551..6f56eb5ec5 100644
--- a/lib/node/ip6_lookup.c
+++ b/lib/node/ip6_lookup.c
@@ -362,7 +362,7 @@ static struct rte_node_register ip6_lookup_node = {
 
 	.init = ip6_lookup_node_init,
 
-	.nb_edges = RTE_NODE_IP6_LOOKUP_NEXT_MAX,
+	.nb_edges = RTE_NODE_IP6_LOOKUP_NEXT_PKT_DROP + 1,
 	.next_nodes = {
 		[RTE_NODE_IP6_LOOKUP_NEXT_REWRITE] = "ip6_rewrite",
 		[RTE_NODE_IP6_LOOKUP_NEXT_PKT_DROP] = "pkt_drop",
diff --git a/lib/node/rte_node_ip4_api.h b/lib/node/rte_node_ip4_api.h
index 405bdd3283..f9e38a4b14 100644
--- a/lib/node/rte_node_ip4_api.h
+++ b/lib/node/rte_node_ip4_api.h
@@ -32,8 +32,6 @@ enum rte_node_ip4_lookup_next {
 	/**< Packet drop node. */
 	RTE_NODE_IP4_LOOKUP_NEXT_IP4_LOCAL,
 	/** IP Local node. */
-	RTE_NODE_IP4_LOOKUP_NEXT_MAX,
-	/**< Number of next nodes of lookup node. */
 };
 
 /**
diff --git a/lib/node/rte_node_ip6_api.h b/lib/node/rte_node_ip6_api.h
index f3b5a1002a..a538dc2ea7 100644
--- a/lib/node/rte_node_ip6_api.h
+++ b/lib/node/rte_node_ip6_api.h
@@ -30,8 +30,6 @@ enum rte_node_ip6_lookup_next {
 	/**< Rewrite node. */
 	RTE_NODE_IP6_LOOKUP_NEXT_PKT_DROP,
 	/**< Packet drop node. */
-	RTE_NODE_IP6_LOOKUP_NEXT_MAX,
-	/**< Number of next nodes of lookup node. */
 };
 
 /**
-- 
2.25.1


^ permalink raw reply	[relevance 3%]

* Re: [PATCH v2 0/5] bbdev: API extension for 23.11
  2023-06-15 16:48  5% [PATCH v2 0/5] bbdev: API extension for 23.11 Nicolas Chautru
  2023-06-15 16:49  8% ` [PATCH v2 5/5] devtools: ignore changes into bbdev experimental API Nicolas Chautru
  2023-07-17 22:28  0% ` [PATCH v2 0/5] bbdev: API extension for 23.11 Chautru, Nicolas
@ 2023-07-18  9:18  0% ` Hemant Agrawal
  2 siblings, 0 replies; 200+ results
From: Hemant Agrawal @ 2023-07-18  9:18 UTC (permalink / raw)
  To: Nicolas Chautru, dev, maxime.coquelin
  Cc: trix, hemant.agrawal, david.marchand, hernan.vargas

Series-

Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>

On 15-Jun-23 10:18 PM, Nicolas Chautru wrote:
> Caution: This is an external email. Please take care when clicking links or opening attachments. When in doubt, report the message using the 'Report this email' button
>
>
> v2: moving the new mld functions at the end of struct rte_bbdev to avoid
> ABI offset changes based on feedback with Maxime.
> Adding a commit to waive the FFT ABI warning since that experimental function
> could break ABI (let me know if preferred to be merged with the FFT
> commit causing the FFT change).
>
>
> Including v1 for extending the bbdev api for 23.11.
> The new MLD-TS is expected to be non ABI compatible, the other ones
> should not break ABI.
> I will send a deprecation notice in parallel.
>
> This introduces a new operation (on top of FEC and FFT) to support
> equalization for MLD-TS. There also more modular API extension for
> existing FFT and FEC operation.
>
> Thanks
> Nic
>
>
> Nicolas Chautru (5):
>    bbdev: add operation type for MLDTS procession
>    bbdev: add new capabilities for FFT processing
>    bbdev: add new capability for FEC 5G UL processing
>    bbdev: improving error handling for queue configuration
>    devtools: ignore changes into bbdev experimental API
>
>   devtools/libabigail.abignore    |   4 +-
>   doc/guides/prog_guide/bbdev.rst |  83 ++++++++++++++++++
>   lib/bbdev/rte_bbdev.c           |  26 +++---
>   lib/bbdev/rte_bbdev.h           |  76 +++++++++++++++++
>   lib/bbdev/rte_bbdev_op.h        | 143 +++++++++++++++++++++++++++++++-
>   lib/bbdev/version.map           |   5 ++
>   6 files changed, 323 insertions(+), 14 deletions(-)
>
> --
> 2.34.1
>

^ permalink raw reply	[relevance 0%]

* RE: [PATCH 3/3] doc: announce bonding function change
  2023-07-17 15:13  3%   ` Ferruh Yigit
@ 2023-07-18  1:15  0%     ` Chaoyong He
  0 siblings, 0 replies; 200+ results
From: Chaoyong He @ 2023-07-18  1:15 UTC (permalink / raw)
  To: Ferruh Yigit, dev; +Cc: oss-drivers, Niklas Soderlund, Long Wu

> On 7/14/2023 9:15 AM, Chaoyong He wrote:
> > In order to support inclusive naming, some of the function in DPDK
> > will need to be renamed. Do this through deprecation process now for
> 23.07.
> >
> > Signed-off-by: Long Wu <long.wu@corigine.com>
> > Signed-off-by: Chaoyong He <chaoyong.he@corigine.com>
> 
> <...>
> 
> > --- a/drivers/net/bonding/rte_eth_bond.h
> > +++ b/drivers/net/bonding/rte_eth_bond.h
> > @@ -121,8 +121,16 @@ rte_eth_bond_free(const char *name);
> >   * @return
> >   *	0 on success, negative value otherwise
> >   */
> > +__rte_experimental
> >  int
> > -rte_eth_bond_slave_add(uint16_t bonded_port_id, uint16_t
> > slave_port_id);
> > +rte_eth_bond_member_add(uint16_t bonded_port_id, uint16_t
> > +member_port_id);
> > +
> > +__rte_deprecated
> > +static inline int
> > +rte_eth_bond_slave_add(uint16_t bonded_port_id, uint16_t
> > +slave_port_id) {
> > +	return rte_eth_bond_member_add(bonded_port_id, slave_port_id); }
> >
> 
> This will make old symbols disappear from shared library, since they are static
> inline functions and not object in the shared library.
> And this will break the ABI, you can see this from the CI test:
> https://mails.dpdk.org/archives/test-report/2023-July/427987.html
> 
> One option is to add old functions to the .c file, and keep old function
> declarations in the header file, with '__rte_deprecated' attribute.
> 
> But I think it is simpler/safer to rename in one go in v23.11 release, so this
> patch can update only deprecation notice to list functions that will be renamed
> in v23.11 release.

Okay. I will revise as your advice in the v2 patch, thanks.

^ permalink raw reply	[relevance 0%]

* RE: [PATCH 2/3] doc: announce bonding data change
  2023-07-17 15:03  3%   ` Ferruh Yigit
@ 2023-07-18  1:13  0%     ` Chaoyong He
  0 siblings, 0 replies; 200+ results
From: Chaoyong He @ 2023-07-18  1:13 UTC (permalink / raw)
  To: Ferruh Yigit, dev; +Cc: oss-drivers, Niklas Soderlund

> On 7/14/2023 9:15 AM, Chaoyong He wrote:
> > In order to support inclusive naming, the data structure of bonding
> > 8023 info need to be renamed. Do this through deprecation process now
> > for 23.07.
> >
> > Signed-off-by: Chaoyong He <chaoyong.he@corigine.com>
> > ---
> >  doc/guides/rel_notes/deprecation.rst      | 3 +++
> >  drivers/net/bonding/rte_eth_bond_8023ad.c | 2 +-
> > drivers/net/bonding/rte_eth_bond_8023ad.h | 4 ++--
> >  drivers/net/bonding/rte_eth_bond_pmd.c    | 4 ++--
> >  4 files changed, 8 insertions(+), 5 deletions(-)
> >
> > diff --git a/doc/guides/rel_notes/deprecation.rst
> > b/doc/guides/rel_notes/deprecation.rst
> > index c9477dd0da..5b16b66267 100644
> > --- a/doc/guides/rel_notes/deprecation.rst
> > +++ b/doc/guides/rel_notes/deprecation.rst
> > @@ -165,3 +165,6 @@ Deprecation Notices
> >  * bonding: The macro ``RTE_ETH_DEV_BONDED_SLAVE`` will be deprecated
> in
> >    DPDK 23.07, and removed in DPDK 23.11. The relevant code can be
> updated using
> >    ``RTE_ETH_DEV_BONDING_MEMBER``.
> > +  The data structure ``struct rte_eth_bond_8023ad_slave_info`` will
> > + be  deprecated in DPDK 23.07, and removed in DPDK 23.11. The
> > + relevant code can be  updated using ``struct
> rte_eth_bond_8023ad_member_info``.
> 
> <...>
> 
> > --- a/drivers/net/bonding/rte_eth_bond_8023ad.h
> > +++ b/drivers/net/bonding/rte_eth_bond_8023ad.h
> > @@ -141,7 +141,7 @@ struct rte_eth_bond_8023ad_conf {
> >  	enum rte_bond_8023ad_agg_selection agg_selection;  };
> >
> > -struct rte_eth_bond_8023ad_slave_info {
> > +struct rte_eth_bond_8023ad_member_info {
> >  	enum rte_bond_8023ad_selection selected;
> >  	uint8_t actor_state;
> >  	struct port_params actor;
> 
> There is no good way to deprecate struct names.
> 
> For macros it is possible to keep both old and new ones, old ones will give
> warning but still continue to work, so that is just a heads up for the user.
> But above is rename and will break the application, forcing user to update their
> code.
> And if we will force user to update their code, this should be done on ABI
> break release, v23.11.
> 
> That is why I suggest just keep the deprecation notice update, saying that
> struct will be renamed in v23.11, without mentioning from deprecating struct
> in this release etc..

Got it. Thanks for point it out, I will revise in the v2 patch.

^ permalink raw reply	[relevance 0%]

* RE: [PATCH v2 0/5] bbdev: API extension for 23.11
  2023-06-15 16:48  5% [PATCH v2 0/5] bbdev: API extension for 23.11 Nicolas Chautru
  2023-06-15 16:49  8% ` [PATCH v2 5/5] devtools: ignore changes into bbdev experimental API Nicolas Chautru
@ 2023-07-17 22:28  0% ` Chautru, Nicolas
  2023-07-18  9:18  0% ` Hemant Agrawal
  2 siblings, 0 replies; 200+ results
From: Chautru, Nicolas @ 2023-07-17 22:28 UTC (permalink / raw)
  To: dev, maxime.coquelin
  Cc: Rix, Tom, hemant.agrawal, david.marchand, Vargas, Hernan

Hi Maxime, Hemant, 
Can I get some review/ack for this serie please. 
Thanks
Nic

> -----Original Message-----
> From: Chautru, Nicolas <nicolas.chautru@intel.com>
> Sent: Thursday, June 15, 2023 9:49 AM
> To: dev@dpdk.org; maxime.coquelin@redhat.com
> Cc: Rix, Tom <trix@redhat.com>; hemant.agrawal@nxp.com;
> david.marchand@redhat.com; Vargas, Hernan <hernan.vargas@intel.com>;
> Chautru, Nicolas <nicolas.chautru@intel.com>
> Subject: [PATCH v2 0/5] bbdev: API extension for 23.11
> 
> v2: moving the new mld functions at the end of struct rte_bbdev to avoid
> ABI offset changes based on feedback with Maxime.
> Adding a commit to waive the FFT ABI warning since that experimental
> function could break ABI (let me know if preferred to be merged with the
> FFT commit causing the FFT change).
> 
> 
> Including v1 for extending the bbdev api for 23.11.
> The new MLD-TS is expected to be non ABI compatible, the other ones
> should not break ABI.
> I will send a deprecation notice in parallel.
> 
> This introduces a new operation (on top of FEC and FFT) to support
> equalization for MLD-TS. There also more modular API extension for
> existing FFT and FEC operation.
> 
> Thanks
> Nic
> 
> 
> Nicolas Chautru (5):
>   bbdev: add operation type for MLDTS procession
>   bbdev: add new capabilities for FFT processing
>   bbdev: add new capability for FEC 5G UL processing
>   bbdev: improving error handling for queue configuration
>   devtools: ignore changes into bbdev experimental API
> 
>  devtools/libabigail.abignore    |   4 +-
>  doc/guides/prog_guide/bbdev.rst |  83 ++++++++++++++++++
>  lib/bbdev/rte_bbdev.c           |  26 +++---
>  lib/bbdev/rte_bbdev.h           |  76 +++++++++++++++++
>  lib/bbdev/rte_bbdev_op.h        | 143
> +++++++++++++++++++++++++++++++-
>  lib/bbdev/version.map           |   5 ++
>  6 files changed, 323 insertions(+), 14 deletions(-)
> 
> --
> 2.34.1


^ permalink raw reply	[relevance 0%]

* Re: [PATCH 3/3] doc: announce bonding function change
  @ 2023-07-17 15:13  3%   ` Ferruh Yigit
  2023-07-18  1:15  0%     ` Chaoyong He
  0 siblings, 1 reply; 200+ results
From: Ferruh Yigit @ 2023-07-17 15:13 UTC (permalink / raw)
  To: Chaoyong He, dev; +Cc: oss-drivers, niklas.soderlund, Long Wu

On 7/14/2023 9:15 AM, Chaoyong He wrote:
> In order to support inclusive naming, some of the function in DPDK will
> need to be renamed. Do this through deprecation process now for 23.07.
> 
> Signed-off-by: Long Wu <long.wu@corigine.com>
> Signed-off-by: Chaoyong He <chaoyong.he@corigine.com>

<...>

> --- a/drivers/net/bonding/rte_eth_bond.h
> +++ b/drivers/net/bonding/rte_eth_bond.h
> @@ -121,8 +121,16 @@ rte_eth_bond_free(const char *name);
>   * @return
>   *	0 on success, negative value otherwise
>   */
> +__rte_experimental
>  int
> -rte_eth_bond_slave_add(uint16_t bonded_port_id, uint16_t slave_port_id);
> +rte_eth_bond_member_add(uint16_t bonded_port_id, uint16_t member_port_id);
> +
> +__rte_deprecated
> +static inline int
> +rte_eth_bond_slave_add(uint16_t bonded_port_id, uint16_t slave_port_id)
> +{
> +	return rte_eth_bond_member_add(bonded_port_id, slave_port_id);
> +}
>  

This will make old symbols disappear from shared library, since they are
static inline functions and not object in the shared library.
And this will break the ABI, you can see this from the CI test:
https://mails.dpdk.org/archives/test-report/2023-July/427987.html

One option is to add old functions to the .c file, and keep old function
declarations in the header file, with '__rte_deprecated' attribute.

But I think it is simpler/safer to rename in one go in v23.11 release,
so this patch can update only deprecation notice to list functions that
will be renamed in v23.11 release.


^ permalink raw reply	[relevance 3%]

* Re: [PATCH 2/3] doc: announce bonding data change
  @ 2023-07-17 15:03  3%   ` Ferruh Yigit
  2023-07-18  1:13  0%     ` Chaoyong He
  0 siblings, 1 reply; 200+ results
From: Ferruh Yigit @ 2023-07-17 15:03 UTC (permalink / raw)
  To: Chaoyong He, dev; +Cc: oss-drivers, niklas.soderlund

On 7/14/2023 9:15 AM, Chaoyong He wrote:
> In order to support inclusive naming, the data structure of bonding 8023
> info need to be renamed. Do this through deprecation process now for
> 23.07.
> 
> Signed-off-by: Chaoyong He <chaoyong.he@corigine.com>
> ---
>  doc/guides/rel_notes/deprecation.rst      | 3 +++
>  drivers/net/bonding/rte_eth_bond_8023ad.c | 2 +-
>  drivers/net/bonding/rte_eth_bond_8023ad.h | 4 ++--
>  drivers/net/bonding/rte_eth_bond_pmd.c    | 4 ++--
>  4 files changed, 8 insertions(+), 5 deletions(-)
> 
> diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
> index c9477dd0da..5b16b66267 100644
> --- a/doc/guides/rel_notes/deprecation.rst
> +++ b/doc/guides/rel_notes/deprecation.rst
> @@ -165,3 +165,6 @@ Deprecation Notices
>  * bonding: The macro ``RTE_ETH_DEV_BONDED_SLAVE`` will be deprecated in
>    DPDK 23.07, and removed in DPDK 23.11. The relevant code can be updated using
>    ``RTE_ETH_DEV_BONDING_MEMBER``.
> +  The data structure ``struct rte_eth_bond_8023ad_slave_info`` will be
> +  deprecated in DPDK 23.07, and removed in DPDK 23.11. The relevant code can be
> +  updated using ``struct rte_eth_bond_8023ad_member_info``.

<...>

> --- a/drivers/net/bonding/rte_eth_bond_8023ad.h
> +++ b/drivers/net/bonding/rte_eth_bond_8023ad.h
> @@ -141,7 +141,7 @@ struct rte_eth_bond_8023ad_conf {
>  	enum rte_bond_8023ad_agg_selection agg_selection;
>  };
>  
> -struct rte_eth_bond_8023ad_slave_info {
> +struct rte_eth_bond_8023ad_member_info {
>  	enum rte_bond_8023ad_selection selected;
>  	uint8_t actor_state;
>  	struct port_params actor;

There is no good way to deprecate struct names.

For macros it is possible to keep both old and new ones, old ones will
give warning but still continue to work, so that is just a heads up for
the user.
But above is rename and will break the application, forcing user to
update their code.
And if we will force user to update their code, this should be done on
ABI break release, v23.11.

That is why I suggest just keep the deprecation notice update, saying
that struct will be renamed in v23.11, without mentioning from
deprecating struct in this release etc..

^ permalink raw reply	[relevance 3%]

* Re: [PATCH v1] doc: deprecation notice to add callback data to rte_event_fp_ops
  2023-07-17 11:43  0%   ` Jerin Jacob
@ 2023-07-17 12:42  0%     ` Ferruh Yigit
  0 siblings, 0 replies; 200+ results
From: Ferruh Yigit @ 2023-07-17 12:42 UTC (permalink / raw)
  To: Jerin Jacob, Sivaprasad Tummala
  Cc: dev, bruce.richardson, david.marchand, thomas

On 7/17/2023 12:43 PM, Jerin Jacob wrote:
> On Mon, Jul 17, 2023 at 4:54 PM Sivaprasad Tummala
> <sivaprasad.tummala@amd.com> wrote:
>>
>> Deprecation notice to add "rte_eventdev_port_data" field to
>> ``rte_event_fp_ops`` for callback support.
>>
>> Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
> 
> Acked-by: Jerin Jacob <jerinj@marvell.com>
> 

Acked-by: Ferruh Yigit <ferruh.yigit@amd.com>

> 
>> ---
>>  doc/guides/rel_notes/deprecation.rst | 7 +++++++
>>  1 file changed, 7 insertions(+)
>>
>> diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
>> index fb771a0305..057f97ce5a 100644
>> --- a/doc/guides/rel_notes/deprecation.rst
>> +++ b/doc/guides/rel_notes/deprecation.rst
>> @@ -130,6 +130,13 @@ Deprecation Notices
>>    ``rte_cryptodev_get_auth_algo_string``, ``rte_cryptodev_get_aead_algo_string`` and
>>    ``rte_cryptodev_asym_get_xform_string`` respectively.
>>
>> +* eventdev: The struct rte_event_fp_ops will be updated with a new element
>> +  rte_eventdev_port_data to support optional callbacks in DPDK 23.11.
>> +  rte_eventdev_port_data is used to hold callbacks registered optionally
>> +  per event device port and associated callback data. By adding rte_eventdev_port_data
>> +  to rte_event_fp_ops, allows to fetch this data for fastpath eventdev inline functions
>> +  in advance. This changes the size of rte_event_fp_ops and result in ABI change.
>> +
>>  * security: Hide structures ``rte_security_ops`` and ``rte_security_ctx``
>>    as these are internal to DPDK library and drivers.
>>
>> --
>> 2.34.1
>>


^ permalink raw reply	[relevance 0%]

* Re: [PATCH v1] doc: deprecation notice to add callback data to rte_event_fp_ops
  2023-07-17 11:24  5% ` [PATCH v1] " Sivaprasad Tummala
@ 2023-07-17 11:43  0%   ` Jerin Jacob
  2023-07-17 12:42  0%     ` Ferruh Yigit
  2023-07-25  8:40  0%   ` Ferruh Yigit
  1 sibling, 1 reply; 200+ results
From: Jerin Jacob @ 2023-07-17 11:43 UTC (permalink / raw)
  To: Sivaprasad Tummala
  Cc: dev, ferruh.yigit, bruce.richardson, david.marchand, thomas

On Mon, Jul 17, 2023 at 4:54 PM Sivaprasad Tummala
<sivaprasad.tummala@amd.com> wrote:
>
> Deprecation notice to add "rte_eventdev_port_data" field to
> ``rte_event_fp_ops`` for callback support.
>
> Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>

Acked-by: Jerin Jacob <jerinj@marvell.com>


> ---
>  doc/guides/rel_notes/deprecation.rst | 7 +++++++
>  1 file changed, 7 insertions(+)
>
> diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
> index fb771a0305..057f97ce5a 100644
> --- a/doc/guides/rel_notes/deprecation.rst
> +++ b/doc/guides/rel_notes/deprecation.rst
> @@ -130,6 +130,13 @@ Deprecation Notices
>    ``rte_cryptodev_get_auth_algo_string``, ``rte_cryptodev_get_aead_algo_string`` and
>    ``rte_cryptodev_asym_get_xform_string`` respectively.
>
> +* eventdev: The struct rte_event_fp_ops will be updated with a new element
> +  rte_eventdev_port_data to support optional callbacks in DPDK 23.11.
> +  rte_eventdev_port_data is used to hold callbacks registered optionally
> +  per event device port and associated callback data. By adding rte_eventdev_port_data
> +  to rte_event_fp_ops, allows to fetch this data for fastpath eventdev inline functions
> +  in advance. This changes the size of rte_event_fp_ops and result in ABI change.
> +
>  * security: Hide structures ``rte_security_ops`` and ``rte_security_ctx``
>    as these are internal to DPDK library and drivers.
>
> --
> 2.34.1
>

^ permalink raw reply	[relevance 0%]

* [PATCH v1] doc: deprecation notice to add callback data to rte_event_fp_ops
  2023-07-12 17:30  5% [PATCH] doc: deprecation notice to add callback data to rte_event_fp_ops Sivaprasad Tummala
  2023-07-13  8:51  0% ` Jerin Jacob
@ 2023-07-17 11:24  5% ` Sivaprasad Tummala
  2023-07-17 11:43  0%   ` Jerin Jacob
  2023-07-25  8:40  0%   ` Ferruh Yigit
  1 sibling, 2 replies; 200+ results
From: Sivaprasad Tummala @ 2023-07-17 11:24 UTC (permalink / raw)
  To: dev; +Cc: ferruh.yigit, bruce.richardson, david.marchand, thomas, jerinjacobk

Deprecation notice to add "rte_eventdev_port_data" field to
``rte_event_fp_ops`` for callback support.

Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
---
 doc/guides/rel_notes/deprecation.rst | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index fb771a0305..057f97ce5a 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -130,6 +130,13 @@ Deprecation Notices
   ``rte_cryptodev_get_auth_algo_string``, ``rte_cryptodev_get_aead_algo_string`` and
   ``rte_cryptodev_asym_get_xform_string`` respectively.
 
+* eventdev: The struct rte_event_fp_ops will be updated with a new element
+  rte_eventdev_port_data to support optional callbacks in DPDK 23.11.
+  rte_eventdev_port_data is used to hold callbacks registered optionally
+  per event device port and associated callback data. By adding rte_eventdev_port_data
+  to rte_event_fp_ops, allows to fetch this data for fastpath eventdev inline functions
+  in advance. This changes the size of rte_event_fp_ops and result in ABI change.
+
 * security: Hide structures ``rte_security_ops`` and ``rte_security_ctx``
   as these are internal to DPDK library and drivers.
 
-- 
2.34.1


^ permalink raw reply	[relevance 5%]

* Re: [PATCH] doc: announce ethdev operation struct changes
  2023-07-13 12:50  0%     ` Morten Brørup
@ 2023-07-17  8:28  0%       ` Andrew Rybchenko
  0 siblings, 0 replies; 200+ results
From: Andrew Rybchenko @ 2023-07-17  8:28 UTC (permalink / raw)
  To: Morten Brørup, Feifei Wang, dev
  Cc: nd, Honnappa Nagarahalli, Ruifeng Wang, Konstantin Ananyev,
	Ferruh Yigit, thomas

On 7/13/23 15:50, Morten Brørup wrote:
>> From: Feifei Wang [mailto:Feifei.Wang2@arm.com]
>> Sent: Thursday, 13 July 2023 04.37
>>
>>> From: Feifei Wang
>>> Sent: Tuesday, July 4, 2023 4:17 PM
>>>
>>>> From: Feifei Wang <feifei.wang2@arm.com>
>>>> Sent: Tuesday, July 4, 2023 4:10 PM
>>>>
>>>> To support mbufs recycle mode, announce the coming ABI changes from
>>>> DPDK 23.11.
>>>>
>>>> Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
>>>> Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
>>>> ---
>>>>   doc/guides/rel_notes/deprecation.rst | 4 ++++
>>>>   1 file changed, 4 insertions(+)
>>>>
>>>> diff --git a/doc/guides/rel_notes/deprecation.rst
>>>> b/doc/guides/rel_notes/deprecation.rst
>>>> index 66431789b0..c7e1ffafb2 100644
>>>> --- a/doc/guides/rel_notes/deprecation.rst
>>>> +++ b/doc/guides/rel_notes/deprecation.rst
>>>> @@ -118,6 +118,10 @@ Deprecation Notices
>>>>     The legacy actions should be removed
>>>>     once ``MODIFY_FIELD`` alternative is implemented in drivers.
>>>>
>>>> +* ethdev: The Ethernet device data structure ``struct rte_eth_dev``
>>>> +and
>>>> +  the fast-path ethdev flat array ``struct rte_eth_fp_ops`` will be
>>>> +updated
>>>> +  with new fields to support mbufs recycle mode from DPDK 23.11.
>>>> +
>>>>   * cryptodev: The function ``rte_cryptodev_cb_fn`` will be updated
>>>>     to have another parameter ``qp_id`` to return the queue pair ID
>>>>     which got error interrupt to the application,
>>>> --
>>>> 2.25.1
>>
>> Ping~
> 
> Acked-by: Morten Brørup <mb@smartsharesystems.com>
> 

Acked-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>


^ permalink raw reply	[relevance 0%]

* [RFC] MAINTAINERS: add status information
@ 2023-07-16 21:25  1% Stephen Hemminger
  2023-07-19 16:07  1% ` [PATCH v2] " Stephen Hemminger
                   ` (4 more replies)
  0 siblings, 5 replies; 200+ results
From: Stephen Hemminger @ 2023-07-16 21:25 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger, Thomas Monjalon

Add a new field S: which indicates the status of support for
individual sub-trees. Almost everything is marked as supported
but components without any maintainer are listed as Orphan.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 MAINTAINERS | 267 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 266 insertions(+), 1 deletion(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index 5bb8090ebe7e..d523ea34d4f3 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -17,6 +17,16 @@ Descriptions of section entries:
 	X: Files and directories exclusion, same rules as F:
 	K: Keyword regex pattern to match content.
 	   One regex pattern per line. Multiple K: lines acceptable.
+	S: *Status*, one of the following:
+	   Supported:	Someone is actually paid to look after this.
+	   Maintained:	Someone actually looks after it.
+	   Odd Fixes:	It has a maintainer but they don't have time to do
+			much other than throw the odd patch in. See below..
+	   Orphan:	No current maintainer [but maybe you could take the
+			role as you write your new code].
+	   Obsolete:	Old code. Something tagged obsolete generally means
+			it has been replaced by a better system and you
+			should be using that.
 
 
 General Project Administration
@@ -25,44 +35,54 @@ General Project Administration
 Main Branch
 M: Thomas Monjalon <thomas@monjalon.net>
 M: David Marchand <david.marchand@redhat.com>
+S: Supported
 T: git://dpdk.org/dpdk
 
 Next-net Tree
 M: Ferruh Yigit <ferruh.yigit@amd.com>
 M: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net
 
 Next-net-brcm Tree
 M: Ajit Khaparde <ajit.khaparde@broadcom.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-brcm
 
 Next-net-intel Tree
 M: Qi Zhang <qi.z.zhang@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 
 Next-net-mrvl Tree
 M: Jerin Jacob <jerinj@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 
 Next-net-mlx Tree
 M: Raslan Darawsheh <rasland@nvidia.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mlx
 
 Next-virtio Tree
 M: Maxime Coquelin <maxime.coquelin@redhat.com>
 M: Chenbo Xia <chenbo.xia@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-virtio
 
 Next-crypto Tree
 M: Akhil Goyal <gakhil@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-crypto
 
 Next-eventdev Tree
 M: Jerin Jacob <jerinj@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-eventdev
 
 Next-baseband Tree
 M: Maxime Coquelin <maxime.coquelin@redhat.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-baseband
 
 Stable Branches
@@ -70,17 +90,21 @@ M: Luca Boccassi <bluca@debian.org>
 M: Kevin Traynor <ktraynor@redhat.com>
 M: Christian Ehrhardt <christian.ehrhardt@canonical.com>
 M: Xueming Li <xuemingl@nvidia.com>
+S: Supported
 T: git://dpdk.org/dpdk-stable
 
 Security Issues
 M: maintainers@dpdk.org
+S: Supported
 
 Documentation (with overlaps)
 F: README
 F: doc/
+S: Supported
 
 Developers and Maintainers Tools
 M: Thomas Monjalon <thomas@monjalon.net>
+S: Supported
 F: MAINTAINERS
 F: devtools/build-dict.sh
 F: devtools/check-abi.sh
@@ -110,7 +134,7 @@ F: .mailmap
 
 Build System
 M: Bruce Richardson <bruce.richardson@intel.com>
-F: Makefile
+S: Maintained
 F: meson.build
 F: meson_options.txt
 F: config/
@@ -130,11 +154,13 @@ F: devtools/check-meson.py
 Public CI
 M: Aaron Conole <aconole@redhat.com>
 M: Michael Santana <maicolgabriel@hotmail.com>
+S: Supported
 F: .github/workflows/build.yml
 F: .ci/
 
 Driver information
 M: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
+S: Maintained
 F: buildtools/coff.py
 F: buildtools/gen-pmdinfo-cfile.py
 F: buildtools/pmdinfogen.py
@@ -147,6 +173,7 @@ Environment Abstraction Layer
 T: git://dpdk.org/dpdk
 
 EAL API and common code
+S: Supported
 F: lib/eal/common/
 F: lib/eal/unix/
 F: lib/eal/include/
@@ -180,6 +207,7 @@ F: app/test/test_version.c
 Trace - EXPERIMENTAL
 M: Jerin Jacob <jerinj@marvell.com>
 M: Sunil Kumar Kori <skori@marvell.com>
+S: Supported
 F: lib/eal/include/rte_trace*.h
 F: lib/eal/common/eal_common_trace*.c
 F: lib/eal/common/eal_trace.h
@@ -188,6 +216,7 @@ F: app/test/test_trace*
 
 Memory Allocation
 M: Anatoly Burakov <anatoly.burakov@intel.com>
+S: Supported
 F: lib/eal/include/rte_fbarray.h
 F: lib/eal/include/rte_mem*
 F: lib/eal/include/rte_malloc.h
@@ -209,11 +238,13 @@ F: app/test/test_memzone.c
 
 Interrupt Subsystem
 M: Harman Kalra <hkalra@marvell.com>
+S: Supported
 F: lib/eal/include/rte_epoll.h
 F: lib/eal/*/*interrupts.*
 F: app/test/test_interrupts.c
 
 Keep alive
+S: Orphan
 F: lib/eal/include/rte_keepalive.h
 F: lib/eal/common/rte_keepalive.c
 F: examples/l2fwd-keepalive/
@@ -221,6 +252,7 @@ F: doc/guides/sample_app_ug/keep_alive.rst
 
 Secondary process
 M: Anatoly Burakov <anatoly.burakov@intel.com>
+S: Maintained
 K: RTE_PROC_
 F: lib/eal/common/eal_common_proc.c
 F: doc/guides/prog_guide/multi_proc_support.rst
@@ -230,6 +262,7 @@ F: doc/guides/sample_app_ug/multi_process.rst
 
 Service Cores
 M: Harry van Haaren <harry.van.haaren@intel.com>
+S: Supported
 F: lib/eal/include/rte_service.h
 F: lib/eal/include/rte_service_component.h
 F: lib/eal/common/rte_service.c
@@ -240,44 +273,52 @@ F: doc/guides/sample_app_ug/service_cores.rst
 
 Bitops
 M: Joyce Kong <joyce.kong@arm.com>
+S: Supported
 F: lib/eal/include/rte_bitops.h
 F: app/test/test_bitops.c
 
 Bitmap
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
+S: Supported
 F: lib/eal/include/rte_bitmap.h
 F: app/test/test_bitmap.c
 
 MCSlock
 M: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
+S: Supported
 F: lib/eal/include/rte_mcslock.h
 F: app/test/test_mcslock.c
 
 Sequence Lock
 M: Mattias Rönnblom <mattias.ronnblom@ericsson.com>
+S: Supported
 F: lib/eal/include/rte_seqcount.h
 F: lib/eal/include/rte_seqlock.h
 F: app/test/test_seqlock.c
 
 Ticketlock
 M: Joyce Kong <joyce.kong@arm.com>
+S: Supported
 F: lib/eal/include/rte_ticketlock.h
 F: app/test/test_ticketlock.c
 
 Pseudo-random Number Generation
 M: Mattias Rönnblom <mattias.ronnblom@ericsson.com>
+S: Supported
 F: lib/eal/include/rte_random.h
 F: lib/eal/common/rte_random.c
 F: app/test/test_rand_perf.c
 
 ARM v7
 M: Ruifeng Wang <ruifeng.wang@arm.com>
+S: Supported
 F: config/arm/
 F: lib/eal/arm/
 X: lib/eal/arm/include/*_64.h
 
 ARM v8
 M: Ruifeng Wang <ruifeng.wang@arm.com>
+S: Supported
 F: config/arm/
 F: doc/guides/linux_gsg/cross_build_dpdk_for_arm64.rst
 F: lib/eal/arm/
@@ -291,12 +332,14 @@ F: examples/common/neon/
 
 LoongArch
 M: Min Zhou <zhoumin@loongson.cn>
+S: Supported
 F: config/loongarch/
 F: doc/guides/linux_gsg/cross_build_dpdk_for_loongarch.rst
 F: lib/eal/loongarch/
 
 IBM POWER (alpha)
 M: David Christensen <drc@linux.vnet.ibm.com>
+S: Supported
 F: config/ppc/
 F: lib/eal/ppc/
 F: lib/*/*_altivec*
@@ -307,6 +350,7 @@ F: examples/common/altivec/
 
 RISC-V
 M: Stanislaw Kardach <kda@semihalf.com>
+S: Supported
 F: config/riscv/
 F: doc/guides/linux_gsg/cross_build_dpdk_for_riscv.rst
 F: lib/eal/riscv/
@@ -314,6 +358,7 @@ F: lib/eal/riscv/
 Intel x86
 M: Bruce Richardson <bruce.richardson@intel.com>
 M: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
+S: Supported
 F: config/x86/
 F: doc/guides/linux_gsg/nic_perf_intel_platform.rst
 F: buildtools/binutils-avx512-check.py
@@ -330,28 +375,34 @@ F: examples/*/*_avx*
 F: examples/common/sse/
 
 Linux EAL (with overlaps)
+S: Maintained
 F: lib/eal/linux/
 F: doc/guides/linux_gsg/
 
 Linux UIO
+S: Maintained
 F: drivers/bus/pci/linux/*uio*
 
 Linux VFIO
 M: Anatoly Burakov <anatoly.burakov@intel.com>
+S: Supported
 F: lib/eal/linux/*vfio*
 F: drivers/bus/pci/linux/*vfio*
 
 FreeBSD EAL (with overlaps)
 M: Bruce Richardson <bruce.richardson@intel.com>
+S: Supported
 F: lib/eal/freebsd/
 F: doc/guides/freebsd_gsg/
 
 FreeBSD contigmem
 M: Bruce Richardson <bruce.richardson@intel.com>
+S: Supported
 F: kernel/freebsd/contigmem/
 
 FreeBSD UIO
 M: Bruce Richardson <bruce.richardson@intel.com>
+S: Supported
 F: kernel/freebsd/nic_uio/
 
 Windows support
@@ -359,12 +410,14 @@ M: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
 M: Narcisa Ana Maria Vasile <navasile@linux.microsoft.com>
 M: Dmitry Malloy <dmitrym@microsoft.com>
 M: Pallavi Kadam <pallavi.kadam@intel.com>
+S: Supported
 F: lib/eal/windows/
 F: buildtools/map_to_win.py
 F: doc/guides/windows_gsg/
 
 Windows memory allocation
 M: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
+S: Supported
 F: lib/eal/windows/eal_hugepages.c
 F: lib/eal/windows/eal_mem*
 
@@ -372,10 +425,12 @@ F: lib/eal/windows/eal_mem*
 Core Libraries
 --------------
 T: git://dpdk.org/dpdk
+S: Maintained
 
 Memory pool
 M: Olivier Matz <olivier.matz@6wind.com>
 M: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
+S: Supported
 F: lib/mempool/
 F: drivers/mempool/ring/
 F: doc/guides/prog_guide/mempool_lib.rst
@@ -385,6 +440,7 @@ F: app/test/test_func_reentrancy.c
 Ring queue
 M: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
 M: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
+S: Supported
 F: lib/ring/
 F: doc/guides/prog_guide/ring_lib.rst
 F: app/test/test_ring*
@@ -392,6 +448,7 @@ F: app/test/test_func_reentrancy.c
 
 Stack
 M: Olivier Matz <olivier.matz@6wind.com>
+S: Supported
 F: lib/stack/
 F: drivers/mempool/stack/
 F: app/test/test_stack*
@@ -399,6 +456,7 @@ F: doc/guides/prog_guide/stack_lib.rst
 
 Packet buffer
 M: Olivier Matz <olivier.matz@6wind.com>
+S: Supported
 F: lib/mbuf/
 F: doc/guides/prog_guide/mbuf_lib.rst
 F: app/test/test_mbuf.c
@@ -407,6 +465,7 @@ Ethernet API
 M: Thomas Monjalon <thomas@monjalon.net>
 M: Ferruh Yigit <ferruh.yigit@amd.com>
 M: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net
 F: lib/ethdev/
 F: app/test/test_ethdev*
@@ -415,6 +474,7 @@ F: doc/guides/prog_guide/switch_representation.rst
 
 Flow API
 M: Ori Kam <orika@nvidia.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net
 F: app/test-pmd/cmdline_flow.c
 F: doc/guides/prog_guide/rte_flow.rst
@@ -422,18 +482,21 @@ F: lib/ethdev/rte_flow*
 
 Traffic Management API - EXPERIMENTAL
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net
 F: lib/ethdev/rte_tm*
 F: app/test-pmd/cmdline_tm.*
 
 Traffic Metering and Policing API - EXPERIMENTAL
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net
 F: lib/ethdev/rte_mtr*
 F: app/test-pmd/cmdline_mtr.*
 
 Baseband API
 M: Nicolas Chautru <nicolas.chautru@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-baseband
 F: lib/bbdev/
 F: doc/guides/prog_guide/bbdev.rst
@@ -446,6 +509,7 @@ F: doc/guides/sample_app_ug/bbdev_app.rst
 Crypto API
 M: Akhil Goyal <gakhil@marvell.com>
 M: Fan Zhang <fanzhang.oss@gmail.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-crypto
 F: lib/cryptodev/
 F: app/test/test_cryptodev*
@@ -453,6 +517,7 @@ F: examples/l2fwd-crypto/
 
 Security API
 M: Akhil Goyal <gakhil@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-crypto
 F: lib/security/
 F: doc/guides/prog_guide/rte_security.rst
@@ -461,6 +526,7 @@ F: app/test/test_security*
 Compression API - EXPERIMENTAL
 M: Fan Zhang <fanzhang.oss@gmail.com>
 M: Ashish Gupta <ashish.gupta@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-crypto
 F: lib/compressdev/
 F: drivers/compress/
@@ -470,6 +536,7 @@ F: doc/guides/compressdevs/features/default.ini
 
 RegEx API - EXPERIMENTAL
 M: Ori Kam <orika@nvidia.com>
+S: Supported
 F: lib/regexdev/
 F: app/test-regex/
 F: doc/guides/prog_guide/regexdev.rst
@@ -477,6 +544,7 @@ F: doc/guides/regexdevs/features/default.ini
 
 Machine Learning device API - EXPERIMENTAL
 M: Srikanth Yalavarthi <syalavarthi@marvell.com>
+S: Supported
 F: lib/mldev/
 F: doc/guides/prog_guide/mldev.rst
 F: app/test-mldev/
@@ -484,6 +552,7 @@ F: doc/guides/tools/testmldev.rst
 
 DMA device API - EXPERIMENTAL
 M: Chengwen Feng <fengchengwen@huawei.com>
+S: Supported
 F: lib/dmadev/
 F: drivers/dma/skeleton/
 F: app/test/test_dmadev*
@@ -495,6 +564,7 @@ F: doc/guides/sample_app_ug/dma.rst
 
 General-Purpose Graphics Processing Unit (GPU) API - EXPERIMENTAL
 M: Elena Agostini <eagostini@nvidia.com>
+S: Supported
 F: lib/gpudev/
 F: doc/guides/prog_guide/gpudev.rst
 F: doc/guides/gpus/features/default.ini
@@ -502,6 +572,7 @@ F: app/test-gpudev/
 
 Eventdev API
 M: Jerin Jacob <jerinj@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-eventdev
 F: lib/eventdev/
 F: drivers/event/skeleton/
@@ -510,6 +581,7 @@ F: examples/l3fwd/l3fwd_event*
 
 Eventdev Ethdev Rx Adapter API
 M: Naga Harish K S V <s.v.naga.harish.k@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-eventdev
 F: lib/eventdev/*eth_rx_adapter*
 F: app/test/test_event_eth_rx_adapter.c
@@ -517,6 +589,7 @@ F: doc/guides/prog_guide/event_ethernet_rx_adapter.rst
 
 Eventdev Ethdev Tx Adapter API
 M: Naga Harish K S V <s.v.naga.harish.k@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-eventdev
 F: lib/eventdev/*eth_tx_adapter*
 F: app/test/test_event_eth_tx_adapter.c
@@ -524,6 +597,7 @@ F: doc/guides/prog_guide/event_ethernet_tx_adapter.rst
 
 Eventdev Timer Adapter API
 M: Erik Gabriel Carrillo <erik.g.carrillo@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-eventdev
 F: lib/eventdev/*timer_adapter*
 F: app/test/test_event_timer_adapter.c
@@ -531,6 +605,7 @@ F: doc/guides/prog_guide/event_timer_adapter.rst
 
 Eventdev Crypto Adapter API
 M: Abhinandan Gujjar <abhinandan.gujjar@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-eventdev
 F: lib/eventdev/*crypto_adapter*
 F: app/test/test_event_crypto_adapter.c
@@ -539,6 +614,7 @@ F: doc/guides/prog_guide/event_crypto_adapter.rst
 Raw device API
 M: Sachin Saxena <sachin.saxena@oss.nxp.com>
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
+S: Supported
 F: lib/rawdev/
 F: drivers/raw/skeleton/
 F: app/test/test_rawdev.c
@@ -551,11 +627,13 @@ Memory Pool Drivers
 Bucket memory pool
 M: Artem V. Andreev <artem.andreev@oktetlabs.ru>
 M: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
+S: Supported
 F: drivers/mempool/bucket/
 
 Marvell cnxk
 M: Ashwin Sekhar T K <asekhar@marvell.com>
 M: Pavan Nikhilesh <pbhagavatula@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/mempool/cnxk/
 F: doc/guides/mempool/cnxk.rst
@@ -567,20 +645,24 @@ Bus Drivers
 AMD CDX bus
 M: Nipun Gupta <nipun.gupta@amd.com>
 M: Nikhil Agarwal <nikhil.agarwal@amd.com>
+S: Supported
 F: drivers/bus/cdx/
 
 Auxiliary bus driver - EXPERIMENTAL
 M: Parav Pandit <parav@nvidia.com>
 M: Xueming Li <xuemingl@nvidia.com>
+S: Supported
 F: drivers/bus/auxiliary/
 
 Intel FPGA bus
 M: Rosen Xu <rosen.xu@intel.com>
+S: Supported
 F: drivers/bus/ifpga/
 
 NXP buses
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
 M: Sachin Saxena <sachin.saxena@oss.nxp.com>
+S: Supported
 F: drivers/common/dpaax/
 F: drivers/bus/dpaa/
 F: drivers/bus/fslmc/
@@ -588,36 +670,43 @@ F: drivers/bus/fslmc/
 PCI bus driver
 M: Chenbo Xia <chenbo.xia@intel.com>
 M: Nipun Gupta <nipun.gupta@amd.com>
+S: Supported
 F: drivers/bus/pci/
 
 Platform bus driver
 M: Tomasz Duszynski <tduszynski@marvell.com>
+S: Supported
 F: drivers/bus/platform/
 
 VDEV bus driver
+S: Maintained
 F: drivers/bus/vdev/
 F: app/test/test_vdev.c
 
 VMBUS bus driver
 M: Long Li <longli@microsoft.com>
+S: Supported
 F: drivers/bus/vmbus/
 
 
 Networking Drivers
 ------------------
 M: Ferruh Yigit <ferruh.yigit@amd.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net
 F: doc/guides/nics/features/default.ini
 
 Link bonding
 M: Chas Williams <chas3@att.com>
 M: Min Hu (Connor) <humin29@huawei.com>
+S: Supported
 F: drivers/net/bonding/
 F: doc/guides/prog_guide/link_bonding_poll_mode_drv_lib.rst
 F: app/test/test_link_bonding*
 F: examples/bond/
 
 Linux KNI
+S: Obsolete
 F: kernel/linux/kni/
 F: lib/kni/
 F: doc/guides/prog_guide/kernel_nic_interface.rst
@@ -625,12 +714,14 @@ F: app/test/test_kni.c
 
 Linux AF_PACKET
 M: John W. Linville <linville@tuxdriver.com>
+S: Odd Fixes
 F: drivers/net/af_packet/
 F: doc/guides/nics/features/afpacket.ini
 
 Linux AF_XDP
 M: Ciara Loftus <ciara.loftus@intel.com>
 M: Qi Zhang <qi.z.zhang@intel.com>
+S: Supported
 F: drivers/net/af_xdp/
 F: doc/guides/nics/af_xdp.rst
 F: doc/guides/nics/features/af_xdp.ini
@@ -641,24 +732,28 @@ M: Shai Brandes <shaibran@amazon.com>
 M: Evgeny Schemeilin <evgenys@amazon.com>
 M: Igor Chauskin <igorch@amazon.com>
 M: Ron Beider <rbeider@amazon.com>
+S: Supported
 F: drivers/net/ena/
 F: doc/guides/nics/ena.rst
 F: doc/guides/nics/features/ena.ini
 
 AMD axgbe
 M: Chandubabu Namburu <chandu@amd.com>
+S: Supported
 F: drivers/net/axgbe/
 F: doc/guides/nics/axgbe.rst
 F: doc/guides/nics/features/axgbe.ini
 
 AMD Pensando ionic
 M: Andrew Boyer <andrew.boyer@amd.com>
+S: Supported
 F: drivers/net/ionic/
 F: doc/guides/nics/ionic.rst
 F: doc/guides/nics/features/ionic.ini
 
 Marvell/Aquantia atlantic
 M: Igor Russkikh <irusskikh@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/net/atlantic/
 F: doc/guides/nics/atlantic.rst
@@ -668,6 +763,7 @@ Atomic Rules ARK
 M: Shepard Siegel <shepard.siegel@atomicrules.com>
 M: Ed Czeck <ed.czeck@atomicrules.com>
 M: John Miller <john.miller@atomicrules.com>
+S: Supported
 F: drivers/net/ark/
 F: doc/guides/nics/ark.rst
 F: doc/guides/nics/features/ark.ini
@@ -675,6 +771,7 @@ F: doc/guides/nics/features/ark.ini
 Broadcom bnxt
 M: Ajit Khaparde <ajit.khaparde@broadcom.com>
 M: Somnath Kotur <somnath.kotur@broadcom.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-brcm
 F: drivers/net/bnxt/
 F: doc/guides/nics/bnxt.rst
@@ -683,6 +780,7 @@ F: doc/guides/nics/features/bnxt.ini
 Cavium ThunderX nicvf
 M: Jerin Jacob <jerinj@marvell.com>
 M: Maciej Czekaj <mczekaj@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/net/thunderx/
 F: doc/guides/nics/thunderx.rst
@@ -690,6 +788,7 @@ F: doc/guides/nics/features/thunderx.ini
 
 Cavium OCTEON TX
 M: Harman Kalra <hkalra@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/common/octeontx/
 F: drivers/mempool/octeontx/
@@ -699,6 +798,7 @@ F: doc/guides/nics/features/octeontx.ini
 
 Chelsio cxgbe
 M: Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>
+S: Supported
 F: drivers/net/cxgbe/
 F: doc/guides/nics/cxgbe.rst
 F: doc/guides/nics/features/cxgbe.ini
@@ -706,6 +806,7 @@ F: doc/guides/nics/features/cxgbe.ini
 Cisco enic
 M: John Daley <johndale@cisco.com>
 M: Hyong Youb Kim <hyonkim@cisco.com>
+S: Supported
 F: drivers/net/enic/
 F: doc/guides/nics/enic.rst
 F: doc/guides/nics/features/enic.ini
@@ -715,6 +816,7 @@ M: Junfeng Guo <junfeng.guo@intel.com>
 M: Jeroen de Borst <jeroendb@google.com>
 M: Rushil Gupta <rushilg@google.com>
 M: Joshua Washington <joshwash@google.com>
+S: Supported
 F: drivers/net/gve/
 F: doc/guides/nics/gve.rst
 F: doc/guides/nics/features/gve.ini
@@ -722,6 +824,7 @@ F: doc/guides/nics/features/gve.ini
 Hisilicon hns3
 M: Dongdong Liu <liudongdong3@huawei.com>
 M: Yisen Zhuang <yisen.zhuang@huawei.com>
+S: Supported
 F: drivers/net/hns3/
 F: doc/guides/nics/hns3.rst
 F: doc/guides/nics/features/hns3.ini
@@ -730,6 +833,7 @@ Huawei hinic
 M: Ziyang Xuan <xuanziyang2@huawei.com>
 M: Xiaoyun Wang <cloud.wangxiaoyun@huawei.com>
 M: Guoyang Zhou <zhouguoyang@huawei.com>
+S: Supported
 F: drivers/net/hinic/
 F: doc/guides/nics/hinic.rst
 F: doc/guides/nics/features/hinic.ini
@@ -737,6 +841,7 @@ F: doc/guides/nics/features/hinic.ini
 Intel e1000
 M: Simei Su <simei.su@intel.com>
 M: Wenjun Wu <wenjun1.wu@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/e1000/
 F: doc/guides/nics/e1000em.rst
@@ -747,6 +852,7 @@ F: doc/guides/nics/features/igb*.ini
 Intel ixgbe
 M: Qiming Yang <qiming.yang@intel.com>
 M: Wenjun Wu <wenjun1.wu@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/ixgbe/
 F: doc/guides/nics/ixgbe.rst
@@ -756,6 +862,7 @@ F: doc/guides/nics/features/ixgbe*.ini
 Intel i40e
 M: Yuying Zhang <Yuying.Zhang@intel.com>
 M: Beilei Xing <beilei.xing@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/i40e/
 F: doc/guides/nics/i40e.rst
@@ -765,6 +872,7 @@ F: doc/guides/nics/features/i40e*.ini
 Intel fm10k
 M: Qi Zhang <qi.z.zhang@intel.com>
 M: Xiao Wang <xiao.w.wang@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/fm10k/
 F: doc/guides/nics/fm10k.rst
@@ -773,6 +881,7 @@ F: doc/guides/nics/features/fm10k*.ini
 Intel iavf
 M: Jingjing Wu <jingjing.wu@intel.com>
 M: Beilei Xing <beilei.xing@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/iavf/
 F: drivers/common/iavf/
@@ -781,6 +890,7 @@ F: doc/guides/nics/features/iavf*.ini
 Intel ice
 M: Qiming Yang <qiming.yang@intel.com>
 M: Qi Zhang <qi.z.zhang@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/ice/
 F: doc/guides/nics/ice.rst
@@ -789,6 +899,7 @@ F: doc/guides/nics/features/ice.ini
 Intel idpf
 M: Jingjing Wu <jingjing.wu@intel.com>
 M: Beilei Xing <beilei.xing@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/idpf/
 F: drivers/common/idpf/
@@ -798,6 +909,7 @@ F: doc/guides/nics/features/idpf.ini
 Intel cpfl - EXPERIMENTAL
 M: Yuying Zhang <yuying.zhang@intel.com>
 M: Beilei Xing <beilei.xing@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/cpfl/
 F: doc/guides/nics/cpfl.rst
@@ -806,6 +918,7 @@ F: doc/guides/nics/features/cpfl.ini
 Intel igc
 M: Junfeng Guo <junfeng.guo@intel.com>
 M: Simei Su <simei.su@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/igc/
 F: doc/guides/nics/igc.rst
@@ -814,6 +927,7 @@ F: doc/guides/nics/features/igc.ini
 Intel ipn3ke
 M: Rosen Xu <rosen.xu@intel.com>
 T: git://dpdk.org/next/dpdk-next-net-intel
+S: Supported
 F: drivers/net/ipn3ke/
 F: doc/guides/nics/ipn3ke.rst
 F: doc/guides/nics/features/ipn3ke.ini
@@ -823,6 +937,7 @@ M: Nithin Dabilpuram <ndabilpuram@marvell.com>
 M: Kiran Kumar K <kirankumark@marvell.com>
 M: Sunil Kumar Kori <skori@marvell.com>
 M: Satha Rao <skoteshwar@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/common/cnxk/
 F: drivers/net/cnxk/
@@ -832,6 +947,7 @@ F: doc/guides/platform/cnxk.rst
 
 Marvell mvpp2
 M: Liron Himi <lironh@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/common/mvep/
 F: drivers/net/mvpp2/
@@ -841,6 +957,7 @@ F: doc/guides/nics/features/mvpp2.ini
 Marvell mvneta
 M: Zyta Szpak <zr@semihalf.com>
 M: Liron Himi <lironh@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/net/mvneta/
 F: doc/guides/nics/mvneta.rst
@@ -848,6 +965,7 @@ F: doc/guides/nics/features/mvneta.ini
 
 Marvell OCTEON TX EP - endpoint
 M: Vamsi Attunuru <vattunuru@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/net/octeon_ep/
 F: doc/guides/nics/features/octeon_ep.ini
@@ -856,6 +974,7 @@ F: doc/guides/nics/octeon_ep.rst
 NVIDIA mlx4
 M: Matan Azrad <matan@nvidia.com>
 M: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mlx
 F: drivers/net/mlx4/
 F: doc/guides/nics/mlx4.rst
@@ -866,6 +985,7 @@ M: Matan Azrad <matan@nvidia.com>
 M: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
 M: Ori Kam <orika@nvidia.com>
 M: Suanming Mou <suanmingm@nvidia.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mlx
 F: drivers/common/mlx5/
 F: drivers/net/mlx5/
@@ -875,23 +995,27 @@ F: doc/guides/nics/features/mlx5.ini
 
 Microsoft mana
 M: Long Li <longli@microsoft.com>
+S: Supported
 F: drivers/net/mana/
 F: doc/guides/nics/mana.rst
 F: doc/guides/nics/features/mana.ini
 
 Microsoft vdev_netvsc - EXPERIMENTAL
 M: Matan Azrad <matan@nvidia.com>
+S: Supported
 F: drivers/net/vdev_netvsc/
 F: doc/guides/nics/vdev_netvsc.rst
 
 Microsoft Hyper-V netvsc
 M: Long Li <longli@microsoft.com>
+S: Supported
 F: drivers/net/netvsc/
 F: doc/guides/nics/netvsc.rst
 F: doc/guides/nics/features/netvsc.ini
 
 Netcope nfb
 M: Martin Spinler <spinler@cesnet.cz>
+S: Supported
 F: drivers/net/nfb/
 F: doc/guides/nics/nfb.rst
 F: doc/guides/nics/features/nfb.ini
@@ -899,6 +1023,7 @@ F: doc/guides/nics/features/nfb.ini
 Netronome nfp
 M: Chaoyong He <chaoyong.he@corigine.com>
 M: Niklas Soderlund <niklas.soderlund@corigine.com>
+S: Supported
 F: drivers/net/nfp/
 F: doc/guides/nics/nfp.rst
 F: doc/guides/nics/features/nfp*.ini
@@ -906,6 +1031,7 @@ F: doc/guides/nics/features/nfp*.ini
 NXP dpaa
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
 M: Sachin Saxena <sachin.saxena@oss.nxp.com>
+S: Supported
 F: drivers/mempool/dpaa/
 F: drivers/net/dpaa/
 F: doc/guides/nics/dpaa.rst
@@ -914,6 +1040,7 @@ F: doc/guides/nics/features/dpaa.ini
 NXP dpaa2
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
 M: Sachin Saxena <sachin.saxena@oss.nxp.com>
+S: Supported
 F: drivers/mempool/dpaa2/
 F: drivers/net/dpaa2/
 F: doc/guides/nics/dpaa2.rst
@@ -922,6 +1049,7 @@ F: doc/guides/nics/features/dpaa2.ini
 NXP enetc
 M: Gagandeep Singh <g.singh@nxp.com>
 M: Sachin Saxena <sachin.saxena@oss.nxp.com>
+S: Supported
 F: drivers/net/enetc/
 F: doc/guides/nics/enetc.rst
 F: doc/guides/nics/features/enetc.ini
@@ -929,18 +1057,21 @@ F: doc/guides/nics/features/enetc.ini
 NXP enetfec - EXPERIMENTAL
 M: Apeksha Gupta <apeksha.gupta@nxp.com>
 M: Sachin Saxena <sachin.saxena@nxp.com>
+S: Supported
 F: drivers/net/enetfec/
 F: doc/guides/nics/enetfec.rst
 F: doc/guides/nics/features/enetfec.ini
 
 NXP pfe
 M: Gagandeep Singh <g.singh@nxp.com>
+S: Supported
 F: doc/guides/nics/pfe.rst
 F: drivers/net/pfe/
 F: doc/guides/nics/features/pfe.ini
 
 Marvell QLogic bnx2x
 M: Julien Aube <julien_dpdk@jaube.fr>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/net/bnx2x/
 F: doc/guides/nics/bnx2x.rst
@@ -949,6 +1080,7 @@ F: doc/guides/nics/features/bnx2x*.ini
 Marvell QLogic qede PMD
 M: Devendra Singh Rawat <dsinghrawat@marvell.com>
 M: Alok Prasad <palok@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-mrvl
 F: drivers/net/qede/
 F: doc/guides/nics/qede.rst
@@ -956,6 +1088,7 @@ F: doc/guides/nics/features/qede*.ini
 
 Solarflare sfc_efx
 M: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
+S: Supported
 F: drivers/common/sfc_efx/
 F: drivers/net/sfc/
 F: doc/guides/nics/sfc_efx.rst
@@ -963,6 +1096,7 @@ F: doc/guides/nics/features/sfc.ini
 
 Wangxun ngbe
 M: Jiawen Wu <jiawenwu@trustnetic.com>
+S: Supported
 F: drivers/net/ngbe/
 F: doc/guides/nics/ngbe.rst
 F: doc/guides/nics/features/ngbe.ini
@@ -970,12 +1104,14 @@ F: doc/guides/nics/features/ngbe.ini
 Wangxun txgbe
 M: Jiawen Wu <jiawenwu@trustnetic.com>
 M: Jian Wang <jianwang@trustnetic.com>
+S: Supported
 F: drivers/net/txgbe/
 F: doc/guides/nics/txgbe.rst
 F: doc/guides/nics/features/txgbe.ini
 
 VMware vmxnet3
 M: Jochen Behrens <jbehrens@vmware.com>
+S: Supported
 F: drivers/net/vmxnet3/
 F: doc/guides/nics/vmxnet3.rst
 F: doc/guides/nics/features/vmxnet3.ini
@@ -983,6 +1119,7 @@ F: doc/guides/nics/features/vmxnet3.ini
 Vhost-user
 M: Maxime Coquelin <maxime.coquelin@redhat.com>
 M: Chenbo Xia <chenbo.xia@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-virtio
 F: lib/vhost/
 F: doc/guides/prog_guide/vhost_lib.rst
@@ -997,6 +1134,7 @@ F: doc/guides/sample_app_ug/vdpa.rst
 Vhost PMD
 M: Maxime Coquelin <maxime.coquelin@redhat.com>
 M: Chenbo Xia <chenbo.xia@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-virtio
 F: drivers/net/vhost/
 F: doc/guides/nics/vhost.rst
@@ -1005,6 +1143,7 @@ F: doc/guides/nics/features/vhost.ini
 Virtio PMD
 M: Maxime Coquelin <maxime.coquelin@redhat.com>
 M: Chenbo Xia <chenbo.xia@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-virtio
 F: drivers/net/virtio/
 F: doc/guides/nics/virtio.rst
@@ -1013,26 +1152,31 @@ F: doc/guides/nics/features/virtio*.ini
 Wind River AVP
 M: Steven Webster <steven.webster@windriver.com>
 M: Matt Peters <matt.peters@windriver.com>
+S: Supported
 F: drivers/net/avp/
 F: doc/guides/nics/avp.rst
 F: doc/guides/nics/features/avp.ini
 
 PCAP PMD
+S: Orphan
 F: drivers/net/pcap/
 F: doc/guides/nics/pcap_ring.rst
 F: doc/guides/nics/features/pcap.ini
 
 Tap PMD
+S: Orphan
 F: drivers/net/tap/
 F: doc/guides/nics/tap.rst
 F: doc/guides/nics/features/tap.ini
 
 KNI PMD
+S: Obsolete
 F: drivers/net/kni/
 F: doc/guides/nics/kni.rst
 
 Ring PMD
 M: Bruce Richardson <bruce.richardson@intel.com>
+S: Supported
 F: drivers/net/ring/
 F: doc/guides/nics/pcap_ring.rst
 F: app/test/test_pmd_ring.c
@@ -1040,21 +1184,25 @@ F: app/test/test_pmd_ring_perf.c
 
 Null Networking PMD
 M: Tetsuya Mukawa <mtetsuyah@gmail.com>
+S: Supported
 F: drivers/net/null/
 
 Fail-safe PMD
 M: Gaetan Rivet <grive@u256.net>
+S: Supported
 F: drivers/net/failsafe/
 F: doc/guides/nics/fail_safe.rst
 F: doc/guides/nics/features/failsafe.ini
 
 Softnic PMD
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
+S: Supported
 F: drivers/net/softnic/
 F: doc/guides/nics/softnic.rst
 
 Memif PMD
 M: Jakub Grajciar <jgrajcia@cisco.com>
+S: Supported
 F: drivers/net/memif/
 F: doc/guides/nics/memif.rst
 F: doc/guides/nics/features/memif.ini
@@ -1062,17 +1210,20 @@ F: doc/guides/nics/features/memif.ini
 
 Crypto Drivers
 --------------
+S: Maintained
 T: git://dpdk.org/next/dpdk-next-crypto
 F: doc/guides/cryptodevs/features/default.ini
 
 AMD CCP Crypto
 M: Sunil Uttarwar <sunilprakashrao.uttarwar@amd.com>
+S: Supported
 F: drivers/crypto/ccp/
 F: doc/guides/cryptodevs/ccp.rst
 F: doc/guides/cryptodevs/features/ccp.ini
 
 ARMv8 Crypto
 M: Ruifeng Wang <ruifeng.wang@arm.com>
+S: Supported
 F: drivers/crypto/armv8/
 F: doc/guides/cryptodevs/armv8.rst
 F: doc/guides/cryptodevs/features/armv8.ini
@@ -1081,12 +1232,14 @@ Broadcom FlexSparc
 M: Ajit Khaparde <ajit.khaparde@broadcom.com>
 M: Raveendra Padasalagi <raveendra.padasalagi@broadcom.com>
 M: Vikas Gupta <vikas.gupta@broadcom.com>
+S: Supported
 F: drivers/crypto/bcmfs/
 F: doc/guides/cryptodevs/bcmfs.rst
 F: doc/guides/cryptodevs/features/bcmfs.ini
 
 Cavium OCTEON TX crypto
 M: Anoob Joseph <anoobj@marvell.com>
+S: Supported
 F: drivers/common/cpt/
 F: drivers/crypto/octeontx/
 F: doc/guides/cryptodevs/octeontx.rst
@@ -1094,17 +1247,20 @@ F: doc/guides/cryptodevs/features/octeontx.ini
 
 Crypto Scheduler
 M: Kai Ji <kai.ji@intel.com>
+S: Supported
 F: drivers/crypto/scheduler/
 F: doc/guides/cryptodevs/scheduler.rst
 
 HiSilicon UADK crypto
 M: Zhangfei Gao <zhangfei.gao@linaro.org>
+S: Supported
 F: drivers/crypto/uadk/
 F: doc/guides/cryptodevs/uadk.rst
 F: doc/guides/cryptodevs/features/uadk.ini
 
 Intel QuickAssist
 M: Kai Ji <kai.ji@intel.com>
+S: Supported
 F: drivers/crypto/qat/
 F: drivers/common/qat/
 F: doc/guides/cryptodevs/qat.rst
@@ -1113,6 +1269,7 @@ F: doc/guides/cryptodevs/features/qat.ini
 IPsec MB
 M: Kai Ji <kai.ji@intel.com>
 M: Pablo de Lara <pablo.de.lara.guarch@intel.com>
+S: Supported
 F: drivers/crypto/ipsec_mb/
 F: doc/guides/cryptodevs/aesni_gcm.rst
 F: doc/guides/cryptodevs/aesni_mb.rst
@@ -1131,6 +1288,7 @@ Marvell cnxk crypto
 M: Ankur Dwivedi <adwivedi@marvell.com>
 M: Anoob Joseph <anoobj@marvell.com>
 M: Tejasree Kondoj <ktejasree@marvell.com>
+S: Supported
 F: drivers/crypto/cnxk/
 F: doc/guides/cryptodevs/cnxk.rst
 F: doc/guides/cryptodevs/features/cn9k.ini
@@ -1139,6 +1297,7 @@ F: doc/guides/cryptodevs/features/cn10k.ini
 Marvell mvsam
 M: Michael Shamis <michaelsh@marvell.com>
 M: Liron Himi <lironh@marvell.com>
+S: Supported
 F: drivers/crypto/mvsam/
 F: doc/guides/cryptodevs/mvsam.rst
 F: doc/guides/cryptodevs/features/mvsam.ini
@@ -1146,18 +1305,21 @@ F: doc/guides/cryptodevs/features/mvsam.ini
 Marvell Nitrox
 M: Nagadheeraj Rottela <rnagadheeraj@marvell.com>
 M: Srikanth Jampala <jsrikanth@marvell.com>
+S: Supported
 F: drivers/crypto/nitrox/
 F: doc/guides/cryptodevs/nitrox.rst
 F: doc/guides/cryptodevs/features/nitrox.ini
 
 NVIDIA mlx5
 M: Matan Azrad <matan@nvidia.com>
+S: Supported
 F: drivers/crypto/mlx5/
 F: doc/guides/cryptodevs/mlx5.rst
 F: doc/guides/cryptodevs/features/mlx5.ini
 
 Null Crypto
 M: Kai Ji <kai.ji@intel.com>
+S: Supported
 F: drivers/crypto/null/
 F: doc/guides/cryptodevs/null.rst
 F: doc/guides/cryptodevs/features/null.ini
@@ -1165,6 +1327,7 @@ F: doc/guides/cryptodevs/features/null.ini
 NXP CAAM JR
 M: Gagandeep Singh <g.singh@nxp.com>
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
+S: Supported
 F: drivers/crypto/caam_jr/
 F: doc/guides/cryptodevs/caam_jr.rst
 F: doc/guides/cryptodevs/features/caam_jr.ini
@@ -1172,6 +1335,7 @@ F: doc/guides/cryptodevs/features/caam_jr.ini
 NXP DPAA_SEC
 M: Gagandeep Singh <g.singh@nxp.com>
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
+S: Supported
 F: drivers/crypto/dpaa_sec/
 F: doc/guides/cryptodevs/dpaa_sec.rst
 F: doc/guides/cryptodevs/features/dpaa_sec.ini
@@ -1179,18 +1343,21 @@ F: doc/guides/cryptodevs/features/dpaa_sec.ini
 NXP DPAA2_SEC
 M: Gagandeep Singh <g.singh@nxp.com>
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
+S: Supported
 F: drivers/crypto/dpaa2_sec/
 F: doc/guides/cryptodevs/dpaa2_sec.rst
 F: doc/guides/cryptodevs/features/dpaa2_sec.ini
 
 OpenSSL
 M: Kai Ji <kai.ji@intel.com>
+S: Supported
 F: drivers/crypto/openssl/
 F: doc/guides/cryptodevs/openssl.rst
 F: doc/guides/cryptodevs/features/openssl.ini
 
 Virtio
 M: Jay Zhou <jianjay.zhou@huawei.com>
+S: Supported
 F: drivers/crypto/virtio/
 F: doc/guides/cryptodevs/virtio.rst
 F: doc/guides/cryptodevs/features/virtio.ini
@@ -1198,31 +1365,37 @@ F: doc/guides/cryptodevs/features/virtio.ini
 
 Compression Drivers
 -------------------
+S: Maintained
 T: git://dpdk.org/next/dpdk-next-crypto
 
 Cavium OCTEON TX zipvf
 M: Ashish Gupta <ashish.gupta@marvell.com>
+S: Supported
 F: drivers/compress/octeontx/
 F: doc/guides/compressdevs/octeontx.rst
 F: doc/guides/compressdevs/features/octeontx.ini
 
 Intel QuickAssist
 M: Kai Ji <kai.ji@intel.com>
+S: Supported
 F: drivers/compress/qat/
 F: drivers/common/qat/
 
 ISA-L
 M: Lee Daly <lee.daly@intel.com>
+S: Supported
 F: drivers/compress/isal/
 F: doc/guides/compressdevs/isal.rst
 F: doc/guides/compressdevs/features/isal.ini
 
 NVIDIA mlx5
 M: Matan Azrad <matan@nvidia.com>
+S: Supported
 F: drivers/compress/mlx5/
 
 ZLIB
 M: Sunila Sahu <ssahu@marvell.com>
+S: Supported
 F: drivers/compress/zlib/
 F: doc/guides/compressdevs/zlib.rst
 F: doc/guides/compressdevs/features/zlib.ini
@@ -1234,34 +1407,40 @@ DMAdev Drivers
 Intel IDXD - EXPERIMENTAL
 M: Bruce Richardson <bruce.richardson@intel.com>
 M: Kevin Laatz <kevin.laatz@intel.com>
+S: Supported
 F: drivers/dma/idxd/
 F: doc/guides/dmadevs/idxd.rst
 
 Intel IOAT
 M: Bruce Richardson <bruce.richardson@intel.com>
 M: Conor Walsh <conor.walsh@intel.com>
+S: Supported
 F: drivers/dma/ioat/
 F: doc/guides/dmadevs/ioat.rst
 
 HiSilicon DMA
 M: Chengwen Feng <fengchengwen@huawei.com>
+S: Supported
 F: drivers/dma/hisilicon/
 F: doc/guides/dmadevs/hisilicon.rst
 
 Marvell CNXK DPI DMA
 M: Vamsi Attunuru <vattunuru@marvell.com>
+S: Supported
 F: drivers/dma/cnxk/
 F: doc/guides/dmadevs/cnxk.rst
 
 NXP DPAA DMA
 M: Gagandeep Singh <g.singh@nxp.com>
 M: Sachin Saxena <sachin.saxena@oss.nxp.com>
+S: Supported
 F: drivers/dma/dpaa/
 F: doc/guides/dmadevs/dpaa.rst
 
 NXP DPAA2 QDMA
 M: Gagandeep Singh <g.singh@nxp.com>
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
+S: Supported
 F: drivers/dma/dpaa2/
 F: doc/guides/dmadevs/dpaa2.rst
 
@@ -1271,12 +1450,14 @@ RegEx Drivers
 
 Marvell OCTEON CN9K regex
 M: Liron Himi <lironh@marvell.com>
+S: Supported
 F: drivers/regex/cn9k/
 F: doc/guides/regexdevs/cn9k.rst
 F: doc/guides/regexdevs/features/cn9k.ini
 
 NVIDIA mlx5
 M: Ori Kam <orika@nvidia.com>
+S: Supported
 F: drivers/regex/mlx5/
 F: doc/guides/regexdevs/mlx5.rst
 F: doc/guides/regexdevs/features/mlx5.ini
@@ -1287,6 +1468,7 @@ MLdev Drivers
 
 Marvell ML CNXK
 M: Srikanth Yalavarthi <syalavarthi@marvell.com>
+S: Supported
 F: drivers/common/cnxk/hw/ml.h
 F: drivers/common/cnxk/roc_ml*
 F: drivers/ml/cnxk/
@@ -1299,6 +1481,7 @@ T: git://dpdk.org/next/dpdk-next-virtio
 
 Intel ifc
 M: Xiao Wang <xiao.w.wang@intel.com>
+S: Supported
 F: drivers/vdpa/ifc/
 F: doc/guides/vdpadevs/ifc.rst
 F: doc/guides/vdpadevs/features/ifcvf.ini
@@ -1306,12 +1489,14 @@ F: doc/guides/vdpadevs/features/ifcvf.ini
 NVIDIA mlx5 vDPA
 M: Matan Azrad <matan@nvidia.com>
 M: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
+S: Supported
 F: drivers/vdpa/mlx5/
 F: doc/guides/vdpadevs/mlx5.rst
 F: doc/guides/vdpadevs/features/mlx5.ini
 
 Xilinx sfc vDPA
 M: Vijay Kumar Srivastava <vsrivast@xilinx.com>
+S: Supported
 F: drivers/vdpa/sfc/
 F: doc/guides/vdpadevs/sfc.rst
 F: doc/guides/vdpadevs/features/sfc.ini
@@ -1320,42 +1505,50 @@ F: doc/guides/vdpadevs/features/sfc.ini
 Eventdev Drivers
 ----------------
 M: Jerin Jacob <jerinj@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-eventdev
 
 Cavium OCTEON TX ssovf
 M: Jerin Jacob <jerinj@marvell.com>
+S: Supported
 F: drivers/event/octeontx/
 F: doc/guides/eventdevs/octeontx.rst
 
 Cavium OCTEON TX timvf
 M: Pavan Nikhilesh <pbhagavatula@marvell.com>
+S: Supported
 F: drivers/event/octeontx/timvf_*
 
 Intel DLB2
 M: Timothy McDaniel <timothy.mcdaniel@intel.com>
+S: Supported
 F: drivers/event/dlb2/
 F: doc/guides/eventdevs/dlb2.rst
 
 Marvell cnxk
 M: Pavan Nikhilesh <pbhagavatula@marvell.com>
 M: Shijith Thotton <sthotton@marvell.com>
+S: Supported
 F: drivers/event/cnxk/
 F: doc/guides/eventdevs/cnxk.rst
 
 NXP DPAA eventdev
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
 M: Sachin Saxena <sachin.saxena@oss.nxp.com>
+S: Supported
 F: drivers/event/dpaa/
 F: doc/guides/eventdevs/dpaa.rst
 
 NXP DPAA2 eventdev
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
 M: Sachin Saxena <sachin.saxena@oss.nxp.com>
+S: Supported
 F: drivers/event/dpaa2/
 F: doc/guides/eventdevs/dpaa2.rst
 
 Software Eventdev PMD
 M: Harry van Haaren <harry.van.haaren@intel.com>
+S: Supported
 F: drivers/event/sw/
 F: doc/guides/eventdevs/sw.rst
 F: examples/eventdev_pipeline/
@@ -1363,11 +1556,13 @@ F: doc/guides/sample_app_ug/eventdev_pipeline.rst
 
 Distributed Software Eventdev PMD
 M: Mattias Rönnblom <mattias.ronnblom@ericsson.com>
+S: Supported
 F: drivers/event/dsw/
 F: doc/guides/eventdevs/dsw.rst
 
 Software OPDL Eventdev PMD
 M: Liang Ma <liangma@liangbit.com>
+S: Supported
 M: Peter Mccarthy <peter.mccarthy@intel.com>
 F: drivers/event/opdl/
 F: doc/guides/eventdevs/opdl.rst
@@ -1378,6 +1573,7 @@ Baseband Drivers
 
 Intel baseband
 M: Nicolas Chautru <nicolas.chautru@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-baseband
 F: drivers/baseband/turbo_sw/
 F: doc/guides/bbdevs/turbo_sw.rst
@@ -1397,6 +1593,7 @@ F: doc/guides/bbdevs/features/vrb1.ini
 
 Null baseband
 M: Nicolas Chautru <nicolas.chautru@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-baseband
 F: drivers/baseband/null/
 F: doc/guides/bbdevs/null.rst
@@ -1405,6 +1602,7 @@ F: doc/guides/bbdevs/features/null.ini
 NXP LA12xx
 M: Gagandeep Singh <g.singh@nxp.com>
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-baseband
 F: drivers/baseband/la12xx/
 F: doc/guides/bbdevs/la12xx.rst
@@ -1416,6 +1614,7 @@ GPU Drivers
 
 NVIDIA CUDA
 M: Elena Agostini <eagostini@nvidia.com>
+S: Supported
 F: drivers/gpu/cuda/
 F: doc/guides/gpus/cuda.rst
 
@@ -1426,6 +1625,7 @@ Rawdev Drivers
 Intel FPGA
 M: Rosen Xu <rosen.xu@intel.com>
 M: Tianfei zhang <tianfei.zhang@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/raw/ifpga/
 F: doc/guides/rawdevs/ifpga.rst
@@ -1433,18 +1633,21 @@ F: doc/guides/rawdevs/ifpga.rst
 Marvell CNXK BPHY
 M: Jakub Palider <jpalider@marvell.com>
 M: Tomasz Duszynski <tduszynski@marvell.com>
+S: Supported
 F: doc/guides/rawdevs/cnxk_bphy.rst
 F: drivers/raw/cnxk_bphy/
 
 Marvell CNXK GPIO
 M: Jakub Palider <jpalider@marvell.com>
 M: Tomasz Duszynski <tduszynski@marvell.com>
+S: Supported
 F: doc/guides/rawdevs/cnxk_gpio.rst
 F: drivers/raw/cnxk_gpio/
 
 NTB
 M: Jingjing Wu <jingjing.wu@intel.com>
 M: Junfeng Guo <junfeng.guo@intel.com>
+S: Supported
 F: drivers/raw/ntb/
 F: doc/guides/rawdevs/ntb.rst
 F: examples/ntb/
@@ -1452,6 +1655,7 @@ F: doc/guides/sample_app_ug/ntb.rst
 
 NXP DPAA2 CMDIF
 M: Gagandeep Singh <g.singh@nxp.com>
+S: Supported
 F: drivers/raw/dpaa2_cmdif/
 F: doc/guides/rawdevs/dpaa2_cmdif.rst
 
@@ -1461,12 +1665,14 @@ Packet processing
 
 Network headers
 M: Olivier Matz <olivier.matz@6wind.com>
+S: Supported
 F: lib/net/
 F: app/test/test_cksum.c
 F: app/test/test_cksum_perf.c
 
 Packet CRC
 M: Jasvinder Singh <jasvinder.singh@intel.com>
+S: Supported
 F: lib/net/net_crc.h
 F: lib/net/rte_net_crc*
 F: lib/net/net_crc_avx512.c
@@ -1475,6 +1681,7 @@ F: app/test/test_crc.c
 
 IP fragmentation & reassembly
 M: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
+S: Supported
 F: lib/ip_frag/
 F: doc/guides/prog_guide/ip_fragment_reassembly_lib.rst
 F: app/test/test_ipfrag.c
@@ -1486,16 +1693,19 @@ F: doc/guides/sample_app_ug/ip_reassembly.rst
 
 Generic Receive Offload - EXPERIMENTAL
 M: Jiayu Hu <jiayu.hu@intel.com>
+S: Supported
 F: lib/gro/
 F: doc/guides/prog_guide/generic_receive_offload_lib.rst
 
 Generic Segmentation Offload
 M: Jiayu Hu <jiayu.hu@intel.com>
+S: Supported
 F: lib/gso/
 F: doc/guides/prog_guide/generic_segmentation_offload_lib.rst
 
 IPsec
 M: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-crypto
 F: lib/ipsec/
 F: app/test/test_ipsec*
@@ -1506,12 +1716,14 @@ F: app/test-sad/
 PDCP - EXPERIMENTAL
 M: Anoob Joseph <anoobj@marvell.com>
 M: Volodymyr Fialko <vfialko@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-crypto
 F: lib/pdcp/
 F: doc/guides/prog_guide/pdcp_lib.rst
 F: app/test/test_pdcp*
 
 Flow Classify - EXPERIMENTAL - UNMAINTAINED
+S: Orphan
 F: lib/flow_classify/
 F: app/test/test_flow_classify*
 F: doc/guides/prog_guide/flow_classify_lib.rst
@@ -1520,6 +1732,7 @@ F: doc/guides/sample_app_ug/flow_classify.rst
 
 Distributor
 M: David Hunt <david.hunt@intel.com>
+S: Supported
 F: lib/distributor/
 F: doc/guides/prog_guide/packet_distrib_lib.rst
 F: app/test/test_distributor*
@@ -1528,6 +1741,7 @@ F: doc/guides/sample_app_ug/dist_app.rst
 
 Reorder
 M: Volodymyr Fialko <vfialko@marvell.com>
+S: Supported
 F: lib/reorder/
 F: doc/guides/prog_guide/reorder_lib.rst
 F: app/test/test_reorder*
@@ -1536,6 +1750,7 @@ F: doc/guides/sample_app_ug/packet_ordering.rst
 
 Hierarchical scheduler
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
+S: Supported
 F: lib/sched/
 F: doc/guides/prog_guide/qos_framework.rst
 F: app/test/test_pie.c
@@ -1547,6 +1762,7 @@ F: doc/guides/sample_app_ug/qos_scheduler.rst
 Packet capture
 M: Reshma Pattan <reshma.pattan@intel.com>
 M: Stephen Hemminger <stephen@networkplumber.org>
+S: Maintained
 F: lib/pdump/
 F: doc/guides/prog_guide/pdump_lib.rst
 F: app/test/test_pdump.*
@@ -1562,6 +1778,7 @@ F: doc/guides/tools/dumpcap.rst
 Packet Framework
 ----------------
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
+S: Supported
 F: lib/pipeline/
 F: lib/port/
 F: lib/table/
@@ -1579,6 +1796,7 @@ Algorithms
 
 ACL
 M: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
+S: Supported
 F: lib/acl/
 F: doc/guides/prog_guide/packet_classif_access_ctrl.rst
 F: app/test-acl/
@@ -1587,6 +1805,7 @@ F: app/test/test_acl.*
 EFD
 M: Byron Marohn <byron.marohn@intel.com>
 M: Yipeng Wang <yipeng1.wang@intel.com>
+S: Supported
 F: lib/efd/
 F: doc/guides/prog_guide/efd_lib.rst
 F: app/test/test_efd*
@@ -1598,6 +1817,7 @@ M: Yipeng Wang <yipeng1.wang@intel.com>
 M: Sameh Gobriel <sameh.gobriel@intel.com>
 M: Bruce Richardson <bruce.richardson@intel.com>
 M: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
+S: Supported
 F: lib/hash/
 F: doc/guides/prog_guide/hash_lib.rst
 F: doc/guides/prog_guide/toeplitz_hash_lib.rst
@@ -1607,6 +1827,7 @@ F: app/test/test_func_reentrancy.c
 LPM
 M: Bruce Richardson <bruce.richardson@intel.com>
 M: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
+S: Supported
 F: lib/lpm/
 F: doc/guides/prog_guide/lpm*
 F: app/test/test_lpm*
@@ -1616,12 +1837,14 @@ F: app/test/test_xmmt_ops.h
 Membership - EXPERIMENTAL
 M: Yipeng Wang <yipeng1.wang@intel.com>
 M: Sameh Gobriel <sameh.gobriel@intel.com>
+S: Supported
 F: lib/member/
 F: doc/guides/prog_guide/member_lib.rst
 F: app/test/test_member*
 
 RIB/FIB
 M: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
+S: Supported
 F: lib/rib/
 F: app/test/test_rib*
 F: lib/fib/
@@ -1630,6 +1853,7 @@ F: app/test-fib/
 
 Traffic metering
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
+S: Supported
 F: lib/meter/
 F: doc/guides/sample_app_ug/qos_scheduler.rst
 F: app/test/test_meter.c
@@ -1642,12 +1866,14 @@ Other libraries
 
 Configuration file
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
+S: Supported
 F: lib/cfgfile/
 F: app/test/test_cfgfile.c
 F: app/test/test_cfgfiles/
 
 Interactive command line
 M: Olivier Matz <olivier.matz@6wind.com>
+S: Supported
 F: lib/cmdline/
 F: app/test-cmdline/
 F: app/test/test_cmdline*
@@ -1656,11 +1882,13 @@ F: doc/guides/sample_app_ug/cmd_line.rst
 
 Key/Value parsing
 M: Olivier Matz <olivier.matz@6wind.com>
+S: Supported
 F: lib/kvargs/
 F: app/test/test_kvargs.c
 
 RCU
 M: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
+S: Supported
 F: lib/rcu/
 F: app/test/test_rcu*
 F: doc/guides/prog_guide/rcu_lib.rst
@@ -1668,11 +1896,13 @@ F: doc/guides/prog_guide/rcu_lib.rst
 PCI
 M: Chenbo Xia <chenbo.xia@intel.com>
 M: Gaetan Rivet <grive@u256.net>
+S: Supported
 F: lib/pci/
 
 Power management
 M: Anatoly Burakov <anatoly.burakov@intel.com>
 M: David Hunt <david.hunt@intel.com>
+S: Supported
 F: lib/power/
 F: doc/guides/prog_guide/power_man.rst
 F: app/test/test_power*
@@ -1683,6 +1913,7 @@ F: doc/guides/sample_app_ug/vm_power_management.rst
 
 Timers
 M: Erik Gabriel Carrillo <erik.g.carrillo@intel.com>
+S: Supported
 F: lib/timer/
 F: doc/guides/prog_guide/timer_lib.rst
 F: app/test/test_timer*
@@ -1690,25 +1921,30 @@ F: examples/timer/
 F: doc/guides/sample_app_ug/timer.rst
 
 Job statistics
+S: Orphan
 F: lib/jobstats/
 F: examples/l2fwd-jobstats/
 F: doc/guides/sample_app_ug/l2_forward_job_stats.rst
 
 Metrics
+S: Orphan
 F: lib/metrics/
 F: app/test/test_metrics.c
 
 Bit-rate statistics
+S: Orphan
 F: lib/bitratestats/
 F: app/test/test_bitratestats.c
 
 Latency statistics
 M: Reshma Pattan <reshma.pattan@intel.com>
+S: Supported
 F: lib/latencystats/
 F: app/test/test_latencystats.c
 
 Telemetry
 M: Ciara Power <ciara.power@intel.com>
+S: Supported
 F: lib/telemetry/
 F: app/test/test_telemetry*
 F: usertools/dpdk-telemetry*
@@ -1716,6 +1952,7 @@ F: doc/guides/howto/telemetry.rst
 
 BPF
 M: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
+S: Supported
 F: lib/bpf/
 F: examples/bpf/
 F: app/test/test_bpf.c
@@ -1727,6 +1964,7 @@ M: Jerin Jacob <jerinj@marvell.com>
 M: Kiran Kumar K <kirankumark@marvell.com>
 M: Nithin Dabilpuram <ndabilpuram@marvell.com>
 M: Zhirun Yan <zhirun.yan@intel.com>
+S: Supported
 F: lib/graph/
 F: doc/guides/prog_guide/graph_lib.rst
 F: app/test/test_graph*
@@ -1736,6 +1974,7 @@ F: doc/guides/sample_app_ug/l3_forward_graph.rst
 Nodes - EXPERIMENTAL
 M: Nithin Dabilpuram <ndabilpuram@marvell.com>
 M: Pavan Nikhilesh <pbhagavatula@marvell.com>
+S: Supported
 F: lib/node/
 
 
@@ -1743,6 +1982,7 @@ Test Applications
 -----------------
 
 Unit tests framework
+S: Maintained
 F: app/test/commands.c
 F: app/test/has_hugepage.py
 F: app/test/packet_burst_generator.c
@@ -1758,45 +1998,53 @@ F: app/test/virtual_pmd.h
 
 Sample packet helper functions for unit test
 M: Reshma Pattan <reshma.pattan@intel.com>
+S: Supported
 F: app/test/sample_packet_forward.c
 F: app/test/sample_packet_forward.h
 
 Networking drivers testing tool
 M: Aman Singh <aman.deep.singh@intel.com>
 M: Yuying Zhang <yuying.zhang@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-net
 F: app/test-pmd/
 F: doc/guides/testpmd_app_ug/
 
 DMA device performance tool
 M: Cheng Jiang <cheng1.jiang@intel.com>
+S: Supported
 F: app/test-dma-perf/
 F: doc/guides/tools/dmaperf.rst
 
 Flow performance tool
 M: Wisam Jaddo <wisamm@nvidia.com>
+S: Supported
 F: app/test-flow-perf/
 F: doc/guides/tools/flow-perf.rst
 
 Security performance tool
 M: Anoob Joseph <anoobj@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-crypto
 F: app/test-security-perf/
 F: doc/guides/tools/securityperf.rst
 
 Compression performance test application
 T: git://dpdk.org/next/dpdk-next-crypto
+S: Orphan
 F: app/test-compress-perf/
 F: doc/guides/tools/comp_perf.rst
 
 Crypto performance test application
 M: Ciara Power <ciara.power@intel.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-crypto
 F: app/test-crypto-perf/
 F: doc/guides/tools/cryptoperf.rst
 
 Eventdev test application
 M: Jerin Jacob <jerinj@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-eventdev
 F: app/test-eventdev/
 F: doc/guides/tools/testeventdev.rst
@@ -1806,12 +2054,14 @@ F: app/test/test_event_ring.c
 Procinfo tool
 M: Maryam Tahhan <maryam.tahhan@intel.com>
 M: Reshma Pattan <reshma.pattan@intel.com>
+S: Supported
 F: app/proc-info/
 F: doc/guides/tools/proc_info.rst
 
 DTS
 M: Lijuan Tu <lijuan.tu@intel.com>
 M: Juraj Linkeš <juraj.linkes@pantheon.tech>
+S: Supported
 F: dts/
 F: devtools/dts-check-format.sh
 F: doc/guides/tools/dts.rst
@@ -1821,77 +2071,92 @@ Other Example Applications
 --------------------------
 
 Ethtool example
+S: Orphan
 F: examples/ethtool/
 F: doc/guides/sample_app_ug/ethtool.rst
 
 FIPS validation example
 M: Brian Dooley <brian.dooley@intel.com>
 M: Gowrishankar Muthukrishnan <gmuthukrishn@marvell.com>
+S: Supported
 F: examples/fips_validation/
 F: doc/guides/sample_app_ug/fips_validation.rst
 
 Flow filtering example
 M: Ori Kam <orika@nvidia.com>
+S: Supported
 F: examples/flow_filtering/
 F: doc/guides/sample_app_ug/flow_filtering.rst
 
 Helloworld example
 M: Bruce Richardson <bruce.richardson@intel.com>
+S: Supported
 F: examples/helloworld/
 F: doc/guides/sample_app_ug/hello_world.rst
 
 IPsec security gateway example
 M: Radu Nicolau <radu.nicolau@intel.com>
 M: Akhil Goyal <gakhil@marvell.com>
+S: Supported
 F: examples/ipsec-secgw/
 F: doc/guides/sample_app_ug/ipsec_secgw.rst
 
 IPv4 multicast example
+S: Orphan
 F: examples/ipv4_multicast/
 F: doc/guides/sample_app_ug/ipv4_multicast.rst
 
 L2 forwarding example
 M: Bruce Richardson <bruce.richardson@intel.com>
+S: Supported
 F: examples/l2fwd/
 F: doc/guides/sample_app_ug/l2_forward_real_virtual.rst
 
 L2 forwarding with cache allocation example
 M: Tomasz Kantecki <tomasz.kantecki@intel.com>
+S: Supported
 F: doc/guides/sample_app_ug/l2_forward_cat.rst
 F: examples/l2fwd-cat/
 
 L2 forwarding with eventdev example
 M: Sunil Kumar Kori <skori@marvell.com>
 M: Pavan Nikhilesh <pbhagavatula@marvell.com>
+S: Supported
 T: git://dpdk.org/next/dpdk-next-eventdev
 F: examples/l2fwd-event/
 F: doc/guides/sample_app_ug/l2_forward_event.rst
 
 L3 forwarding example
+S: Maintained
 F: examples/l3fwd/
 F: doc/guides/sample_app_ug/l3_forward.rst
 
 Link status interrupt example
+S: Maintained
 F: examples/link_status_interrupt/
 F: doc/guides/sample_app_ug/link_status_intr.rst
 
 PTP client example
 M: Kirill Rybalchenko <kirill.rybalchenko@intel.com>
+S: Supported
 F: examples/ptpclient/
 
 Rx/Tx callbacks example
 M: Bruce Richardson <bruce.richardson@intel.com>
 M: John McNamara <john.mcnamara@intel.com>
+S: Supported
 F: examples/rxtx_callbacks/
 F: doc/guides/sample_app_ug/rxtx_callbacks.rst
 
 Skeleton example
 M: Bruce Richardson <bruce.richardson@intel.com>
 M: John McNamara <john.mcnamara@intel.com>
+S: Supported
 F: examples/skeleton/
 F: doc/guides/sample_app_ug/skeleton.rst
 
 VMDq examples
+S: Orphan
 F: examples/vmdq/
 F: doc/guides/sample_app_ug/vmdq_forwarding.rst
 F: examples/vmdq_dcb/
-- 
2.39.2


^ permalink raw reply	[relevance 1%]

* RE: [PATCH] doc: deprecation notice to add callback data to rte_event_fp_ops
  2023-07-13 10:40  0%     ` Jerin Jacob
@ 2023-07-14 11:32  0%       ` Tummala, Sivaprasad
  0 siblings, 0 replies; 200+ results
From: Tummala, Sivaprasad @ 2023-07-14 11:32 UTC (permalink / raw)
  To: Jerin Jacob; +Cc: dev, Yigit, Ferruh, bruce.richardson, david.marchand, thomas

[AMD Official Use Only - General]

> -----Original Message-----
> From: Jerin Jacob <jerinjacobk@gmail.com>
> Sent: Thursday, July 13, 2023 4:11 PM
> To: Tummala, Sivaprasad <Sivaprasad.Tummala@amd.com>
> Cc: dev@dpdk.org; Yigit, Ferruh <Ferruh.Yigit@amd.com>;
> bruce.richardson@intel.com; david.marchand@redhat.com; thomas@monjalon.net
> Subject: Re: [PATCH] doc: deprecation notice to add callback data to
> rte_event_fp_ops
>
> Caution: This message originated from an External Source. Use proper caution
> when opening attachments, clicking links, or responding.
>
>
> On Thu, Jul 13, 2023 at 4:08 PM Tummala, Sivaprasad
> <Sivaprasad.Tummala@amd.com> wrote:
> >
> > [AMD Official Use Only - General]
> >
> > Hi Jerin,
> >
> > > -----Original Message-----
> > > From: Jerin Jacob <jerinjacobk@gmail.com>
> > > Sent: Thursday, July 13, 2023 2:22 PM
> > > To: Tummala, Sivaprasad <Sivaprasad.Tummala@amd.com>
> > > Cc: dev@dpdk.org; Yigit, Ferruh <Ferruh.Yigit@amd.com>;
> > > bruce.richardson@intel.com; david.marchand@redhat.com;
> > > thomas@monjalon.net
> > > Subject: Re: [PATCH] doc: deprecation notice to add callback data to
> > > rte_event_fp_ops
> > >
> > > Caution: This message originated from an External Source. Use proper
> > > caution when opening attachments, clicking links, or responding.
> > >
> > >
> > > On Wed, Jul 12, 2023 at 11:01 PM Sivaprasad Tummala
> > > <sivaprasad.tummala@amd.com> wrote:
> > > >
> > > > Deprecation notice to add "rte_eventdev_port_data" field to
> > >
> > > Could you share the rational for why rte_eventdev_port_data needs to be
> added?
> >
> > "rte_eventdev_port_data" is used to hold callbacks registered optionally per
> event device port and associated callback data.
> > By adding "rte_eventdev_port_data" to "rte_event_fp_ops", allows to fetch this
> data for fastpath eventdev inline functions in advance.
>
> Please add above info in the release notes for next version.
Sure, will do the same.
>
> >
> > >
> > >
> > > > ``rte_event_fp_ops`` for callback support.
> > > >
> > > > Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
> > > > ---
> > > >  doc/guides/rel_notes/deprecation.rst | 4 ++++
> > > >  1 file changed, 4 insertions(+)
> > > >
> > > > diff --git a/doc/guides/rel_notes/deprecation.rst
> > > > b/doc/guides/rel_notes/deprecation.rst
> > > > index 8e1cdd677a..2c69338818 100644
> > > > --- a/doc/guides/rel_notes/deprecation.rst
> > > > +++ b/doc/guides/rel_notes/deprecation.rst
> > > > @@ -133,6 +133,10 @@ Deprecation Notices
> > > >    ``rte_cryptodev_get_auth_algo_string``,
> > > ``rte_cryptodev_get_aead_algo_string`` and
> > > >    ``rte_cryptodev_asym_get_xform_string`` respectively.
> > > >
> > > > +* eventdev: The struct rte_event_fp_ops will be updated with a
> > > > +new element
> > > > +  rte_eventdev_port_data to support optional callbacks in DPDK 23.11.
> > > > +This changes
> > > > +  the size of rte_event_fp_ops and result in ABI change.
> > > > +
> > > >  * flow_classify: The flow_classify library and example have no maintainer.
> > > >    The library is experimental and, as such, it could be removed from DPDK.
> > > >    Its removal has been postponed to let potential users report
> > > > interest
> > > > --
> > > > 2.34.1
> > > >

^ permalink raw reply	[relevance 0%]

* Re: [PATCH V6 0/5] app/testpmd: support multiple process attach and detach port
  2023-05-27  2:11  3% ` [PATCH V6 0/5] app/testpmd: support multiple process attach and detach port Huisong Li
  2023-05-27  2:11  2%   ` [PATCH V6 2/5] ethdev: fix skip valid port in probing callback Huisong Li
  2023-06-06 16:26  0%   ` [PATCH V6 0/5] app/testpmd: support multiple process attach and detach port Ferruh Yigit
@ 2023-07-14  7:21  0%   ` lihuisong (C)
  2 siblings, 0 replies; 200+ results
From: lihuisong (C) @ 2023-07-14  7:21 UTC (permalink / raw)
  To: dev, ferruh.yigit
  Cc: thomas, andrew.rybchenko, liudongdong3, liuyonglong, fengchengwen

Hi Ferruh,

Can you take a look at this series?
I added the call stack info for segment fault.

/Huisong


在 2023/5/27 10:11, Huisong Li 写道:
> This patchset fix some bugs and support attaching and detaching port
> in primary and secondary.
>
> ---
>   -v6: adjust rte_eth_dev_is_used position based on alphabetical order
>        in version.map
>   -v5: move 'ALLOCATED' state to the back of 'REMOVED' to avoid abi break.
>   -v4: fix a misspelling.
>   -v3:
>     #1 merge patch 1/6 and patch 2/6 into patch 1/5, and add modification
>        for other bus type.
>     #2 add a RTE_ETH_DEV_ALLOCATED state in rte_eth_dev_state to resolve
>        the probelm in patch 2/5.
>   -v2: resend due to CI unexplained failure.
>
> Huisong Li (5):
>    drivers/bus: restore driver assignment at front of probing
>    ethdev: fix skip valid port in probing callback
>    app/testpmd: check the validity of the port
>    app/testpmd: add attach and detach port for multiple process
>    app/testpmd: stop forwarding in new or destroy event
>
>   app/test-pmd/testpmd.c                   | 47 +++++++++++++++---------
>   app/test-pmd/testpmd.h                   |  1 -
>   drivers/bus/auxiliary/auxiliary_common.c |  9 ++++-
>   drivers/bus/dpaa/dpaa_bus.c              |  9 ++++-
>   drivers/bus/fslmc/fslmc_bus.c            |  8 +++-
>   drivers/bus/ifpga/ifpga_bus.c            | 12 ++++--
>   drivers/bus/pci/pci_common.c             |  9 ++++-
>   drivers/bus/vdev/vdev.c                  | 10 ++++-
>   drivers/bus/vmbus/vmbus_common.c         |  9 ++++-
>   drivers/net/bnxt/bnxt_ethdev.c           |  3 +-
>   drivers/net/bonding/bonding_testpmd.c    |  1 -
>   drivers/net/mlx5/mlx5.c                  |  2 +-
>   lib/ethdev/ethdev_driver.c               | 13 +++++--
>   lib/ethdev/ethdev_driver.h               | 12 ++++++
>   lib/ethdev/ethdev_pci.h                  |  2 +-
>   lib/ethdev/rte_class_eth.c               |  2 +-
>   lib/ethdev/rte_ethdev.c                  |  4 +-
>   lib/ethdev/rte_ethdev.h                  |  4 +-
>   lib/ethdev/version.map                   |  1 +
>   19 files changed, 114 insertions(+), 44 deletions(-)
>

^ permalink raw reply	[relevance 0%]

* RE: [PATCH] doc: announce ethdev operation struct changes
  2023-07-13  2:37  0%   ` Feifei Wang
@ 2023-07-13 12:50  0%     ` Morten Brørup
  2023-07-17  8:28  0%       ` Andrew Rybchenko
  0 siblings, 1 reply; 200+ results
From: Morten Brørup @ 2023-07-13 12:50 UTC (permalink / raw)
  To: Feifei Wang, dev
  Cc: nd, Honnappa Nagarahalli, Ruifeng Wang, Konstantin Ananyev,
	Ferruh Yigit, thomas, Andrew Rybchenko, nd, nd

> From: Feifei Wang [mailto:Feifei.Wang2@arm.com]
> Sent: Thursday, 13 July 2023 04.37
> 
> > From: Feifei Wang
> > Sent: Tuesday, July 4, 2023 4:17 PM
> >
> > > From: Feifei Wang <feifei.wang2@arm.com>
> > > Sent: Tuesday, July 4, 2023 4:10 PM
> > >
> > > To support mbufs recycle mode, announce the coming ABI changes from
> > > DPDK 23.11.
> > >
> > > Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
> > > Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
> > > ---
> > >  doc/guides/rel_notes/deprecation.rst | 4 ++++
> > >  1 file changed, 4 insertions(+)
> > >
> > > diff --git a/doc/guides/rel_notes/deprecation.rst
> > > b/doc/guides/rel_notes/deprecation.rst
> > > index 66431789b0..c7e1ffafb2 100644
> > > --- a/doc/guides/rel_notes/deprecation.rst
> > > +++ b/doc/guides/rel_notes/deprecation.rst
> > > @@ -118,6 +118,10 @@ Deprecation Notices
> > >    The legacy actions should be removed
> > >    once ``MODIFY_FIELD`` alternative is implemented in drivers.
> > >
> > > +* ethdev: The Ethernet device data structure ``struct rte_eth_dev``
> > > +and
> > > +  the fast-path ethdev flat array ``struct rte_eth_fp_ops`` will be
> > > +updated
> > > +  with new fields to support mbufs recycle mode from DPDK 23.11.
> > > +
> > >  * cryptodev: The function ``rte_cryptodev_cb_fn`` will be updated
> > >    to have another parameter ``qp_id`` to return the queue pair ID
> > >    which got error interrupt to the application,
> > > --
> > > 2.25.1
> 
> Ping~

Acked-by: Morten Brørup <mb@smartsharesystems.com>


^ permalink raw reply	[relevance 0%]

* Re: [PATCH] doc: deprecation notice to add callback data to rte_event_fp_ops
  2023-07-13 10:38  0%   ` Tummala, Sivaprasad
@ 2023-07-13 10:40  0%     ` Jerin Jacob
  2023-07-14 11:32  0%       ` Tummala, Sivaprasad
  0 siblings, 1 reply; 200+ results
From: Jerin Jacob @ 2023-07-13 10:40 UTC (permalink / raw)
  To: Tummala, Sivaprasad
  Cc: dev, Yigit, Ferruh, bruce.richardson, david.marchand, thomas

On Thu, Jul 13, 2023 at 4:08 PM Tummala, Sivaprasad
<Sivaprasad.Tummala@amd.com> wrote:
>
> [AMD Official Use Only - General]
>
> Hi Jerin,
>
> > -----Original Message-----
> > From: Jerin Jacob <jerinjacobk@gmail.com>
> > Sent: Thursday, July 13, 2023 2:22 PM
> > To: Tummala, Sivaprasad <Sivaprasad.Tummala@amd.com>
> > Cc: dev@dpdk.org; Yigit, Ferruh <Ferruh.Yigit@amd.com>;
> > bruce.richardson@intel.com; david.marchand@redhat.com; thomas@monjalon.net
> > Subject: Re: [PATCH] doc: deprecation notice to add callback data to
> > rte_event_fp_ops
> >
> > Caution: This message originated from an External Source. Use proper caution
> > when opening attachments, clicking links, or responding.
> >
> >
> > On Wed, Jul 12, 2023 at 11:01 PM Sivaprasad Tummala
> > <sivaprasad.tummala@amd.com> wrote:
> > >
> > > Deprecation notice to add "rte_eventdev_port_data" field to
> >
> > Could you share the rational for why rte_eventdev_port_data needs to be added?
>
> "rte_eventdev_port_data" is used to hold callbacks registered optionally per event device port and associated callback data.
> By adding "rte_eventdev_port_data" to "rte_event_fp_ops", allows to fetch this data for fastpath eventdev inline functions in advance.

Please add above info in the release notes for next version.

>
> >
> >
> > > ``rte_event_fp_ops`` for callback support.
> > >
> > > Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
> > > ---
> > >  doc/guides/rel_notes/deprecation.rst | 4 ++++
> > >  1 file changed, 4 insertions(+)
> > >
> > > diff --git a/doc/guides/rel_notes/deprecation.rst
> > > b/doc/guides/rel_notes/deprecation.rst
> > > index 8e1cdd677a..2c69338818 100644
> > > --- a/doc/guides/rel_notes/deprecation.rst
> > > +++ b/doc/guides/rel_notes/deprecation.rst
> > > @@ -133,6 +133,10 @@ Deprecation Notices
> > >    ``rte_cryptodev_get_auth_algo_string``,
> > ``rte_cryptodev_get_aead_algo_string`` and
> > >    ``rte_cryptodev_asym_get_xform_string`` respectively.
> > >
> > > +* eventdev: The struct rte_event_fp_ops will be updated with a new
> > > +element
> > > +  rte_eventdev_port_data to support optional callbacks in DPDK 23.11.
> > > +This changes
> > > +  the size of rte_event_fp_ops and result in ABI change.
> > > +
> > >  * flow_classify: The flow_classify library and example have no maintainer.
> > >    The library is experimental and, as such, it could be removed from DPDK.
> > >    Its removal has been postponed to let potential users report
> > > interest
> > > --
> > > 2.34.1
> > >

^ permalink raw reply	[relevance 0%]

* RE: [PATCH] doc: deprecation notice to add callback data to rte_event_fp_ops
  2023-07-13  8:51  0% ` Jerin Jacob
@ 2023-07-13 10:38  0%   ` Tummala, Sivaprasad
  2023-07-13 10:40  0%     ` Jerin Jacob
  0 siblings, 1 reply; 200+ results
From: Tummala, Sivaprasad @ 2023-07-13 10:38 UTC (permalink / raw)
  To: Jerin Jacob; +Cc: dev, Yigit, Ferruh, bruce.richardson, david.marchand, thomas

[AMD Official Use Only - General]

Hi Jerin,

> -----Original Message-----
> From: Jerin Jacob <jerinjacobk@gmail.com>
> Sent: Thursday, July 13, 2023 2:22 PM
> To: Tummala, Sivaprasad <Sivaprasad.Tummala@amd.com>
> Cc: dev@dpdk.org; Yigit, Ferruh <Ferruh.Yigit@amd.com>;
> bruce.richardson@intel.com; david.marchand@redhat.com; thomas@monjalon.net
> Subject: Re: [PATCH] doc: deprecation notice to add callback data to
> rte_event_fp_ops
>
> Caution: This message originated from an External Source. Use proper caution
> when opening attachments, clicking links, or responding.
>
>
> On Wed, Jul 12, 2023 at 11:01 PM Sivaprasad Tummala
> <sivaprasad.tummala@amd.com> wrote:
> >
> > Deprecation notice to add "rte_eventdev_port_data" field to
>
> Could you share the rational for why rte_eventdev_port_data needs to be added?

"rte_eventdev_port_data" is used to hold callbacks registered optionally per event device port and associated callback data.
By adding "rte_eventdev_port_data" to "rte_event_fp_ops", allows to fetch this data for fastpath eventdev inline functions in advance.

>
>
> > ``rte_event_fp_ops`` for callback support.
> >
> > Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
> > ---
> >  doc/guides/rel_notes/deprecation.rst | 4 ++++
> >  1 file changed, 4 insertions(+)
> >
> > diff --git a/doc/guides/rel_notes/deprecation.rst
> > b/doc/guides/rel_notes/deprecation.rst
> > index 8e1cdd677a..2c69338818 100644
> > --- a/doc/guides/rel_notes/deprecation.rst
> > +++ b/doc/guides/rel_notes/deprecation.rst
> > @@ -133,6 +133,10 @@ Deprecation Notices
> >    ``rte_cryptodev_get_auth_algo_string``,
> ``rte_cryptodev_get_aead_algo_string`` and
> >    ``rte_cryptodev_asym_get_xform_string`` respectively.
> >
> > +* eventdev: The struct rte_event_fp_ops will be updated with a new
> > +element
> > +  rte_eventdev_port_data to support optional callbacks in DPDK 23.11.
> > +This changes
> > +  the size of rte_event_fp_ops and result in ABI change.
> > +
> >  * flow_classify: The flow_classify library and example have no maintainer.
> >    The library is experimental and, as such, it could be removed from DPDK.
> >    Its removal has been postponed to let potential users report
> > interest
> > --
> > 2.34.1
> >

^ permalink raw reply	[relevance 0%]

* Re: [PATCH] doc: deprecation notice to add callback data to rte_event_fp_ops
  2023-07-12 17:30  5% [PATCH] doc: deprecation notice to add callback data to rte_event_fp_ops Sivaprasad Tummala
@ 2023-07-13  8:51  0% ` Jerin Jacob
  2023-07-13 10:38  0%   ` Tummala, Sivaprasad
  2023-07-17 11:24  5% ` [PATCH v1] " Sivaprasad Tummala
  1 sibling, 1 reply; 200+ results
From: Jerin Jacob @ 2023-07-13  8:51 UTC (permalink / raw)
  To: Sivaprasad Tummala
  Cc: dev, ferruh.yigit, bruce.richardson, david.marchand, thomas

On Wed, Jul 12, 2023 at 11:01 PM Sivaprasad Tummala
<sivaprasad.tummala@amd.com> wrote:
>
> Deprecation notice to add "rte_eventdev_port_data" field to

Could you share the rational for why rte_eventdev_port_data needs to be added?


> ``rte_event_fp_ops`` for callback support.
>
> Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
> ---
>  doc/guides/rel_notes/deprecation.rst | 4 ++++
>  1 file changed, 4 insertions(+)
>
> diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
> index 8e1cdd677a..2c69338818 100644
> --- a/doc/guides/rel_notes/deprecation.rst
> +++ b/doc/guides/rel_notes/deprecation.rst
> @@ -133,6 +133,10 @@ Deprecation Notices
>    ``rte_cryptodev_get_auth_algo_string``, ``rte_cryptodev_get_aead_algo_string`` and
>    ``rte_cryptodev_asym_get_xform_string`` respectively.
>
> +* eventdev: The struct rte_event_fp_ops will be updated with a new element
> +  rte_eventdev_port_data to support optional callbacks in DPDK 23.11. This changes
> +  the size of rte_event_fp_ops and result in ABI change.
> +
>  * flow_classify: The flow_classify library and example have no maintainer.
>    The library is experimental and, as such, it could be removed from DPDK.
>    Its removal has been postponed to let potential users report interest
> --
> 2.34.1
>

^ permalink raw reply	[relevance 0%]

* Re: [PATCH] doc: announce ethdev operation struct changes
  2023-07-05 11:32  0% ` Konstantin Ananyev
@ 2023-07-13  7:52  0%   ` Ferruh Yigit
  0 siblings, 0 replies; 200+ results
From: Ferruh Yigit @ 2023-07-13  7:52 UTC (permalink / raw)
  To: Konstantin Ananyev, Feifei Wang
  Cc: dev, nd, Honnappa.Nagarahalli, Ruifeng Wang

On 7/5/2023 12:32 PM, Konstantin Ananyev wrote:
> 04/07/2023 09:10, Feifei Wang пишет:
>> To support mbufs recycle mode, announce the coming ABI changes
>> from DPDK 23.11.
>>
>> Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
>> Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
>> ---
>>   doc/guides/rel_notes/deprecation.rst | 4 ++++
>>   1 file changed, 4 insertions(+)
>>
>> diff --git a/doc/guides/rel_notes/deprecation.rst
>> b/doc/guides/rel_notes/deprecation.rst
>> index 66431789b0..c7e1ffafb2 100644
>> --- a/doc/guides/rel_notes/deprecation.rst
>> +++ b/doc/guides/rel_notes/deprecation.rst
>> @@ -118,6 +118,10 @@ Deprecation Notices
>>     The legacy actions should be removed
>>     once ``MODIFY_FIELD`` alternative is implemented in drivers.
>>   +* ethdev: The Ethernet device data structure ``struct rte_eth_dev``
>> and
>> +  the fast-path ethdev flat array ``struct rte_eth_fp_ops`` will be
>> updated
>> +  with new fields to support mbufs recycle mode from DPDK 23.11.
>> +
>>   * cryptodev: The function ``rte_cryptodev_cb_fn`` will be updated
>>     to have another parameter ``qp_id`` to return the queue pair ID
>>     which got error interrupt to the application,
> 
> Acked-by: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
>

Acked-by: Ferruh Yigit <ferruh.yigit@amd.com>


^ permalink raw reply	[relevance 0%]

* RE: [PATCH] doc: announce ethdev operation struct changes
  2023-07-04  8:17  0% ` Feifei Wang
@ 2023-07-13  2:37  0%   ` Feifei Wang
  2023-07-13 12:50  0%     ` Morten Brørup
  0 siblings, 1 reply; 200+ results
From: Feifei Wang @ 2023-07-13  2:37 UTC (permalink / raw)
  To: dev
  Cc: nd, Honnappa Nagarahalli, Ruifeng Wang, Konstantin Ananyev, mb,
	Ferruh Yigit, thomas, Andrew Rybchenko, nd, nd

> -----Original Message-----
> From: Feifei Wang
> Sent: Tuesday, July 4, 2023 4:17 PM
> To: Feifei Wang <feifei.wang2@arm.com>
> Cc: dev@dpdk.org; nd <nd@arm.com>; Honnappa Nagarahalli
> <Honnappa.Nagarahalli@arm.com>; Ruifeng Wang
> <Ruifeng.Wang@arm.com>; Konstantin Ananyev
> <konstantin.v.ananyev@yandex.ru>; mb@smartsharesystems.com; Ferruh
> Yigit <ferruh.yigit@amd.com>; thomas@monjalon.net; Andrew Rybchenko
> <andrew.rybchenko@oktetlabs.ru>; nd <nd@arm.com>
> Subject: RE: [PATCH] doc: announce ethdev operation struct changes
> 
> 
> 
> > -----Original Message-----
> > From: Feifei Wang <feifei.wang2@arm.com>
> > Sent: Tuesday, July 4, 2023 4:10 PM
> > Cc: dev@dpdk.org; nd <nd@arm.com>; Honnappa Nagarahalli
> > <Honnappa.Nagarahalli@arm.com>; Feifei Wang <Feifei.Wang2@arm.com>;
> > Ruifeng Wang <Ruifeng.Wang@arm.com>
> > Subject: [PATCH] doc: announce ethdev operation struct changes
> >
> > To support mbufs recycle mode, announce the coming ABI changes from
> > DPDK 23.11.
> >
> > Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
> > Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
> > ---
> >  doc/guides/rel_notes/deprecation.rst | 4 ++++
> >  1 file changed, 4 insertions(+)
> >
> > diff --git a/doc/guides/rel_notes/deprecation.rst
> > b/doc/guides/rel_notes/deprecation.rst
> > index 66431789b0..c7e1ffafb2 100644
> > --- a/doc/guides/rel_notes/deprecation.rst
> > +++ b/doc/guides/rel_notes/deprecation.rst
> > @@ -118,6 +118,10 @@ Deprecation Notices
> >    The legacy actions should be removed
> >    once ``MODIFY_FIELD`` alternative is implemented in drivers.
> >
> > +* ethdev: The Ethernet device data structure ``struct rte_eth_dev``
> > +and
> > +  the fast-path ethdev flat array ``struct rte_eth_fp_ops`` will be
> > +updated
> > +  with new fields to support mbufs recycle mode from DPDK 23.11.
> > +
> >  * cryptodev: The function ``rte_cryptodev_cb_fn`` will be updated
> >    to have another parameter ``qp_id`` to return the queue pair ID
> >    which got error interrupt to the application,
> > --
> > 2.25.1

Ping~


^ permalink raw reply	[relevance 0%]

* [PATCH] doc: deprecation notice to add callback data to rte_event_fp_ops
@ 2023-07-12 17:30  5% Sivaprasad Tummala
  2023-07-13  8:51  0% ` Jerin Jacob
  2023-07-17 11:24  5% ` [PATCH v1] " Sivaprasad Tummala
  0 siblings, 2 replies; 200+ results
From: Sivaprasad Tummala @ 2023-07-12 17:30 UTC (permalink / raw)
  To: dev; +Cc: ferruh.yigit, bruce.richardson, david.marchand, thomas

Deprecation notice to add "rte_eventdev_port_data" field to
``rte_event_fp_ops`` for callback support.

Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
---
 doc/guides/rel_notes/deprecation.rst | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 8e1cdd677a..2c69338818 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -133,6 +133,10 @@ Deprecation Notices
   ``rte_cryptodev_get_auth_algo_string``, ``rte_cryptodev_get_aead_algo_string`` and
   ``rte_cryptodev_asym_get_xform_string`` respectively.
 
+* eventdev: The struct rte_event_fp_ops will be updated with a new element
+  rte_eventdev_port_data to support optional callbacks in DPDK 23.11. This changes
+  the size of rte_event_fp_ops and result in ABI change.
+
 * flow_classify: The flow_classify library and example have no maintainer.
   The library is experimental and, as such, it could be removed from DPDK.
   Its removal has been postponed to let potential users report interest
-- 
2.34.1


^ permalink raw reply	[relevance 5%]

* Re: [PATCH] doc: announce deprecation of RTE_CPUFLAG_NUMFLAGS
  2023-07-12 10:21  0% ` Ferruh Yigit
@ 2023-07-12 14:51  0%   ` Hemant Agrawal
  0 siblings, 0 replies; 200+ results
From: Hemant Agrawal @ 2023-07-12 14:51 UTC (permalink / raw)
  To: Ferruh Yigit, Sivaprasad Tummala, dev
  Cc: bruce.richardson, david.marchand, thomas


On 12-Jul-23 3:51 PM, Ferruh Yigit wrote:
> Caution: This is an external email. Please take care when clicking links or opening attachments. When in doubt, report the message using the 'Report this email' button
>
>
> On 7/12/2023 11:18 AM, Sivaprasad Tummala wrote:
>> To allow new cpu features to be added without ABI breakage,
>> RTE_CPUFLAG_NUMFLAGS will be removed in DPDK 23.11 release.
>>
>> Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
>> ---
>>   doc/guides/rel_notes/deprecation.rst | 3 +++
>>   1 file changed, 3 insertions(+)
>>
>> diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
>> index 8e1cdd677a..92db59d9c2 100644
>> --- a/doc/guides/rel_notes/deprecation.rst
>> +++ b/doc/guides/rel_notes/deprecation.rst
>> @@ -28,6 +28,9 @@ Deprecation Notices
>>     the replacement API rte_thread_set_name and rte_thread_create_control being
>>     marked as stable, and planned to be removed by the 23.11 release.
>>
>> +* eal: RTE_CPUFLAG_NUMFLAGS will be removed in DPDK 23.11 release. This is
>> +  to allow new cpu features to be added without ABI breakage.
>> +
>>   * rte_atomicNN_xxx: These APIs do not take memory order parameter. This does
>>     not allow for writing optimized code for all the CPU architectures supported
>>     in DPDK. DPDK has adopted the atomic operations from
>>
> Acked-by: Ferruh Yigit <ferruh.yigit@amd.com>
>
> Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>
>

^ permalink raw reply	[relevance 0%]

* Re: [PATCH] doc: announce deprecation of RTE_CPUFLAG_NUMFLAGS
  2023-07-12 10:18  8% [PATCH] doc: announce deprecation of RTE_CPUFLAG_NUMFLAGS Sivaprasad Tummala
@ 2023-07-12 10:21  0% ` Ferruh Yigit
  2023-07-12 14:51  0%   ` Hemant Agrawal
  2023-07-25  8:39  3% ` Ferruh Yigit
  1 sibling, 1 reply; 200+ results
From: Ferruh Yigit @ 2023-07-12 10:21 UTC (permalink / raw)
  To: Sivaprasad Tummala, dev; +Cc: bruce.richardson, david.marchand, thomas

On 7/12/2023 11:18 AM, Sivaprasad Tummala wrote:
> To allow new cpu features to be added without ABI breakage,
> RTE_CPUFLAG_NUMFLAGS will be removed in DPDK 23.11 release.
> 
> Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
> ---
>  doc/guides/rel_notes/deprecation.rst | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
> index 8e1cdd677a..92db59d9c2 100644
> --- a/doc/guides/rel_notes/deprecation.rst
> +++ b/doc/guides/rel_notes/deprecation.rst
> @@ -28,6 +28,9 @@ Deprecation Notices
>    the replacement API rte_thread_set_name and rte_thread_create_control being
>    marked as stable, and planned to be removed by the 23.11 release.
>  
> +* eal: RTE_CPUFLAG_NUMFLAGS will be removed in DPDK 23.11 release. This is
> +  to allow new cpu features to be added without ABI breakage.
> +
>  * rte_atomicNN_xxx: These APIs do not take memory order parameter. This does
>    not allow for writing optimized code for all the CPU architectures supported
>    in DPDK. DPDK has adopted the atomic operations from
>

Acked-by: Ferruh Yigit <ferruh.yigit@amd.com>



^ permalink raw reply	[relevance 0%]

* [PATCH] doc: announce deprecation of RTE_CPUFLAG_NUMFLAGS
@ 2023-07-12 10:18  8% Sivaprasad Tummala
  2023-07-12 10:21  0% ` Ferruh Yigit
  2023-07-25  8:39  3% ` Ferruh Yigit
  0 siblings, 2 replies; 200+ results
From: Sivaprasad Tummala @ 2023-07-12 10:18 UTC (permalink / raw)
  To: dev; +Cc: ferruh.yigit, bruce.richardson, david.marchand, thomas

To allow new cpu features to be added without ABI breakage,
RTE_CPUFLAG_NUMFLAGS will be removed in DPDK 23.11 release.

Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
---
 doc/guides/rel_notes/deprecation.rst | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 8e1cdd677a..92db59d9c2 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -28,6 +28,9 @@ Deprecation Notices
   the replacement API rte_thread_set_name and rte_thread_create_control being
   marked as stable, and planned to be removed by the 23.11 release.
 
+* eal: RTE_CPUFLAG_NUMFLAGS will be removed in DPDK 23.11 release. This is
+  to allow new cpu features to be added without ABI breakage.
+
 * rte_atomicNN_xxx: These APIs do not take memory order parameter. This does
   not allow for writing optimized code for all the CPU architectures supported
   in DPDK. DPDK has adopted the atomic operations from
-- 
2.34.1


^ permalink raw reply	[relevance 8%]

* Re: [RFC v2 2/2] eal: add high-performance timer facility
  2023-07-06 22:41  3%     ` Stephen Hemminger
@ 2023-07-12  8:58  4%       ` Mattias Rönnblom
  0 siblings, 0 replies; 200+ results
From: Mattias Rönnblom @ 2023-07-12  8:58 UTC (permalink / raw)
  To: Stephen Hemminger
  Cc: dev, Erik Gabriel Carrillo, David Marchand, Maria Lingemark,
	Stefan Sundkvist, Morten Brørup, Tyler Retzlaff,
	Mattias Rönnblom

On 2023-07-07 00:41, Stephen Hemminger wrote:
> On Wed, 15 Mar 2023 18:03:42 +0100
> Mattias Rönnblom <mattias.ronnblom@ericsson.com> wrote:
> 
>> The htimer library attempts at providing a timer facility with roughly
>> the same functionality, but less overhead and better scalability than
>> DPDK timer library.
> 
> I don't understand. Why not just fix and extend existing timers.
> Sure you will need to add some API's and maybe drop some of the existing
> experimental ones (ie alt_timer). Even change the ABI.
> 
> It would be better to have one high performance, scaleable timer than
> spend the next 3 years telling users which one to use and why!
> 
> So please make rte_timer work better in 23.11 release rather
> than reinventing a new variant.

I wanted to explore how a data plane timer API should look like. 
Something like a "first principles" type approach. As it happens, it 
seems like I will converge on something that's pretty similar to how 
rte_timer (and most kernel timers) API works, for example in regards to 
timer memory allocation.

Clearly, there should not be two DPDK timer APIs that provide the same 
functionality. That was never the intention. Since so much DPDK code and 
more importantly application code depends on <rte_timer.h> it wasn't 
obvious that the best option was make extensive changes to rte_timer API 
and implementation. One way that seemed like a plausible option (how 
much so depending on the extend of the rte_timer vs rte_htimer API 
differences) was to have a new API, and depreciate <rte_timer.h> in the 
release htimer was introduced.

That said, at this point, it's not clear to me which option is the best 
one of "making extensive changes to rte_timer" or "having rte_htimer on 
the side for a couple of releases".

An imaginary alternative where the <rte_timer.h> API/ABI can be 
maintained, and you get all the performance and scalability and improved 
API semantics of htimer, would obviously be the best option. But I don't 
think that is possible. Especially not if you want to end up with a 
nice, orthogonal API and a clean implementation.

I think changes in both ABI and API are inevitable, and a good thing, 
considering some of the quirks for the current API.

A side note: It seems to me at this point there should be two public 
timer APIs, but providing different functionality, at slightly different 
levels of abstraction. One is the <rte_timer.h> lookalike, and the other 
what in the current patchset is represented by <rte_htw.h>, but minus 
the callbacks, as per Morten Brørup's suggestion. The latter would be a 
low-level HTW only, with no MT safety, no lcore knowledge, no opinions 
on time source, etc.


^ permalink raw reply	[relevance 4%]

* [PATCH v9 10/14] eal: expand most macros to empty when using MSVC
  @ 2023-07-11 16:49  5%   ` Tyler Retzlaff
  2023-07-11 16:49  3%   ` [PATCH v9 12/14] telemetry: avoid expanding versioned symbol macros on MSVC Tyler Retzlaff
  1 sibling, 0 replies; 200+ results
From: Tyler Retzlaff @ 2023-07-11 16:49 UTC (permalink / raw)
  To: dev
  Cc: Bruce Richardson, Konstantin Ananyev, Ciara Power, thomas,
	david.marchand, mb, Tyler Retzlaff

For now expand a lot of common rte macros empty. The catch here is we
need to test that most of the macros do what they should but at the same
time they are blocking work needed to bootstrap of the unit tests.

Later we will return and provide (where possible) expansions that work
correctly for msvc and where not possible provide some alternate macros
to achieve the same outcome.

Signed-off-by: Tyler Retzlaff <roretzla@linux.microsoft.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
---
 lib/eal/include/rte_branch_prediction.h |  8 +++++
 lib/eal/include/rte_common.h            | 54 +++++++++++++++++++++++++++++++++
 lib/eal/include/rte_compat.h            | 20 ++++++++++++
 3 files changed, 82 insertions(+)

diff --git a/lib/eal/include/rte_branch_prediction.h b/lib/eal/include/rte_branch_prediction.h
index 414cd92..c0356ca 100644
--- a/lib/eal/include/rte_branch_prediction.h
+++ b/lib/eal/include/rte_branch_prediction.h
@@ -24,7 +24,11 @@
  *      do_stuff();
  */
 #ifndef likely
+#ifdef RTE_TOOLCHAIN_MSVC
+#define likely(x)	(!!(x))
+#else
 #define likely(x)	__builtin_expect(!!(x), 1)
+#endif
 #endif /* likely */
 
 /**
@@ -37,7 +41,11 @@
  *      do_stuff();
  */
 #ifndef unlikely
+#ifdef RTE_TOOLCHAIN_MSVC
+#define unlikely(x)	(!!(x))
+#else
 #define unlikely(x)	__builtin_expect(!!(x), 0)
+#endif
 #endif /* unlikely */
 
 #ifdef __cplusplus
diff --git a/lib/eal/include/rte_common.h b/lib/eal/include/rte_common.h
index 2f464e3..b087532 100644
--- a/lib/eal/include/rte_common.h
+++ b/lib/eal/include/rte_common.h
@@ -41,6 +41,10 @@
 #define RTE_STD_C11
 #endif
 
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __extension__
+#endif
+
 /*
  * RTE_TOOLCHAIN_GCC is defined if the target is built with GCC,
  * while a host application (like pmdinfogen) may have another compiler.
@@ -65,7 +69,11 @@
 /**
  * Force alignment
  */
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_aligned(a)
+#else
 #define __rte_aligned(a) __attribute__((__aligned__(a)))
+#endif
 
 #ifdef RTE_ARCH_STRICT_ALIGN
 typedef uint64_t unaligned_uint64_t __rte_aligned(1);
@@ -80,16 +88,29 @@
 /**
  * Force a structure to be packed
  */
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_packed
+#else
 #define __rte_packed __attribute__((__packed__))
+#endif
 
 /**
  * Macro to mark a type that is not subject to type-based aliasing rules
  */
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_may_alias
+#else
 #define __rte_may_alias __attribute__((__may_alias__))
+#endif
 
 /******* Macro to mark functions and fields scheduled for removal *****/
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_deprecated
+#define __rte_deprecated_msg(msg)
+#else
 #define __rte_deprecated	__attribute__((__deprecated__))
 #define __rte_deprecated_msg(msg)	__attribute__((__deprecated__(msg)))
+#endif
 
 /**
  *  Macro to mark macros and defines scheduled for removal
@@ -110,14 +131,22 @@
 /**
  * Force symbol to be generated even if it appears to be unused.
  */
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_used
+#else
 #define __rte_used __attribute__((used))
+#endif
 
 /*********** Macros to eliminate unused variable warnings ********/
 
 /**
  * short definition to mark a function parameter unused
  */
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_unused
+#else
 #define __rte_unused __attribute__((__unused__))
+#endif
 
 /**
  * Mark pointer as restricted with regard to pointer aliasing.
@@ -141,6 +170,9 @@
  * even if the underlying stdio implementation is ANSI-compliant,
  * so this must be overridden.
  */
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_format_printf(format_index, first_arg)
+#else
 #if RTE_CC_IS_GNU
 #define __rte_format_printf(format_index, first_arg) \
 	__attribute__((format(gnu_printf, format_index, first_arg)))
@@ -148,6 +180,7 @@
 #define __rte_format_printf(format_index, first_arg) \
 	__attribute__((format(printf, format_index, first_arg)))
 #endif
+#endif
 
 /**
  * Tells compiler that the function returns a value that points to
@@ -222,7 +255,11 @@ static void __attribute__((destructor(RTE_PRIO(prio)), used)) func(void)
 /**
  * Hint never returning function
  */
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_noreturn
+#else
 #define __rte_noreturn __attribute__((noreturn))
+#endif
 
 /**
  * Issue a warning in case the function's return value is ignored.
@@ -247,12 +284,20 @@ static void __attribute__((destructor(RTE_PRIO(prio)), used)) func(void)
  *  }
  * @endcode
  */
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_warn_unused_result
+#else
 #define __rte_warn_unused_result __attribute__((warn_unused_result))
+#endif
 
 /**
  * Force a function to be inlined
  */
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_always_inline
+#else
 #define __rte_always_inline inline __attribute__((always_inline))
+#endif
 
 /**
  * Force a function to be noinlined
@@ -437,7 +482,11 @@ static void __attribute__((destructor(RTE_PRIO(prio)), used)) func(void)
 #define RTE_CACHE_LINE_MIN_SIZE 64
 
 /** Force alignment to cache line. */
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_cache_aligned
+#else
 #define __rte_cache_aligned __rte_aligned(RTE_CACHE_LINE_SIZE)
+#endif
 
 /** Force minimum cache line alignment. */
 #define __rte_cache_min_aligned __rte_aligned(RTE_CACHE_LINE_MIN_SIZE)
@@ -812,6 +861,10 @@ static void __attribute__((destructor(RTE_PRIO(prio)), used)) func(void)
  *  struct wrapper *w = container_of(x, struct wrapper, c);
  */
 #ifndef container_of
+#ifdef RTE_TOOLCHAIN_MSVC
+#define container_of(ptr, type, member) \
+			((type *)((uintptr_t)(ptr) - offsetof(type, member)))
+#else
 #define container_of(ptr, type, member)	__extension__ ({		\
 			const typeof(((type *)0)->member) *_ptr = (ptr); \
 			__rte_unused type *_target_ptr =	\
@@ -819,6 +872,7 @@ static void __attribute__((destructor(RTE_PRIO(prio)), used)) func(void)
 			(type *)(((uintptr_t)_ptr) - offsetof(type, member)); \
 		})
 #endif
+#endif
 
 /** Swap two variables. */
 #define RTE_SWAP(a, b) \
diff --git a/lib/eal/include/rte_compat.h b/lib/eal/include/rte_compat.h
index fc9fbaa..716bc03 100644
--- a/lib/eal/include/rte_compat.h
+++ b/lib/eal/include/rte_compat.h
@@ -12,14 +12,22 @@
 
 #ifndef ALLOW_EXPERIMENTAL_API
 
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_experimental
+#else
 #define __rte_experimental \
 __attribute__((deprecated("Symbol is not yet part of stable ABI"), \
 section(".text.experimental")))
+#endif
 
 #else
 
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_experimental
+#else
 #define __rte_experimental \
 __attribute__((section(".text.experimental")))
+#endif
 
 #endif
 
@@ -30,23 +38,35 @@
 
 #if !defined ALLOW_INTERNAL_API && __has_attribute(error) /* For GCC */
 
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_internal
+#else
 #define __rte_internal \
 __attribute__((error("Symbol is not public ABI"), \
 section(".text.internal")))
+#endif
 
 #elif !defined ALLOW_INTERNAL_API && __has_attribute(diagnose_if) /* For clang */
 
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_internal
+#else
 #define __rte_internal \
 _Pragma("GCC diagnostic push") \
 _Pragma("GCC diagnostic ignored \"-Wgcc-compat\"") \
 __attribute__((diagnose_if(1, "Symbol is not public ABI", "error"), \
 section(".text.internal"))) \
 _Pragma("GCC diagnostic pop")
+#endif
 
 #else
 
+#ifdef RTE_TOOLCHAIN_MSVC
+#define __rte_internal
+#else
 #define __rte_internal \
 __attribute__((section(".text.internal")))
+#endif
 
 #endif
 
-- 
1.8.3.1


^ permalink raw reply	[relevance 5%]

* [PATCH v9 12/14] telemetry: avoid expanding versioned symbol macros on MSVC
    2023-07-11 16:49  5%   ` [PATCH v9 10/14] eal: expand most macros to empty when using MSVC Tyler Retzlaff
@ 2023-07-11 16:49  3%   ` Tyler Retzlaff
  1 sibling, 0 replies; 200+ results
From: Tyler Retzlaff @ 2023-07-11 16:49 UTC (permalink / raw)
  To: dev
  Cc: Bruce Richardson, Konstantin Ananyev, Ciara Power, thomas,
	david.marchand, mb, Tyler Retzlaff

Windows does not support versioned symbols. Fortunately Windows also
doesn't have an exported stable ABI.

Export rte_tel_data_add_array_int -> rte_tel_data_add_array_int_24
and rte_tel_data_add_dict_int -> rte_tel_data_add_dict_int_v24
functions.

Windows does have a way to achieve similar versioning for symbols but it
is not a simple #define so it will be done as a work package later.

Signed-off-by: Tyler Retzlaff <roretzla@linux.microsoft.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
---
 lib/telemetry/telemetry_data.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/lib/telemetry/telemetry_data.c b/lib/telemetry/telemetry_data.c
index 0c7187b..523287b 100644
--- a/lib/telemetry/telemetry_data.c
+++ b/lib/telemetry/telemetry_data.c
@@ -83,8 +83,16 @@
 /* mark the v23 function as the older version, and v24 as the default version */
 VERSION_SYMBOL(rte_tel_data_add_array_int, _v23, 23);
 BIND_DEFAULT_SYMBOL(rte_tel_data_add_array_int, _v24, 24);
+#ifdef RTE_TOOLCHAIN_MSVC
+int
+rte_tel_data_add_array_int(struct rte_tel_data *d, int64_t x)
+{
+	return rte_tel_data_add_array_int_v24(d, x);
+}
+#else
 MAP_STATIC_SYMBOL(int rte_tel_data_add_array_int(struct rte_tel_data *d,
 		int64_t x), rte_tel_data_add_array_int_v24);
+#endif
 
 int
 rte_tel_data_add_array_uint(struct rte_tel_data *d, uint64_t x)
@@ -218,8 +226,16 @@
 /* mark the v23 function as the older version, and v24 as the default version */
 VERSION_SYMBOL(rte_tel_data_add_dict_int, _v23, 23);
 BIND_DEFAULT_SYMBOL(rte_tel_data_add_dict_int, _v24, 24);
+#ifdef RTE_TOOLCHAIN_MSVC
+int
+rte_tel_data_add_dict_int(struct rte_tel_data *d, const char *name, int64_t val)
+{
+	return rte_tel_data_add_dict_int_v24(d, name, val);
+}
+#else
 MAP_STATIC_SYMBOL(int rte_tel_data_add_dict_int(struct rte_tel_data *d,
 		const char *name, int64_t val), rte_tel_data_add_dict_int_v24);
+#endif
 
 int
 rte_tel_data_add_dict_uint(struct rte_tel_data *d,
-- 
1.8.3.1


^ permalink raw reply	[relevance 3%]

* Re: [PATCH v1 0/2] add IPv6 extension push remove
  2023-07-10 14:41  3%         ` Stephen Hemminger
@ 2023-07-11  6:16  0%           ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2023-07-11  6:16 UTC (permalink / raw)
  To: Ferruh Yigit, Stephen Hemminger
  Cc: Rongwei Liu, Ori Kam, Andrew Rybchenko, dev, Matan Azrad,
	Slava Ovsiienko, Suanming Mou

10/07/2023 16:41, Stephen Hemminger:
> On Mon, 10 Jul 2023 09:55:59 +0100
> Ferruh Yigit <ferruh.yigit@amd.com> wrote:
> 
> > On 7/10/2023 3:32 AM, Rongwei Liu wrote:
> > > Hi Ferruh & Andrew & Ori & Thomas:
> > > 	Sorry, we can't commit the PMD implementation for "IPv6 extension push remove" feature in time for this release.
> > > 	There are some dis-agreements which need to be addressed internally. 
> > > 	We will continue to work on this and plan to push it in the next release.
> > > 
> > > 	RFC link: https://patchwork.dpdk.org/project/dpdk/cover/20230417022630.2377505-1-rongweil@nvidia.com/
> > > 	V1 patch with full PMD implementation: https://patchwork.dpdk.org/project/dpdk/cover/20230417092540.2617450-1-rongweil@nvidia.com/
> > >   
> > 
> > Hi Rongwei,
> > 
> > Thanks for the heads up.
> > As long as there is a plan to upstream driver implementation, I think it
> > is OK to keep ethdev change and wait for driver implementation for
> > better design instead of rushing it for this release with lower quality
> > (although target should be to have driver changes with same release with
> > API changes for future features).
> 
> Please wait the change until driver is ready.
> Don't want to deal with API/ABI changes when driver is upstream.
> Also, no unused code please.

There was a driver patch sent in April.
It was impossible to imagine it was not good enough to be merged.



^ permalink raw reply	[relevance 0%]

* Re: [PATCH v1 0/2] add IPv6 extension push remove
  @ 2023-07-10 14:41  3%         ` Stephen Hemminger
  2023-07-11  6:16  0%           ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Stephen Hemminger @ 2023-07-10 14:41 UTC (permalink / raw)
  To: Ferruh Yigit
  Cc: Rongwei Liu, Ori Kam, NBU-Contact-Thomas Monjalon (EXTERNAL),
	Andrew Rybchenko, dev, Matan Azrad, Slava Ovsiienko,
	Suanming Mou

On Mon, 10 Jul 2023 09:55:59 +0100
Ferruh Yigit <ferruh.yigit@amd.com> wrote:

> On 7/10/2023 3:32 AM, Rongwei Liu wrote:
> > Hi Ferruh & Andrew & Ori & Thomas:
> > 	Sorry, we can't commit the PMD implementation for "IPv6 extension push remove" feature in time for this release.
> > 	There are some dis-agreements which need to be addressed internally. 
> > 	We will continue to work on this and plan to push it in the next release.
> > 
> > 	RFC link: https://patchwork.dpdk.org/project/dpdk/cover/20230417022630.2377505-1-rongweil@nvidia.com/
> > 	V1 patch with full PMD implementation: https://patchwork.dpdk.org/project/dpdk/cover/20230417092540.2617450-1-rongweil@nvidia.com/
> >   
> 
> Hi Rongwei,
> 
> Thanks for the heads up.
> As long as there is a plan to upstream driver implementation, I think it
> is OK to keep ethdev change and wait for driver implementation for
> better design instead of rushing it for this release with lower quality
> (although target should be to have driver changes with same release with
> API changes for future features).

Please wait the change until driver is ready.
Don't want to deal with API/ABI changes when driver is upstream.
Also, no unused code please.

^ permalink raw reply	[relevance 3%]

* Re: [PATCH v2 1/2] net/virtio: fix legacy device IO port map in secondary process
  @ 2023-07-07 17:03  3%           ` Gupta, Nipun
  0 siblings, 0 replies; 200+ results
From: Gupta, Nipun @ 2023-07-07 17:03 UTC (permalink / raw)
  To: Xia, Chenbo, David Marchand, Li, Miao, Maxime Coquelin; +Cc: dev, stable



On 7/3/2023 3:01 PM, Xia, Chenbo wrote:
> +Nipun
> 
>> -----Original Message-----
>> From: David Marchand <david.marchand@redhat.com>
>> Sent: Monday, July 3, 2023 4:58 PM
>> To: Li, Miao <miao.li@intel.com>
>> Cc: dev@dpdk.org; stable@dpdk.org; Maxime Coquelin
>> <maxime.coquelin@redhat.com>; Xia, Chenbo <chenbo.xia@intel.com>
>> Subject: Re: [PATCH v2 1/2] net/virtio: fix legacy device IO port map in
>> secondary process
>>
>> On Mon, Jul 3, 2023 at 10:54 AM Li, Miao <miao.li@intel.com> wrote:
>>>>> When doing IO port map for legacy device in secondary process,
>>>>> vfio_cfg setup for legacy device like vfio_group_fd and vfio_dev_fd
>> is
>>>>> missing. So, in secondary process, rte_pci_map_device is added for
>>>>> legacy device to setup vfio_cfg and fill in region info like in
>>>>> primary process.
>>>>
>>>> I think, in legacy mode, there is no PCI mappable memory.
>>>> So there should be no need for this call to rte_pci_map_device.
>>>>
>>>> What is missing is a vfio setup, is this correct?
>>>> I'd rather see this issue be fixed in the pci_vfio_ioport_map()
>> function.
>>>>
>>> If adding vfio setup in the pci_vfio_ioport_map() function, vfio will be
>> setup twice in primary process because rte_pci_map_device will be called
>> for legacy device in primary process.
>>> I add IO port region check to skip region map in the next patch.
>>
>> Well, something must be done so that it is not mapped twice, I did not
>> look into the details.
>> This current patch looks wrong to me and I understand this is not a
>> virtio only issue.
> 
> I think we could have some way to improve this:
> 
> 1. Make rte_pci_map_device map either PIO or MMIO (Based on my knowledge, it's doable
> for vfio. For UIO, I am no expert and not sure). For ioport, it's only about setting
> up the ioport offset and size.
> 2. rte_pci_ioport_map may not be needed anymore.
> 3. struct rte_pci_ioport may not be needed anymore as the info could be saved in
> struct rte_pci_device_internal.
> 4. ioport device uses bar #, len, offset to RW specific BAR.
> 
> Then for virtio device, either primary or secondary process only calls rte_pci_map_device
> once.
> 
> Any comments?

Wouldn't a call to API rte_vfio_setup_device() to setup vfio_cfg, 
vfio_group_fd, vfio_dev_fd under a secondary process check suffice to 
handle IO port map for legacy device in secondary process?

I do not have much info on legacy Virtio device, and I am not clear on 
why and how for these devices rte_pci_map_device() would be called in 
case of primary process, but not in case of secondary process as 
mentioned by Miao Li?

Steps you have mentioned looks fine but note that this would cause an 
ABI breakage and as you mentioned may need changes in UIO (even I am not 
an expert in UIO).

Thanks,
Nipun

> 
> Thanks,
> Chenbo
> 
>>
>>
>> --
>> David Marchand
> 

^ permalink raw reply	[relevance 3%]

* Re: [PATCH v4 3/3] ring: add telemetry cmd for ring info
  2023-07-06  8:52  3%       ` David Marchand
@ 2023-07-07  2:18  0%         ` Jie Hai
  0 siblings, 0 replies; 200+ results
From: Jie Hai @ 2023-07-07  2:18 UTC (permalink / raw)
  To: David Marchand, Thomas Monjalon
  Cc: honnappa.nagarahalli, konstantin.v.ananyev, dev, liudongdong3,
	bruce.richardson

On 2023/7/6 16:52, David Marchand wrote:
> On Tue, Jul 4, 2023 at 4:11 PM Thomas Monjalon <thomas@monjalon.net> wrote:
>>
>> 04/07/2023 10:04, Jie Hai:
>>> On 2023/6/20 22:34, Thomas Monjalon wrote:
>>>> 20/06/2023 10:14, Jie Hai:
>>>>> On 2023/2/20 20:55, David Marchand wrote:
>>>>>> On Fri, Feb 10, 2023 at 3:50 AM Jie Hai <haijie1@huawei.com> wrote:
>>>>>>>
>>>>>>> This patch supports dump of ring information by its name.
>>>>>>> An example using this command is shown below:
>>>>>>>
>>>>>>> --> /ring/info,MP_mb_pool_0
>>>>>>> {
>>>>>>>      "/ring/info": {
>>>>>>>        "name": "MP_mb_pool_0",
>>>>>>>        "socket": 0,
>>>>>>>        "flags": "0x0",
>>>>>>>        "producer_type": "MP",
>>>>>>>        "consumer_type": "MC",
>>>>>>>        "size": 262144,
>>>>>>>        "mask": "0x3ffff",
>>>>>>>        "capacity": 262143,
>>>>>>>        "used_count": 153197,
>>>>>>>        "consumer_tail": 2259,
>>>>>>>        "consumer_head": 2259,
>>>>>>>        "producer_tail": 155456,
>>>>>>>        "producer_head": 155456,
>>>>>>
>>>>>> What would an external user make of such an information?
>>>>>>
>>>>>> I'd like to have a better idea what your usecase is.
>>>>>> If it is for debugging, well, gdb is probably a better candidate.
>>>>>>
>>>>>>
>>>>> Hi David,
>>>>> Thanks for your question and I'm sorry for getting back to you so late.
>>>>> There was a problem with my mailbox and I lost all my mails.
>>>>>
>>>>> The ring information exported by telemetry can be used to check the ring
>>>>> status periodically during normal use. When an error occurs, the fault
>>>>> cause can be deduced based on the information.
>>>>> GDB is more suitable for locating errors only when they are sure that
>>>>> errors will occur.
>>>>
>>>> Yes, when an error occurs, you can use GDB,
>>>> and you don't need all these internal values in telemetry.
>>>>
>>>>
>>> Hi, David, Thomas,
>>>
>>> Would it be better to delete the last four items?
>>>          "consumer_tail": 2259,
>>>          "consumer_head": 2259,
>>>          "producer_tail": 155456,
>>>          "producer_head": 155456,
>>
>> Yes it would be better.
>> David, other maintainers, would it make the telemetry command a good idea?
>>
>>
> 
> Without the ring head/tail exposed, it seems ok.
> It still exposes the ring flags which are kind of internal things, but
> those are parts of the API/ABI, iiuc, so it should not be an issue.
> 
> 
Similar to "name" and "size" of ring, "flags" of ring is also determined 
by user input. I think it's ok to expose it, users can use it to check 
if the configuration is as they want.
And the proc-info also exposes this flag.

^ permalink raw reply	[relevance 0%]

* Re: [RFC v2 2/2] eal: add high-performance timer facility
  @ 2023-07-06 22:41  3%     ` Stephen Hemminger
  2023-07-12  8:58  4%       ` Mattias Rönnblom
  0 siblings, 1 reply; 200+ results
From: Stephen Hemminger @ 2023-07-06 22:41 UTC (permalink / raw)
  To: Mattias Rönnblom
  Cc: dev, Erik Gabriel Carrillo, David Marchand, maria.lingemark,
	Stefan Sundkvist, Morten Brørup, Tyler Retzlaff

On Wed, 15 Mar 2023 18:03:42 +0100
Mattias Rönnblom <mattias.ronnblom@ericsson.com> wrote:

> The htimer library attempts at providing a timer facility with roughly
> the same functionality, but less overhead and better scalability than
> DPDK timer library.

I don't understand. Why not just fix and extend existing timers.
Sure you will need to add some API's and maybe drop some of the existing
experimental ones (ie alt_timer). Even change the ABI.

It would be better to have one high performance, scaleable timer than
spend the next 3 years telling users which one to use and why!

So please make rte_timer work better in 23.11 release rather
than reinventing a new variant.

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v13 0/4] devtools: scripts to count and track symbols
  @ 2023-07-06 19:13  0%   ` Stephen Hemminger
  0 siblings, 0 replies; 200+ results
From: Stephen Hemminger @ 2023-07-06 19:13 UTC (permalink / raw)
  To: Ray Kinsella
  Cc: dev, bruce.richardson, ferruh.yigit, thomas, ktraynor, aconole,
	roy.fan.zhang, arkadiuszx.kusztal, gakhil

On Thu,  9 Sep 2021 14:48:04 +0100
Ray Kinsella <mdr@ashroe.eu> wrote:

> The symbol-tool script reports on the growth of symbols over releases
> and list expired symbols. The notify-symbol-maintainers script
> consumes the input from symbol-tool and generates email notifications
> of expired symbols.
> 
> v2: reworked to fix pylint errors
> v3: sent with the correct in-reply-to
> v4: fix typos picked up by the CI
> v5: fix terminal_size & directory args
> v6: added list-expired, to list expired experimental symbols
> v7: fix typo in comments
> v8: added tool to notify maintainers of expired symbols
> v9: removed hardcoded emails addressed and script names
> v10: added ability to identify and notify the original contributors
> v11: addressed feedback from Aaron Conole, including PEP8 errors.
> v12: added symbol-tool ignore functionality, to ignore specific symbols
> v13: renamed symboltool.abignore, typos, added ack from Akhil Goyal
> 
> Ray Kinsella (4):
>   devtools: script to track symbols over releases
>   devtools: script to send notifications of expired symbols
>   maintainers: add new abi scripts
>   devtools: add asym crypto to symbol-tool ignore

Not sure why this never made it in.

Series-Acked-by: Stephen Hemminger <stephen@networkplumber.org>

^ permalink raw reply	[relevance 0%]

* Re: [PATCH v4 3/3] ring: add telemetry cmd for ring info
  @ 2023-07-06  8:52  3%       ` David Marchand
  2023-07-07  2:18  0%         ` Jie Hai
  0 siblings, 1 reply; 200+ results
From: David Marchand @ 2023-07-06  8:52 UTC (permalink / raw)
  To: Thomas Monjalon
  Cc: Jie Hai, honnappa.nagarahalli, konstantin.v.ananyev, dev,
	liudongdong3, bruce.richardson

On Tue, Jul 4, 2023 at 4:11 PM Thomas Monjalon <thomas@monjalon.net> wrote:
>
> 04/07/2023 10:04, Jie Hai:
> > On 2023/6/20 22:34, Thomas Monjalon wrote:
> > > 20/06/2023 10:14, Jie Hai:
> > >> On 2023/2/20 20:55, David Marchand wrote:
> > >>> On Fri, Feb 10, 2023 at 3:50 AM Jie Hai <haijie1@huawei.com> wrote:
> > >>>>
> > >>>> This patch supports dump of ring information by its name.
> > >>>> An example using this command is shown below:
> > >>>>
> > >>>> --> /ring/info,MP_mb_pool_0
> > >>>> {
> > >>>>     "/ring/info": {
> > >>>>       "name": "MP_mb_pool_0",
> > >>>>       "socket": 0,
> > >>>>       "flags": "0x0",
> > >>>>       "producer_type": "MP",
> > >>>>       "consumer_type": "MC",
> > >>>>       "size": 262144,
> > >>>>       "mask": "0x3ffff",
> > >>>>       "capacity": 262143,
> > >>>>       "used_count": 153197,
> > >>>>       "consumer_tail": 2259,
> > >>>>       "consumer_head": 2259,
> > >>>>       "producer_tail": 155456,
> > >>>>       "producer_head": 155456,
> > >>>
> > >>> What would an external user make of such an information?
> > >>>
> > >>> I'd like to have a better idea what your usecase is.
> > >>> If it is for debugging, well, gdb is probably a better candidate.
> > >>>
> > >>>
> > >> Hi David,
> > >> Thanks for your question and I'm sorry for getting back to you so late.
> > >> There was a problem with my mailbox and I lost all my mails.
> > >>
> > >> The ring information exported by telemetry can be used to check the ring
> > >> status periodically during normal use. When an error occurs, the fault
> > >> cause can be deduced based on the information.
> > >> GDB is more suitable for locating errors only when they are sure that
> > >> errors will occur.
> > >
> > > Yes, when an error occurs, you can use GDB,
> > > and you don't need all these internal values in telemetry.
> > >
> > >
> > Hi, David, Thomas,
> >
> > Would it be better to delete the last four items?
> >         "consumer_tail": 2259,
> >         "consumer_head": 2259,
> >         "producer_tail": 155456,
> >         "producer_head": 155456,
>
> Yes it would be better.
> David, other maintainers, would it make the telemetry command a good idea?
>
>

Without the ring head/tail exposed, it seems ok.
It still exposes the ring flags which are kind of internal things, but
those are parts of the API/ABI, iiuc, so it should not be an issue.


-- 
David Marchand


^ permalink raw reply	[relevance 3%]

* Re: [PATCH] ptp: replace terms master/slave
  @ 2023-07-05 17:27  3% ` Stephen Hemminger
  0 siblings, 0 replies; 200+ results
From: Stephen Hemminger @ 2023-07-05 17:27 UTC (permalink / raw)
  To: Ajit Khaparde; +Cc: dev, Somnath Kotur, Kirill Rybalchenko

On Fri, 19 May 2023 11:15:49 -0700
Stephen Hemminger <stephen@networkplumber.org> wrote:

> The IEEE has revised the naming in PTP protocol.
> Use these new terms to replace master and slave.
> 
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>

This patch has several acks but is still not merged.
Since it is examples, no API/ABI deprecation needed.

^ permalink raw reply	[relevance 3%]

* RE: [EXT] Re: [PATCH v2] doc: announce single-event enqueue/dequeue ABI change
  2023-07-05 13:00  4%   ` Jerin Jacob
@ 2023-07-05 13:02  4%     ` Pavan Nikhilesh Bhagavatula
  2023-07-28 15:51  4%       ` Thomas Monjalon
  2023-07-26 12:04  4%     ` Jerin Jacob
  1 sibling, 1 reply; 200+ results
From: Pavan Nikhilesh Bhagavatula @ 2023-07-05 13:02 UTC (permalink / raw)
  To: Jerin Jacob, Mattias Rönnblom
  Cc: Jerin Jacob Kollanukkaran, Thomas Monjalon, hofors, dev,
	Timothy McDaniel, Hemant Agrawal, Sachin Saxena,
	Harry van Haaren, Liang Ma, Peter Mccarthy

> On Wed, Jul 5, 2023 at 4:48 PM Mattias Rönnblom
> <mattias.ronnblom@ericsson.com> wrote:
> >
> > Announce the removal of the single-event enqueue and dequeue
> > operations from the eventdev ABI.
> >
> > Signed-off-by: Mattias Rönnblom <mattias.ronnblom@ericsson.com>
> 
> Acked-by: Jerin Jacob <jerinj@marvell.com>

Acked-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
> 
> 
> >
> > ---
> > PATCH v2: Fix commit subject prefix.
> > ---
> >  doc/guides/rel_notes/deprecation.rst | 8 ++++++++
> >  1 file changed, 8 insertions(+)
> >
> > diff --git a/doc/guides/rel_notes/deprecation.rst
> b/doc/guides/rel_notes/deprecation.rst
> > index 66431789b0..ca192d838d 100644
> > --- a/doc/guides/rel_notes/deprecation.rst
> > +++ b/doc/guides/rel_notes/deprecation.rst
> > @@ -153,3 +153,11 @@ Deprecation Notices
> >    The new port library API (functions rte_swx_port_*)
> >    will gradually transition from experimental to stable status
> >    starting with DPDK 23.07 release.
> > +
> > +* eventdev: The single-event (non-burst) enqueue and dequeue
> > +  operations, used by static inline burst enqueue and dequeue
> > +  functions in <rte_eventdev.h>, will be removed in DPDK 23.11. This
> > +  simplification includes changing the layout and potentially also the
> > +  size of the public rte_event_fp_ops struct, breaking the ABI. Since
> > +  these functions are not called directly by the application, the API
> > +  remains unaffected.
> > --
> > 2.34.1
> >

^ permalink raw reply	[relevance 4%]

* Re: [PATCH v2] doc: announce single-event enqueue/dequeue ABI change
  2023-07-05 11:12 13% ` [PATCH v2] doc: " Mattias Rönnblom
@ 2023-07-05 13:00  4%   ` Jerin Jacob
  2023-07-05 13:02  4%     ` [EXT] " Pavan Nikhilesh Bhagavatula
  2023-07-26 12:04  4%     ` Jerin Jacob
  0 siblings, 2 replies; 200+ results
From: Jerin Jacob @ 2023-07-05 13:00 UTC (permalink / raw)
  To: Mattias Rönnblom
  Cc: jerinj, Thomas Monjalon, hofors, dev, Pavan Nikhilesh,
	Timothy McDaniel, Hemant Agrawal, Sachin Saxena,
	Harry van Haaren, Liang Ma, Peter Mccarthy

On Wed, Jul 5, 2023 at 4:48 PM Mattias Rönnblom
<mattias.ronnblom@ericsson.com> wrote:
>
> Announce the removal of the single-event enqueue and dequeue
> operations from the eventdev ABI.
>
> Signed-off-by: Mattias Rönnblom <mattias.ronnblom@ericsson.com>

Acked-by: Jerin Jacob <jerinj@marvell.com>


>
> ---
> PATCH v2: Fix commit subject prefix.
> ---
>  doc/guides/rel_notes/deprecation.rst | 8 ++++++++
>  1 file changed, 8 insertions(+)
>
> diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
> index 66431789b0..ca192d838d 100644
> --- a/doc/guides/rel_notes/deprecation.rst
> +++ b/doc/guides/rel_notes/deprecation.rst
> @@ -153,3 +153,11 @@ Deprecation Notices
>    The new port library API (functions rte_swx_port_*)
>    will gradually transition from experimental to stable status
>    starting with DPDK 23.07 release.
> +
> +* eventdev: The single-event (non-burst) enqueue and dequeue
> +  operations, used by static inline burst enqueue and dequeue
> +  functions in <rte_eventdev.h>, will be removed in DPDK 23.11. This
> +  simplification includes changing the layout and potentially also the
> +  size of the public rte_event_fp_ops struct, breaking the ABI. Since
> +  these functions are not called directly by the application, the API
> +  remains unaffected.
> --
> 2.34.1
>

^ permalink raw reply	[relevance 4%]

* Re: [PATCH] doc: announce ethdev operation struct changes
  2023-07-04  8:10  3% [PATCH] doc: announce ethdev operation struct changes Feifei Wang
  2023-07-04  8:17  0% ` Feifei Wang
@ 2023-07-05 11:32  0% ` Konstantin Ananyev
  2023-07-13  7:52  0%   ` Ferruh Yigit
  2023-07-28 14:56  3% ` Thomas Monjalon
  2 siblings, 1 reply; 200+ results
From: Konstantin Ananyev @ 2023-07-05 11:32 UTC (permalink / raw)
  To: Feifei Wang; +Cc: dev, nd, Honnappa.Nagarahalli, Ruifeng Wang

04/07/2023 09:10, Feifei Wang пишет:
> To support mbufs recycle mode, announce the coming ABI changes
> from DPDK 23.11.
> 
> Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
> Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
> ---
>   doc/guides/rel_notes/deprecation.rst | 4 ++++
>   1 file changed, 4 insertions(+)
> 
> diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
> index 66431789b0..c7e1ffafb2 100644
> --- a/doc/guides/rel_notes/deprecation.rst
> +++ b/doc/guides/rel_notes/deprecation.rst
> @@ -118,6 +118,10 @@ Deprecation Notices
>     The legacy actions should be removed
>     once ``MODIFY_FIELD`` alternative is implemented in drivers.
>   
> +* ethdev: The Ethernet device data structure ``struct rte_eth_dev`` and
> +  the fast-path ethdev flat array ``struct rte_eth_fp_ops`` will be updated
> +  with new fields to support mbufs recycle mode from DPDK 23.11.
> +
>   * cryptodev: The function ``rte_cryptodev_cb_fn`` will be updated
>     to have another parameter ``qp_id`` to return the queue pair ID
>     which got error interrupt to the application,

Acked-by: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>

^ permalink raw reply	[relevance 0%]

* Re: [PATCH v4 1/4] doc: announce new cpu flag added to rte_cpu_flag_t
    @ 2023-07-05 11:32  0%     ` Konstantin Ananyev
  1 sibling, 0 replies; 200+ results
From: Konstantin Ananyev @ 2023-07-05 11:32 UTC (permalink / raw)
  To: Sivaprasad Tummala, david.hunt; +Cc: dev, david.marchand, ferruh.yigit

18/04/2023 09:25, Sivaprasad Tummala пишет:
> A new flag RTE_CPUFLAG_MONITORX is added to rte_cpu_flag_t in
> DPDK 23.07 release to support monitorx instruction on EPYC processors.
> This results in ABI breakage for legacy apps.
> 
> Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
> ---
>   doc/guides/rel_notes/deprecation.rst | 3 +++
>   1 file changed, 3 insertions(+)
> 
> diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
> index dcc1ca1696..831713983f 100644
> --- a/doc/guides/rel_notes/deprecation.rst
> +++ b/doc/guides/rel_notes/deprecation.rst
> @@ -163,3 +163,6 @@ Deprecation Notices
>     The new port library API (functions rte_swx_port_*)
>     will gradually transition from experimental to stable status
>     starting with DPDK 23.07 release.
> +
> +* eal/x86: The enum ``rte_cpu_flag_t`` will be extended with a new cpu flag
> +  ``RTE_CPUFLAG_MONITORX`` to support monitorx instruction on EPYC processors.

Acked-by: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>

^ permalink raw reply	[relevance 0%]

* [PATCH v2] doc: announce single-event enqueue/dequeue ABI change
  2023-07-05  8:48 13% [PATCH] eventdev: announce single-event enqueue/dequeue ABI change Mattias Rönnblom
@ 2023-07-05 11:12 13% ` Mattias Rönnblom
  2023-07-05 13:00  4%   ` Jerin Jacob
  0 siblings, 1 reply; 200+ results
From: Mattias Rönnblom @ 2023-07-05 11:12 UTC (permalink / raw)
  To: jerinj, Thomas Monjalon
  Cc: Jerin Jacob, hofors, dev, Pavan Nikhilesh, Timothy McDaniel,
	Hemant Agrawal, Sachin Saxena, Harry van Haaren, Liang Ma,
	Peter Mccarthy, Mattias Rönnblom

Announce the removal of the single-event enqueue and dequeue
operations from the eventdev ABI.

Signed-off-by: Mattias Rönnblom <mattias.ronnblom@ericsson.com>

---
PATCH v2: Fix commit subject prefix.
---
 doc/guides/rel_notes/deprecation.rst | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 66431789b0..ca192d838d 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -153,3 +153,11 @@ Deprecation Notices
   The new port library API (functions rte_swx_port_*)
   will gradually transition from experimental to stable status
   starting with DPDK 23.07 release.
+
+* eventdev: The single-event (non-burst) enqueue and dequeue
+  operations, used by static inline burst enqueue and dequeue
+  functions in <rte_eventdev.h>, will be removed in DPDK 23.11. This
+  simplification includes changing the layout and potentially also the
+  size of the public rte_event_fp_ops struct, breaking the ABI. Since
+  these functions are not called directly by the application, the API
+  remains unaffected.
-- 
2.34.1


^ permalink raw reply	[relevance 13%]

* [PATCH] eventdev: announce single-event enqueue/dequeue ABI change
@ 2023-07-05  8:48 13% Mattias Rönnblom
  2023-07-05 11:12 13% ` [PATCH v2] doc: " Mattias Rönnblom
  0 siblings, 1 reply; 200+ results
From: Mattias Rönnblom @ 2023-07-05  8:48 UTC (permalink / raw)
  To: jerinj
  Cc: Jerin Jacob, hofors, dev, Pavan Nikhilesh, Timothy McDaniel,
	Hemant Agrawal, Sachin Saxena, Harry van Haaren, Liang Ma,
	Peter Mccarthy, Mattias Rönnblom

Announce the removal of the single-event enqueue and dequeue
operations from the eventdev ABI.

Signed-off-by: Mattias Rönnblom <mattias.ronnblom@ericsson.com>
---
 doc/guides/rel_notes/deprecation.rst | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 66431789b0..ca192d838d 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -153,3 +153,11 @@ Deprecation Notices
   The new port library API (functions rte_swx_port_*)
   will gradually transition from experimental to stable status
   starting with DPDK 23.07 release.
+
+* eventdev: The single-event (non-burst) enqueue and dequeue
+  operations, used by static inline burst enqueue and dequeue
+  functions in <rte_eventdev.h>, will be removed in DPDK 23.11. This
+  simplification includes changing the layout and potentially also the
+  size of the public rte_event_fp_ops struct, breaking the ABI. Since
+  these functions are not called directly by the application, the API
+  remains unaffected.
-- 
2.34.1


^ permalink raw reply	[relevance 13%]

* Re: [PATCH] eventdev: remove single-event enqueue operation
  2023-07-05  7:47  0%   ` Jerin Jacob
@ 2023-07-05  8:41  0%     ` Mattias Rönnblom
  0 siblings, 0 replies; 200+ results
From: Mattias Rönnblom @ 2023-07-05  8:41 UTC (permalink / raw)
  To: Jerin Jacob, Mattias Rönnblom
  Cc: jerinj, dev, Pavan Nikhilesh, Timothy McDaniel, Hemant Agrawal,
	Sachin Saxena, Harry van Haaren, Liang Ma, Peter Mccarthy

On 2023-07-05 09:47, Jerin Jacob wrote:
> On Tue, Jul 4, 2023 at 5:29 PM Mattias Rönnblom
> <mattias.ronnblom@ericsson.com> wrote:
>>
>> Eliminate non-burst enqueue operation from Eventdev.
>>
>> The effect of this change is to reduce Eventdev code complexity
>> somewhat and slightly improve performance.
>>
>> The single-event enqueue shortcut provided a very minor performance
>> advantage in some situations (e.g., with a compile time-constant burst
>> size of '1'), but would in other situations cause a noticeable
>> performance penalty (e.g., rte_event_enqueue_forward_burst() with run
>> time-variable burst sizes varying between '1' and larger burst sizes).
>>
>> Signed-off-by: Mattias Rönnblom <mattias.ronnblom@ericsson.com>
>>
>> --
>>
>> PATCH: Add ABI deprecation notice.
> 
> 
> Need to split this patch as depreciation notice only will be merged to
> this release.
> Example: https://patches.dpdk.org/project/dpdk/patch/20230704194445.3332847-1-gakhil@marvell.com/
> 
> I think, we need to remove the single dequeue as well. So I think, we
> can write a generic deprecation notice
> which says size of struct rte_event_fp_ops will be changed by removing
> single enqueue, dequeue and.
> Reservation fields size . Later we can analysis the performance impact
> when the implementation patch is ready.
> For now, let make deprecation notice for this release.

OK, sounds good.

The size may be the same, but layout will be different.

^ permalink raw reply	[relevance 0%]

* Re: [PATCH] eventdev: remove single-event enqueue operation
  2023-07-04 11:53  4% ` [PATCH] " Mattias Rönnblom
@ 2023-07-05  7:47  0%   ` Jerin Jacob
  2023-07-05  8:41  0%     ` Mattias Rönnblom
  0 siblings, 1 reply; 200+ results
From: Jerin Jacob @ 2023-07-05  7:47 UTC (permalink / raw)
  To: Mattias Rönnblom
  Cc: jerinj, hofors, dev, Pavan Nikhilesh, Timothy McDaniel,
	Hemant Agrawal, Sachin Saxena, Harry van Haaren, Liang Ma,
	Peter Mccarthy

On Tue, Jul 4, 2023 at 5:29 PM Mattias Rönnblom
<mattias.ronnblom@ericsson.com> wrote:
>
> Eliminate non-burst enqueue operation from Eventdev.
>
> The effect of this change is to reduce Eventdev code complexity
> somewhat and slightly improve performance.
>
> The single-event enqueue shortcut provided a very minor performance
> advantage in some situations (e.g., with a compile time-constant burst
> size of '1'), but would in other situations cause a noticeable
> performance penalty (e.g., rte_event_enqueue_forward_burst() with run
> time-variable burst sizes varying between '1' and larger burst sizes).
>
> Signed-off-by: Mattias Rönnblom <mattias.ronnblom@ericsson.com>
>
> --
>
> PATCH: Add ABI deprecation notice.


Need to split this patch as depreciation notice only will be merged to
this release.
Example: https://patches.dpdk.org/project/dpdk/patch/20230704194445.3332847-1-gakhil@marvell.com/

I think, we need to remove the single dequeue as well. So I think, we
can write a generic deprecation notice
which says size of struct rte_event_fp_ops will be changed by removing
single enqueue, dequeue and.
Reservation fields size . Later we can analysis the performance impact
when the implementation patch is ready.
For now, let make deprecation notice for this release.

^ permalink raw reply	[relevance 0%]

* Re: [RFC] eventdev: remove single-event enqueue operation
  2023-06-30  4:37  3% ` Jerin Jacob
@ 2023-07-04 12:01  0%   ` Mattias Rönnblom
  0 siblings, 0 replies; 200+ results
From: Mattias Rönnblom @ 2023-07-04 12:01 UTC (permalink / raw)
  To: Jerin Jacob, Mattias Rönnblom
  Cc: jerinj, dev, Pavan Nikhilesh, Timothy McDaniel, Hemant Agrawal,
	Sachin Saxena, Harry van Haaren, Liang Ma, Peter Mccarthy

On 2023-06-30 06:37, Jerin Jacob wrote:
> On Fri, Jun 9, 2023 at 11:18 PM Mattias Rönnblom
> <mattias.ronnblom@ericsson.com> wrote:
>>
>> Eliminate non-burst enqueue operation from Eventdev.
>>
>> The effect of this change is to reduce Eventdev code complexity
>> somewhat and slightly improve performance.
>>
>> The single-event enqueue shortcut provided a very minor performance
>> advantage in some situations (e.g., with a compile time-constant burst
>> size of '1'), but would in other situations cause a noticeable
>> performance penalty (e.g., rte_event_enqueue_forward_burst() with run
>> time-variable burst sizes varying between '1' and larger burst sizes).
>>
>> Signed-off-by: Mattias Rönnblom <mattias.ronnblom@ericsson.com>
> 
>>
>> -typedef uint16_t (*event_enqueue_t)(void *port, const struct rte_event *ev);
>> -/**< @internal Enqueue event on port of a device */
>> -
>>   typedef uint16_t (*event_enqueue_burst_t)(void *port,
>>                                            const struct rte_event ev[],
>>                                            uint16_t nb_events);
>> @@ -45,8 +42,6 @@ typedef uint16_t (*event_crypto_adapter_enqueue_t)(void *port,
>>   struct rte_event_fp_ops {
>>          void **data;
>>          /**< points to array of internal port data pointers */
>> -       event_enqueue_t enqueue;
>> -       /**< PMD enqueue function. */
> 
> Can we remove "dequeue" as well?

Seems likely, but I have no data on that option.

> In any event, Please send a deprecation notice as it is an ABI change,
> and we need to get merge the deprecation notice patch for v23.07.
> I can review the deprecation notice patch quickly as soon as you send
> it to make forward progress.
> 

OK.

> 
>>          event_enqueue_burst_t enqueue_burst;
>>          /**< PMD enqueue burst function. */
>>          event_enqueue_burst_t enqueue_new_burst;
>> @@ -65,7 +60,7 @@ struct rte_event_fp_ops {
>>          /**< PMD Tx adapter enqueue same destination function. */
>>          event_crypto_adapter_enqueue_t ca_enqueue;
>>          /**< PMD Crypto adapter enqueue function. */
>> -       uintptr_t reserved[6];
>> +       uintptr_t reserved[7];
>>   } __rte_cache_aligned;
>>

^ permalink raw reply	[relevance 0%]

* [PATCH] eventdev: remove single-event enqueue operation
    2023-06-30  4:37  3% ` Jerin Jacob
@ 2023-07-04 11:53  4% ` Mattias Rönnblom
  2023-07-05  7:47  0%   ` Jerin Jacob
  1 sibling, 1 reply; 200+ results
From: Mattias Rönnblom @ 2023-07-04 11:53 UTC (permalink / raw)
  To: jerinj
  Cc: Jerin Jacob, hofors, dev, Pavan Nikhilesh, Timothy McDaniel,
	Hemant Agrawal, Sachin Saxena, Harry van Haaren, Liang Ma,
	Peter Mccarthy, Mattias Rönnblom

Eliminate non-burst enqueue operation from Eventdev.

The effect of this change is to reduce Eventdev code complexity
somewhat and slightly improve performance.

The single-event enqueue shortcut provided a very minor performance
advantage in some situations (e.g., with a compile time-constant burst
size of '1'), but would in other situations cause a noticeable
performance penalty (e.g., rte_event_enqueue_forward_burst() with run
time-variable burst sizes varying between '1' and larger burst sizes).

Signed-off-by: Mattias Rönnblom <mattias.ronnblom@ericsson.com>

--

PATCH: Add ABI deprecation notice.
---
 doc/guides/rel_notes/deprecation.rst       |  4 ++
 drivers/event/cnxk/cn10k_eventdev.c        |  1 -
 drivers/event/cnxk/cn10k_worker.c          | 49 ++++++++++------------
 drivers/event/cnxk/cn10k_worker.h          |  1 -
 drivers/event/cnxk/cn9k_eventdev.c         |  2 -
 drivers/event/cnxk/cn9k_worker.c           | 27 ++++--------
 drivers/event/cnxk/cn9k_worker.h           |  1 -
 drivers/event/dlb2/dlb2.c                  | 13 ------
 drivers/event/dpaa/dpaa_eventdev.c         |  7 ----
 drivers/event/dpaa2/dpaa2_eventdev.c       |  7 ----
 drivers/event/dsw/dsw_evdev.c              |  1 -
 drivers/event/dsw/dsw_evdev.h              |  1 -
 drivers/event/dsw/dsw_event.c              |  6 ---
 drivers/event/octeontx/ssovf_worker.c      | 14 ++-----
 drivers/event/opdl/opdl_evdev.c            | 13 ------
 drivers/event/opdl/opdl_evdev.h            |  1 -
 drivers/event/skeleton/skeleton_eventdev.c | 14 -------
 drivers/event/sw/sw_evdev.c                |  1 -
 drivers/event/sw/sw_evdev.h                |  1 -
 drivers/event/sw/sw_evdev_worker.c         |  6 ---
 lib/eventdev/eventdev_pmd.h                |  2 -
 lib/eventdev/eventdev_private.c            | 11 -----
 lib/eventdev/rte_eventdev.h                | 10 +----
 lib/eventdev/rte_eventdev_core.h           |  7 +---
 24 files changed, 42 insertions(+), 158 deletions(-)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 66431789b0..badf011ab2 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -153,3 +153,7 @@ Deprecation Notices
   The new port library API (functions rte_swx_port_*)
   will gradually transition from experimental to stable status
   starting with DPDK 23.07 release.
+
+* eventdev: The single-event enqueue operation, used by static inline
+  burst-enqueue functions in <rte_eventdev.h>, has been removed,
+  breaking the ABI. The API remains unaffected.
diff --git a/drivers/event/cnxk/cn10k_eventdev.c b/drivers/event/cnxk/cn10k_eventdev.c
index 499a3aace7..51b2345269 100644
--- a/drivers/event/cnxk/cn10k_eventdev.c
+++ b/drivers/event/cnxk/cn10k_eventdev.c
@@ -412,7 +412,6 @@ cn10k_sso_fp_fns_set(struct rte_eventdev *event_dev)
 #undef T
 	};
 
-	event_dev->enqueue = cn10k_sso_hws_enq;
 	event_dev->enqueue_burst = cn10k_sso_hws_enq_burst;
 	event_dev->enqueue_new_burst = cn10k_sso_hws_enq_new_burst;
 	event_dev->enqueue_forward_burst = cn10k_sso_hws_enq_fwd_burst;
diff --git a/drivers/event/cnxk/cn10k_worker.c b/drivers/event/cnxk/cn10k_worker.c
index 9b5bf90159..62dd8e5c5d 100644
--- a/drivers/event/cnxk/cn10k_worker.c
+++ b/drivers/event/cnxk/cn10k_worker.c
@@ -107,32 +107,6 @@ sso_lmt_aw_wait_fc(struct cn10k_sso_hws *ws, int64_t req)
 	}
 }
 
-uint16_t __rte_hot
-cn10k_sso_hws_enq(void *port, const struct rte_event *ev)
-{
-	struct cn10k_sso_hws *ws = port;
-
-	switch (ev->op) {
-	case RTE_EVENT_OP_NEW:
-		return cn10k_sso_hws_new_event(ws, ev);
-	case RTE_EVENT_OP_FORWARD:
-		cn10k_sso_hws_forward_event(ws, ev);
-		break;
-	case RTE_EVENT_OP_RELEASE:
-		if (ws->swtag_req) {
-			cnxk_sso_hws_desched(ev->u64, ws->base);
-			ws->swtag_req = 0;
-			break;
-		}
-		cnxk_sso_hws_swtag_flush(ws->base);
-		break;
-	default:
-		return 0;
-	}
-
-	return 1;
-}
-
 #define VECTOR_SIZE_BITS	     0xFFFFFFFFFFF80000ULL
 #define VECTOR_GET_LINE_OFFSET(line) (19 + (3 * line))
 
@@ -384,8 +358,29 @@ uint16_t __rte_hot
 cn10k_sso_hws_enq_burst(void *port, const struct rte_event ev[],
 			uint16_t nb_events)
 {
+	struct cn10k_sso_hws *ws = port;
+
 	RTE_SET_USED(nb_events);
-	return cn10k_sso_hws_enq(port, ev);
+
+	switch (ev->op) {
+	case RTE_EVENT_OP_NEW:
+		return cn10k_sso_hws_new_event(ws, ev);
+	case RTE_EVENT_OP_FORWARD:
+		cn10k_sso_hws_forward_event(ws, ev);
+		break;
+	case RTE_EVENT_OP_RELEASE:
+		if (ws->swtag_req) {
+			cnxk_sso_hws_desched(ev->u64, ws->base);
+			ws->swtag_req = 0;
+			break;
+		}
+		cnxk_sso_hws_swtag_flush(ws->base);
+		break;
+	default:
+		return 0;
+	}
+
+	return 1;
 }
 
 uint16_t __rte_hot
diff --git a/drivers/event/cnxk/cn10k_worker.h b/drivers/event/cnxk/cn10k_worker.h
index b4ee023723..c0db92f3a8 100644
--- a/drivers/event/cnxk/cn10k_worker.h
+++ b/drivers/event/cnxk/cn10k_worker.h
@@ -306,7 +306,6 @@ cn10k_sso_hws_get_work_empty(struct cn10k_sso_hws *ws, struct rte_event *ev,
 }
 
 /* CN10K Fastpath functions. */
-uint16_t __rte_hot cn10k_sso_hws_enq(void *port, const struct rte_event *ev);
 uint16_t __rte_hot cn10k_sso_hws_enq_burst(void *port,
 					   const struct rte_event ev[],
 					   uint16_t nb_events);
diff --git a/drivers/event/cnxk/cn9k_eventdev.c b/drivers/event/cnxk/cn9k_eventdev.c
index 6cce5477f0..fb967635af 100644
--- a/drivers/event/cnxk/cn9k_eventdev.c
+++ b/drivers/event/cnxk/cn9k_eventdev.c
@@ -434,7 +434,6 @@ cn9k_sso_fp_fns_set(struct rte_eventdev *event_dev)
 #undef T
 	};
 
-	event_dev->enqueue = cn9k_sso_hws_enq;
 	event_dev->enqueue_burst = cn9k_sso_hws_enq_burst;
 	event_dev->enqueue_new_burst = cn9k_sso_hws_enq_new_burst;
 	event_dev->enqueue_forward_burst = cn9k_sso_hws_enq_fwd_burst;
@@ -469,7 +468,6 @@ cn9k_sso_fp_fns_set(struct rte_eventdev *event_dev)
 				      sso_hws_tx_adptr_enq);
 
 	if (dev->dual_ws) {
-		event_dev->enqueue = cn9k_sso_hws_dual_enq;
 		event_dev->enqueue_burst = cn9k_sso_hws_dual_enq_burst;
 		event_dev->enqueue_new_burst = cn9k_sso_hws_dual_enq_new_burst;
 		event_dev->enqueue_forward_burst =
diff --git a/drivers/event/cnxk/cn9k_worker.c b/drivers/event/cnxk/cn9k_worker.c
index abbbfffd85..fa5924e113 100644
--- a/drivers/event/cnxk/cn9k_worker.c
+++ b/drivers/event/cnxk/cn9k_worker.c
@@ -8,10 +8,13 @@
 #include "cn9k_cryptodev_ops.h"
 
 uint16_t __rte_hot
-cn9k_sso_hws_enq(void *port, const struct rte_event *ev)
+cn9k_sso_hws_enq_burst(void *port, const struct rte_event ev[],
+		       uint16_t nb_events)
 {
 	struct cn9k_sso_hws *ws = port;
 
+	RTE_SET_USED(nb_events);
+
 	switch (ev->op) {
 	case RTE_EVENT_OP_NEW:
 		return cn9k_sso_hws_new_event(ws, ev);
@@ -33,14 +36,6 @@ cn9k_sso_hws_enq(void *port, const struct rte_event *ev)
 	return 1;
 }
 
-uint16_t __rte_hot
-cn9k_sso_hws_enq_burst(void *port, const struct rte_event ev[],
-		       uint16_t nb_events)
-{
-	RTE_SET_USED(nb_events);
-	return cn9k_sso_hws_enq(port, ev);
-}
-
 uint16_t __rte_hot
 cn9k_sso_hws_enq_new_burst(void *port, const struct rte_event ev[],
 			   uint16_t nb_events)
@@ -66,14 +61,18 @@ cn9k_sso_hws_enq_fwd_burst(void *port, const struct rte_event ev[],
 	return 1;
 }
 
+
 /* Dual ws ops. */
 
 uint16_t __rte_hot
-cn9k_sso_hws_dual_enq(void *port, const struct rte_event *ev)
+cn9k_sso_hws_dual_enq_burst(void *port, const struct rte_event ev[],
+			    uint16_t nb_events)
 {
 	struct cn9k_sso_hws_dual *dws = port;
 	uint64_t base;
 
+	RTE_SET_USED(nb_events);
+
 	base = dws->base[!dws->vws];
 	switch (ev->op) {
 	case RTE_EVENT_OP_NEW:
@@ -96,14 +95,6 @@ cn9k_sso_hws_dual_enq(void *port, const struct rte_event *ev)
 	return 1;
 }
 
-uint16_t __rte_hot
-cn9k_sso_hws_dual_enq_burst(void *port, const struct rte_event ev[],
-			    uint16_t nb_events)
-{
-	RTE_SET_USED(nb_events);
-	return cn9k_sso_hws_dual_enq(port, ev);
-}
-
 uint16_t __rte_hot
 cn9k_sso_hws_dual_enq_new_burst(void *port, const struct rte_event ev[],
 				uint16_t nb_events)
diff --git a/drivers/event/cnxk/cn9k_worker.h b/drivers/event/cnxk/cn9k_worker.h
index 9ddab095ac..12426d58bc 100644
--- a/drivers/event/cnxk/cn9k_worker.h
+++ b/drivers/event/cnxk/cn9k_worker.h
@@ -365,7 +365,6 @@ cn9k_sso_hws_get_work_empty(uint64_t base, struct rte_event *ev,
 }
 
 /* CN9K Fastpath functions. */
-uint16_t __rte_hot cn9k_sso_hws_enq(void *port, const struct rte_event *ev);
 uint16_t __rte_hot cn9k_sso_hws_enq_burst(void *port,
 					  const struct rte_event ev[],
 					  uint16_t nb_events);
diff --git a/drivers/event/dlb2/dlb2.c b/drivers/event/dlb2/dlb2.c
index 60c5cd4804..e7fe0ba576 100644
--- a/drivers/event/dlb2/dlb2.c
+++ b/drivers/event/dlb2/dlb2.c
@@ -1502,10 +1502,6 @@ dlb2_init_qe_mem(struct dlb2_port *qm_port, char *mz_name)
 	return ret;
 }
 
-static inline uint16_t
-dlb2_event_enqueue_delayed(void *event_port,
-			   const struct rte_event events[]);
-
 static inline uint16_t
 dlb2_event_enqueue_burst_delayed(void *event_port,
 				 const struct rte_event events[],
@@ -1697,7 +1693,6 @@ dlb2_hw_create_ldb_port(struct dlb2_eventdev *dlb2,
 	 * performance reasons.
 	 */
 	if (qm_port->token_pop_mode == DELAYED_POP) {
-		dlb2->event_dev->enqueue = dlb2_event_enqueue_delayed;
 		dlb2->event_dev->enqueue_burst =
 			dlb2_event_enqueue_burst_delayed;
 		dlb2->event_dev->enqueue_new_burst =
@@ -3141,13 +3136,6 @@ dlb2_event_enqueue_burst_delayed(void *event_port,
 	return __dlb2_event_enqueue_burst(event_port, events, num, true);
 }
 
-static inline uint16_t
-dlb2_event_enqueue(void *event_port,
-		   const struct rte_event events[])
-{
-	return __dlb2_event_enqueue_burst(event_port, events, 1, false);
-}
-
 static inline uint16_t
 dlb2_event_enqueue_delayed(void *event_port,
 			   const struct rte_event events[])
@@ -4585,7 +4573,6 @@ dlb2_entry_points_init(struct rte_eventdev *dev)
 	/* Expose PMD's eventdev interface */
 
 	dev->dev_ops = &dlb2_eventdev_entry_ops;
-	dev->enqueue = dlb2_event_enqueue;
 	dev->enqueue_burst = dlb2_event_enqueue_burst;
 	dev->enqueue_new_burst = dlb2_event_enqueue_new_burst;
 	dev->enqueue_forward_burst = dlb2_event_enqueue_forward_burst;
diff --git a/drivers/event/dpaa/dpaa_eventdev.c b/drivers/event/dpaa/dpaa_eventdev.c
index 4b3d16735b..8809f2ecd9 100644
--- a/drivers/event/dpaa/dpaa_eventdev.c
+++ b/drivers/event/dpaa/dpaa_eventdev.c
@@ -112,12 +112,6 @@ dpaa_event_enqueue_burst(void *port, const struct rte_event ev[],
 	return nb_events;
 }
 
-static uint16_t
-dpaa_event_enqueue(void *port, const struct rte_event *ev)
-{
-	return dpaa_event_enqueue_burst(port, ev, 1);
-}
-
 static void drain_4_bytes(int fd, fd_set *fdset)
 {
 	if (FD_ISSET(fd, fdset)) {
@@ -1008,7 +1002,6 @@ dpaa_event_dev_create(const char *name, const char *params)
 	priv = eventdev->data->dev_private;
 
 	eventdev->dev_ops       = &dpaa_eventdev_ops;
-	eventdev->enqueue       = dpaa_event_enqueue;
 	eventdev->enqueue_burst = dpaa_event_enqueue_burst;
 
 	if (dpaa_event_check_flags(params)) {
diff --git a/drivers/event/dpaa2/dpaa2_eventdev.c b/drivers/event/dpaa2/dpaa2_eventdev.c
index fa1a1ade80..de08fa1b78 100644
--- a/drivers/event/dpaa2/dpaa2_eventdev.c
+++ b/drivers/event/dpaa2/dpaa2_eventdev.c
@@ -202,12 +202,6 @@ dpaa2_eventdev_enqueue_burst(void *port, const struct rte_event ev[],
 
 }
 
-static uint16_t
-dpaa2_eventdev_enqueue(void *port, const struct rte_event *ev)
-{
-	return dpaa2_eventdev_enqueue_burst(port, ev, 1);
-}
-
 static void dpaa2_eventdev_dequeue_wait(uint64_t timeout_ticks)
 {
 	struct epoll_event epoll_ev;
@@ -1103,7 +1097,6 @@ dpaa2_eventdev_create(const char *name)
 	}
 
 	eventdev->dev_ops       = &dpaa2_eventdev_ops;
-	eventdev->enqueue       = dpaa2_eventdev_enqueue;
 	eventdev->enqueue_burst = dpaa2_eventdev_enqueue_burst;
 	eventdev->enqueue_new_burst = dpaa2_eventdev_enqueue_burst;
 	eventdev->enqueue_forward_burst = dpaa2_eventdev_enqueue_burst;
diff --git a/drivers/event/dsw/dsw_evdev.c b/drivers/event/dsw/dsw_evdev.c
index 6c5cde2468..f3bcacfaf8 100644
--- a/drivers/event/dsw/dsw_evdev.c
+++ b/drivers/event/dsw/dsw_evdev.c
@@ -439,7 +439,6 @@ dsw_probe(struct rte_vdev_device *vdev)
 		return -EFAULT;
 
 	dev->dev_ops = &dsw_evdev_ops;
-	dev->enqueue = dsw_event_enqueue;
 	dev->enqueue_burst = dsw_event_enqueue_burst;
 	dev->enqueue_new_burst = dsw_event_enqueue_new_burst;
 	dev->enqueue_forward_burst = dsw_event_enqueue_forward_burst;
diff --git a/drivers/event/dsw/dsw_evdev.h b/drivers/event/dsw/dsw_evdev.h
index 6416a8a898..ca5d4714b0 100644
--- a/drivers/event/dsw/dsw_evdev.h
+++ b/drivers/event/dsw/dsw_evdev.h
@@ -263,7 +263,6 @@ struct dsw_ctl_msg {
 	struct dsw_queue_flow qfs[DSW_MAX_FLOWS_PER_MIGRATION];
 } __rte_aligned(4);
 
-uint16_t dsw_event_enqueue(void *port, const struct rte_event *event);
 uint16_t dsw_event_enqueue_burst(void *port,
 				 const struct rte_event events[],
 				 uint16_t events_len);
diff --git a/drivers/event/dsw/dsw_event.c b/drivers/event/dsw/dsw_event.c
index 93bbeead2e..1a4ea6629c 100644
--- a/drivers/event/dsw/dsw_event.c
+++ b/drivers/event/dsw/dsw_event.c
@@ -1242,12 +1242,6 @@ dsw_port_flush_out_buffers(struct dsw_evdev *dsw, struct dsw_port *source_port)
 		dsw_port_transmit_buffered(dsw, source_port, dest_port_id);
 }
 
-uint16_t
-dsw_event_enqueue(void *port, const struct rte_event *ev)
-{
-	return dsw_event_enqueue_burst(port, ev, unlikely(ev == NULL) ? 0 : 1);
-}
-
 static __rte_always_inline uint16_t
 dsw_event_enqueue_burst_generic(struct dsw_port *source_port,
 				const struct rte_event events[],
diff --git a/drivers/event/octeontx/ssovf_worker.c b/drivers/event/octeontx/ssovf_worker.c
index 36454939ea..2b0e255499 100644
--- a/drivers/event/octeontx/ssovf_worker.c
+++ b/drivers/event/octeontx/ssovf_worker.c
@@ -148,12 +148,14 @@ ssows_deq_timeout_burst_ ##name(void *port, struct rte_event ev[],	     \
 SSO_RX_ADPTR_ENQ_FASTPATH_FUNC
 #undef R
 
-__rte_always_inline uint16_t __rte_hot
-ssows_enq(void *port, const struct rte_event *ev)
+uint16_t __rte_hot
+ssows_enq_burst(void *port, const struct rte_event ev[], uint16_t nb_events)
 {
 	struct ssows *ws = port;
 	uint16_t ret = 1;
 
+	RTE_SET_USED(nb_events);
+
 	switch (ev->op) {
 	case RTE_EVENT_OP_NEW:
 		rte_smp_wmb();
@@ -171,13 +173,6 @@ ssows_enq(void *port, const struct rte_event *ev)
 	return ret;
 }
 
-uint16_t __rte_hot
-ssows_enq_burst(void *port, const struct rte_event ev[], uint16_t nb_events)
-{
-	RTE_SET_USED(nb_events);
-	return ssows_enq(port, ev);
-}
-
 uint16_t __rte_hot
 ssows_enq_new_burst(void *port, const struct rte_event ev[], uint16_t nb_events)
 {
@@ -336,7 +331,6 @@ ssovf_fastpath_fns_set(struct rte_eventdev *dev)
 {
 	struct ssovf_evdev *edev = ssovf_pmd_priv(dev);
 
-	dev->enqueue       = ssows_enq;
 	dev->enqueue_burst = ssows_enq_burst;
 	dev->enqueue_new_burst = ssows_enq_new_burst;
 	dev->enqueue_forward_burst = ssows_enq_fwd_burst;
diff --git a/drivers/event/opdl/opdl_evdev.c b/drivers/event/opdl/opdl_evdev.c
index 9ce8b39b60..6bde153514 100644
--- a/drivers/event/opdl/opdl_evdev.c
+++ b/drivers/event/opdl/opdl_evdev.c
@@ -41,18 +41,6 @@ opdl_event_enqueue_burst(void *port,
 	return p->enq(p, ev, num);
 }
 
-uint16_t
-opdl_event_enqueue(void *port, const struct rte_event *ev)
-{
-	struct opdl_port *p = port;
-
-	if (unlikely(!p->opdl->data->dev_started))
-		return 0;
-
-
-	return p->enq(p, ev, 1);
-}
-
 uint16_t
 opdl_event_dequeue_burst(void *port,
 			 struct rte_event *ev,
@@ -714,7 +702,6 @@ opdl_probe(struct rte_vdev_device *vdev)
 
 	dev->dev_ops = &evdev_opdl_ops;
 
-	dev->enqueue = opdl_event_enqueue;
 	dev->enqueue_burst = opdl_event_enqueue_burst;
 	dev->enqueue_new_burst = opdl_event_enqueue_burst;
 	dev->enqueue_forward_burst = opdl_event_enqueue_burst;
diff --git a/drivers/event/opdl/opdl_evdev.h b/drivers/event/opdl/opdl_evdev.h
index 1ca166b37c..1bf862cfff 100644
--- a/drivers/event/opdl/opdl_evdev.h
+++ b/drivers/event/opdl/opdl_evdev.h
@@ -275,7 +275,6 @@ opdl_pmd_priv_const(const struct rte_eventdev *eventdev)
 	return eventdev->data->dev_private;
 }
 
-uint16_t opdl_event_enqueue(void *port, const struct rte_event *ev);
 uint16_t opdl_event_enqueue_burst(void *port, const struct rte_event ev[],
 		uint16_t num);
 
diff --git a/drivers/event/skeleton/skeleton_eventdev.c b/drivers/event/skeleton/skeleton_eventdev.c
index 8513b9a013..b31c902d42 100644
--- a/drivers/event/skeleton/skeleton_eventdev.c
+++ b/drivers/event/skeleton/skeleton_eventdev.c
@@ -25,18 +25,6 @@
 #define EVENTDEV_NAME_SKELETON_PMD event_skeleton
 /**< Skeleton event device PMD name */
 
-static uint16_t
-skeleton_eventdev_enqueue(void *port, const struct rte_event *ev)
-{
-	struct skeleton_port *sp = port;
-
-	RTE_SET_USED(sp);
-	RTE_SET_USED(ev);
-	RTE_SET_USED(port);
-
-	return 0;
-}
-
 static uint16_t
 skeleton_eventdev_enqueue_burst(void *port, const struct rte_event ev[],
 			uint16_t nb_events)
@@ -349,7 +337,6 @@ skeleton_eventdev_init(struct rte_eventdev *eventdev)
 	PMD_DRV_FUNC_TRACE();
 
 	eventdev->dev_ops       = &skeleton_eventdev_ops;
-	eventdev->enqueue       = skeleton_eventdev_enqueue;
 	eventdev->enqueue_burst = skeleton_eventdev_enqueue_burst;
 	eventdev->dequeue       = skeleton_eventdev_dequeue;
 	eventdev->dequeue_burst = skeleton_eventdev_dequeue_burst;
@@ -439,7 +426,6 @@ skeleton_eventdev_create(const char *name, int socket_id)
 	}
 
 	eventdev->dev_ops       = &skeleton_eventdev_ops;
-	eventdev->enqueue       = skeleton_eventdev_enqueue;
 	eventdev->enqueue_burst = skeleton_eventdev_enqueue_burst;
 	eventdev->dequeue       = skeleton_eventdev_dequeue;
 	eventdev->dequeue_burst = skeleton_eventdev_dequeue_burst;
diff --git a/drivers/event/sw/sw_evdev.c b/drivers/event/sw/sw_evdev.c
index cfd659d774..7655505b7c 100644
--- a/drivers/event/sw/sw_evdev.c
+++ b/drivers/event/sw/sw_evdev.c
@@ -1080,7 +1080,6 @@ sw_probe(struct rte_vdev_device *vdev)
 		return -EFAULT;
 	}
 	dev->dev_ops = &evdev_sw_ops;
-	dev->enqueue = sw_event_enqueue;
 	dev->enqueue_burst = sw_event_enqueue_burst;
 	dev->enqueue_new_burst = sw_event_enqueue_burst;
 	dev->enqueue_forward_burst = sw_event_enqueue_burst;
diff --git a/drivers/event/sw/sw_evdev.h b/drivers/event/sw/sw_evdev.h
index c7b943a72b..110724d52d 100644
--- a/drivers/event/sw/sw_evdev.h
+++ b/drivers/event/sw/sw_evdev.h
@@ -288,7 +288,6 @@ sw_pmd_priv_const(const struct rte_eventdev *eventdev)
 	return eventdev->data->dev_private;
 }
 
-uint16_t sw_event_enqueue(void *port, const struct rte_event *ev);
 uint16_t sw_event_enqueue_burst(void *port, const struct rte_event ev[],
 		uint16_t num);
 
diff --git a/drivers/event/sw/sw_evdev_worker.c b/drivers/event/sw/sw_evdev_worker.c
index 063b919c7e..f041bae2a0 100644
--- a/drivers/event/sw/sw_evdev_worker.c
+++ b/drivers/event/sw/sw_evdev_worker.c
@@ -131,12 +131,6 @@ sw_event_enqueue_burst(void *port, const struct rte_event ev[], uint16_t num)
 	return enq;
 }
 
-uint16_t
-sw_event_enqueue(void *port, const struct rte_event *ev)
-{
-	return sw_event_enqueue_burst(port, ev, 1);
-}
-
 uint16_t
 sw_event_dequeue_burst(void *port, struct rte_event *ev, uint16_t num,
 		uint64_t wait)
diff --git a/lib/eventdev/eventdev_pmd.h b/lib/eventdev/eventdev_pmd.h
index c68c3a2262..fab0bf501b 100644
--- a/lib/eventdev/eventdev_pmd.h
+++ b/lib/eventdev/eventdev_pmd.h
@@ -159,8 +159,6 @@ struct rte_eventdev {
 	uint8_t attached : 1;
 	/**< Flag indicating the device is attached */
 
-	event_enqueue_t enqueue;
-	/**< Pointer to PMD enqueue function. */
 	event_enqueue_burst_t enqueue_burst;
 	/**< Pointer to PMD enqueue burst function. */
 	event_enqueue_burst_t enqueue_new_burst;
diff --git a/lib/eventdev/eventdev_private.c b/lib/eventdev/eventdev_private.c
index 1d3d9d357e..4c998669c8 100644
--- a/lib/eventdev/eventdev_private.c
+++ b/lib/eventdev/eventdev_private.c
@@ -5,15 +5,6 @@
 #include "eventdev_pmd.h"
 #include "rte_eventdev.h"
 
-static uint16_t
-dummy_event_enqueue(__rte_unused void *port,
-		    __rte_unused const struct rte_event *ev)
-{
-	RTE_EDEV_LOG_ERR(
-		"event enqueue requested for unconfigured event device");
-	return 0;
-}
-
 static uint16_t
 dummy_event_enqueue_burst(__rte_unused void *port,
 			  __rte_unused const struct rte_event ev[],
@@ -86,7 +77,6 @@ event_dev_fp_ops_reset(struct rte_event_fp_ops *fp_op)
 {
 	static void *dummy_data[RTE_MAX_QUEUES_PER_PORT];
 	static const struct rte_event_fp_ops dummy = {
-		.enqueue = dummy_event_enqueue,
 		.enqueue_burst = dummy_event_enqueue_burst,
 		.enqueue_new_burst = dummy_event_enqueue_burst,
 		.enqueue_forward_burst = dummy_event_enqueue_burst,
@@ -107,7 +97,6 @@ void
 event_dev_fp_ops_set(struct rte_event_fp_ops *fp_op,
 		     const struct rte_eventdev *dev)
 {
-	fp_op->enqueue = dev->enqueue;
 	fp_op->enqueue_burst = dev->enqueue_burst;
 	fp_op->enqueue_new_burst = dev->enqueue_new_burst;
 	fp_op->enqueue_forward_burst = dev->enqueue_forward_burst;
diff --git a/lib/eventdev/rte_eventdev.h b/lib/eventdev/rte_eventdev.h
index b6a4fa1495..2461d002da 100644
--- a/lib/eventdev/rte_eventdev.h
+++ b/lib/eventdev/rte_eventdev.h
@@ -1929,14 +1929,8 @@ __rte_event_enqueue_burst(uint8_t dev_id, uint8_t port_id,
 	}
 #endif
 	rte_eventdev_trace_enq_burst(dev_id, port_id, ev, nb_events, (void *)fn);
-	/*
-	 * Allow zero cost non burst mode routine invocation if application
-	 * requests nb_events as const one
-	 */
-	if (nb_events == 1)
-		return (fp_ops->enqueue)(port, ev);
-	else
-		return fn(port, ev, nb_events);
+
+	return fn(port, ev, nb_events);
 }
 
 /**
diff --git a/lib/eventdev/rte_eventdev_core.h b/lib/eventdev/rte_eventdev_core.h
index c328bdbc82..5bc3e645b9 100644
--- a/lib/eventdev/rte_eventdev_core.h
+++ b/lib/eventdev/rte_eventdev_core.h
@@ -12,9 +12,6 @@
 extern "C" {
 #endif
 
-typedef uint16_t (*event_enqueue_t)(void *port, const struct rte_event *ev);
-/**< @internal Enqueue event on port of a device */
-
 typedef uint16_t (*event_enqueue_burst_t)(void *port,
 					  const struct rte_event ev[],
 					  uint16_t nb_events);
@@ -45,8 +42,6 @@ typedef uint16_t (*event_crypto_adapter_enqueue_t)(void *port,
 struct rte_event_fp_ops {
 	void **data;
 	/**< points to array of internal port data pointers */
-	event_enqueue_t enqueue;
-	/**< PMD enqueue function. */
 	event_enqueue_burst_t enqueue_burst;
 	/**< PMD enqueue burst function. */
 	event_enqueue_burst_t enqueue_new_burst;
@@ -65,7 +60,7 @@ struct rte_event_fp_ops {
 	/**< PMD Tx adapter enqueue same destination function. */
 	event_crypto_adapter_enqueue_t ca_enqueue;
 	/**< PMD Crypto adapter enqueue function. */
-	uintptr_t reserved[6];
+	uintptr_t reserved[7];
 } __rte_cache_aligned;
 
 extern struct rte_event_fp_ops rte_event_fp_ops[RTE_EVENT_MAX_DEVS];
-- 
2.34.1


^ permalink raw reply	[relevance 4%]

* [PATCH v7 0/3] add telemetry cmds for ring
    2023-05-30  9:27  0%   ` Jie Hai
@ 2023-07-04  9:04  3%   ` Jie Hai
  2023-07-04  9:04  3%     ` [PATCH v7 1/3] ring: fix unmatched type definition and usage Jie Hai
  1 sibling, 1 reply; 200+ results
From: Jie Hai @ 2023-07-04  9:04 UTC (permalink / raw)
  Cc: haijie1, dev, liudongdong3

This patch set supports telemetry cmd to list rings and dump information
of a ring by its name.

v1->v2:
1. Add space after "switch".
2. Fix wrong strlen parameter.

v2->v3:
1. Remove prefix "rte_" for static function.
2. Add Acked-by Konstantin Ananyev for PATCH 1.
3. Introduce functions to return strings instead copy strings.
4. Check pointer to memzone of ring.
5. Remove redundant variable.
6. Hold lock when access ring data.

v3->v4:
1. Update changelog according to reviews of Honnappa Nagarahalli.
2. Add Reviewed-by Honnappa Nagarahalli.
3. Correct grammar in help information.
4. Correct spell warning on "te" reported by checkpatch.pl.
5. Use ring_walk() to query ring info instead of rte_ring_lookup().
6. Fix that type definition the flag field of rte_ring does not match the usage.
7. Use rte_tel_data_add_dict_uint_hex instead of rte_tel_data_add_dict_u64
   for mask and flags.

v4->v5:
1. Add Acked-by Konstantin Ananyev and Chengwen Feng.
2. Add ABI change explanation for commit message of patch 1/3.

v5->v6:
1. Add Acked-by Morten Brørup.
2. Fix incorrect reference of commit.

v6->v7:
1. Remove prod/consumer head/tail info.

Jie Hai (3):
  ring: fix unmatched type definition and usage
  ring: add telemetry cmd to list rings
  ring: add telemetry cmd for ring info

 lib/ring/meson.build     |   1 +
 lib/ring/rte_ring.c      | 135 +++++++++++++++++++++++++++++++++++++++
 lib/ring/rte_ring_core.h |   2 +-
 3 files changed, 137 insertions(+), 1 deletion(-)

-- 
2.33.0


^ permalink raw reply	[relevance 3%]

* [PATCH v7 1/3] ring: fix unmatched type definition and usage
  2023-07-04  9:04  3%   ` [PATCH v7 " Jie Hai
@ 2023-07-04  9:04  3%     ` Jie Hai
  0 siblings, 0 replies; 200+ results
From: Jie Hai @ 2023-07-04  9:04 UTC (permalink / raw)
  To: Honnappa Nagarahalli, Konstantin Ananyev; +Cc: haijie1, dev, liudongdong3

Field 'flags' of struct rte_ring is defined as int type. However,
it is used as unsigned int. To ensure consistency, change the
type of flags to unsigned int. Since these two types has the
same byte size, this change is not an ABI change.

Fixes: af75078fece3 ("first public release")

Signed-off-by: Jie Hai <haijie1@huawei.com>
Acked-by: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
Acked-by: Chengwen Feng <fengchengwen@huawei.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
---
 lib/ring/rte_ring_core.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/ring/rte_ring_core.h b/lib/ring/rte_ring_core.h
index 82b237091b71..1c809abeb531 100644
--- a/lib/ring/rte_ring_core.h
+++ b/lib/ring/rte_ring_core.h
@@ -120,7 +120,7 @@ struct rte_ring_hts_headtail {
 struct rte_ring {
 	char name[RTE_RING_NAMESIZE] __rte_cache_aligned;
 	/**< Name of the ring. */
-	int flags;               /**< Flags supplied at creation. */
+	uint32_t flags;               /**< Flags supplied at creation. */
 	const struct rte_memzone *memzone;
 			/**< Memzone, if any, containing the rte_ring */
 	uint32_t size;           /**< Size of ring. */
-- 
2.33.0


^ permalink raw reply	[relevance 3%]

* RE: [PATCH] doc: announce ethdev operation struct changes
  2023-07-04  8:10  3% [PATCH] doc: announce ethdev operation struct changes Feifei Wang
@ 2023-07-04  8:17  0% ` Feifei Wang
  2023-07-13  2:37  0%   ` Feifei Wang
  2023-07-05 11:32  0% ` Konstantin Ananyev
  2023-07-28 14:56  3% ` Thomas Monjalon
  2 siblings, 1 reply; 200+ results
From: Feifei Wang @ 2023-07-04  8:17 UTC (permalink / raw)
  To: Feifei Wang
  Cc: dev, nd, Honnappa Nagarahalli, Ruifeng Wang, Konstantin Ananyev,
	mb, Ferruh Yigit, thomas, Andrew Rybchenko, nd



> -----Original Message-----
> From: Feifei Wang <feifei.wang2@arm.com>
> Sent: Tuesday, July 4, 2023 4:10 PM
> Cc: dev@dpdk.org; nd <nd@arm.com>; Honnappa Nagarahalli
> <Honnappa.Nagarahalli@arm.com>; Feifei Wang <Feifei.Wang2@arm.com>;
> Ruifeng Wang <Ruifeng.Wang@arm.com>
> Subject: [PATCH] doc: announce ethdev operation struct changes
> 
> To support mbufs recycle mode, announce the coming ABI changes from
> DPDK 23.11.
> 
> Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
> Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
> ---
>  doc/guides/rel_notes/deprecation.rst | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/doc/guides/rel_notes/deprecation.rst
> b/doc/guides/rel_notes/deprecation.rst
> index 66431789b0..c7e1ffafb2 100644
> --- a/doc/guides/rel_notes/deprecation.rst
> +++ b/doc/guides/rel_notes/deprecation.rst
> @@ -118,6 +118,10 @@ Deprecation Notices
>    The legacy actions should be removed
>    once ``MODIFY_FIELD`` alternative is implemented in drivers.
> 
> +* ethdev: The Ethernet device data structure ``struct rte_eth_dev`` and
> +  the fast-path ethdev flat array ``struct rte_eth_fp_ops`` will be
> +updated
> +  with new fields to support mbufs recycle mode from DPDK 23.11.
> +
>  * cryptodev: The function ``rte_cryptodev_cb_fn`` will be updated
>    to have another parameter ``qp_id`` to return the queue pair ID
>    which got error interrupt to the application,
> --
> 2.25.1


^ permalink raw reply	[relevance 0%]

* [PATCH] doc: announce ethdev operation struct changes
@ 2023-07-04  8:10  3% Feifei Wang
  2023-07-04  8:17  0% ` Feifei Wang
                   ` (2 more replies)
  0 siblings, 3 replies; 200+ results
From: Feifei Wang @ 2023-07-04  8:10 UTC (permalink / raw)
  Cc: dev, nd, Honnappa.Nagarahalli, Feifei Wang, Ruifeng Wang

To support mbufs recycle mode, announce the coming ABI changes
from DPDK 23.11.

Signed-off-by: Feifei Wang <feifei.wang2@arm.com>
Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
---
 doc/guides/rel_notes/deprecation.rst | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 66431789b0..c7e1ffafb2 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -118,6 +118,10 @@ Deprecation Notices
   The legacy actions should be removed
   once ``MODIFY_FIELD`` alternative is implemented in drivers.
 
+* ethdev: The Ethernet device data structure ``struct rte_eth_dev`` and
+  the fast-path ethdev flat array ``struct rte_eth_fp_ops`` will be updated
+  with new fields to support mbufs recycle mode from DPDK 23.11.
+
 * cryptodev: The function ``rte_cryptodev_cb_fn`` will be updated
   to have another parameter ``qp_id`` to return the queue pair ID
   which got error interrupt to the application,
-- 
2.25.1


^ permalink raw reply	[relevance 3%]

* Re: kni: check abi version between kmod and lib
  @ 2023-07-04  2:56  7% ` Stephen Hemminger
  0 siblings, 0 replies; 200+ results
From: Stephen Hemminger @ 2023-07-04  2:56 UTC (permalink / raw)
  To: Stephen Coleman; +Cc: dev, Ray Kinsella, Ferruh Yigit

On Thu, 21 Apr 2022 12:38:26 +0800
Stephen Coleman <omegacoleman@gmail.com> wrote:

> KNI ioctl functions copy data from userspace lib, and this interface
> of kmod is not compatible indeed. If the user use incompatible rte_kni.ko
> bad things happen: sometimes various fields contain garbage value,
> sometimes it cause a kmod soft lockup.
> 
> Some common distros ship their own rte_kni.ko, so this is likely to
> happen.
> 
> This patch add abi version checking between userland lib and kmod so
> that:
> 
> * if kmod ioctl got a wrong abi magic, it refuse to go on
> * if userland lib, probed a wrong abi version via newly added ioctl, it
>   also refuse to go on
> 
> Bugzilla ID: 998
> 
> Signed-off-by: youcai <omegacoleman@gmail.com>

KNI is deprecated and scheduled for removal.
Even though this fixes a bug, because it changes API/ABI it can't go in.
Dropping the patch.



^ permalink raw reply	[relevance 7%]

* Re: [EXT] Re: [PATCH v3] bitmap: add scan from offset function
  2023-07-03 12:02  4%       ` [EXT] " Volodymyr Fialko
@ 2023-07-03 12:17  0%         ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2023-07-03 12:17 UTC (permalink / raw)
  To: Dumitrescu, Cristian, Volodymyr Fialko
  Cc: dev, Jerin Jacob Kollanukkaran, Anoob Joseph

03/07/2023 14:02, Volodymyr Fialko:
> 
> > -----Original Message-----
> > From: Thomas Monjalon <thomas@monjalon.net>
> > Sent: Monday, July 3, 2023 1:51 PM
> > To: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>; Volodymyr Fialko <vfialko@marvell.com>
> > Cc: dev@dpdk.org; Jerin Jacob Kollanukkaran <jerinj@marvell.com>; Anoob Joseph
> > <anoobj@marvell.com>
> > Subject: [EXT] Re: [PATCH v3] bitmap: add scan from offset function
> > 
> > External Email
> > 
> > ----------------------------------------------------------------------
> > 03/07/2023 12:56, Volodymyr Fialko:
> > > Since it's header-only library, there is issue with using __rte_intenal (appeared in v4).
> > 
> > What is the issue?
> 
> From V4 ci build failure(http://mails.dpdk.org/archives/test-report/2023-July/421235.html):
> 	In file included from ../examples/ipsec-secgw/event_helper.c:6:
> 	../lib/eal/include/rte_bitmap.h:645:2: error: Symbol is not public ABI
> 	        __rte_bitmap_scan_init_at(bmp, offset);
>  	       ^
> 	../lib/eal/include/rte_bitmap.h:150:1: note: from 'diagnose_if' attribute on '__rte_bitmap_scan_init_at':
> 	__rte_internal
> 	^~~~~~~~~~~~~~
> 	../lib/eal/include/rte_compat.h:42:16: note: expanded from macro '__rte_internal'	
> 	__attribute__((diagnose_if(1, "Symbol is not public ABI", "error"), \
>               		^           ~
> 	1 error generated.

OK I see.
So we should give up with __rte_internal for inline functions.
As it is not supposed to be exposed to the applications,
I think we can skip the __rte_experimental flag.

> > > Even if the function itself is not used directly, it get's included to the other public files.
> > > It explains why other functions in this library does not have the rte_internal prefix, but the double
> > underscores.
> > > So, should I simply remove __rte_internal from v4, or there's another approach to resolve this
> > issue(beside creating .c file)?
> > >
> > > /Volodymyr
> > >
> > > > -----Original Message-----
> > > > From: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>
> > > > Sent: Friday, June 23, 2023 2:41 PM
> > > > To: Thomas Monjalon <thomas@monjalon.net>; Volodymyr Fialko
> > > > <vfialko@marvell.com>
> > > > Cc: dev@dpdk.org; Jerin Jacob Kollanukkaran <jerinj@marvell.com>;
> > > > Anoob Joseph <anoobj@marvell.com>
> > > > Subject: [EXT] RE: [PATCH v3] bitmap: add scan from offset function
> > > >
> > > > External Email
> > > >
> > > > --------------------------------------------------------------------
> > > > --
> > > >
> > > >
> > > > > -----Original Message-----
> > > > > From: Thomas Monjalon <thomas@monjalon.net>
> > > > > Sent: Thursday, June 22, 2023 6:45 PM
> > > > > To: Volodymyr Fialko <vfialko@marvell.com>
> > > > > Cc: dev@dpdk.org; Dumitrescu, Cristian
> > > > > <cristian.dumitrescu@intel.com>; jerinj@marvell.com;
> > > > > anoobj@marvell.com
> > > > > Subject: Re: [PATCH v3] bitmap: add scan from offset function
> > > > >
> > > > > 21/06/2023 12:01, Volodymyr Fialko:
> > > > > > Currently, in the case when we search for a bit set after a
> > > > > > particular value, the bitmap has to be scanned from the
> > > > > > beginning and
> > > > > > rte_bitmap_scan() has to be called multiple times until we hit the value.
> > > > > >
> > > > > > Add a new rte_bitmap_scan_from_offset() function to initialize
> > > > > > scan state at the given offset and perform scan, this will allow
> > > > > > getting the next set bit after certain offset within one scan call.
> > > > > >
> > > > > > Signed-off-by: Volodymyr Fialko <vfialko@marvell.com>
> > > > > > ---
> > > > > > v2:
> > > > > >  - added rte_bitmap_scan_from_offset
> > > > > > v3
> > > > > >  - added note for internal use only for init_at function
> > > > > [...]
> > > > > > +/**
> > > > > > + * @warning
> > > > > > + * @b EXPERIMENTAL: this API may change without prior notice.
> > > > > > + *
> > > > > > + * Bitmap initialize internal scan pointers at the given
> > > > > > +position for the scan
> > > > > function.
> > > > > > + *
> > > > > > + * Note: for private/internal use, for public:
> > > > > > + * @see rte_bitmap_scan_from_offset()
> > > > > > + *
> > > > > > + * @param bmp
> > > > > > + *   Handle to bitmap instance
> > > > > > + * @param pos
> > > > > > + *   Bit position to start scan
> > > > > > + */
> > > > > > +__rte_experimental
> > > > > > +static inline void
> > > > > > +__rte_bitmap_scan_init_at(struct rte_bitmap *bmp, uint32_t pos)
> > > > >
> > > > > I think it should marked with __rte_internal instead of experimental.
> > > > >
> > > > >
> > > >
> > > >
> > > > +1
> > >
> > 
> > 
> > 
> > 
> 
> 






^ permalink raw reply	[relevance 0%]

* RE: [EXT] Re: [PATCH v3] bitmap: add scan from offset function
  @ 2023-07-03 12:02  4%       ` Volodymyr Fialko
  2023-07-03 12:17  0%         ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Volodymyr Fialko @ 2023-07-03 12:02 UTC (permalink / raw)
  To: Thomas Monjalon, Dumitrescu, Cristian
  Cc: dev, Jerin Jacob Kollanukkaran, Anoob Joseph


> -----Original Message-----
> From: Thomas Monjalon <thomas@monjalon.net>
> Sent: Monday, July 3, 2023 1:51 PM
> To: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>; Volodymyr Fialko <vfialko@marvell.com>
> Cc: dev@dpdk.org; Jerin Jacob Kollanukkaran <jerinj@marvell.com>; Anoob Joseph
> <anoobj@marvell.com>
> Subject: [EXT] Re: [PATCH v3] bitmap: add scan from offset function
> 
> External Email
> 
> ----------------------------------------------------------------------
> 03/07/2023 12:56, Volodymyr Fialko:
> > Since it's header-only library, there is issue with using __rte_intenal (appeared in v4).
> 
> What is the issue?

From V4 ci build failure(http://mails.dpdk.org/archives/test-report/2023-July/421235.html):
	In file included from ../examples/ipsec-secgw/event_helper.c:6:
	../lib/eal/include/rte_bitmap.h:645:2: error: Symbol is not public ABI
	        __rte_bitmap_scan_init_at(bmp, offset);
 	       ^
	../lib/eal/include/rte_bitmap.h:150:1: note: from 'diagnose_if' attribute on '__rte_bitmap_scan_init_at':
	__rte_internal
	^~~~~~~~~~~~~~
	../lib/eal/include/rte_compat.h:42:16: note: expanded from macro '__rte_internal'	
	__attribute__((diagnose_if(1, "Symbol is not public ABI", "error"), \
              		^           ~
	1 error generated.

/Volodymyr
> 
> > Even if the function itself is not used directly, it get's included to the other public files.
> > It explains why other functions in this library does not have the rte_internal prefix, but the double
> underscores.
> > So, should I simply remove __rte_internal from v4, or there's another approach to resolve this
> issue(beside creating .c file)?
> >
> > /Volodymyr
> >
> > > -----Original Message-----
> > > From: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>
> > > Sent: Friday, June 23, 2023 2:41 PM
> > > To: Thomas Monjalon <thomas@monjalon.net>; Volodymyr Fialko
> > > <vfialko@marvell.com>
> > > Cc: dev@dpdk.org; Jerin Jacob Kollanukkaran <jerinj@marvell.com>;
> > > Anoob Joseph <anoobj@marvell.com>
> > > Subject: [EXT] RE: [PATCH v3] bitmap: add scan from offset function
> > >
> > > External Email
> > >
> > > --------------------------------------------------------------------
> > > --
> > >
> > >
> > > > -----Original Message-----
> > > > From: Thomas Monjalon <thomas@monjalon.net>
> > > > Sent: Thursday, June 22, 2023 6:45 PM
> > > > To: Volodymyr Fialko <vfialko@marvell.com>
> > > > Cc: dev@dpdk.org; Dumitrescu, Cristian
> > > > <cristian.dumitrescu@intel.com>; jerinj@marvell.com;
> > > > anoobj@marvell.com
> > > > Subject: Re: [PATCH v3] bitmap: add scan from offset function
> > > >
> > > > 21/06/2023 12:01, Volodymyr Fialko:
> > > > > Currently, in the case when we search for a bit set after a
> > > > > particular value, the bitmap has to be scanned from the
> > > > > beginning and
> > > > > rte_bitmap_scan() has to be called multiple times until we hit the value.
> > > > >
> > > > > Add a new rte_bitmap_scan_from_offset() function to initialize
> > > > > scan state at the given offset and perform scan, this will allow
> > > > > getting the next set bit after certain offset within one scan call.
> > > > >
> > > > > Signed-off-by: Volodymyr Fialko <vfialko@marvell.com>
> > > > > ---
> > > > > v2:
> > > > >  - added rte_bitmap_scan_from_offset
> > > > > v3
> > > > >  - added note for internal use only for init_at function
> > > > [...]
> > > > > +/**
> > > > > + * @warning
> > > > > + * @b EXPERIMENTAL: this API may change without prior notice.
> > > > > + *
> > > > > + * Bitmap initialize internal scan pointers at the given
> > > > > +position for the scan
> > > > function.
> > > > > + *
> > > > > + * Note: for private/internal use, for public:
> > > > > + * @see rte_bitmap_scan_from_offset()
> > > > > + *
> > > > > + * @param bmp
> > > > > + *   Handle to bitmap instance
> > > > > + * @param pos
> > > > > + *   Bit position to start scan
> > > > > + */
> > > > > +__rte_experimental
> > > > > +static inline void
> > > > > +__rte_bitmap_scan_init_at(struct rte_bitmap *bmp, uint32_t pos)
> > > >
> > > > I think it should marked with __rte_internal instead of experimental.
> > > >
> > > >
> > >
> > >
> > > +1
> >
> 
> 
> 
> 


^ permalink raw reply	[relevance 4%]

* Re: [RFC] eventdev: remove single-event enqueue operation
  @ 2023-06-30  4:37  3% ` Jerin Jacob
  2023-07-04 12:01  0%   ` Mattias Rönnblom
  2023-07-04 11:53  4% ` [PATCH] " Mattias Rönnblom
  1 sibling, 1 reply; 200+ results
From: Jerin Jacob @ 2023-06-30  4:37 UTC (permalink / raw)
  To: Mattias Rönnblom
  Cc: jerinj, hofors, dev, Pavan Nikhilesh, Timothy McDaniel,
	Hemant Agrawal, Sachin Saxena, Harry van Haaren, Liang Ma,
	Peter Mccarthy

On Fri, Jun 9, 2023 at 11:18 PM Mattias Rönnblom
<mattias.ronnblom@ericsson.com> wrote:
>
> Eliminate non-burst enqueue operation from Eventdev.
>
> The effect of this change is to reduce Eventdev code complexity
> somewhat and slightly improve performance.
>
> The single-event enqueue shortcut provided a very minor performance
> advantage in some situations (e.g., with a compile time-constant burst
> size of '1'), but would in other situations cause a noticeable
> performance penalty (e.g., rte_event_enqueue_forward_burst() with run
> time-variable burst sizes varying between '1' and larger burst sizes).
>
> Signed-off-by: Mattias Rönnblom <mattias.ronnblom@ericsson.com>

>
> -typedef uint16_t (*event_enqueue_t)(void *port, const struct rte_event *ev);
> -/**< @internal Enqueue event on port of a device */
> -
>  typedef uint16_t (*event_enqueue_burst_t)(void *port,
>                                           const struct rte_event ev[],
>                                           uint16_t nb_events);
> @@ -45,8 +42,6 @@ typedef uint16_t (*event_crypto_adapter_enqueue_t)(void *port,
>  struct rte_event_fp_ops {
>         void **data;
>         /**< points to array of internal port data pointers */
> -       event_enqueue_t enqueue;
> -       /**< PMD enqueue function. */

Can we remove "dequeue" as well?
In any event, Please send a deprecation notice as it is an ABI change,
and we need to get merge the deprecation notice patch for v23.07.
I can review the deprecation notice patch quickly as soon as you send
it to make forward progress.


>         event_enqueue_burst_t enqueue_burst;
>         /**< PMD enqueue burst function. */
>         event_enqueue_burst_t enqueue_new_burst;
> @@ -65,7 +60,7 @@ struct rte_event_fp_ops {
>         /**< PMD Tx adapter enqueue same destination function. */
>         event_crypto_adapter_enqueue_t ca_enqueue;
>         /**< PMD Crypto adapter enqueue function. */
> -       uintptr_t reserved[6];
> +       uintptr_t reserved[7];
>  } __rte_cache_aligned;
>

^ permalink raw reply	[relevance 3%]

* [PATCH v4] doc: prefer installing using meson rather than ninja
    2023-06-09 13:34  3% ` [PATCH v2] " Bruce Richardson
  2023-06-09 14:51  3% ` [PATCH v3] " Bruce Richardson
@ 2023-06-23 11:43  4% ` Bruce Richardson
  2 siblings, 0 replies; 200+ results
From: Bruce Richardson @ 2023-06-23 11:43 UTC (permalink / raw)
  To: dev; +Cc: thomas, david.marchand, Bruce Richardson

After doing a build, to install DPDK system-wide our documentation
recommended using the "ninja install" command. However, for anyone
building as a non-root user and only installing as root, the "meson
install" command is a better alternative, as it provides for
automatically dropping or elevating privileges as necessary in more
recent meson releases [1].

[1] https://mesonbuild.com/Installing.html#installing-as-the-superuser

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>

---

V4:
* replaced missed calls to ninja install in ci script and
  test-meson-builds script.

V3:
* correct order of arguments to meson in CI scripts. The "-C" option
  must follow the meson "install" command. [This is consistent with
  other uses e.g. meson compile -C ..., meson test -C ...]

V2:
* Fix one missed reference to "ninja install" in Linux GSG
* Changed CI scripts to use "meson install" to ensure step is
  properly tested.
---
 .ci/linux-build.sh                           | 6 +++---
 devtools/test-meson-builds.sh                | 4 ++--
 doc/guides/contributing/coding_style.rst     | 2 +-
 doc/guides/cryptodevs/uadk.rst               | 2 +-
 doc/guides/freebsd_gsg/build_dpdk.rst        | 2 +-
 doc/guides/freebsd_gsg/build_sample_apps.rst | 2 +-
 doc/guides/linux_gsg/build_dpdk.rst          | 4 ++--
 doc/guides/prog_guide/build-sdk-meson.rst    | 4 ++--
 8 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/.ci/linux-build.sh b/.ci/linux-build.sh
index d0d9f89bae..45f2729996 100755
--- a/.ci/linux-build.sh
+++ b/.ci/linux-build.sh
@@ -151,14 +151,14 @@ if [ "$ABI_CHECKS" = "true" ]; then
         git clone --single-branch -b "$REF_GIT_TAG" $REF_GIT_REPO $refsrcdir
         meson setup $OPTS -Dexamples= $refsrcdir $refsrcdir/build
         ninja -C $refsrcdir/build
-        DESTDIR=$(pwd)/reference ninja -C $refsrcdir/build install
+        DESTDIR=$(pwd)/reference meson install -C $refsrcdir/build
         find reference/usr/local -name '*.a' -delete
         rm -rf reference/usr/local/bin
         rm -rf reference/usr/local/share
         echo $REF_GIT_TAG > reference/VERSION
     fi
 
-    DESTDIR=$(pwd)/install ninja -C build install
+    DESTDIR=$(pwd)/install meson install -C build
     devtools/check-abi.sh reference install ${ABI_CHECKS_WARN_ONLY:-}
 fi
 
@@ -172,7 +172,7 @@ fi
 
 # Test examples compilation with an installed dpdk
 if [ "$BUILD_EXAMPLES" = "true" ]; then
-    [ -d install ] || DESTDIR=$(pwd)/install ninja -C build install
+    [ -d install ] || DESTDIR=$(pwd)/install meson install -C build
     export LD_LIBRARY_PATH=$(dirname $(find $(pwd)/install -name librte_eal.so)):$LD_LIBRARY_PATH
     export PKG_CONFIG_PATH=$(dirname $(find $(pwd)/install -name libdpdk.pc)):$PKG_CONFIG_PATH
     export PKGCONF="pkg-config --define-prefix"
diff --git a/devtools/test-meson-builds.sh b/devtools/test-meson-builds.sh
index 1eb28a2490..84b907d2ea 100755
--- a/devtools/test-meson-builds.sh
+++ b/devtools/test-meson-builds.sh
@@ -158,8 +158,8 @@ compile () # <builddir>
 install_target () # <builddir> <installdir>
 {
 	rm -rf $2
-	echo "DESTDIR=$2 $ninja_cmd -C $1 install" >&$verbose
-	DESTDIR=$2 $ninja_cmd -C $1 install >&$veryverbose
+	echo "DESTDIR=$2 $MESON install -C $1" >&$verbose
+	DESTDIR=$2 $MESON install -C $1 >&$veryverbose
 }
 
 build () # <directory> <target cc | cross file> <ABI check> [meson options]
diff --git a/doc/guides/contributing/coding_style.rst b/doc/guides/contributing/coding_style.rst
index 0861305dc6..13b2390d9e 100644
--- a/doc/guides/contributing/coding_style.rst
+++ b/doc/guides/contributing/coding_style.rst
@@ -975,7 +975,7 @@ ext_deps
 headers
 	**Default Value = []**.
 	Used to return the list of header files for the library that should be
-	installed to $PREFIX/include when ``ninja install`` is run. As with
+	installed to $PREFIX/include when ``meson install`` is run. As with
 	source files, these should be specified using the meson ``files()``
 	function.
 	When ``check_includes`` build option is set to ``true``, each header file
diff --git a/doc/guides/cryptodevs/uadk.rst b/doc/guides/cryptodevs/uadk.rst
index 9af6b88a5a..136ab4be6a 100644
--- a/doc/guides/cryptodevs/uadk.rst
+++ b/doc/guides/cryptodevs/uadk.rst
@@ -90,7 +90,7 @@ Test steps
       meson setup build (--reconfigure)
       cd build
       ninja
-      sudo ninja install
+      sudo meson install
 
 #. Prepare hugepages for DPDK (see also :doc:`../tools/hugepages`)
 
diff --git a/doc/guides/freebsd_gsg/build_dpdk.rst b/doc/guides/freebsd_gsg/build_dpdk.rst
index 514d18c870..86e8e5a805 100644
--- a/doc/guides/freebsd_gsg/build_dpdk.rst
+++ b/doc/guides/freebsd_gsg/build_dpdk.rst
@@ -47,7 +47,7 @@ The final, install, step generally needs to be run as root::
   meson setup build
   cd build
   ninja
-  ninja install
+  meson install
 
 This will install the DPDK libraries and drivers to `/usr/local/lib` with a
 pkg-config file `libdpdk.pc` installed to `/usr/local/lib/pkgconfig`. The
diff --git a/doc/guides/freebsd_gsg/build_sample_apps.rst b/doc/guides/freebsd_gsg/build_sample_apps.rst
index c87e982759..b1ab7545b1 100644
--- a/doc/guides/freebsd_gsg/build_sample_apps.rst
+++ b/doc/guides/freebsd_gsg/build_sample_apps.rst
@@ -22,7 +22,7 @@ the system when DPDK is installed, and so can be built using GNU make.
    on the FreeBSD system.
 
 The following shows how to compile the helloworld example app, following
-the installation of DPDK using `ninja install` as described previously::
+the installation of DPDK using `meson install` as described previously::
 
         $ export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
 
diff --git a/doc/guides/linux_gsg/build_dpdk.rst b/doc/guides/linux_gsg/build_dpdk.rst
index bbd2efc9d8..9c0dd9daf6 100644
--- a/doc/guides/linux_gsg/build_dpdk.rst
+++ b/doc/guides/linux_gsg/build_dpdk.rst
@@ -68,11 +68,11 @@ Once configured, to build and then install DPDK system-wide use:
 
         cd build
         ninja
-        ninja install
+        meson install
         ldconfig
 
 The last two commands above generally need to be run as root,
-with the `ninja install` step copying the built objects to their final system-wide locations,
+with the `meson install` step copying the built objects to their final system-wide locations,
 and the last step causing the dynamic loader `ld.so` to update its cache to take account of the new objects.
 
 .. note::
diff --git a/doc/guides/prog_guide/build-sdk-meson.rst b/doc/guides/prog_guide/build-sdk-meson.rst
index 5deabbe54c..93aa1f80e3 100644
--- a/doc/guides/prog_guide/build-sdk-meson.rst
+++ b/doc/guides/prog_guide/build-sdk-meson.rst
@@ -12,7 +12,7 @@ following set of commands::
 	meson setup build
 	cd build
 	ninja
-	ninja install
+	meson install
 
 This will compile DPDK in the ``build`` subdirectory, and then install the
 resulting libraries, drivers and header files onto the system - generally
@@ -165,7 +165,7 @@ printing each command on a new line as it runs.
 Installing the Compiled Files
 ------------------------------
 
-Use ``ninja install`` to install the required DPDK files onto the system.
+Use ``meson install`` to install the required DPDK files onto the system.
 The install prefix defaults to ``/usr/local`` but can be used as with other
 options above. The environment variable ``DESTDIR`` can be used to adjust
 the root directory for the install, for example when packaging.
-- 
2.39.2


^ permalink raw reply	[relevance 4%]

* Re: [PATCH] ci: fix libabigail cache in GHA
  2023-06-20 14:21  0% ` Aaron Conole
@ 2023-06-22 17:41  0%   ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2023-06-22 17:41 UTC (permalink / raw)
  To: David Marchand; +Cc: dev, stable, Michael Santana, Aaron Conole

20/06/2023 16:21, Aaron Conole:
> David Marchand <david.marchand@redhat.com> writes:
> 
> > In repositories where multiple branches run the ABI checks using
> > different versions of libabigail (for example, a 22.11 branch using
> > libabigail-1.8 and a main branch using libabigail-2.1), a collision
> > happens on the libabigail binary cache entry.
> > As a single cache entry is used, the content of the cache (let's say the
> > cache was built for libabigail 2.1) won't match what the branch wants to
> > use (in this example running the check for 22.11 branch requires
> > libabigail 1.8).
> > .ci/linux-build.sh then tries to recompile libabigail but it fails as
> > the packages used for building libabigail are missing.
> >
> > Add the version to the cache entry name to avoid this collision.
> >
> > Fixes: 443267090edc ("ci: enable v21 ABI checks")
> > Cc: stable@dpdk.org
> >
> > Signed-off-by: David Marchand <david.marchand@redhat.com>
> 
> Acked-by: Aaron Conole <aconole@redhat.com>

Applied, thanks.




^ permalink raw reply	[relevance 0%]

* Re: [PATCH] ci: fix libabigail cache in GHA
  2023-06-20 13:29 10% [PATCH] ci: fix libabigail cache in GHA David Marchand
@ 2023-06-20 14:21  0% ` Aaron Conole
  2023-06-22 17:41  0%   ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Aaron Conole @ 2023-06-20 14:21 UTC (permalink / raw)
  To: David Marchand; +Cc: dev, stable, Michael Santana, Thomas Monjalon

David Marchand <david.marchand@redhat.com> writes:

> In repositories where multiple branches run the ABI checks using
> different versions of libabigail (for example, a 22.11 branch using
> libabigail-1.8 and a main branch using libabigail-2.1), a collision
> happens on the libabigail binary cache entry.
> As a single cache entry is used, the content of the cache (let's say the
> cache was built for libabigail 2.1) won't match what the branch wants to
> use (in this example running the check for 22.11 branch requires
> libabigail 1.8).
> .ci/linux-build.sh then tries to recompile libabigail but it fails as
> the packages used for building libabigail are missing.
>
> Add the version to the cache entry name to avoid this collision.
>
> Fixes: 443267090edc ("ci: enable v21 ABI checks")
> Cc: stable@dpdk.org
>
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> ---

Acked-by: Aaron Conole <aconole@redhat.com>


^ permalink raw reply	[relevance 0%]

* [PATCH v3 4/4] ci: build examples externally
  @ 2023-06-20 14:07 10%   ` David Marchand
  0 siblings, 0 replies; 200+ results
From: David Marchand @ 2023-06-20 14:07 UTC (permalink / raw)
  To: dev; +Cc: thomas, bruce.richardson, Aaron Conole, Michael Santana

Enhance our CI coverage by building examples against an installed DPDK.

Signed-off-by: David Marchand <david.marchand@redhat.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Aaron Conole <aconole@redhat.com>
---
Changes since v2:
- dropped unneeded -e in sed cmdline,

Changes since v1:
- reworked built examples discovery,
- added comment for people who are not sed fluent,

---
 .ci/linux-build.sh          | 27 ++++++++++++++++++++++++++-
 .github/workflows/build.yml |  6 +++---
 2 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/.ci/linux-build.sh b/.ci/linux-build.sh
index 9631e342b5..d0d9f89bae 100755
--- a/.ci/linux-build.sh
+++ b/.ci/linux-build.sh
@@ -1,7 +1,7 @@
 #!/bin/sh -xe
 
 if [ -z "${DEF_LIB:-}" ]; then
-    DEF_LIB=static ABI_CHECKS= BUILD_DOCS= RUN_TESTS= $0
+    DEF_LIB=static ABI_CHECKS= BUILD_DOCS= BUILD_EXAMPLES= RUN_TESTS= $0
     DEF_LIB=shared $0
     exit
 fi
@@ -99,6 +99,7 @@ if [ "$MINI" = "true" ]; then
 else
     OPTS="$OPTS -Ddisable_libs="
 fi
+OPTS="$OPTS -Dlibdir=lib"
 
 if [ "$ASAN" = "true" ]; then
     OPTS="$OPTS -Db_sanitize=address"
@@ -168,3 +169,27 @@ if [ "$RUN_TESTS" = "true" ]; then
     catch_coredump
     [ "$failed" != "true" ]
 fi
+
+# Test examples compilation with an installed dpdk
+if [ "$BUILD_EXAMPLES" = "true" ]; then
+    [ -d install ] || DESTDIR=$(pwd)/install ninja -C build install
+    export LD_LIBRARY_PATH=$(dirname $(find $(pwd)/install -name librte_eal.so)):$LD_LIBRARY_PATH
+    export PKG_CONFIG_PATH=$(dirname $(find $(pwd)/install -name libdpdk.pc)):$PKG_CONFIG_PATH
+    export PKGCONF="pkg-config --define-prefix"
+    find build/examples -maxdepth 1 -type f -name "dpdk-*" |
+    while read target; do
+        target=${target%%:*}
+        target=${target#build/examples/dpdk-}
+        if [ -e examples/$target/Makefile ]; then
+            echo $target
+            continue
+        fi
+        # Some examples binaries are built from an example sub
+        # directory, discover the "top level" example name.
+        find examples -name Makefile |
+        sed -n "s,examples/\([^/]*\)\(/.*\|\)/$target/Makefile,\1,p"
+    done | sort -u |
+    while read example; do
+        make -C install/usr/local/share/dpdk/examples/$example clean shared
+    done
+fi
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 3b629fcdbd..414dd089e0 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -20,6 +20,7 @@ jobs:
       BUILD_32BIT: ${{ matrix.config.cross == 'i386' }}
       BUILD_DEBUG: ${{ contains(matrix.config.checks, 'debug') }}
       BUILD_DOCS: ${{ contains(matrix.config.checks, 'doc') }}
+      BUILD_EXAMPLES: ${{ contains(matrix.config.checks, 'examples') }}
       CC: ccache ${{ matrix.config.compiler }}
       DEF_LIB: ${{ matrix.config.library }}
       LIBABIGAIL_VERSION: libabigail-2.1
@@ -39,7 +40,7 @@ jobs:
             mini: mini
           - os: ubuntu-20.04
             compiler: gcc
-            checks: abi+debug+doc+tests
+            checks: abi+debug+doc+examples+tests
           - os: ubuntu-20.04
             compiler: clang
             checks: asan+doc+tests
@@ -96,12 +97,11 @@ jobs:
     - name: Install packages
       run: sudo apt install -y ccache libarchive-dev libbsd-dev libfdt-dev
         libibverbs-dev libjansson-dev libnuma-dev libpcap-dev libssl-dev
-        ninja-build python3-pip python3-pyelftools python3-setuptools
+        ninja-build pkg-config python3-pip python3-pyelftools python3-setuptools
         python3-wheel zlib1g-dev
     - name: Install libabigail build dependencies if no cache is available
       if: env.ABI_CHECKS == 'true' && steps.libabigail-cache.outputs.cache-hit != 'true'
       run: sudo apt install -y autoconf automake libdw-dev libtool libxml2-dev
-        pkg-config
     - name: Install i386 cross compiling packages
       if: env.BUILD_32BIT == 'true'
       run: sudo apt install -y gcc-multilib g++-multilib
-- 
2.40.1


^ permalink raw reply	[relevance 10%]

* [PATCH] ci: fix libabigail cache in GHA
@ 2023-06-20 13:29 10% David Marchand
  2023-06-20 14:21  0% ` Aaron Conole
  0 siblings, 1 reply; 200+ results
From: David Marchand @ 2023-06-20 13:29 UTC (permalink / raw)
  To: dev; +Cc: stable, Aaron Conole, Michael Santana, Thomas Monjalon

In repositories where multiple branches run the ABI checks using
different versions of libabigail (for example, a 22.11 branch using
libabigail-1.8 and a main branch using libabigail-2.1), a collision
happens on the libabigail binary cache entry.
As a single cache entry is used, the content of the cache (let's say the
cache was built for libabigail 2.1) won't match what the branch wants to
use (in this example running the check for 22.11 branch requires
libabigail 1.8).
.ci/linux-build.sh then tries to recompile libabigail but it fails as
the packages used for building libabigail are missing.

Add the version to the cache entry name to avoid this collision.

Fixes: 443267090edc ("ci: enable v21 ABI checks")
Cc: stable@dpdk.org

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
 .github/workflows/build.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 3b629fcdbd..7b69771a58 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -69,7 +69,7 @@ jobs:
       id: get_ref_keys
       run: |
         echo 'ccache=ccache-${{ matrix.config.os }}-${{ matrix.config.compiler }}-${{ matrix.config.cross }}-'$(date -u +%Y-w%W) >> $GITHUB_OUTPUT
-        echo 'libabigail=libabigail-${{ matrix.config.os }}' >> $GITHUB_OUTPUT
+        echo 'libabigail=libabigail-${{ env.LIBABIGAIL_VERSION }}-${{ matrix.config.os }}' >> $GITHUB_OUTPUT
         echo 'abi=abi-${{ matrix.config.os }}-${{ matrix.config.compiler }}-${{ matrix.config.cross }}-${{ env.REF_GIT_TAG }}' >> $GITHUB_OUTPUT
     - name: Retrieve ccache cache
       uses: actions/cache@v3
-- 
2.40.1


^ permalink raw reply	[relevance 10%]

* RE: [PATCH v1 1/1] doc: announce change in bbdev api related to operation extension
  2023-06-16  7:36  4%                             ` Maxime Coquelin
@ 2023-06-16 15:48  0%                               ` Chautru, Nicolas
  0 siblings, 0 replies; 200+ results
From: Chautru, Nicolas @ 2023-06-16 15:48 UTC (permalink / raw)
  To: Maxime Coquelin, David Marchand, hemant.agrawal
  Cc: Stephen Hemminger, dev, Rix, Tom, Vargas, Hernan

Hi Maxime, Hermant, 

Hermant can I have your view on this topic below. 

> -----Original Message-----
> From: Maxime Coquelin <maxime.coquelin@redhat.com>
> On 6/15/23 21:30, Chautru, Nicolas wrote:
> > Hi Maxime,
> >
> >> -----Original Message-----
> >> From: Maxime Coquelin <maxime.coquelin@redhat.com>
> >>
> >> On 6/14/23 20:18, Chautru, Nicolas wrote:
> >>> Hi Maxime,
> >>>
> >>>> -----Original Message-----
> >>>> From: Maxime Coquelin <maxime.coquelin@redhat.com> Hi,
> >>>>
> >>>> On 6/13/23 19:16, Chautru, Nicolas wrote:
> >>>>> Hi Maxime,
> >>>>>
> >>>>>> -----Original Message-----
> >>>>>> From: Maxime Coquelin <maxime.coquelin@redhat.com>
> >>>>>
> >>>>>>
> >>>>>> On 6/12/23 22:53, Chautru, Nicolas wrote:
> >>>>>>> Hi Maxime, David,
> >>>>>>>
> >>>>>>>> -----Original Message-----
> >>>>>>>> From: Maxime Coquelin <maxime.coquelin@redhat.com>
> >>>>>>>>
> >>>>>>>> On 6/6/23 23:01, Chautru, Nicolas wrote:
> >>>>>>>>> Hi David,
> >>>>>>>>>
> >>>>>>>>>> -----Original Message-----
> >>>>>>>>>> From: David Marchand <david.marchand@redhat.com>> >> On
> >>>> Mon, Jun
> >>>>>> 5,
> >>>>>>>>>> 2023 at 10:08 PM Chautru, Nicolas <nicolas.chautru@intel.com>
> >>>>>>>>>> wrote:
> >>>>>>>>>>> Wrt the MLD functions: these are new into the related serie
> >>>>>>>>>>> but still the
> >>>>>>>>>> break the ABI since the struct rte_bbdev includes these
> >>>>>>>>>> functions hence causing offset changes.
> >>>>>>>>>>>
> >>>>>>>>>>> Should I then just rephrase as:
> >>>>>>>>>>>
> >>>>>>>>>>> +* bbdev: Will extend the API to support the new operation
> >>>>>>>>>>> +type
> >>>>>>>>>>>       +``RTE_BBDEV_OP_MLDTS`` as per
> >>>>>>>>>>>       +  this `v1
> >>>>>>>>>>>
> >> +<https://patches.dpdk.org/project/dpdk/list/?series=28192>`.
> >>>>>>>>>>> This
> >>>>>>>>>>> + will notably introduce  +  new symbols for
> >>>>>>>>>>> ``rte_bbdev_dequeue_mldts_ops``,
> >>>>>>>>>>> +``rte_bbdev_enqueue_mldts_ops`` into the stuct rte_bbdev.
> >>>>>>>>>>
> >>>>>>>>>> I don't think we need this deprecation notice.
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>> Do you need to expose those new mldts ops in rte_bbdev?
> >>>>>>>>>> Can't they go to dev_ops?
> >>>>>>>>>> If you can't, at least moving those new ops at the end of the
> >>>>>>>>>> structure would avoid the breakage on rte_bbdev.
> >>>>>>>>>
> >>>>>>>>> It would probably be best to move all these ops at the end of
> >>>>>>>>> the structure
> >>>>>>>> (ie. keep them together).
> >>>>>>>>> In that case the deprecation notice would call out that the
> >>>>>>>>> rte_bbdev
> >>>>>>>> structure content is more generally modified. Probably best for
> >>>>>>>> the longer run.
> >>>>>>>>> David, Maxime, ok with that option?
> >>>>>>>>>
> >>>>>>>>> struct __rte_cache_aligned rte_bbdev {
> >>>>>>>>>           rte_bbdev_enqueue_enc_ops_t enqueue_enc_ops;
> >>>>>>>>>           rte_bbdev_enqueue_dec_ops_t enqueue_dec_ops;
> >>>>>>>>>           rte_bbdev_dequeue_enc_ops_t dequeue_enc_ops;
> >>>>>>>>>           rte_bbdev_dequeue_dec_ops_t dequeue_dec_ops;
> >>>>>>>>>           rte_bbdev_enqueue_enc_ops_t enqueue_ldpc_enc_ops;
> >>>>>>>>>           rte_bbdev_enqueue_dec_ops_t enqueue_ldpc_dec_ops;
> >>>>>>>>>           rte_bbdev_dequeue_enc_ops_t dequeue_ldpc_enc_ops;
> >>>>>>>>>           rte_bbdev_dequeue_dec_ops_t dequeue_ldpc_dec_ops;
> >>>>>>>>>           rte_bbdev_enqueue_fft_ops_t enqueue_fft_ops;
> >>>>>>>>>           rte_bbdev_dequeue_fft_ops_t dequeue_fft_ops;
> >>>>>>>>>           const struct rte_bbdev_ops *dev_ops;
> >>>>>>>>>           struct rte_bbdev_data *data;
> >>>>>>>>>           enum rte_bbdev_state state;
> >>>>>>>>>           struct rte_device *device;
> >>>>>>>>>           struct rte_bbdev_cb_list list_cbs;
> >>>>>>>>>           struct rte_intr_handle *intr_handle;
> >>>>>>>>>       };
> >>>>>>>>
> >>>>>>>> The best thing, as suggested by David, would be to move all the
> >>>>>>>> ops out of struct rte_bbdev, as these should not be visible to
> >>>>>>>> the
> >>>> application.
> >>>>>>>
> >>>>>>> That would be quite disruptive across all PMDs and possible perf
> >>>>>>> impact to
> >>>>>> validate. I don’t think this is anywhere realistic to consider
> >>>>>> such a change in 23.11.
> >>>>>>> I believe moving these function at the end of the structure is a
> >>>>>>> good
> >>>>>> compromise to avoid future breakage of rte_bbdev structure with
> >>>>>> almost seamless impact (purely a ABI break when moving into 23.11
> >>>>>> which is not avoidable. Retrospectively we should have done that
> >>>>>> in
> >>>>>> 22.11
> >>>> really.
> >>>>>>
> >>>>>> If we are going to break the ABI, better to do the right rework
> >>>>>> directly. Otherwise we'll end-up breaking it again next year.
> >>>>>
> >>>>> With the suggested change, this will not break ABI next year. Any
> >>>>> future
> >>>> functions are added at the end of the structure anyway.
> >>>>
> >>>> I'm not so sure, it depends if adding a new field at the end cross
> >>>> a cacheline boundary or not:
> >>>>
> >>>> /*
> >>>>     * Global array of all devices. This is not static because it's used by the
> >>>>     * inline enqueue and dequeue functions
> >>>>     */
> >>>> struct rte_bbdev rte_bbdev_devices[RTE_BBDEV_MAX_DEVS];
> >>>>
> >>>> If the older inlined functions used by the application retrieve the
> >>>> dev pointer from the array directly (they do) and added new fields
> >>>> in new version cross a cacheline, then there will be a
> >>>> misalignement between the new lib version and the application using
> >>>> the older inlined
> >> functions.
> >>>>
> >>>> ABI-wise, this is not really future proof.
> >>>>
> >>>>>
> >>>>>>
> >>>>>> IMHO, moving these ops should be quite trivial and not much work.
> >>>>>>
> >>>>>> Otherwise, if we just placed the rte_bbdev_dequeue_mldts_ops and
> >>>>>> rte_bbdev_enqueue_mldts_ops at the bottom of struct rte_bbdev, it
> >>>>>> may not break the ABI, but that's a bit fragile:
> >>>>>> - rte_bbdev_devices[] is not static, but is placed in the BSS section so
> >>>>>>       should be OK
> >>>>>> - struct rte_bbdev is cache-aligned, so it may work if adding these two
> >>>>>>       ops do not overlap a cacheline which depends on the CPU
> >> architecture.
> >>>>>
> >>>>> If you prefer to add the only 2 new functions at the end of the
> >>>>> structure
> >>>> that is okay. I believe it would be cleaner to move all these
> >>>> enqueue/dequeue funs down together without drawback I can think of.
> >>>> Let me know.
> >>>>
> >>>> Adding the new ones at the end is not future proof, but at least it
> >>>> does not break ABI just for cosmetic reasons (that's a big drawback
> >> IMHO).
> >>>>
> >>>> I just checked using pahole:
> >>>>
> >>>> struct rte_bbdev {
> >>>> 	rte_bbdev_enqueue_enc_ops_t enqueue_enc_ops;     /*     0     8 */
> >>>> 	rte_bbdev_enqueue_dec_ops_t enqueue_dec_ops;     /*     8     8 */
> >>>> 	rte_bbdev_dequeue_enc_ops_t dequeue_enc_ops;     /*    16     8 */
> >>>> 	rte_bbdev_dequeue_dec_ops_t dequeue_dec_ops;     /*    24     8 */
> >>>> 	rte_bbdev_enqueue_enc_ops_t enqueue_ldpc_enc_ops; /*    32     8
> >>>> */
> >>>> 	rte_bbdev_enqueue_dec_ops_t enqueue_ldpc_dec_ops; /*    40     8
> >>>> */
> >>>> 	rte_bbdev_dequeue_enc_ops_t dequeue_ldpc_enc_ops; /*    48     8
> >>>> */
> >>>> 	rte_bbdev_dequeue_dec_ops_t dequeue_ldpc_dec_ops; /*    56     8
> >>>> */
> >>>> 	/* --- cacheline 1 boundary (64 bytes) --- */
> >>>> 	rte_bbdev_enqueue_fft_ops_t enqueue_fft_ops;     /*    64     8 */
> >>>> 	rte_bbdev_dequeue_fft_ops_t dequeue_fft_ops;     /*    72     8 */
> >>>> 	const struct rte_bbdev_ops  * dev_ops;           /*    80     8 */
> >>>> 	struct rte_bbdev_data *    data;                 /*    88     8 */
> >>>> 	enum rte_bbdev_state       state;                /*    96     4 */
> >>>>
> >>>> 	/* XXX 4 bytes hole, try to pack */
> >>>>
> >>>> 	struct rte_device *        device;               /*   104     8 */
> >>>> 	struct rte_bbdev_cb_list   list_cbs;             /*   112    16 */
> >>>> 	/* --- cacheline 2 boundary (128 bytes) --- */
> >>>> 	struct rte_intr_handle *   intr_handle;          /*   128     8 */
> >>>>
> >>>> 	/* size: 192, cachelines: 3, members: 16 */
> >>>> 	/* sum members: 132, holes: 1, sum holes: 4 */
> >>>> 	/* padding: 56 */
> >>>> } __attribute__((__aligned__(64)));
> >>>>
> >>>> We're lucky on x86, we still have 56 bytes, so we can add 7 new ops
> >>>> at the end before breaking the ABI if I'm not mistaken.
> >>>>
> >>>> I checked the other architecture, and it seems we don't support any
> >>>> with 32B cacheline size so we're good for a while.
> >>>
> >>> OK then just adding the new functions at the end, no other cosmetic
> >> changes. Will update the patch to match this.
> >>> In term of deprecation notice, you are okay with latest draft?
> >>>
> >>> +* bbdev: Will extend the API to support the new operation type
> >>> +``RTE_BBDEV_OP_MLDTS`` as per this `v1
> >>> +<https://patches.dpdk.org/project/dpdk/list/?series=28192>`.
> >>> + This will notably introduce new symbols for
> >>> +``rte_bbdev_dequeue_mldts_ops``, ``rte_bbdev_enqueue_mldts_ops``
> >> into the stuct rte_bbdev.
> >>
> >> This is not needed in the deprecation notice.
> >> If you are willing to announce it, it could be part of the Intel roadmap.
> >>
> >
> > I still see this abi failure as we extend the struct (see below), what is the harm
> in calling it out in the deprecation notice?
> >
> > 1 function with some indirect sub-type change:
> >
> >    [C] 'function rte_bbdev* rte_bbdev_allocate(const char*)' at
> rte_bbdev.c:174:1 has some indirect sub-type changes:
> >      return type changed:
> >        in pointed to type 'struct rte_bbdev' at rte_bbdev.h:498:1:
> >          type size hasn't changed
> >          2 data member insertions:
> >            'rte_bbdev_enqueue_mldts_ops_t enqueue_mldts_ops', at offset 1088
> (in bits) at rte_bbdev.h:527:1
> >            'rte_bbdev_dequeue_mldts_ops_t dequeue_mldts_ops', at offset 1152
> (in bits) at rte_bbdev.h:529:1
> >          no data member changes (12 filtered);
> >
> > Error: ABI issue reported for abidiff --suppr
> > /home-local/jenkins-local/jenkins-agent/workspace/Generic-DPDK-Compile
> > -ABI@2/dpdk/devtools/libabigail.abignore --no-added-syms
> > --headers-dir1 reference/usr/local/include --headers-dir2
> > build_install/usr/local/include
> > reference/usr/local/lib64/librte_bbdev.so.23.0
> > build_install/usr/local/lib64/librte_bbdev.so.23.2
> > ABIDIFF_ABI_CHANGE, this change requires a review (abidiff flagged this as a
> potential issue).
> >
> >>
> >> To be on the safe side, could you try to dynamically link an
> >> application with a DPDK version before this change, then rebuild DPDK
> >> with adding these two fields. Then test with at least 2 devices with
> >> test-bbdev and see if it does not crash or fail?
> >
> > This is not something we would validate really. But I agree the chance of that
> ABI having an actual impact is slim based on the address alignment.
> 
> Bbdev is not only about Intel AFAICS.

Agreed 100% but I have no way to validate on non-Intel architecture or using non-Intel HW. All I can guarantee is that this would be fine on Intel environment based on the warning below. 
Hemant, can you share your view on this? Any concern on the bbdev extension for the new operation (this is similar addition to the FFT one done in 22.11) in your architecture? 
Thanks
Nic

> 
> > Still by process, we can use the abi warning above as a litmus the ABI has some
> minor change.
> > Also we introduce this change in the new LTS version, so unsure this is
> controversial or impactful.
> > Let me know if different opinion.
> 
> Either we are sure we can waive this warning, e.g. by testing it.
> Or we cannot, and in this case we have an ABI break.
> If we are going to have an ABI break, let's do the right thing now and move ops in
> a dedicated struct as suggested by Stephen, David and myself.
> 
> Maxime
> 
> > Thanks
> > Nic
> >
> >
> >>
> >> Thanks,
> >> Maxime
> >>
> >>>
> >>>>
> >>>> Maxime
> >>>>
> >>>>>
> >>>>>>
> >>>>>> Maxime
> >>>>>>
> >>>>>>> What do you think Maxime, David? Based on this I can adjust the
> >>>>>>> change for
> >>>>>> 23.11 and update slightly the deprecation notice accordingly.
> >>>>>>>
> >>>>>>> Thanks
> >>>>>>> Nic
> >>>>>>>
> >>>>>
> >>>
> >


^ permalink raw reply	[relevance 0%]

* Minutes of Technical Board Meeting 2023-06-14
@ 2023-06-16  8:37  5% Richardson, Bruce
  0 siblings, 0 replies; 200+ results
From: Richardson, Bruce @ 2023-06-16  8:37 UTC (permalink / raw)
  To: dev

Attendees
----------
* Aaron
* Bruce
* Hemant
* Honnappa
* Jerin
* Kevin
* Maxime
* Thomas
* Morten
* Tyler
* Nathan
* Akhil
* David M.
* Dave Y.

NOTES:
* Next meeting on 2023-06-28 will be chaired by Hemant


General Updates
================

Documentation Rework
~~~~~~~~~~~~~~~~~~~~~

* Dave Young has started on DPDK project as technical writer
* Bruce and Nathan are currently acting as main points of contact but many
  queries are being handled via the DPDK #doc-rework slack channel
* There is an open invitation to all who wish to help out with
  documentation rework to join this channel - it's not just for TB members

Reviewers for DPDK Summit
~~~~~~~~~~~~~~~~~~~~~~~~~

* The call for papers for the DPDK summit has gone out.
* It is planned to review submissions at the start of July.
* Review panel to be made of tech-board members and others heavily involved
  in the project and regular techboard meeting attendees.

Agenda Discussion
=================

Managing Planned ABI changes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* Reviewed previous discussion on how to manage code changes which break
  ABI ahead of the next ABI-change release
* Decision to generally allow use of NEXT_ABI macro to include changes
  earlier while keeping stability when NEXT_ABI is off (the default)
* Each ABI change needs individual discussion before merging with NEXT_ABI
  to ensure easier or better solutions are not missed.

DPDK API Stability
~~~~~~~~~~~~~~~~~~

Issue raised that, while DPDK has an ABI stability policy, it does not have
an *API* stability policy.

It was suggested we introduce such a stability policy to match that of ABI
one, leading to much discussion.

* A number of people on the call reported feedback from users of the
  difficulty of moving DPDK releases because of API changes i.e. they had
  to change their own code, not just recompile.
* Presenters at previous DPDK conferences reported issues with e.g.
  open-source apps, trying to support multiple releases of DPDK underneath.
  The support requires much use of DPDK version-related ifdefs.
  This contrasts with other projects like VPP or OVS which only support a
  single DPDK release at a time, for the same reason.
* On the other hand, concern was expressed at how the imposition of API
  stability might impact feature delivery. We don't want new features held
  up for long periods.
* It was pointed out that much of our recent API change issues stem from
  cleanup of published macros/enums that don't have proper "RTE" prefixes.
  The hope is that the API will naturally be more stable now that this work
  is nearing completion.
* Beyond API changes specifically, concern was expressed with our current
  releases about:

  - changes of behaviour within functions without an API change, or ABI
    versioning to catch this
  - changes to behaviour or API not being properly documented in release
    notes
  - lack of rigour in our doxygen function documentation, e.g. lack of
    clarity on edge-case behaviour, and specifics of what error codes are
    returned.
  - use of error numbers as return codes, vs use of -1 & errno global, for
    flagging error. [Latter leads to more resiliency, especially when it
    comes to using switch statements for handing the documented error
    values, and a new error return code is added]

* Proposal was made to look at having 1 year API stability policy to match
  that of ABI policy.
* At end of discussion quorum was no longer present and no vote was taken
  on the issue at this point. It will be discussed further at later
  meetings.

---

All other agenda items postponed to a future meeting.

^ permalink raw reply	[relevance 5%]

* Re: [PATCH v1 1/1] doc: announce change in bbdev api related to operation extension
  2023-06-15 19:30  5%                           ` Chautru, Nicolas
@ 2023-06-16  7:36  4%                             ` Maxime Coquelin
  2023-06-16 15:48  0%                               ` Chautru, Nicolas
  0 siblings, 1 reply; 200+ results
From: Maxime Coquelin @ 2023-06-16  7:36 UTC (permalink / raw)
  To: Chautru, Nicolas, David Marchand
  Cc: Stephen Hemminger, dev, Rix, Tom, hemant.agrawal, Vargas, Hernan



On 6/15/23 21:30, Chautru, Nicolas wrote:
> Hi Maxime,
> 
>> -----Original Message-----
>> From: Maxime Coquelin <maxime.coquelin@redhat.com>
>>
>> On 6/14/23 20:18, Chautru, Nicolas wrote:
>>> Hi Maxime,
>>>
>>>> -----Original Message-----
>>>> From: Maxime Coquelin <maxime.coquelin@redhat.com> Hi,
>>>>
>>>> On 6/13/23 19:16, Chautru, Nicolas wrote:
>>>>> Hi Maxime,
>>>>>
>>>>>> -----Original Message-----
>>>>>> From: Maxime Coquelin <maxime.coquelin@redhat.com>
>>>>>
>>>>>>
>>>>>> On 6/12/23 22:53, Chautru, Nicolas wrote:
>>>>>>> Hi Maxime, David,
>>>>>>>
>>>>>>>> -----Original Message-----
>>>>>>>> From: Maxime Coquelin <maxime.coquelin@redhat.com>
>>>>>>>>
>>>>>>>> On 6/6/23 23:01, Chautru, Nicolas wrote:
>>>>>>>>> Hi David,
>>>>>>>>>
>>>>>>>>>> -----Original Message-----
>>>>>>>>>> From: David Marchand <david.marchand@redhat.com>> >> On
>>>> Mon, Jun
>>>>>> 5,
>>>>>>>>>> 2023 at 10:08 PM Chautru, Nicolas <nicolas.chautru@intel.com>
>>>>>>>>>> wrote:
>>>>>>>>>>> Wrt the MLD functions: these are new into the related serie
>>>>>>>>>>> but still the
>>>>>>>>>> break the ABI since the struct rte_bbdev includes these
>>>>>>>>>> functions hence causing offset changes.
>>>>>>>>>>>
>>>>>>>>>>> Should I then just rephrase as:
>>>>>>>>>>>
>>>>>>>>>>> +* bbdev: Will extend the API to support the new operation
>>>>>>>>>>> +type
>>>>>>>>>>>       +``RTE_BBDEV_OP_MLDTS`` as per
>>>>>>>>>>>       +  this `v1
>>>>>>>>>>>
>> +<https://patches.dpdk.org/project/dpdk/list/?series=28192>`.
>>>>>>>>>>> This
>>>>>>>>>>> + will notably introduce  +  new symbols for
>>>>>>>>>>> ``rte_bbdev_dequeue_mldts_ops``,
>>>>>>>>>>> +``rte_bbdev_enqueue_mldts_ops`` into the stuct rte_bbdev.
>>>>>>>>>>
>>>>>>>>>> I don't think we need this deprecation notice.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Do you need to expose those new mldts ops in rte_bbdev?
>>>>>>>>>> Can't they go to dev_ops?
>>>>>>>>>> If you can't, at least moving those new ops at the end of the
>>>>>>>>>> structure would avoid the breakage on rte_bbdev.
>>>>>>>>>
>>>>>>>>> It would probably be best to move all these ops at the end of
>>>>>>>>> the structure
>>>>>>>> (ie. keep them together).
>>>>>>>>> In that case the deprecation notice would call out that the
>>>>>>>>> rte_bbdev
>>>>>>>> structure content is more generally modified. Probably best for
>>>>>>>> the longer run.
>>>>>>>>> David, Maxime, ok with that option?
>>>>>>>>>
>>>>>>>>> struct __rte_cache_aligned rte_bbdev {
>>>>>>>>>           rte_bbdev_enqueue_enc_ops_t enqueue_enc_ops;
>>>>>>>>>           rte_bbdev_enqueue_dec_ops_t enqueue_dec_ops;
>>>>>>>>>           rte_bbdev_dequeue_enc_ops_t dequeue_enc_ops;
>>>>>>>>>           rte_bbdev_dequeue_dec_ops_t dequeue_dec_ops;
>>>>>>>>>           rte_bbdev_enqueue_enc_ops_t enqueue_ldpc_enc_ops;
>>>>>>>>>           rte_bbdev_enqueue_dec_ops_t enqueue_ldpc_dec_ops;
>>>>>>>>>           rte_bbdev_dequeue_enc_ops_t dequeue_ldpc_enc_ops;
>>>>>>>>>           rte_bbdev_dequeue_dec_ops_t dequeue_ldpc_dec_ops;
>>>>>>>>>           rte_bbdev_enqueue_fft_ops_t enqueue_fft_ops;
>>>>>>>>>           rte_bbdev_dequeue_fft_ops_t dequeue_fft_ops;
>>>>>>>>>           const struct rte_bbdev_ops *dev_ops;
>>>>>>>>>           struct rte_bbdev_data *data;
>>>>>>>>>           enum rte_bbdev_state state;
>>>>>>>>>           struct rte_device *device;
>>>>>>>>>           struct rte_bbdev_cb_list list_cbs;
>>>>>>>>>           struct rte_intr_handle *intr_handle;
>>>>>>>>>       };
>>>>>>>>
>>>>>>>> The best thing, as suggested by David, would be to move all the
>>>>>>>> ops out of struct rte_bbdev, as these should not be visible to
>>>>>>>> the
>>>> application.
>>>>>>>
>>>>>>> That would be quite disruptive across all PMDs and possible perf
>>>>>>> impact to
>>>>>> validate. I don’t think this is anywhere realistic to consider such
>>>>>> a change in 23.11.
>>>>>>> I believe moving these function at the end of the structure is a
>>>>>>> good
>>>>>> compromise to avoid future breakage of rte_bbdev structure with
>>>>>> almost seamless impact (purely a ABI break when moving into 23.11
>>>>>> which is not avoidable. Retrospectively we should have done that in
>>>>>> 22.11
>>>> really.
>>>>>>
>>>>>> If we are going to break the ABI, better to do the right rework
>>>>>> directly. Otherwise we'll end-up breaking it again next year.
>>>>>
>>>>> With the suggested change, this will not break ABI next year. Any
>>>>> future
>>>> functions are added at the end of the structure anyway.
>>>>
>>>> I'm not so sure, it depends if adding a new field at the end cross a
>>>> cacheline boundary or not:
>>>>
>>>> /*
>>>>     * Global array of all devices. This is not static because it's used by the
>>>>     * inline enqueue and dequeue functions
>>>>     */
>>>> struct rte_bbdev rte_bbdev_devices[RTE_BBDEV_MAX_DEVS];
>>>>
>>>> If the older inlined functions used by the application retrieve the
>>>> dev pointer from the array directly (they do) and added new fields in
>>>> new version cross a cacheline, then there will be a misalignement
>>>> between the new lib version and the application using the older inlined
>> functions.
>>>>
>>>> ABI-wise, this is not really future proof.
>>>>
>>>>>
>>>>>>
>>>>>> IMHO, moving these ops should be quite trivial and not much work.
>>>>>>
>>>>>> Otherwise, if we just placed the rte_bbdev_dequeue_mldts_ops and
>>>>>> rte_bbdev_enqueue_mldts_ops at the bottom of struct rte_bbdev, it
>>>>>> may not break the ABI, but that's a bit fragile:
>>>>>> - rte_bbdev_devices[] is not static, but is placed in the BSS section so
>>>>>>       should be OK
>>>>>> - struct rte_bbdev is cache-aligned, so it may work if adding these two
>>>>>>       ops do not overlap a cacheline which depends on the CPU
>> architecture.
>>>>>
>>>>> If you prefer to add the only 2 new functions at the end of the
>>>>> structure
>>>> that is okay. I believe it would be cleaner to move all these
>>>> enqueue/dequeue funs down together without drawback I can think of.
>>>> Let me know.
>>>>
>>>> Adding the new ones at the end is not future proof, but at least it
>>>> does not break ABI just for cosmetic reasons (that's a big drawback
>> IMHO).
>>>>
>>>> I just checked using pahole:
>>>>
>>>> struct rte_bbdev {
>>>> 	rte_bbdev_enqueue_enc_ops_t enqueue_enc_ops;     /*     0     8 */
>>>> 	rte_bbdev_enqueue_dec_ops_t enqueue_dec_ops;     /*     8     8 */
>>>> 	rte_bbdev_dequeue_enc_ops_t dequeue_enc_ops;     /*    16     8 */
>>>> 	rte_bbdev_dequeue_dec_ops_t dequeue_dec_ops;     /*    24     8 */
>>>> 	rte_bbdev_enqueue_enc_ops_t enqueue_ldpc_enc_ops; /*    32     8
>>>> */
>>>> 	rte_bbdev_enqueue_dec_ops_t enqueue_ldpc_dec_ops; /*    40     8
>>>> */
>>>> 	rte_bbdev_dequeue_enc_ops_t dequeue_ldpc_enc_ops; /*    48     8
>>>> */
>>>> 	rte_bbdev_dequeue_dec_ops_t dequeue_ldpc_dec_ops; /*    56     8
>>>> */
>>>> 	/* --- cacheline 1 boundary (64 bytes) --- */
>>>> 	rte_bbdev_enqueue_fft_ops_t enqueue_fft_ops;     /*    64     8 */
>>>> 	rte_bbdev_dequeue_fft_ops_t dequeue_fft_ops;     /*    72     8 */
>>>> 	const struct rte_bbdev_ops  * dev_ops;           /*    80     8 */
>>>> 	struct rte_bbdev_data *    data;                 /*    88     8 */
>>>> 	enum rte_bbdev_state       state;                /*    96     4 */
>>>>
>>>> 	/* XXX 4 bytes hole, try to pack */
>>>>
>>>> 	struct rte_device *        device;               /*   104     8 */
>>>> 	struct rte_bbdev_cb_list   list_cbs;             /*   112    16 */
>>>> 	/* --- cacheline 2 boundary (128 bytes) --- */
>>>> 	struct rte_intr_handle *   intr_handle;          /*   128     8 */
>>>>
>>>> 	/* size: 192, cachelines: 3, members: 16 */
>>>> 	/* sum members: 132, holes: 1, sum holes: 4 */
>>>> 	/* padding: 56 */
>>>> } __attribute__((__aligned__(64)));
>>>>
>>>> We're lucky on x86, we still have 56 bytes, so we can add 7 new ops
>>>> at the end before breaking the ABI if I'm not mistaken.
>>>>
>>>> I checked the other architecture, and it seems we don't support any
>>>> with 32B cacheline size so we're good for a while.
>>>
>>> OK then just adding the new functions at the end, no other cosmetic
>> changes. Will update the patch to match this.
>>> In term of deprecation notice, you are okay with latest draft?
>>>
>>> +* bbdev: Will extend the API to support the new operation type
>>> +``RTE_BBDEV_OP_MLDTS`` as per this `v1
>>> +<https://patches.dpdk.org/project/dpdk/list/?series=28192>`.
>>> + This will notably introduce new symbols for
>>> +``rte_bbdev_dequeue_mldts_ops``, ``rte_bbdev_enqueue_mldts_ops``
>> into the stuct rte_bbdev.
>>
>> This is not needed in the deprecation notice.
>> If you are willing to announce it, it could be part of the Intel roadmap.
>>
> 
> I still see this abi failure as we extend the struct (see below), what is the harm in calling it out in the deprecation notice?
> 
> 1 function with some indirect sub-type change:
> 
>    [C] 'function rte_bbdev* rte_bbdev_allocate(const char*)' at rte_bbdev.c:174:1 has some indirect sub-type changes:
>      return type changed:
>        in pointed to type 'struct rte_bbdev' at rte_bbdev.h:498:1:
>          type size hasn't changed
>          2 data member insertions:
>            'rte_bbdev_enqueue_mldts_ops_t enqueue_mldts_ops', at offset 1088 (in bits) at rte_bbdev.h:527:1
>            'rte_bbdev_dequeue_mldts_ops_t dequeue_mldts_ops', at offset 1152 (in bits) at rte_bbdev.h:529:1
>          no data member changes (12 filtered);
> 
> Error: ABI issue reported for abidiff --suppr /home-local/jenkins-local/jenkins-agent/workspace/Generic-DPDK-Compile-ABI@2/dpdk/devtools/libabigail.abignore --no-added-syms --headers-dir1 reference/usr/local/include --headers-dir2 build_install/usr/local/include reference/usr/local/lib64/librte_bbdev.so.23.0 build_install/usr/local/lib64/librte_bbdev.so.23.2
> ABIDIFF_ABI_CHANGE, this change requires a review (abidiff flagged this as a potential issue).
> 
>>
>> To be on the safe side, could you try to dynamically link an application with
>> a DPDK version before this change, then rebuild DPDK with adding these two
>> fields. Then test with at least 2 devices with test-bbdev and see if it does not
>> crash or fail?
> 
> This is not something we would validate really. But I agree the chance of that ABI having an actual impact is slim based on the address alignment.

Bbdev is not only about Intel AFAICS.

> Still by process, we can use the abi warning above as a litmus the ABI has some minor change.
> Also we introduce this change in the new LTS version, so unsure this is controversial or impactful.
> Let me know if different opinion.

Either we are sure we can waive this warning, e.g. by testing it.
Or we cannot, and in this case we have an ABI break.
If we are going to have an ABI break, let's do the right thing now and
move ops in a dedicated struct as suggested by Stephen, David and
myself.

Maxime

> Thanks
> Nic
> 
> 
>>
>> Thanks,
>> Maxime
>>
>>>
>>>>
>>>> Maxime
>>>>
>>>>>
>>>>>>
>>>>>> Maxime
>>>>>>
>>>>>>> What do you think Maxime, David? Based on this I can adjust the
>>>>>>> change for
>>>>>> 23.11 and update slightly the deprecation notice accordingly.
>>>>>>>
>>>>>>> Thanks
>>>>>>> Nic
>>>>>>>
>>>>>
>>>
> 


^ permalink raw reply	[relevance 4%]

* RE: [PATCH v1 1/1] doc: announce change in bbdev api related to operation extension
  2023-06-15  7:52  0%                         ` Maxime Coquelin
@ 2023-06-15 19:30  5%                           ` Chautru, Nicolas
  2023-06-16  7:36  4%                             ` Maxime Coquelin
  0 siblings, 1 reply; 200+ results
From: Chautru, Nicolas @ 2023-06-15 19:30 UTC (permalink / raw)
  To: Maxime Coquelin, David Marchand
  Cc: Stephen Hemminger, dev, Rix, Tom, hemant.agrawal, Vargas, Hernan

Hi Maxime, 

> -----Original Message-----
> From: Maxime Coquelin <maxime.coquelin@redhat.com>
> 
> On 6/14/23 20:18, Chautru, Nicolas wrote:
> > Hi Maxime,
> >
> >> -----Original Message-----
> >> From: Maxime Coquelin <maxime.coquelin@redhat.com> Hi,
> >>
> >> On 6/13/23 19:16, Chautru, Nicolas wrote:
> >>> Hi Maxime,
> >>>
> >>>> -----Original Message-----
> >>>> From: Maxime Coquelin <maxime.coquelin@redhat.com>
> >>>
> >>>>
> >>>> On 6/12/23 22:53, Chautru, Nicolas wrote:
> >>>>> Hi Maxime, David,
> >>>>>
> >>>>>> -----Original Message-----
> >>>>>> From: Maxime Coquelin <maxime.coquelin@redhat.com>
> >>>>>>
> >>>>>> On 6/6/23 23:01, Chautru, Nicolas wrote:
> >>>>>>> Hi David,
> >>>>>>>
> >>>>>>>> -----Original Message-----
> >>>>>>>> From: David Marchand <david.marchand@redhat.com>> >> On
> >> Mon, Jun
> >>>> 5,
> >>>>>>>> 2023 at 10:08 PM Chautru, Nicolas <nicolas.chautru@intel.com>
> >>>>>>>> wrote:
> >>>>>>>>> Wrt the MLD functions: these are new into the related serie
> >>>>>>>>> but still the
> >>>>>>>> break the ABI since the struct rte_bbdev includes these
> >>>>>>>> functions hence causing offset changes.
> >>>>>>>>>
> >>>>>>>>> Should I then just rephrase as:
> >>>>>>>>>
> >>>>>>>>> +* bbdev: Will extend the API to support the new operation
> >>>>>>>>> +type
> >>>>>>>>>      +``RTE_BBDEV_OP_MLDTS`` as per
> >>>>>>>>>      +  this `v1
> >>>>>>>>>
> +<https://patches.dpdk.org/project/dpdk/list/?series=28192>`.
> >>>>>>>>> This
> >>>>>>>>> + will notably introduce  +  new symbols for
> >>>>>>>>> ``rte_bbdev_dequeue_mldts_ops``,
> >>>>>>>>> +``rte_bbdev_enqueue_mldts_ops`` into the stuct rte_bbdev.
> >>>>>>>>
> >>>>>>>> I don't think we need this deprecation notice.
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> Do you need to expose those new mldts ops in rte_bbdev?
> >>>>>>>> Can't they go to dev_ops?
> >>>>>>>> If you can't, at least moving those new ops at the end of the
> >>>>>>>> structure would avoid the breakage on rte_bbdev.
> >>>>>>>
> >>>>>>> It would probably be best to move all these ops at the end of
> >>>>>>> the structure
> >>>>>> (ie. keep them together).
> >>>>>>> In that case the deprecation notice would call out that the
> >>>>>>> rte_bbdev
> >>>>>> structure content is more generally modified. Probably best for
> >>>>>> the longer run.
> >>>>>>> David, Maxime, ok with that option?
> >>>>>>>
> >>>>>>> struct __rte_cache_aligned rte_bbdev {
> >>>>>>>          rte_bbdev_enqueue_enc_ops_t enqueue_enc_ops;
> >>>>>>>          rte_bbdev_enqueue_dec_ops_t enqueue_dec_ops;
> >>>>>>>          rte_bbdev_dequeue_enc_ops_t dequeue_enc_ops;
> >>>>>>>          rte_bbdev_dequeue_dec_ops_t dequeue_dec_ops;
> >>>>>>>          rte_bbdev_enqueue_enc_ops_t enqueue_ldpc_enc_ops;
> >>>>>>>          rte_bbdev_enqueue_dec_ops_t enqueue_ldpc_dec_ops;
> >>>>>>>          rte_bbdev_dequeue_enc_ops_t dequeue_ldpc_enc_ops;
> >>>>>>>          rte_bbdev_dequeue_dec_ops_t dequeue_ldpc_dec_ops;
> >>>>>>>          rte_bbdev_enqueue_fft_ops_t enqueue_fft_ops;
> >>>>>>>          rte_bbdev_dequeue_fft_ops_t dequeue_fft_ops;
> >>>>>>>          const struct rte_bbdev_ops *dev_ops;
> >>>>>>>          struct rte_bbdev_data *data;
> >>>>>>>          enum rte_bbdev_state state;
> >>>>>>>          struct rte_device *device;
> >>>>>>>          struct rte_bbdev_cb_list list_cbs;
> >>>>>>>          struct rte_intr_handle *intr_handle;
> >>>>>>>      };
> >>>>>>
> >>>>>> The best thing, as suggested by David, would be to move all the
> >>>>>> ops out of struct rte_bbdev, as these should not be visible to
> >>>>>> the
> >> application.
> >>>>>
> >>>>> That would be quite disruptive across all PMDs and possible perf
> >>>>> impact to
> >>>> validate. I don’t think this is anywhere realistic to consider such
> >>>> a change in 23.11.
> >>>>> I believe moving these function at the end of the structure is a
> >>>>> good
> >>>> compromise to avoid future breakage of rte_bbdev structure with
> >>>> almost seamless impact (purely a ABI break when moving into 23.11
> >>>> which is not avoidable. Retrospectively we should have done that in
> >>>> 22.11
> >> really.
> >>>>
> >>>> If we are going to break the ABI, better to do the right rework
> >>>> directly. Otherwise we'll end-up breaking it again next year.
> >>>
> >>> With the suggested change, this will not break ABI next year. Any
> >>> future
> >> functions are added at the end of the structure anyway.
> >>
> >> I'm not so sure, it depends if adding a new field at the end cross a
> >> cacheline boundary or not:
> >>
> >> /*
> >>    * Global array of all devices. This is not static because it's used by the
> >>    * inline enqueue and dequeue functions
> >>    */
> >> struct rte_bbdev rte_bbdev_devices[RTE_BBDEV_MAX_DEVS];
> >>
> >> If the older inlined functions used by the application retrieve the
> >> dev pointer from the array directly (they do) and added new fields in
> >> new version cross a cacheline, then there will be a misalignement
> >> between the new lib version and the application using the older inlined
> functions.
> >>
> >> ABI-wise, this is not really future proof.
> >>
> >>>
> >>>>
> >>>> IMHO, moving these ops should be quite trivial and not much work.
> >>>>
> >>>> Otherwise, if we just placed the rte_bbdev_dequeue_mldts_ops and
> >>>> rte_bbdev_enqueue_mldts_ops at the bottom of struct rte_bbdev, it
> >>>> may not break the ABI, but that's a bit fragile:
> >>>> - rte_bbdev_devices[] is not static, but is placed in the BSS section so
> >>>>      should be OK
> >>>> - struct rte_bbdev is cache-aligned, so it may work if adding these two
> >>>>      ops do not overlap a cacheline which depends on the CPU
> architecture.
> >>>
> >>> If you prefer to add the only 2 new functions at the end of the
> >>> structure
> >> that is okay. I believe it would be cleaner to move all these
> >> enqueue/dequeue funs down together without drawback I can think of.
> >> Let me know.
> >>
> >> Adding the new ones at the end is not future proof, but at least it
> >> does not break ABI just for cosmetic reasons (that's a big drawback
> IMHO).
> >>
> >> I just checked using pahole:
> >>
> >> struct rte_bbdev {
> >> 	rte_bbdev_enqueue_enc_ops_t enqueue_enc_ops;     /*     0     8 */
> >> 	rte_bbdev_enqueue_dec_ops_t enqueue_dec_ops;     /*     8     8 */
> >> 	rte_bbdev_dequeue_enc_ops_t dequeue_enc_ops;     /*    16     8 */
> >> 	rte_bbdev_dequeue_dec_ops_t dequeue_dec_ops;     /*    24     8 */
> >> 	rte_bbdev_enqueue_enc_ops_t enqueue_ldpc_enc_ops; /*    32     8
> >> */
> >> 	rte_bbdev_enqueue_dec_ops_t enqueue_ldpc_dec_ops; /*    40     8
> >> */
> >> 	rte_bbdev_dequeue_enc_ops_t dequeue_ldpc_enc_ops; /*    48     8
> >> */
> >> 	rte_bbdev_dequeue_dec_ops_t dequeue_ldpc_dec_ops; /*    56     8
> >> */
> >> 	/* --- cacheline 1 boundary (64 bytes) --- */
> >> 	rte_bbdev_enqueue_fft_ops_t enqueue_fft_ops;     /*    64     8 */
> >> 	rte_bbdev_dequeue_fft_ops_t dequeue_fft_ops;     /*    72     8 */
> >> 	const struct rte_bbdev_ops  * dev_ops;           /*    80     8 */
> >> 	struct rte_bbdev_data *    data;                 /*    88     8 */
> >> 	enum rte_bbdev_state       state;                /*    96     4 */
> >>
> >> 	/* XXX 4 bytes hole, try to pack */
> >>
> >> 	struct rte_device *        device;               /*   104     8 */
> >> 	struct rte_bbdev_cb_list   list_cbs;             /*   112    16 */
> >> 	/* --- cacheline 2 boundary (128 bytes) --- */
> >> 	struct rte_intr_handle *   intr_handle;          /*   128     8 */
> >>
> >> 	/* size: 192, cachelines: 3, members: 16 */
> >> 	/* sum members: 132, holes: 1, sum holes: 4 */
> >> 	/* padding: 56 */
> >> } __attribute__((__aligned__(64)));
> >>
> >> We're lucky on x86, we still have 56 bytes, so we can add 7 new ops
> >> at the end before breaking the ABI if I'm not mistaken.
> >>
> >> I checked the other architecture, and it seems we don't support any
> >> with 32B cacheline size so we're good for a while.
> >
> > OK then just adding the new functions at the end, no other cosmetic
> changes. Will update the patch to match this.
> > In term of deprecation notice, you are okay with latest draft?
> >
> > +* bbdev: Will extend the API to support the new operation type
> > +``RTE_BBDEV_OP_MLDTS`` as per this `v1
> > +<https://patches.dpdk.org/project/dpdk/list/?series=28192>`.
> > + This will notably introduce new symbols for
> > +``rte_bbdev_dequeue_mldts_ops``, ``rte_bbdev_enqueue_mldts_ops``
> into the stuct rte_bbdev.
> 
> This is not needed in the deprecation notice.
> If you are willing to announce it, it could be part of the Intel roadmap.
> 

I still see this abi failure as we extend the struct (see below), what is the harm in calling it out in the deprecation notice? 

1 function with some indirect sub-type change:

  [C] 'function rte_bbdev* rte_bbdev_allocate(const char*)' at rte_bbdev.c:174:1 has some indirect sub-type changes:
    return type changed:
      in pointed to type 'struct rte_bbdev' at rte_bbdev.h:498:1:
        type size hasn't changed
        2 data member insertions:
          'rte_bbdev_enqueue_mldts_ops_t enqueue_mldts_ops', at offset 1088 (in bits) at rte_bbdev.h:527:1
          'rte_bbdev_dequeue_mldts_ops_t dequeue_mldts_ops', at offset 1152 (in bits) at rte_bbdev.h:529:1
        no data member changes (12 filtered);

Error: ABI issue reported for abidiff --suppr /home-local/jenkins-local/jenkins-agent/workspace/Generic-DPDK-Compile-ABI@2/dpdk/devtools/libabigail.abignore --no-added-syms --headers-dir1 reference/usr/local/include --headers-dir2 build_install/usr/local/include reference/usr/local/lib64/librte_bbdev.so.23.0 build_install/usr/local/lib64/librte_bbdev.so.23.2
ABIDIFF_ABI_CHANGE, this change requires a review (abidiff flagged this as a potential issue).

> 
> To be on the safe side, could you try to dynamically link an application with
> a DPDK version before this change, then rebuild DPDK with adding these two
> fields. Then test with at least 2 devices with test-bbdev and see if it does not
> crash or fail?

This is not something we would validate really. But I agree the chance of that ABI having an actual impact is slim based on the address alignment. 
Still by process, we can use the abi warning above as a litmus the ABI has some minor change. 
Also we introduce this change in the new LTS version, so unsure this is controversial or impactful. 
Let me know if different opinion. 

Thanks
Nic


> 
> Thanks,
> Maxime
> 
> >
> >>
> >> Maxime
> >>
> >>>
> >>>>
> >>>> Maxime
> >>>>
> >>>>> What do you think Maxime, David? Based on this I can adjust the
> >>>>> change for
> >>>> 23.11 and update slightly the deprecation notice accordingly.
> >>>>>
> >>>>> Thanks
> >>>>> Nic
> >>>>>
> >>>
> >


^ permalink raw reply	[relevance 5%]

* DPDK Release Status Meeting 2023-06-15
@ 2023-06-15 17:59  3% Mcnamara, John
  0 siblings, 0 replies; 200+ results
From: Mcnamara, John @ 2023-06-15 17:59 UTC (permalink / raw)
  To: dev; +Cc: thomas, david.marchand

[-- Attachment #1: Type: text/plain, Size: 3005 bytes --]

Release status meeting minutes 2023-06-15
=========================================

Agenda:
* Release Dates
* Subtrees
* Roadmaps
* LTS
* Defects
* Opens

Participants:
* AMD
* ARM
* Debian/Microsoft
* Intel
* Marvell
* Nvidia
* Red Hat


Release Dates
-------------

The following are the proposed current dates for 23.07:

* V1:      22 April 2023
* RC1:     13  June 2023
* RC2:     23  June 2023 - Moved from 21
* RC3:     30  June 2023 - Moved from 28
* Release: 12  July 2023


Subtrees
--------

* next-net
  * Looking at larger patches from SFC and Netronome.

* next-net-intel
  * Mostly merged for RC1.

* next-net-mlx
  * No update.

* next-net-mvl
  * 20 patches merged and ready for RC2.

* next-eventdev
  * 3 patches merged and ready for RC2.

* next-baseband
  * Some discussion on API/ABI changes in BBDev.

* next-virtio
  * Some patches, mostly fixes, under review.
  * Majority of the larger features merged in RC1.

* next-crypto
  * Comments on some of the patches for RC2: needs review
    * MLX5 crypto driver.
    * OpenSSL and QAT: from Kai
  * Some compilations issue on IPsecMB blocking merge.

* main
  * RC1 is out.
  * Graph series has a new revision.
  * Meson build script updates.
  * Patch from Bruce on tracing/logging
  * PCIe maintainership

  * Overall we need more maintainers and/or more trees
    * Trees for graph and pipeline
    * Tree for core and other




Proposed Schedule for 2023
--------------------------

See also http://core.dpdk.org/roadmap/#dates

23.07
  * Proposal deadline (RFC/v1 patches): 22 April 2023
  * API freeze (-rc1): 7 June 2023
  * PMD features freeze (-rc2): 23 June 2023
  * Builtin applications features freeze (-rc3): 30 June 2023
  * Release: 12 July 2023

23.11
  * Proposal deadline (RFC/v1 patches): 12 August 2023
  * API freeze (-rc1): 29 September 2023
  * PMD features freeze (-rc2): 20 October 2023
  * Builtin applications features freeze (-rc3): 27 October 2023
  * Release: 15 November 2023


LTS
---

Backporting in progress.

Next LTS releases:

* 22.11.2
* 21.11.5
* 20.11.9
* 19.11.15
  * Will be updated with CVE and critical fixes only.


* Distros
  * v22.11 in Debian 12
  * Ubuntu 22.04-LTS contains 21.11
  * Ubuntu 23.04 contains 22.11

Defects
-------

* Bugzilla links, 'Bugs',  added for hosted projects
  * https://www.dpdk.org/hosted-projects/


Opens
-----

* None


DPDK Release Status Meetings
----------------------------

The DPDK Release Status Meeting is intended for DPDK Committers to discuss the
status of the master tree and sub-trees, and for project managers to track
progress or milestone dates.

The meeting occurs on every Thursday at 9:30 UTC over Jitsi on https://meet.jit.si/DPDK

You don't need an invite to join the meeting but if you want a calendar reminder just
send an email to "John McNamara john.mcnamara@intel.com" for the invite.

[-- Attachment #2: Type: text/html, Size: 16270 bytes --]

^ permalink raw reply	[relevance 3%]

* [PATCH v2 5/5] devtools: ignore changes into bbdev experimental API
  2023-06-15 16:48  5% [PATCH v2 0/5] bbdev: API extension for 23.11 Nicolas Chautru
@ 2023-06-15 16:49  8% ` Nicolas Chautru
  2023-07-17 22:28  0% ` [PATCH v2 0/5] bbdev: API extension for 23.11 Chautru, Nicolas
  2023-07-18  9:18  0% ` Hemant Agrawal
  2 siblings, 0 replies; 200+ results
From: Nicolas Chautru @ 2023-06-15 16:49 UTC (permalink / raw)
  To: dev, maxime.coquelin
  Cc: trix, hemant.agrawal, david.marchand, hernan.vargas, Nicolas Chautru

Developpers are warned that the related fft experimental functions
do not preserve ABI, hence these can be waived.

Signed-off-by: Nicolas Chautru <nicolas.chautru@intel.com>
---
 devtools/libabigail.abignore | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/devtools/libabigail.abignore b/devtools/libabigail.abignore
index 7a93de3ba1..09b8f156b5 100644
--- a/devtools/libabigail.abignore
+++ b/devtools/libabigail.abignore
@@ -30,7 +30,9 @@
 [suppress_type]
         type_kind = enum
         changed_enumerators = RTE_CRYPTO_ASYM_XFORM_ECPM, RTE_CRYPTO_ASYM_XFORM_TYPE_LIST_END
-
+; Ignore changes to bbdev FFT API which is experimental
+[suppress_type]
+        name = rte_bbdev_fft_op
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; Temporary exceptions till next major ABI version ;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-- 
2.34.1


^ permalink raw reply	[relevance 8%]

* [PATCH v2 0/5] bbdev: API extension for 23.11
@ 2023-06-15 16:48  5% Nicolas Chautru
  2023-06-15 16:49  8% ` [PATCH v2 5/5] devtools: ignore changes into bbdev experimental API Nicolas Chautru
                   ` (2 more replies)
  0 siblings, 3 replies; 200+ results
From: Nicolas Chautru @ 2023-06-15 16:48 UTC (permalink / raw)
  To: dev, maxime.coquelin
  Cc: trix, hemant.agrawal, david.marchand, hernan.vargas, Nicolas Chautru

v2: moving the new mld functions at the end of struct rte_bbdev to avoid
ABI offset changes based on feedback with Maxime.
Adding a commit to waive the FFT ABI warning since that experimental function
could break ABI (let me know if preferred to be merged with the FFT
commit causing the FFT change). 


Including v1 for extending the bbdev api for 23.11.
The new MLD-TS is expected to be non ABI compatible, the other ones
should not break ABI. 
I will send a deprecation notice in parallel.

This introduces a new operation (on top of FEC and FFT) to support
equalization for MLD-TS. There also more modular API extension for
existing FFT and FEC operation. 

Thanks
Nic


Nicolas Chautru (5):
  bbdev: add operation type for MLDTS procession
  bbdev: add new capabilities for FFT processing
  bbdev: add new capability for FEC 5G UL processing
  bbdev: improving error handling for queue configuration
  devtools: ignore changes into bbdev experimental API

 devtools/libabigail.abignore    |   4 +-
 doc/guides/prog_guide/bbdev.rst |  83 ++++++++++++++++++
 lib/bbdev/rte_bbdev.c           |  26 +++---
 lib/bbdev/rte_bbdev.h           |  76 +++++++++++++++++
 lib/bbdev/rte_bbdev_op.h        | 143 +++++++++++++++++++++++++++++++-
 lib/bbdev/version.map           |   5 ++
 6 files changed, 323 insertions(+), 14 deletions(-)

-- 
2.34.1


^ permalink raw reply	[relevance 5%]

* [PATCH v5] build: prevent accidentally building without NUMA support
  2023-06-13 16:58  4% [PATCH v3] build: prevent accidentally building without NUMA support Bruce Richardson
  2023-06-13 17:08  4% ` [PATCH v4] " Bruce Richardson
@ 2023-06-15 14:38  4% ` Bruce Richardson
  1 sibling, 0 replies; 200+ results
From: Bruce Richardson @ 2023-06-15 14:38 UTC (permalink / raw)
  To: dev; +Cc: Bruce Richardson, David Marchand

When libnuma development package is missing on a system, DPDK can still
be built but will be missing much-needed support for NUMA memory
management. This may later cause issues at runtime if the resulting
binary is run on a NUMA system.

We can reduce the incidence of such runtime errors by ensuring that, for
native builds*, libnuma is present - unless the user actually specifies
via "max_numa_nodes" that they don't require NUMA support. Having this
as an error condition is also in keeping with what is documented in the
Linux GSG doc, where libnuma is listed as a requirement for building
DPDK [1].

* NOTE: cross-compilation builds have a different logic set, with a
  separate "numa" value indicating if numa support is necessary.

[1] https://doc.dpdk.org/guides-23.03/linux_gsg/sys_reqs.html

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Signed-off-by: David Marchand <david.marchand@redhat.com>

---
V5: Rebase on main, since dependencies merged

V4: Add Depends-on tag so CI picks up dependency

V3:
- install 32-bit libnuma packages on CI systems [thanks to David
  for the changes]
- split the patch out of the previous patchset, so it can be tracked
  separately from the more minor fixup changes.

V2: Limit check to linux only
---
 .github/workflows/build.yml | 5 ++++-
 config/meson.build          | 9 +++++++++
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 3b629fcdbd..a479783bbc 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -91,6 +91,9 @@ jobs:
       with:
         path: reference
         key: ${{ steps.get_ref_keys.outputs.abi }}
+    - name: Configure i386 architecture
+      if: env.BUILD_32BIT == 'true'
+      run: sudo dpkg --add-architecture i386
     - name: Update APT cache
       run: sudo apt update || true
     - name: Install packages
@@ -104,7 +107,7 @@ jobs:
         pkg-config
     - name: Install i386 cross compiling packages
       if: env.BUILD_32BIT == 'true'
-      run: sudo apt install -y gcc-multilib g++-multilib
+      run: sudo apt install -y gcc-multilib g++-multilib libnuma-dev:i386
     - name: Install aarch64 cross compiling packages
       if: env.AARCH64 == 'true'
       run: sudo apt install -y crossbuild-essential-arm64
diff --git a/config/meson.build b/config/meson.build
index 22d7d908b7..d8223718e4 100644
--- a/config/meson.build
+++ b/config/meson.build
@@ -381,6 +381,15 @@ endif
 if not dpdk_conf.has('RTE_MAX_NUMA_NODES')
     error('Number of NUMA nodes not specified.')
 endif
+if (is_linux and
+        dpdk_conf.get('RTE_MAX_NUMA_NODES') > 1 and
+        not meson.is_cross_build() and
+        not has_libnuma)
+    error('''
+No NUMA library (development package) found, yet DPDK configured for multiple NUMA nodes.
+Please install libnuma, or set 'max_numa_nodes' option to '1' to build without NUMA support.
+''')
+endif
 
 # set the install path for the drivers
 dpdk_conf.set_quoted('RTE_EAL_PMD_PATH', eal_pmd_path)
-- 
2.39.2


^ permalink raw reply	[relevance 4%]

* Re: [PATCH v1 1/1] doc: announce change in bbdev api related to operation extension
  2023-06-14 18:18  0%                       ` Chautru, Nicolas
@ 2023-06-15  7:52  0%                         ` Maxime Coquelin
  2023-06-15 19:30  5%                           ` Chautru, Nicolas
  0 siblings, 1 reply; 200+ results
From: Maxime Coquelin @ 2023-06-15  7:52 UTC (permalink / raw)
  To: Chautru, Nicolas, David Marchand
  Cc: Stephen Hemminger, dev, Rix, Tom, hemant.agrawal, Vargas, Hernan



On 6/14/23 20:18, Chautru, Nicolas wrote:
> Hi Maxime,
> 
>> -----Original Message-----
>> From: Maxime Coquelin <maxime.coquelin@redhat.com>
>> Hi,
>>
>> On 6/13/23 19:16, Chautru, Nicolas wrote:
>>> Hi Maxime,
>>>
>>>> -----Original Message-----
>>>> From: Maxime Coquelin <maxime.coquelin@redhat.com>
>>>
>>>>
>>>> On 6/12/23 22:53, Chautru, Nicolas wrote:
>>>>> Hi Maxime, David,
>>>>>
>>>>>> -----Original Message-----
>>>>>> From: Maxime Coquelin <maxime.coquelin@redhat.com>
>>>>>>
>>>>>> On 6/6/23 23:01, Chautru, Nicolas wrote:
>>>>>>> Hi David,
>>>>>>>
>>>>>>>> -----Original Message-----
>>>>>>>> From: David Marchand <david.marchand@redhat.com>> >> On
>> Mon, Jun
>>>> 5,
>>>>>>>> 2023 at 10:08 PM Chautru, Nicolas <nicolas.chautru@intel.com>
>>>>>>>> wrote:
>>>>>>>>> Wrt the MLD functions: these are new into the related serie but
>>>>>>>>> still the
>>>>>>>> break the ABI since the struct rte_bbdev includes these functions
>>>>>>>> hence causing offset changes.
>>>>>>>>>
>>>>>>>>> Should I then just rephrase as:
>>>>>>>>>
>>>>>>>>> +* bbdev: Will extend the API to support the new operation type
>>>>>>>>>      +``RTE_BBDEV_OP_MLDTS`` as per
>>>>>>>>>      +  this `v1
>>>>>>>>>      +<https://patches.dpdk.org/project/dpdk/list/?series=28192>`.
>>>>>>>>> This
>>>>>>>>> + will notably introduce  +  new symbols for
>>>>>>>>> ``rte_bbdev_dequeue_mldts_ops``,
>>>>>>>>> +``rte_bbdev_enqueue_mldts_ops`` into the stuct rte_bbdev.
>>>>>>>>
>>>>>>>> I don't think we need this deprecation notice.
>>>>>>>>
>>>>>>>>
>>>>>>>> Do you need to expose those new mldts ops in rte_bbdev?
>>>>>>>> Can't they go to dev_ops?
>>>>>>>> If you can't, at least moving those new ops at the end of the
>>>>>>>> structure would avoid the breakage on rte_bbdev.
>>>>>>>
>>>>>>> It would probably be best to move all these ops at the end of the
>>>>>>> structure
>>>>>> (ie. keep them together).
>>>>>>> In that case the deprecation notice would call out that the
>>>>>>> rte_bbdev
>>>>>> structure content is more generally modified. Probably best for the
>>>>>> longer run.
>>>>>>> David, Maxime, ok with that option?
>>>>>>>
>>>>>>> struct __rte_cache_aligned rte_bbdev {
>>>>>>>          rte_bbdev_enqueue_enc_ops_t enqueue_enc_ops;
>>>>>>>          rte_bbdev_enqueue_dec_ops_t enqueue_dec_ops;
>>>>>>>          rte_bbdev_dequeue_enc_ops_t dequeue_enc_ops;
>>>>>>>          rte_bbdev_dequeue_dec_ops_t dequeue_dec_ops;
>>>>>>>          rte_bbdev_enqueue_enc_ops_t enqueue_ldpc_enc_ops;
>>>>>>>          rte_bbdev_enqueue_dec_ops_t enqueue_ldpc_dec_ops;
>>>>>>>          rte_bbdev_dequeue_enc_ops_t dequeue_ldpc_enc_ops;
>>>>>>>          rte_bbdev_dequeue_dec_ops_t dequeue_ldpc_dec_ops;
>>>>>>>          rte_bbdev_enqueue_fft_ops_t enqueue_fft_ops;
>>>>>>>          rte_bbdev_dequeue_fft_ops_t dequeue_fft_ops;
>>>>>>>          const struct rte_bbdev_ops *dev_ops;
>>>>>>>          struct rte_bbdev_data *data;
>>>>>>>          enum rte_bbdev_state state;
>>>>>>>          struct rte_device *device;
>>>>>>>          struct rte_bbdev_cb_list list_cbs;
>>>>>>>          struct rte_intr_handle *intr_handle;
>>>>>>>      };
>>>>>>
>>>>>> The best thing, as suggested by David, would be to move all the ops
>>>>>> out of struct rte_bbdev, as these should not be visible to the
>> application.
>>>>>
>>>>> That would be quite disruptive across all PMDs and possible perf
>>>>> impact to
>>>> validate. I don’t think this is anywhere realistic to consider such a
>>>> change in 23.11.
>>>>> I believe moving these function at the end of the structure is a
>>>>> good
>>>> compromise to avoid future breakage of rte_bbdev structure with
>>>> almost seamless impact (purely a ABI break when moving into 23.11
>>>> which is not avoidable. Retrospectively we should have done that in 22.11
>> really.
>>>>
>>>> If we are going to break the ABI, better to do the right rework
>>>> directly. Otherwise we'll end-up breaking it again next year.
>>>
>>> With the suggested change, this will not break ABI next year. Any future
>> functions are added at the end of the structure anyway.
>>
>> I'm not so sure, it depends if adding a new field at the end cross a cacheline
>> boundary or not:
>>
>> /*
>>    * Global array of all devices. This is not static because it's used by the
>>    * inline enqueue and dequeue functions
>>    */
>> struct rte_bbdev rte_bbdev_devices[RTE_BBDEV_MAX_DEVS];
>>
>> If the older inlined functions used by the application retrieve the dev pointer
>> from the array directly (they do) and added new fields in new version cross
>> a cacheline, then there will be a misalignement between the new lib version
>> and the application using the older inlined functions.
>>
>> ABI-wise, this is not really future proof.
>>
>>>
>>>>
>>>> IMHO, moving these ops should be quite trivial and not much work.
>>>>
>>>> Otherwise, if we just placed the rte_bbdev_dequeue_mldts_ops and
>>>> rte_bbdev_enqueue_mldts_ops at the bottom of struct rte_bbdev, it may
>>>> not break the ABI, but that's a bit fragile:
>>>> - rte_bbdev_devices[] is not static, but is placed in the BSS section so
>>>>      should be OK
>>>> - struct rte_bbdev is cache-aligned, so it may work if adding these two
>>>>      ops do not overlap a cacheline which depends on the CPU architecture.
>>>
>>> If you prefer to add the only 2 new functions at the end of the structure
>> that is okay. I believe it would be cleaner to move all these
>> enqueue/dequeue funs down together without drawback I can think of. Let
>> me know.
>>
>> Adding the new ones at the end is not future proof, but at least it does not
>> break ABI just for cosmetic reasons (that's a big drawback IMHO).
>>
>> I just checked using pahole:
>>
>> struct rte_bbdev {
>> 	rte_bbdev_enqueue_enc_ops_t enqueue_enc_ops;     /*     0     8 */
>> 	rte_bbdev_enqueue_dec_ops_t enqueue_dec_ops;     /*     8     8 */
>> 	rte_bbdev_dequeue_enc_ops_t dequeue_enc_ops;     /*    16     8 */
>> 	rte_bbdev_dequeue_dec_ops_t dequeue_dec_ops;     /*    24     8 */
>> 	rte_bbdev_enqueue_enc_ops_t enqueue_ldpc_enc_ops; /*    32     8
>> */
>> 	rte_bbdev_enqueue_dec_ops_t enqueue_ldpc_dec_ops; /*    40     8
>> */
>> 	rte_bbdev_dequeue_enc_ops_t dequeue_ldpc_enc_ops; /*    48     8
>> */
>> 	rte_bbdev_dequeue_dec_ops_t dequeue_ldpc_dec_ops; /*    56     8
>> */
>> 	/* --- cacheline 1 boundary (64 bytes) --- */
>> 	rte_bbdev_enqueue_fft_ops_t enqueue_fft_ops;     /*    64     8 */
>> 	rte_bbdev_dequeue_fft_ops_t dequeue_fft_ops;     /*    72     8 */
>> 	const struct rte_bbdev_ops  * dev_ops;           /*    80     8 */
>> 	struct rte_bbdev_data *    data;                 /*    88     8 */
>> 	enum rte_bbdev_state       state;                /*    96     4 */
>>
>> 	/* XXX 4 bytes hole, try to pack */
>>
>> 	struct rte_device *        device;               /*   104     8 */
>> 	struct rte_bbdev_cb_list   list_cbs;             /*   112    16 */
>> 	/* --- cacheline 2 boundary (128 bytes) --- */
>> 	struct rte_intr_handle *   intr_handle;          /*   128     8 */
>>
>> 	/* size: 192, cachelines: 3, members: 16 */
>> 	/* sum members: 132, holes: 1, sum holes: 4 */
>> 	/* padding: 56 */
>> } __attribute__((__aligned__(64)));
>>
>> We're lucky on x86, we still have 56 bytes, so we can add 7 new ops at the
>> end before breaking the ABI if I'm not mistaken.
>>
>> I checked the other architecture, and it seems we don't support any with
>> 32B cacheline size so we're good for a while.
> 
> OK then just adding the new functions at the end, no other cosmetic changes. Will update the patch to match this.
> In term of deprecation notice, you are okay with latest draft?
> 
> +* bbdev: Will extend the API to support the new operation type
> +``RTE_BBDEV_OP_MLDTS`` as per this `v1
> +<https://patches.dpdk.org/project/dpdk/list/?series=28192>`.
> + This will notably introduce new symbols for  ``rte_bbdev_dequeue_mldts_ops``,
> +``rte_bbdev_enqueue_mldts_ops`` into the stuct rte_bbdev.

This is not needed in the deprecation notice.
If you are willing to announce it, it could be part of the Intel
roadmap.

To be on the safe side, could you try to dynamically link an application
with a DPDK version before this change, then rebuild DPDK with adding
these two fields. Then test with at least 2 devices with test-bbdev and
see if it does not crash or fail?

Thanks,
Maxime

> 
>>
>> Maxime
>>
>>>
>>>>
>>>> Maxime
>>>>
>>>>> What do you think Maxime, David? Based on this I can adjust the
>>>>> change for
>>>> 23.11 and update slightly the deprecation notice accordingly.
>>>>>
>>>>> Thanks
>>>>> Nic
>>>>>
>>>
> 


^ permalink raw reply	[relevance 0%]

* RE: [PATCH v1 1/1] doc: announce change in bbdev api related to operation extension
  2023-06-13 20:00  4%                     ` Maxime Coquelin
  2023-06-13 21:22  3%                       ` Stephen Hemminger
@ 2023-06-14 18:18  0%                       ` Chautru, Nicolas
  2023-06-15  7:52  0%                         ` Maxime Coquelin
  1 sibling, 1 reply; 200+ results
From: Chautru, Nicolas @ 2023-06-14 18:18 UTC (permalink / raw)
  To: Maxime Coquelin, David Marchand
  Cc: Stephen Hemminger, dev, Rix, Tom, hemant.agrawal, Vargas, Hernan

Hi Maxime, 

> -----Original Message-----
> From: Maxime Coquelin <maxime.coquelin@redhat.com>
> Hi,
> 
> On 6/13/23 19:16, Chautru, Nicolas wrote:
> > Hi Maxime,
> >
> >> -----Original Message-----
> >> From: Maxime Coquelin <maxime.coquelin@redhat.com>
> >
> >>
> >> On 6/12/23 22:53, Chautru, Nicolas wrote:
> >>> Hi Maxime, David,
> >>>
> >>>> -----Original Message-----
> >>>> From: Maxime Coquelin <maxime.coquelin@redhat.com>
> >>>>
> >>>> On 6/6/23 23:01, Chautru, Nicolas wrote:
> >>>>> Hi David,
> >>>>>
> >>>>>> -----Original Message-----
> >>>>>> From: David Marchand <david.marchand@redhat.com>> >> On
> Mon, Jun
> >> 5,
> >>>>>> 2023 at 10:08 PM Chautru, Nicolas <nicolas.chautru@intel.com>
> >>>>>> wrote:
> >>>>>>> Wrt the MLD functions: these are new into the related serie but
> >>>>>>> still the
> >>>>>> break the ABI since the struct rte_bbdev includes these functions
> >>>>>> hence causing offset changes.
> >>>>>>>
> >>>>>>> Should I then just rephrase as:
> >>>>>>>
> >>>>>>> +* bbdev: Will extend the API to support the new operation type
> >>>>>>>     +``RTE_BBDEV_OP_MLDTS`` as per
> >>>>>>>     +  this `v1
> >>>>>>>     +<https://patches.dpdk.org/project/dpdk/list/?series=28192>`.
> >>>>>>> This
> >>>>>>> + will notably introduce  +  new symbols for
> >>>>>>> ``rte_bbdev_dequeue_mldts_ops``,
> >>>>>>> +``rte_bbdev_enqueue_mldts_ops`` into the stuct rte_bbdev.
> >>>>>>
> >>>>>> I don't think we need this deprecation notice.
> >>>>>>
> >>>>>>
> >>>>>> Do you need to expose those new mldts ops in rte_bbdev?
> >>>>>> Can't they go to dev_ops?
> >>>>>> If you can't, at least moving those new ops at the end of the
> >>>>>> structure would avoid the breakage on rte_bbdev.
> >>>>>
> >>>>> It would probably be best to move all these ops at the end of the
> >>>>> structure
> >>>> (ie. keep them together).
> >>>>> In that case the deprecation notice would call out that the
> >>>>> rte_bbdev
> >>>> structure content is more generally modified. Probably best for the
> >>>> longer run.
> >>>>> David, Maxime, ok with that option?
> >>>>>
> >>>>> struct __rte_cache_aligned rte_bbdev {
> >>>>>         rte_bbdev_enqueue_enc_ops_t enqueue_enc_ops;
> >>>>>         rte_bbdev_enqueue_dec_ops_t enqueue_dec_ops;
> >>>>>         rte_bbdev_dequeue_enc_ops_t dequeue_enc_ops;
> >>>>>         rte_bbdev_dequeue_dec_ops_t dequeue_dec_ops;
> >>>>>         rte_bbdev_enqueue_enc_ops_t enqueue_ldpc_enc_ops;
> >>>>>         rte_bbdev_enqueue_dec_ops_t enqueue_ldpc_dec_ops;
> >>>>>         rte_bbdev_dequeue_enc_ops_t dequeue_ldpc_enc_ops;
> >>>>>         rte_bbdev_dequeue_dec_ops_t dequeue_ldpc_dec_ops;
> >>>>>         rte_bbdev_enqueue_fft_ops_t enqueue_fft_ops;
> >>>>>         rte_bbdev_dequeue_fft_ops_t dequeue_fft_ops;
> >>>>>         const struct rte_bbdev_ops *dev_ops;
> >>>>>         struct rte_bbdev_data *data;
> >>>>>         enum rte_bbdev_state state;
> >>>>>         struct rte_device *device;
> >>>>>         struct rte_bbdev_cb_list list_cbs;
> >>>>>         struct rte_intr_handle *intr_handle;
> >>>>>     };
> >>>>
> >>>> The best thing, as suggested by David, would be to move all the ops
> >>>> out of struct rte_bbdev, as these should not be visible to the
> application.
> >>>
> >>> That would be quite disruptive across all PMDs and possible perf
> >>> impact to
> >> validate. I don’t think this is anywhere realistic to consider such a
> >> change in 23.11.
> >>> I believe moving these function at the end of the structure is a
> >>> good
> >> compromise to avoid future breakage of rte_bbdev structure with
> >> almost seamless impact (purely a ABI break when moving into 23.11
> >> which is not avoidable. Retrospectively we should have done that in 22.11
> really.
> >>
> >> If we are going to break the ABI, better to do the right rework
> >> directly. Otherwise we'll end-up breaking it again next year.
> >
> > With the suggested change, this will not break ABI next year. Any future
> functions are added at the end of the structure anyway.
> 
> I'm not so sure, it depends if adding a new field at the end cross a cacheline
> boundary or not:
> 
> /*
>   * Global array of all devices. This is not static because it's used by the
>   * inline enqueue and dequeue functions
>   */
> struct rte_bbdev rte_bbdev_devices[RTE_BBDEV_MAX_DEVS];
> 
> If the older inlined functions used by the application retrieve the dev pointer
> from the array directly (they do) and added new fields in new version cross
> a cacheline, then there will be a misalignement between the new lib version
> and the application using the older inlined functions.
> 
> ABI-wise, this is not really future proof.
> 
> >
> >>
> >> IMHO, moving these ops should be quite trivial and not much work.
> >>
> >> Otherwise, if we just placed the rte_bbdev_dequeue_mldts_ops and
> >> rte_bbdev_enqueue_mldts_ops at the bottom of struct rte_bbdev, it may
> >> not break the ABI, but that's a bit fragile:
> >> - rte_bbdev_devices[] is not static, but is placed in the BSS section so
> >>     should be OK
> >> - struct rte_bbdev is cache-aligned, so it may work if adding these two
> >>     ops do not overlap a cacheline which depends on the CPU architecture.
> >
> > If you prefer to add the only 2 new functions at the end of the structure
> that is okay. I believe it would be cleaner to move all these
> enqueue/dequeue funs down together without drawback I can think of. Let
> me know.
> 
> Adding the new ones at the end is not future proof, but at least it does not
> break ABI just for cosmetic reasons (that's a big drawback IMHO).
> 
> I just checked using pahole:
> 
> struct rte_bbdev {
> 	rte_bbdev_enqueue_enc_ops_t enqueue_enc_ops;     /*     0     8 */
> 	rte_bbdev_enqueue_dec_ops_t enqueue_dec_ops;     /*     8     8 */
> 	rte_bbdev_dequeue_enc_ops_t dequeue_enc_ops;     /*    16     8 */
> 	rte_bbdev_dequeue_dec_ops_t dequeue_dec_ops;     /*    24     8 */
> 	rte_bbdev_enqueue_enc_ops_t enqueue_ldpc_enc_ops; /*    32     8
> */
> 	rte_bbdev_enqueue_dec_ops_t enqueue_ldpc_dec_ops; /*    40     8
> */
> 	rte_bbdev_dequeue_enc_ops_t dequeue_ldpc_enc_ops; /*    48     8
> */
> 	rte_bbdev_dequeue_dec_ops_t dequeue_ldpc_dec_ops; /*    56     8
> */
> 	/* --- cacheline 1 boundary (64 bytes) --- */
> 	rte_bbdev_enqueue_fft_ops_t enqueue_fft_ops;     /*    64     8 */
> 	rte_bbdev_dequeue_fft_ops_t dequeue_fft_ops;     /*    72     8 */
> 	const struct rte_bbdev_ops  * dev_ops;           /*    80     8 */
> 	struct rte_bbdev_data *    data;                 /*    88     8 */
> 	enum rte_bbdev_state       state;                /*    96     4 */
> 
> 	/* XXX 4 bytes hole, try to pack */
> 
> 	struct rte_device *        device;               /*   104     8 */
> 	struct rte_bbdev_cb_list   list_cbs;             /*   112    16 */
> 	/* --- cacheline 2 boundary (128 bytes) --- */
> 	struct rte_intr_handle *   intr_handle;          /*   128     8 */
> 
> 	/* size: 192, cachelines: 3, members: 16 */
> 	/* sum members: 132, holes: 1, sum holes: 4 */
> 	/* padding: 56 */
> } __attribute__((__aligned__(64)));
> 
> We're lucky on x86, we still have 56 bytes, so we can add 7 new ops at the
> end before breaking the ABI if I'm not mistaken.
> 
> I checked the other architecture, and it seems we don't support any with
> 32B cacheline size so we're good for a while.

OK then just adding the new functions at the end, no other cosmetic changes. Will update the patch to match this. 
In term of deprecation notice, you are okay with latest draft?

+* bbdev: Will extend the API to support the new operation type
+``RTE_BBDEV_OP_MLDTS`` as per this `v1
+<https://patches.dpdk.org/project/dpdk/list/?series=28192>`.
+ This will notably introduce new symbols for  ``rte_bbdev_dequeue_mldts_ops``,
+``rte_bbdev_enqueue_mldts_ops`` into the stuct rte_bbdev.


> 
> Maxime
> 
> >
> >>
> >> Maxime
> >>
> >>> What do you think Maxime, David? Based on this I can adjust the
> >>> change for
> >> 23.11 and update slightly the deprecation notice accordingly.
> >>>
> >>> Thanks
> >>> Nic
> >>>
> >


^ permalink raw reply	[relevance 0%]

* [PATCH 1/5] lib: remove blank line ending comment blocks
  @ 2023-06-14 14:26  1% ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2023-06-14 14:26 UTC (permalink / raw)
  To: dev
  Cc: Nicolas Chautru, Cristian Dumitrescu, Olivier Matz, Fan Zhang,
	Ashish Gupta, Akhil Goyal, Ruifeng Wang, Anatoly Burakov,
	Harman Kalra, Joyce Kong, Jerin Jacob, Sunil Kumar Kori,
	Dmitry Kozlyuk, Narcisa Ana Maria Vasile, Dmitry Malloy,
	Pallavi Kadam, Byron Marohn, Yipeng Wang, Ferruh Yigit,
	Andrew Rybchenko, Ori Kam, Erik Gabriel Carrillo, Kiran Kumar K,
	Nithin Dabilpuram, Sameh Gobriel, Bruce Richardson,
	Vladimir Medvedkin, Konstantin Ananyev, Srikanth Yalavarthi,
	Pavan Nikhilesh, Reshma Pattan, Stephen Hemminger, Anoob Joseph,
	Volodymyr Fialko, David Hunt, Sachin Saxena, Hemant Agrawal,
	Honnappa Nagarahalli, Ciara Power

At the end of a comment, no need for an extra line.

This pattern was fixed with the following command:
git ls lib | xargs sed -i '/^ *\* *$/{N;/ *\*\/ *$/D;}'

Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
---
 lib/bbdev/rte_bbdev.h                   |  2 --
 lib/bbdev/rte_bbdev_op.h                |  1 -
 lib/bbdev/rte_bbdev_pmd.h               |  1 -
 lib/cfgfile/rte_cfgfile.h               |  1 -
 lib/cmdline/cmdline_parse.h             |  1 -
 lib/compressdev/rte_comp.h              |  1 -
 lib/compressdev/rte_compressdev.h       |  1 -
 lib/cryptodev/cryptodev_pmd.h           |  1 -
 lib/cryptodev/rte_crypto.h              |  1 -
 lib/cryptodev/rte_crypto_asym.h         | 12 ------------
 lib/cryptodev/rte_cryptodev.h           |  3 ---
 lib/cryptodev/rte_cryptodev_core.h      |  1 -
 lib/eal/arm/include/rte_cycles_64.h     |  1 -
 lib/eal/common/eal_common_proc.c        |  1 -
 lib/eal/include/generic/rte_pause.h     |  1 -
 lib/eal/include/generic/rte_spinlock.h  |  1 -
 lib/eal/include/rte_bitmap.h            |  1 -
 lib/eal/include/rte_branch_prediction.h |  2 --
 lib/eal/include/rte_eal.h               |  2 --
 lib/eal/include/rte_interrupts.h        |  1 -
 lib/eal/include/rte_keepalive.h         |  1 -
 lib/eal/include/rte_lcore.h             |  1 -
 lib/eal/include/rte_tailq.h             |  1 -
 lib/eal/include/rte_thread.h            |  1 -
 lib/eal/include/rte_ticketlock.h        |  1 -
 lib/eal/include/rte_trace_point.h       |  1 -
 lib/eal/windows/include/sys/queue.h     |  1 -
 lib/efd/rte_efd.c                       |  1 -
 lib/ethdev/ethdev_driver.h              |  1 -
 lib/ethdev/rte_ethdev.c                 |  1 -
 lib/ethdev/rte_ethdev.h                 |  1 -
 lib/ethdev/rte_ethdev_core.h            |  1 -
 lib/ethdev/rte_flow.h                   | 11 -----------
 lib/ethdev/rte_mtr.h                    |  2 --
 lib/ethdev/sff_8636.h                   |  2 --
 lib/ethdev/sff_common.h                 |  1 -
 lib/eventdev/event_timer_adapter_pmd.h  |  1 -
 lib/eventdev/eventdev_pmd.h             | 17 -----------------
 lib/eventdev/rte_event_timer_adapter.h  |  2 --
 lib/eventdev/rte_eventdev.h             | 11 -----------
 lib/graph/rte_graph.h                   |  2 --
 lib/hash/rte_hash.h                     |  1 -
 lib/hash/rte_hash_crc.h                 |  1 -
 lib/ip_frag/rte_ipv6_fragmentation.c    |  1 -
 lib/ip_frag/rte_ipv6_reassembly.c       |  1 -
 lib/ipsec/ipsec_telemetry.c             |  1 -
 lib/member/rte_member.h                 |  1 -
 lib/mempool/rte_mempool.c               |  1 -
 lib/mempool/rte_mempool.h               |  1 -
 lib/meter/rte_meter.h                   |  3 ---
 lib/mldev/mldev_utils.h                 |  1 -
 lib/node/rte_node_eth_api.h             |  1 -
 lib/node/rte_node_ip4_api.h             |  1 -
 lib/node/rte_node_ip6_api.h             |  1 -
 lib/pcapng/rte_pcapng.h                 |  1 -
 lib/pdcp/rte_pdcp_group.h               |  1 -
 lib/pipeline/rte_pipeline.c             |  4 ----
 lib/pipeline/rte_pipeline.h             |  7 -------
 lib/pipeline/rte_swx_ipsec.h            |  2 --
 lib/pipeline/rte_swx_pipeline_spec.c    | 11 -----------
 lib/port/rte_port.h                     |  3 ---
 lib/port/rte_port_ethdev.h              |  1 -
 lib/port/rte_port_eventdev.h            |  1 -
 lib/port/rte_port_fd.h                  |  1 -
 lib/port/rte_port_frag.h                |  1 -
 lib/port/rte_port_kni.h                 |  1 -
 lib/port/rte_port_ras.h                 |  1 -
 lib/port/rte_port_ring.h                |  1 -
 lib/port/rte_port_sched.h               |  1 -
 lib/port/rte_port_source_sink.h         |  1 -
 lib/port/rte_port_sym_crypto.h          |  1 -
 lib/port/rte_swx_port_fd.h              |  1 -
 lib/power/guest_channel.h               |  1 -
 lib/rawdev/rte_rawdev.h                 |  2 --
 lib/rawdev/rte_rawdev_pmd.h             |  3 ---
 lib/rcu/rte_rcu_qsbr.h                  |  1 -
 lib/regexdev/rte_regexdev_core.h        |  1 -
 lib/reorder/rte_reorder.h               |  1 -
 lib/ring/rte_ring.h                     |  1 -
 lib/sched/rte_approx.h                  |  1 -
 lib/sched/rte_pie.h                     |  2 --
 lib/sched/rte_red.h                     |  4 ----
 lib/sched/rte_sched.c                   |  1 -
 lib/sched/rte_sched.h                   |  3 ---
 lib/sched/rte_sched_common.h            |  2 --
 lib/security/rte_security.h             |  1 -
 lib/security/rte_security_driver.h      |  1 -
 lib/table/rte_swx_table_em.c            |  1 -
 lib/table/rte_table.h                   |  1 -
 lib/table/rte_table_acl.h               |  1 -
 lib/table/rte_table_array.h             |  1 -
 lib/table/rte_table_hash.h              |  1 -
 lib/table/rte_table_hash_cuckoo.h       |  1 -
 lib/table/rte_table_hash_ext.c          |  2 --
 lib/table/rte_table_hash_lru.c          |  2 --
 lib/table/rte_table_lpm.h               |  1 -
 lib/table/rte_table_lpm_ipv6.h          |  1 -
 lib/table/rte_table_stub.h              |  1 -
 lib/telemetry/telemetry_internal.h      |  1 -
 lib/telemetry/telemetry_json.h          |  1 -
 100 files changed, 192 deletions(-)

diff --git a/lib/bbdev/rte_bbdev.h b/lib/bbdev/rte_bbdev.h
index 52f6ed9b01..f124e1f5db 100644
--- a/lib/bbdev/rte_bbdev.h
+++ b/lib/bbdev/rte_bbdev.h
@@ -963,7 +963,6 @@ rte_bbdev_queue_intr_ctl(uint16_t dev_id, uint16_t queue_id, int epfd, int op,
  *
  * @returns
  *   Device status as string or NULL if invalid.
- *
  */
 __rte_experimental
 const char*
@@ -977,7 +976,6 @@ rte_bbdev_device_status_str(enum rte_bbdev_device_status status);
  *
  * @returns
  *   Queue status as string or NULL if op_type is invalid.
- *
  */
 __rte_experimental
 const char*
diff --git a/lib/bbdev/rte_bbdev_op.h b/lib/bbdev/rte_bbdev_op.h
index 96a390cd9b..cb17a17cbc 100644
--- a/lib/bbdev/rte_bbdev_op.h
+++ b/lib/bbdev/rte_bbdev_op.h
@@ -936,7 +936,6 @@ struct rte_bbdev_op_pool_private {
  *
  * @returns
  *   Operation type as string or NULL if op_type is invalid
- *
  */
 const char*
 rte_bbdev_op_type_str(enum rte_bbdev_op_type op_type);
diff --git a/lib/bbdev/rte_bbdev_pmd.h b/lib/bbdev/rte_bbdev_pmd.h
index 3da7a2bdf5..442b23943d 100644
--- a/lib/bbdev/rte_bbdev_pmd.h
+++ b/lib/bbdev/rte_bbdev_pmd.h
@@ -64,7 +64,6 @@ rte_bbdev_release(struct rte_bbdev *bbdev);
  * @return
  *   - The device structure pointer, or
  *   - NULL otherwise
- *
  */
 struct rte_bbdev *
 rte_bbdev_get_named_dev(const char *name);
diff --git a/lib/cfgfile/rte_cfgfile.h b/lib/cfgfile/rte_cfgfile.h
index b2030fa66c..ea7244bcac 100644
--- a/lib/cfgfile/rte_cfgfile.h
+++ b/lib/cfgfile/rte_cfgfile.h
@@ -17,7 +17,6 @@ extern "C" {
 *
 * This library allows reading application defined parameters from standard
 * format configuration file.
-*
 ***/
 
 #ifndef CFG_NAME_LEN
diff --git a/lib/cmdline/cmdline_parse.h b/lib/cmdline/cmdline_parse.h
index afc2fcd3dc..a852ac411c 100644
--- a/lib/cmdline/cmdline_parse.h
+++ b/lib/cmdline/cmdline_parse.h
@@ -142,7 +142,6 @@ typedef struct cmdline_inst cmdline_parse_inst_t;
 /**
  * A context is identified by its name, and contains a list of
  * instruction
- *
  */
 typedef cmdline_parse_inst_t *cmdline_parse_ctx_t;
 
diff --git a/lib/compressdev/rte_comp.h b/lib/compressdev/rte_comp.h
index 026a2814b5..bf896d0722 100644
--- a/lib/compressdev/rte_comp.h
+++ b/lib/compressdev/rte_comp.h
@@ -9,7 +9,6 @@
  * @file rte_comp.h
  *
  * RTE definitions for Data Compression Service
- *
  */
 
 #ifdef __cplusplus
diff --git a/lib/compressdev/rte_compressdev.h b/lib/compressdev/rte_compressdev.h
index 7eb5c58798..13a4186318 100644
--- a/lib/compressdev/rte_compressdev.h
+++ b/lib/compressdev/rte_compressdev.h
@@ -495,7 +495,6 @@ rte_compressdev_enqueue_burst(uint8_t dev_id, uint16_t qp_id,
  *  - Returns -ENOTSUP if comp device does not support STATEFUL operations.
  *  - Returns -ENOTSUP if comp device does not support the comp transform.
  *  - Returns -ENOMEM if the private stream could not be allocated.
- *
  */
 __rte_experimental
 int
diff --git a/lib/cryptodev/cryptodev_pmd.h b/lib/cryptodev/cryptodev_pmd.h
index 0dfad9e24f..585c29df8a 100644
--- a/lib/cryptodev/cryptodev_pmd.h
+++ b/lib/cryptodev/cryptodev_pmd.h
@@ -390,7 +390,6 @@ typedef void (*cryptodev_asym_clear_session_t)(struct rte_cryptodev *dev,
  *
  * @return
  *  - Returns number of successfully processed packets.
- *
  */
 typedef uint32_t (*cryptodev_sym_cpu_crypto_process_t)
 	(struct rte_cryptodev *dev, struct rte_cryptodev_sym_session *sess,
diff --git a/lib/cryptodev/rte_crypto.h b/lib/cryptodev/rte_crypto.h
index f9644d29ec..7c9c413349 100644
--- a/lib/cryptodev/rte_crypto.h
+++ b/lib/cryptodev/rte_crypto.h
@@ -9,7 +9,6 @@
  * @file rte_crypto.h
  *
  * RTE Cryptography Common Definitions
- *
  */
 
 #ifdef __cplusplus
diff --git a/lib/cryptodev/rte_crypto_asym.h b/lib/cryptodev/rte_crypto_asym.h
index 083320e555..fc3f331393 100644
--- a/lib/cryptodev/rte_crypto_asym.h
+++ b/lib/cryptodev/rte_crypto_asym.h
@@ -76,7 +76,6 @@ enum rte_crypto_curve_id {
  * Asymmetric crypto transformation types.
  * Each xform type maps to one asymmetric algorithm
  * performing specific operation
- *
  */
 enum rte_crypto_asym_xform_type {
 	RTE_CRYPTO_ASYM_XFORM_UNSPECIFIED = 0,
@@ -181,7 +180,6 @@ enum rte_crypto_rsa_padding_type {
  *
  * enumerates private key format required to perform RSA crypto
  * transform.
- *
  */
 enum rte_crypto_rsa_priv_key_type {
 	RTE_RSA_KEY_TYPE_EXP,
@@ -303,7 +301,6 @@ struct rte_crypto_rsa_padding {
  * Asymmetric RSA transform data
  *
  * Structure describing RSA xform params
- *
  */
 struct rte_crypto_rsa_xform {
 	rte_crypto_uint n;
@@ -326,7 +323,6 @@ struct rte_crypto_rsa_xform {
  * Asymmetric Modular exponentiation transform data
  *
  * Structure describing modular exponentiation xform param
- *
  */
 struct rte_crypto_modex_xform {
 	rte_crypto_uint modulus;
@@ -339,7 +335,6 @@ struct rte_crypto_modex_xform {
  * Asymmetric modular multiplicative inverse transform operation
  *
  * Structure describing modular multiplicative inverse transform
- *
  */
 struct rte_crypto_modinv_xform {
 	rte_crypto_uint modulus;
@@ -350,7 +345,6 @@ struct rte_crypto_modinv_xform {
  * Asymmetric DH transform data
  *
  * Structure describing deffie-hellman xform params
- *
  */
 struct rte_crypto_dh_xform {
 	rte_crypto_uint p;
@@ -363,7 +357,6 @@ struct rte_crypto_dh_xform {
  * Asymmetric Digital Signature transform operation
  *
  * Structure describing DSA xform params
- *
  */
 struct rte_crypto_dsa_xform {
 	rte_crypto_uint p;
@@ -380,7 +373,6 @@ struct rte_crypto_dsa_xform {
  * Asymmetric elliptic curve transform data
  *
  * Structure describing all EC based xform params
- *
  */
 struct rte_crypto_ec_xform {
 	enum rte_crypto_curve_id curve_id;
@@ -400,7 +392,6 @@ struct rte_crypto_sm2_xform {
 /**
  * Operations params for modular operations:
  * exponentiation and multiplicative inverse
- *
  */
 struct rte_crypto_mod_op_param {
 	rte_crypto_uint base;
@@ -411,7 +402,6 @@ struct rte_crypto_mod_op_param {
 
 /**
  * RSA operation params
- *
  */
 struct rte_crypto_rsa_op_param {
 	enum rte_crypto_asym_op_type op_type;
@@ -545,7 +535,6 @@ struct rte_crypto_ecdh_op_param {
 
 /**
  * DSA Operations params
- *
  */
 struct rte_crypto_dsa_op_param {
 	enum rte_crypto_asym_op_type op_type;
@@ -734,7 +723,6 @@ struct rte_crypto_sm2_op_param {
  * Asymmetric Cryptographic Operation.
  *
  * Structure describing asymmetric crypto operation params.
- *
  */
 struct rte_crypto_asym_op {
 	RTE_STD_C11
diff --git a/lib/cryptodev/rte_cryptodev.h b/lib/cryptodev/rte_cryptodev.h
index 228273df90..1674945229 100644
--- a/lib/cryptodev/rte_cryptodev.h
+++ b/lib/cryptodev/rte_cryptodev.h
@@ -162,7 +162,6 @@ struct rte_cryptodev_symmetric_capability {
 
 /**
  * Asymmetric Xform Crypto Capability
- *
  */
 struct rte_cryptodev_asymmetric_xform_capability {
 	enum rte_crypto_asym_xform_type xform_type;
@@ -188,7 +187,6 @@ struct rte_cryptodev_asymmetric_xform_capability {
 
 /**
  * Asymmetric Crypto Capability
- *
  */
 struct rte_cryptodev_asymmetric_capability {
 	struct rte_cryptodev_asymmetric_xform_capability xform_capa;
@@ -222,7 +220,6 @@ struct rte_cryptodev_sym_capability_idx {
 /**
  * Structure used to describe asymmetric crypto xforms
  * Each xform maps to one asym algorithm.
- *
  */
 struct rte_cryptodev_asym_capability_idx {
 	enum rte_crypto_asym_xform_type type;
diff --git a/lib/cryptodev/rte_cryptodev_core.h b/lib/cryptodev/rte_cryptodev_core.h
index 16832f645d..5de89d099f 100644
--- a/lib/cryptodev/rte_cryptodev_core.h
+++ b/lib/cryptodev/rte_cryptodev_core.h
@@ -14,7 +14,6 @@
  * public API because they are used by inline functions in the published API.
  *
  * Applications should not use these directly.
- *
  */
 
 typedef uint16_t (*dequeue_pkt_burst_t)(void *qp,
diff --git a/lib/eal/arm/include/rte_cycles_64.h b/lib/eal/arm/include/rte_cycles_64.h
index 029fdc4355..8b05302f47 100644
--- a/lib/eal/arm/include/rte_cycles_64.h
+++ b/lib/eal/arm/include/rte_cycles_64.h
@@ -72,7 +72,6 @@ rte_rdtsc(void)
  * val |= (BIT(0) | BIT(2));
  * isb();
  * asm volatile("msr pmcr_el0, %0" : : "r" (val));
- *
  */
 
 /** Read PMU cycle counter */
diff --git a/lib/eal/common/eal_common_proc.c b/lib/eal/common/eal_common_proc.c
index 1fc1d6c53b..7a038e0a3c 100644
--- a/lib/eal/common/eal_common_proc.c
+++ b/lib/eal/common/eal_common_proc.c
@@ -669,7 +669,6 @@ rte_mp_channel_cleanup(void)
  * Return -1, as fail to send message and it's caused by the local side.
  * Return 0, as fail to send message and it's caused by the remote side.
  * Return 1, as succeed to send message.
- *
  */
 static int
 send_msg(const char *dst_path, struct rte_mp_msg *msg, int type)
diff --git a/lib/eal/include/generic/rte_pause.h b/lib/eal/include/generic/rte_pause.h
index 2173a544d5..ec1f41819c 100644
--- a/lib/eal/include/generic/rte_pause.h
+++ b/lib/eal/include/generic/rte_pause.h
@@ -10,7 +10,6 @@
  * @file
  *
  * CPU pause operation.
- *
  */
 
 #include <stdint.h>
diff --git a/lib/eal/include/generic/rte_spinlock.h b/lib/eal/include/generic/rte_spinlock.h
index 8ca47bbfaa..c50ebaaa80 100644
--- a/lib/eal/include/generic/rte_spinlock.h
+++ b/lib/eal/include/generic/rte_spinlock.h
@@ -15,7 +15,6 @@
  * a loop repeatedly checking until the lock becomes available.
  *
  * All locks must be initialised before use, and only initialised once.
- *
  */
 
 #include <rte_lcore.h>
diff --git a/lib/eal/include/rte_bitmap.h b/lib/eal/include/rte_bitmap.h
index 27ee3d18a4..25897ed512 100644
--- a/lib/eal/include/rte_bitmap.h
+++ b/lib/eal/include/rte_bitmap.h
@@ -32,7 +32,6 @@ extern "C" {
  * serialization of the bit set/clear and bitmap scan operations needs to be
  * enforced by the caller, while the bit get operation does not require locking
  * the bitmap.
- *
  ***/
 
 #include <string.h>
diff --git a/lib/eal/include/rte_branch_prediction.h b/lib/eal/include/rte_branch_prediction.h
index 0256a9de60..414cd921ba 100644
--- a/lib/eal/include/rte_branch_prediction.h
+++ b/lib/eal/include/rte_branch_prediction.h
@@ -22,7 +22,6 @@ extern "C" {
  *
  *   if (likely(x > 1))
  *      do_stuff();
- *
  */
 #ifndef likely
 #define likely(x)	__builtin_expect(!!(x), 1)
@@ -36,7 +35,6 @@ extern "C" {
  *
  *   if (unlikely(x < 1))
  *      do_stuff();
- *
  */
 #ifndef unlikely
 #define unlikely(x)	__builtin_expect(!!(x), 0)
diff --git a/lib/eal/include/rte_eal.h b/lib/eal/include/rte_eal.h
index d52f79f63d..b612577b38 100644
--- a/lib/eal/include/rte_eal.h
+++ b/lib/eal/include/rte_eal.h
@@ -240,7 +240,6 @@ rte_mp_action_register(const char *name, rte_mp_t action);
  *
  * @param name
  *   The name argument plays as the nonredundant key to find the action.
- *
  */
 void
 rte_mp_action_unregister(const char *name);
@@ -463,7 +462,6 @@ uint64_t rte_eal_get_baseaddr(void);
  * IOVA mapping mode is iommu programming mode of a device.
  * That device (for example: IOMMU backed DMA device) based
  * on rte_iova_mode will generate physical or virtual address.
- *
  */
 enum rte_iova_mode {
 	RTE_IOVA_DC = 0,	/* Don't care mode */
diff --git a/lib/eal/include/rte_interrupts.h b/lib/eal/include/rte_interrupts.h
index 487e3c8875..bcafdd58a9 100644
--- a/lib/eal/include/rte_interrupts.h
+++ b/lib/eal/include/rte_interrupts.h
@@ -234,7 +234,6 @@ rte_intr_instance_alloc(uint32_t flags);
  * @param intr_handle
  *  Interrupt handle allocated with rte_intr_instance_alloc().
  *  If intr_handle is NULL, no operation is performed.
- *
  */
 __rte_experimental
 void
diff --git a/lib/eal/include/rte_keepalive.h b/lib/eal/include/rte_keepalive.h
index 538fb09095..28c3064493 100644
--- a/lib/eal/include/rte_keepalive.h
+++ b/lib/eal/include/rte_keepalive.h
@@ -5,7 +5,6 @@
 /**
  * @file rte_keepalive.h
  * DPDK RTE LCore Keepalive Monitor.
- *
  **/
 
 #ifndef _KEEPALIVE_H_
diff --git a/lib/eal/include/rte_lcore.h b/lib/eal/include/rte_lcore.h
index 6a355e9986..6ce810b876 100644
--- a/lib/eal/include/rte_lcore.h
+++ b/lib/eal/include/rte_lcore.h
@@ -9,7 +9,6 @@
  * @file
  *
  * API for lcore and socket manipulation
- *
  */
 #include <stdio.h>
 
diff --git a/lib/eal/include/rte_tailq.h b/lib/eal/include/rte_tailq.h
index 0f67f9e4db..931d549e59 100644
--- a/lib/eal/include/rte_tailq.h
+++ b/lib/eal/include/rte_tailq.h
@@ -8,7 +8,6 @@
 /**
  * @file
  *  Here defines rte_tailq APIs for only internal use
- *
  */
 
 #ifdef __cplusplus
diff --git a/lib/eal/include/rte_thread.h b/lib/eal/include/rte_thread.h
index ddd411e067..369e2375f6 100644
--- a/lib/eal/include/rte_thread.h
+++ b/lib/eal/include/rte_thread.h
@@ -356,7 +356,6 @@ int rte_thread_set_affinity(rte_cpuset_t *cpusetp);
  * @param cpusetp
  *   Pointer to CPU affinity of current thread.
  *   It presumes input is not NULL, otherwise it causes panic.
- *
  */
 void rte_thread_get_affinity(rte_cpuset_t *cpusetp);
 
diff --git a/lib/eal/include/rte_ticketlock.h b/lib/eal/include/rte_ticketlock.h
index 693c67b517..5db0d8ae92 100644
--- a/lib/eal/include/rte_ticketlock.h
+++ b/lib/eal/include/rte_ticketlock.h
@@ -15,7 +15,6 @@
  * serviced.
  *
  * All locks must be initialised before use, and only initialised once.
- *
  */
 
 #ifdef __cplusplus
diff --git a/lib/eal/include/rte_trace_point.h b/lib/eal/include/rte_trace_point.h
index 4d6b5700dd..c6b6fccda5 100644
--- a/lib/eal/include/rte_trace_point.h
+++ b/lib/eal/include/rte_trace_point.h
@@ -234,7 +234,6 @@ __rte_trace_point_fp_is_enabled(void)
  * @internal
  *
  * Allocate trace memory buffer per thread.
- *
  */
 __rte_experimental
 void __rte_trace_mem_per_thread_alloc(void);
diff --git a/lib/eal/windows/include/sys/queue.h b/lib/eal/windows/include/sys/queue.h
index 9756bee6fb..917526531b 100644
--- a/lib/eal/windows/include/sys/queue.h
+++ b/lib/eal/windows/include/sys/queue.h
@@ -83,7 +83,6 @@
  * _REMOVE_HEAD			+	-	+	-
  * _REMOVE			s	+	s	+
  * _SWAP			+	+	+	+
- *
  */
 #ifdef QUEUE_MACRO_DEBUG
 #warn Use QUEUE_MACRO_DEBUG_TRACE and/or QUEUE_MACRO_DEBUG_TRASH
diff --git a/lib/efd/rte_efd.c b/lib/efd/rte_efd.c
index 686a137757..dad962ce29 100644
--- a/lib/efd/rte_efd.c
+++ b/lib/efd/rte_efd.c
@@ -344,7 +344,6 @@ efd_get_choice(const struct rte_efd_table * const table,
  *   Computed chunk ID
  * @param bin_id
  *   Computed bin ID
- *
  */
 static inline void
 efd_compute_ids(const struct rte_efd_table * const table,
diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h
index 367c0c4878..980f837ab6 100644
--- a/lib/ethdev/ethdev_driver.h
+++ b/lib/ethdev/ethdev_driver.h
@@ -16,7 +16,6 @@ extern "C" {
  *
  * These APIs for the use from Ethernet drivers, user applications shouldn't
  * use them.
- *
  */
 
 #include <dev_driver.h>
diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
index 7317015895..4428428adc 100644
--- a/lib/ethdev/rte_ethdev.c
+++ b/lib/ethdev/rte_ethdev.c
@@ -1109,7 +1109,6 @@ eth_dev_check_lro_pkt_size(uint16_t port_id, uint32_t config_size,
  * @return
  *   - (0) if validation successful.
  *   - (-EINVAL) if requested offload has been silently disabled.
- *
  */
 static int
 eth_dev_validate_offloads(uint16_t port_id, uint64_t req_offloads,
diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h
index 34ca25bbc0..e550f09889 100644
--- a/lib/ethdev/rte_ethdev.h
+++ b/lib/ethdev/rte_ethdev.h
@@ -6372,7 +6372,6 @@ rte_eth_tx_burst(uint16_t port_id, uint16_t queue_id,
  *   - EINVAL: offload flags are not correctly set
  *   - ENOTSUP: the offload feature is not supported by the hardware
  *   - ENODEV: if *port_id* is invalid (with debug enabled only)
- *
  */
 
 #ifndef RTE_ETHDEV_TX_PREPARE_NOOP
diff --git a/lib/ethdev/rte_ethdev_core.h b/lib/ethdev/rte_ethdev_core.h
index dcf8adab92..46e9721e07 100644
--- a/lib/ethdev/rte_ethdev_core.h
+++ b/lib/ethdev/rte_ethdev_core.h
@@ -16,7 +16,6 @@
  * public API because they are used by inline functions in the published API.
  *
  * Applications should not use these directly.
- *
  */
 
 struct rte_eth_dev_callback;
diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h
index dec454275f..f1d6b4de30 100644
--- a/lib/ethdev/rte_flow.h
+++ b/lib/ethdev/rte_flow.h
@@ -1726,7 +1726,6 @@ static const struct rte_flow_item_mark rte_flow_item_mark_mask = {
  * RTE_FLOW_ITEM_TYPE_NSH
  *
  * Match network service header (NSH), RFC 8300
- *
  */
 struct rte_flow_item_nsh {
 	uint32_t version:2;
@@ -1758,7 +1757,6 @@ static const struct rte_flow_item_nsh rte_flow_item_nsh_mask = {
  * RTE_FLOW_ITEM_TYPE_IGMP
  *
  * Match Internet Group Management Protocol (IGMP), RFC 2236
- *
  */
 struct rte_flow_item_igmp {
 	uint32_t type:8;
@@ -1781,7 +1779,6 @@ static const struct rte_flow_item_igmp rte_flow_item_igmp_mask = {
  * RTE_FLOW_ITEM_TYPE_AH
  *
  * Match IP Authentication Header (AH), RFC 4302
- *
  */
 struct rte_flow_item_ah {
 	uint32_t next_hdr:8;
@@ -3028,7 +3025,6 @@ struct rte_flow_action_quota {
  * Query indirect QUOTA action.
  *
  * @see RTE_FLOW_ACTION_TYPE_QUOTA
- *
  */
 struct rte_flow_query_quota {
 	int64_t quota; /**< Quota value. */
@@ -3422,7 +3418,6 @@ struct rte_flow_action_of_push_mpls {
  * - ETH / IPV4 / UDP / VXLAN / END
  * - ETH / IPV6 / UDP / VXLAN / END
  * - ETH / VLAN / IPV4 / UDP / VXLAN / END
- *
  */
 struct rte_flow_action_vxlan_encap {
 	/**
@@ -3456,7 +3451,6 @@ struct rte_flow_action_vxlan_encap {
  *
  * - ETH / IPV4 / NVGRE / END
  * - ETH / VLAN / IPV6 / NVGRE / END
- *
  */
 struct rte_flow_action_nvgre_encap {
 	/**
@@ -4041,7 +4035,6 @@ struct rte_flow_action_meter_mark {
  * RTE_FLOW_ACTION_TYPE_METER_MARK
  *
  * Wrapper structure for the context update interface.
- *
  */
 struct rte_flow_update_meter_mark {
 	/** New meter_mark parameters to be updated. */
@@ -5285,7 +5278,6 @@ rte_flow_flex_item_release(uint16_t port_id,
  *
  * Information about flow engine resources.
  * The zero value means a resource is not supported.
- *
  */
 struct rte_flow_port_info {
 	/**
@@ -5329,7 +5321,6 @@ struct rte_flow_port_info {
  *
  * Information about flow engine asynchronous queues.
  * The value only valid if @p port_attr.max_nb_queues is not zero.
- *
  */
 struct rte_flow_queue_info {
 	/**
@@ -5379,7 +5370,6 @@ rte_flow_info_get(uint16_t port_id,
  *
  * Flow engine resources settings.
  * The zero value means on demand resource allocations only.
- *
  */
 struct rte_flow_port_attr {
 	/**
@@ -5423,7 +5413,6 @@ struct rte_flow_port_attr {
  *
  * Flow engine asynchronous queues settings.
  * The value means default value picked by PMD.
- *
  */
 struct rte_flow_queue_attr {
 	/**
diff --git a/lib/ethdev/rte_mtr.h b/lib/ethdev/rte_mtr.h
index 46c398dd8b..7e6a66b938 100644
--- a/lib/ethdev/rte_mtr.h
+++ b/lib/ethdev/rte_mtr.h
@@ -223,7 +223,6 @@ struct rte_mtr_meter_policy_params {
  * applicable for the current input packet wins;
  * if none is both enabled and applicable, the default input color is used.
  * @see function rte_mtr_color_in_protocol_set()
- *
  */
 enum rte_mtr_color_in_protocol {
 	/**
@@ -1043,7 +1042,6 @@ rte_mtr_color_in_protocol_set(uint16_t port_id, uint32_t mtr_id,
  *   Error details. Filled in only on error, when not NULL.
  * @return
  *   0 on success, non-zero error code otherwise.
- *
  */
 __rte_experimental
 int
diff --git a/lib/ethdev/sff_8636.h b/lib/ethdev/sff_8636.h
index 70f70353d0..cf11a2c247 100644
--- a/lib/ethdev/sff_8636.h
+++ b/lib/ethdev/sff_8636.h
@@ -17,7 +17,6 @@
  *
  * Lower Memory Page 00h
  * Measurement, Diagnostic and Control Functions
- *
  */
 /* Identifier - 0 */
 /* Values are defined under SFF_8024_ID_OFFSET */
@@ -221,7 +220,6 @@
  *
  * Upper Memory Page 00h
  * Serial ID - Base ID, Extended ID and Vendor Specific ID fields
- *
  */
 /* Identifier - 128 */
 /* Identifier values same as Lower Memory Page 00h */
diff --git a/lib/ethdev/sff_common.h b/lib/ethdev/sff_common.h
index e44f3c7bf3..2e42cbe8be 100644
--- a/lib/ethdev/sff_common.h
+++ b/lib/ethdev/sff_common.h
@@ -3,7 +3,6 @@
  *
  * Implements SFF-8024 Rev 4.0 of pluggable I/O configuration and some
  * common utilities for SFF-8436/8636 and SFF-8472/8079
- *
  */
 
 #ifndef _SFF_COMMON_H_
diff --git a/lib/eventdev/event_timer_adapter_pmd.h b/lib/eventdev/event_timer_adapter_pmd.h
index c7d4a4f0f6..8f3e6c4851 100644
--- a/lib/eventdev/event_timer_adapter_pmd.h
+++ b/lib/eventdev/event_timer_adapter_pmd.h
@@ -14,7 +14,6 @@
  * This file provides implementation helpers for internal use by PMDs.  They
  * are not intended to be exposed to applications and are not subject to ABI
  * versioning.
- *
  */
 
 #ifdef __cplusplus
diff --git a/lib/eventdev/eventdev_pmd.h b/lib/eventdev/eventdev_pmd.h
index aebab26852..c68c3a2262 100644
--- a/lib/eventdev/eventdev_pmd.h
+++ b/lib/eventdev/eventdev_pmd.h
@@ -310,7 +310,6 @@ typedef int (*eventdev_close_t)(struct rte_eventdev *dev);
  *   Event queue index
  * @param[out] queue_conf
  *   Event queue configuration structure
- *
  */
 typedef void (*eventdev_queue_default_conf_get_t)(struct rte_eventdev *dev,
 		uint8_t queue_id, struct rte_event_queue_conf *queue_conf);
@@ -339,7 +338,6 @@ typedef int (*eventdev_queue_setup_t)(struct rte_eventdev *dev,
  *   Event device pointer
  * @param queue_id
  *   Event queue index
- *
  */
 typedef void (*eventdev_queue_release_t)(struct rte_eventdev *dev,
 		uint8_t queue_id);
@@ -373,7 +371,6 @@ typedef int (*eventdev_queue_attr_set_t)(struct rte_eventdev *dev,
  *   Event port index
  * @param[out] port_conf
  *   Event port configuration structure
- *
  */
 typedef void (*eventdev_port_default_conf_get_t)(struct rte_eventdev *dev,
 		uint8_t port_id, struct rte_event_port_conf *port_conf);
@@ -400,7 +397,6 @@ typedef int (*eventdev_port_setup_t)(struct rte_eventdev *dev,
  *
  * @param port
  *   Event port pointer
- *
  */
 typedef void (*eventdev_port_release_t)(void *port);
 
@@ -415,7 +411,6 @@ typedef void (*eventdev_port_release_t)(void *port);
  *   User-provided event flush function.
  * @param args
  *   Arguments to be passed to the user-provided event flush function.
- *
  */
 typedef void (*eventdev_port_quiesce_t)(struct rte_eventdev *dev, void *port,
 					rte_eventdev_port_flush_t flush_cb,
@@ -439,7 +434,6 @@ typedef void (*eventdev_port_quiesce_t)(struct rte_eventdev *dev, void *port,
  *
  * @return
  *   Returns 0 on success.
- *
  */
 typedef int (*eventdev_port_link_t)(struct rte_eventdev *dev, void *port,
 		const uint8_t queues[], const uint8_t priorities[],
@@ -459,7 +453,6 @@ typedef int (*eventdev_port_link_t)(struct rte_eventdev *dev, void *port,
  *
  * @return
  *   Returns 0 on success.
- *
  */
 typedef int (*eventdev_port_unlink_t)(struct rte_eventdev *dev, void *port,
 		uint8_t queues[], uint16_t nb_unlinks);
@@ -493,7 +486,6 @@ typedef int (*eventdev_port_unlinks_in_progress_t)(struct rte_eventdev *dev,
  *
  * @return
  *   Returns 0 on success.
- *
  */
 typedef int (*eventdev_dequeue_timeout_ticks_t)(struct rte_eventdev *dev,
 		uint64_t ns, uint64_t *timeout_ticks);
@@ -505,7 +497,6 @@ typedef int (*eventdev_dequeue_timeout_ticks_t)(struct rte_eventdev *dev,
  *   Event device pointer
  * @param f
  *   A pointer to a file for output
- *
  */
 typedef void (*eventdev_dump_t)(struct rte_eventdev *dev, FILE *f);
 
@@ -602,7 +593,6 @@ typedef uint64_t (*eventdev_xstats_get_by_name)(const struct rte_eventdev *dev,
  *   - 0: Success, driver provides Rx event adapter capabilities for the
  *	ethernet device.
  *   - <0: Error code returned by the driver function.
- *
  */
 typedef int (*eventdev_eth_rx_adapter_caps_get_t)
 					(const struct rte_eventdev *dev,
@@ -634,7 +624,6 @@ struct rte_event_eth_rx_adapter_queue_conf;
  *   - 0: Success, driver provides Rx event adapter capabilities for the
  *	ethernet device.
  *   - <0: Error code returned by the driver function.
- *
  */
 typedef int (*eventdev_timer_adapter_caps_get_t)(
 	const struct rte_eventdev *dev, uint64_t flags, uint32_t *caps,
@@ -660,7 +649,6 @@ typedef int (*eventdev_timer_adapter_caps_get_t)(
  * @return
  *   - 0: Success, ethernet receive queue added successfully.
  *   - <0: Error code returned by the driver function.
- *
  */
 typedef int (*eventdev_eth_rx_adapter_queue_add_t)(
 		const struct rte_eventdev *dev,
@@ -685,7 +673,6 @@ typedef int (*eventdev_eth_rx_adapter_queue_add_t)(
  * @return
  *   - 0: Success, ethernet receive queue deleted successfully.
  *   - <0: Error code returned by the driver function.
- *
  */
 typedef int (*eventdev_eth_rx_adapter_queue_del_t)
 					(const struct rte_eventdev *dev,
@@ -932,7 +919,6 @@ struct rte_event_crypto_adapter_queue_conf;
  *   - 0: Success, driver provides event adapter capabilities for the
  *	cryptodev.
  *   - <0: Error code returned by the driver function.
- *
  */
 typedef int (*eventdev_crypto_adapter_caps_get_t)
 					(const struct rte_eventdev *dev,
@@ -963,7 +949,6 @@ typedef int (*eventdev_crypto_adapter_caps_get_t)
  * @return
  *   - 0: Success, cryptodev queue pair added successfully.
  *   - <0: Error code returned by the driver function.
- *
  */
 typedef int (*eventdev_crypto_adapter_queue_pair_add_t)(
 		const struct rte_eventdev *dev,
@@ -991,7 +976,6 @@ typedef int (*eventdev_crypto_adapter_queue_pair_add_t)(
  * @return
  *   - 0: Success, cryptodev queue pair deleted successfully.
  *   - <0: Error code returned by the driver function.
- *
  */
 typedef int (*eventdev_crypto_adapter_queue_pair_del_t)
 					(const struct rte_eventdev *dev,
@@ -1114,7 +1098,6 @@ typedef int (*eventdev_crypto_adapter_vector_limits_get_t)(
  * @return
  *   - 0: Success, driver provides eth Tx adapter capabilities
  *   - <0: Error code returned by the driver function.
- *
  */
 typedef int (*eventdev_eth_tx_adapter_caps_get_t)
 					(const struct rte_eventdev *dev,
diff --git a/lib/eventdev/rte_event_timer_adapter.h b/lib/eventdev/rte_event_timer_adapter.h
index 9a771ac679..9ac35b7d5a 100644
--- a/lib/eventdev/rte_event_timer_adapter.h
+++ b/lib/eventdev/rte_event_timer_adapter.h
@@ -310,7 +310,6 @@ struct rte_event_timer_adapter_info {
  *
  * @see RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES,
  *   struct rte_event_timer_adapter_info
- *
  */
 int
 rte_event_timer_adapter_get_info(
@@ -596,7 +595,6 @@ struct rte_event_timer_adapter {
  *   - EALREADY A timer was encountered that was already armed
  *
  * @see RTE_EVENT_TIMER_ADAPTER_F_PERIODIC
- *
  */
 static inline uint16_t
 rte_event_timer_arm_burst(const struct rte_event_timer_adapter *adapter,
diff --git a/lib/eventdev/rte_eventdev.h b/lib/eventdev/rte_eventdev.h
index a90e23ac8b..b6a4fa1495 100644
--- a/lib/eventdev/rte_eventdev.h
+++ b/lib/eventdev/rte_eventdev.h
@@ -203,7 +203,6 @@
  *		rte_event_enqueue_burst(...);
  *	}
  * \endcode
- *
  */
 
 #ifdef __cplusplus
@@ -462,7 +461,6 @@ struct rte_event_dev_info {
  * @return
  *   - 0: Success, driver updates the contextual information of the event device
  *   - <0: Error code returned by the driver info get function.
- *
  */
 int
 rte_event_dev_info_get(uint8_t dev_id, struct rte_event_dev_info *dev_info);
@@ -679,7 +677,6 @@ struct rte_event_queue_conf {
  *   - <0: Error code returned by the driver info get function.
  *
  * @see rte_event_queue_setup()
- *
  */
 int
 rte_event_queue_default_conf_get(uint8_t dev_id, uint8_t queue_id,
@@ -881,7 +878,6 @@ struct rte_event_port_conf {
  *   - <0: Error code returned by the driver info get function.
  *
  * @see rte_event_port_setup()
- *
  */
 int
 rte_event_port_default_conf_get(uint8_t dev_id, uint8_t port_id,
@@ -1271,7 +1267,6 @@ struct rte_event_vector {
  *
  * This operation must only be enqueued to the same port that the
  * event to be released was dequeued from.
- *
  */
 
 /**
@@ -1388,7 +1383,6 @@ struct rte_event {
  *   - 0: Success, driver provides Rx event adapter capabilities for the
  *	ethernet device.
  *   - <0: Error code returned by the driver function.
- *
  */
 int
 rte_event_eth_rx_adapter_caps_get(uint8_t dev_id, uint16_t eth_port_id,
@@ -1464,7 +1458,6 @@ rte_event_timer_adapter_caps_get(uint8_t dev_id, uint32_t *caps);
  *   - 0: Success, driver provides event adapter capabilities for the
  *     cryptodev device.
  *   - <0: Error code returned by the driver function.
- *
  */
 int
 rte_event_crypto_adapter_caps_get(uint8_t dev_id, uint8_t cdev_id,
@@ -1494,7 +1487,6 @@ rte_event_crypto_adapter_caps_get(uint8_t dev_id, uint8_t cdev_id,
  * @return
  *   - 0: Success, driver provides eth Tx adapter capabilities.
  *   - <0: Error code returned by the driver function.
- *
  */
 int
 rte_event_eth_tx_adapter_caps_get(uint8_t dev_id, uint16_t eth_port_id,
@@ -1523,7 +1515,6 @@ rte_event_eth_tx_adapter_caps_get(uint8_t dev_id, uint16_t eth_port_id,
  *
  * @see rte_event_dequeue_burst(), RTE_EVENT_DEV_CFG_PER_DEQUEUE_TIMEOUT
  * @see rte_event_dev_configure()
- *
  */
 int
 rte_event_dequeue_timeout_ticks(uint8_t dev_id, uint64_t ns,
@@ -1587,7 +1578,6 @@ rte_event_dequeue_timeout_ticks(uint8_t dev_id, uint64_t ns,
  * (EDQUOT) Quota exceeded(Application tried to link the queue configured with
  *  RTE_EVENT_QUEUE_CFG_SINGLE_LINK to more than one event ports)
  * (EINVAL) Invalid parameter
- *
  */
 int
 rte_event_port_link(uint8_t dev_id, uint8_t port_id,
@@ -1686,7 +1676,6 @@ rte_event_port_unlinks_in_progress(uint8_t dev_id, uint8_t port_id);
  * The number of links established on the event port designated by its
  *  *port_id*.
  * - <0 on failure.
- *
  */
 int
 rte_event_port_links_get(uint8_t dev_id, uint8_t port_id,
diff --git a/lib/graph/rte_graph.h b/lib/graph/rte_graph.h
index c9a77297fc..c30de0c5bb 100644
--- a/lib/graph/rte_graph.h
+++ b/lib/graph/rte_graph.h
@@ -20,7 +20,6 @@
  * dump and destroy on graph and node operations such as clone,
  * edge update, and edge shrink, etc. The API also allows to create the stats
  * cluster to monitor per graph and per node stats.
- *
  */
 
 #include <stdbool.h>
@@ -95,7 +94,6 @@ struct rte_graph_cluster_node_stats; /**< Node stats within cluster of graphs */
  *   Number of objects processed.
  *
  * @see rte_graph_walk()
- *
  */
 typedef uint16_t (*rte_node_process_t)(struct rte_graph *graph,
 				       struct rte_node *node, void **objs,
diff --git a/lib/hash/rte_hash.h b/lib/hash/rte_hash.h
index a399346d02..7ecc021111 100644
--- a/lib/hash/rte_hash.h
+++ b/lib/hash/rte_hash.h
@@ -176,7 +176,6 @@ rte_hash_find_existing(const char *name);
  *
  * @param h
  *   Hash table to free, if NULL, the function does nothing.
- *
  */
 void
 rte_hash_free(struct rte_hash *h);
diff --git a/lib/hash/rte_hash_crc.h b/lib/hash/rte_hash_crc.h
index 0249ad16c5..60bf42ce1d 100644
--- a/lib/hash/rte_hash_crc.h
+++ b/lib/hash/rte_hash_crc.h
@@ -51,7 +51,6 @@ static uint8_t crc32_alg = CRC32_SW;
  *   - (CRC32_SSE42) Use SSE4.2 intrinsics if available
  *   - (CRC32_SSE42_x64) Use 64-bit SSE4.2 intrinsic if available (default x86)
  *   - (CRC32_ARM64) Use ARMv8 CRC intrinsic if available (default ARMv8)
- *
  */
 static inline void
 rte_hash_crc_set_alg(uint8_t alg)
diff --git a/lib/ip_frag/rte_ipv6_fragmentation.c b/lib/ip_frag/rte_ipv6_fragmentation.c
index 2e692418b5..56696f32f8 100644
--- a/lib/ip_frag/rte_ipv6_fragmentation.c
+++ b/lib/ip_frag/rte_ipv6_fragmentation.c
@@ -14,7 +14,6 @@
  * RTE IPv6 Fragmentation
  *
  * Implementation of IPv6 fragmentation.
- *
  */
 
 static inline void
diff --git a/lib/ip_frag/rte_ipv6_reassembly.c b/lib/ip_frag/rte_ipv6_reassembly.c
index d4019e87e6..88863a98d1 100644
--- a/lib/ip_frag/rte_ipv6_reassembly.c
+++ b/lib/ip_frag/rte_ipv6_reassembly.c
@@ -13,7 +13,6 @@
  * IPv6 reassemble
  *
  * Implementation of IPv6 reassembly.
- *
  */
 
 static inline void
diff --git a/lib/ipsec/ipsec_telemetry.c b/lib/ipsec/ipsec_telemetry.c
index 90d4b67156..68a91108dd 100644
--- a/lib/ipsec/ipsec_telemetry.c
+++ b/lib/ipsec/ipsec_telemetry.c
@@ -41,7 +41,6 @@ handle_telemetry_cmd_ipsec_sa_list(const char *cmd __rte_unused,
  *     "SA_SPI_XX": {"count": 0, "bytes": 0, "errors": 0},
  *     "SA_SPI_YY": {"count": 0, "bytes": 0, "errors": 0}
  * }
- *
  */
 static int
 handle_telemetry_cmd_ipsec_sa_stats(const char *cmd __rte_unused,
diff --git a/lib/member/rte_member.h b/lib/member/rte_member.h
index 072a253c89..237d403714 100644
--- a/lib/member/rte_member.h
+++ b/lib/member/rte_member.h
@@ -213,7 +213,6 @@ struct rte_member_setsum {
  * Parameters used when create the set summary table. Currently user can
  * specify two types of setsummary: HT based and vBF. For HT based, user can
  * specify cache or non-cache mode. Here is a table to describe some differences
- *
  */
 struct rte_member_parameters {
 	const char *name;			/**< Name of the hash. */
diff --git a/lib/mempool/rte_mempool.c b/lib/mempool/rte_mempool.c
index cf5dea2304..4d337fca8d 100644
--- a/lib/mempool/rte_mempool.c
+++ b/lib/mempool/rte_mempool.c
@@ -55,7 +55,6 @@ mempool_event_callback_invoke(enum rte_mempool_event event,
 #if defined(RTE_ARCH_X86)
 /*
  * return the greatest common divisor between a and b (fast algorithm)
- *
  */
 static unsigned get_gcd(unsigned a, unsigned b)
 {
diff --git a/lib/mempool/rte_mempool.h b/lib/mempool/rte_mempool.h
index e53f9e7abd..160975a7e7 100644
--- a/lib/mempool/rte_mempool.h
+++ b/lib/mempool/rte_mempool.h
@@ -1867,7 +1867,6 @@ void rte_mempool_list_dump(FILE *f);
  *   NULL on error
  *   with rte_errno set appropriately. Possible rte_errno values include:
  *    - ENOENT - required entry not available to return.
- *
  */
 struct rte_mempool *rte_mempool_lookup(const char *name);
 
diff --git a/lib/meter/rte_meter.h b/lib/meter/rte_meter.h
index 0932645d0a..d2c91b3a40 100644
--- a/lib/meter/rte_meter.h
+++ b/lib/meter/rte_meter.h
@@ -18,7 +18,6 @@ extern "C" {
  *    1. Single Rate Three Color Marker (srTCM): defined by IETF RFC 2697
  *    2. Two Rate Three Color Marker (trTCM): defined by IETF RFC 2698
  *    3. Two Rate Three Color Marker (trTCM): defined by IETF RFC 4115
- *
  ***/
 
 #include <stdint.h>
@@ -26,7 +25,6 @@ extern "C" {
 
 /*
  * Application Programmer's Interface (API)
- *
  ***/
 
 /**
@@ -328,7 +326,6 @@ rte_meter_trtcm_rfc4115_color_aware_check(
 
 /*
  * Inline implementation of run-time methods
- *
  ***/
 
 struct rte_meter_srtcm_profile {
diff --git a/lib/mldev/mldev_utils.h b/lib/mldev/mldev_utils.h
index 7d798a92a5..5bc8020453 100644
--- a/lib/mldev/mldev_utils.h
+++ b/lib/mldev/mldev_utils.h
@@ -15,7 +15,6 @@ extern "C" {
  * ML Device PMD utility API
  *
  * These APIs for the use from ML drivers, user applications shouldn't use them.
- *
  */
 
 #include <rte_compat.h>
diff --git a/lib/node/rte_node_eth_api.h b/lib/node/rte_node_eth_api.h
index 1e7477349c..40b2021f01 100644
--- a/lib/node/rte_node_eth_api.h
+++ b/lib/node/rte_node_eth_api.h
@@ -14,7 +14,6 @@
  *
  * This API allows to setup ethdev_rx and ethdev_tx nodes
  * and its queue associations.
- *
  */
 
 #ifdef __cplusplus
diff --git a/lib/node/rte_node_ip4_api.h b/lib/node/rte_node_ip4_api.h
index 46d0d8976b..3397da0ae8 100644
--- a/lib/node/rte_node_ip4_api.h
+++ b/lib/node/rte_node_ip4_api.h
@@ -14,7 +14,6 @@
  *
  * This API allows to do control path functions of ip4_* nodes
  * like ip4_lookup, ip4_rewrite.
- *
  */
 #ifdef __cplusplus
 extern "C" {
diff --git a/lib/node/rte_node_ip6_api.h b/lib/node/rte_node_ip6_api.h
index 1459ccef47..f3b5a1002a 100644
--- a/lib/node/rte_node_ip6_api.h
+++ b/lib/node/rte_node_ip6_api.h
@@ -14,7 +14,6 @@
  *
  * This API allows to do control path functions of ip6_* nodes
  * like ip6_lookup, ip6_rewrite.
- *
  */
 #ifdef __cplusplus
 extern "C" {
diff --git a/lib/pcapng/rte_pcapng.h b/lib/pcapng/rte_pcapng.h
index 4afdec22ef..d93cc9f73a 100644
--- a/lib/pcapng/rte_pcapng.h
+++ b/lib/pcapng/rte_pcapng.h
@@ -131,7 +131,6 @@ enum rte_pcapng_direction {
  * @return
  *   - The pointer to the new mbuf formatted for pcapng_write
  *   - NULL if allocation fails.
- *
  */
 __rte_experimental
 struct rte_mbuf *
diff --git a/lib/pdcp/rte_pdcp_group.h b/lib/pdcp/rte_pdcp_group.h
index 2ac2af9b36..f6a94ff587 100644
--- a/lib/pdcp/rte_pdcp_group.h
+++ b/lib/pdcp/rte_pdcp_group.h
@@ -78,7 +78,6 @@ rte_pdcp_en_from_cop(const struct rte_crypto_op *cop)
  *   The maximum number of crypto-ops to process.
  * @return
  *   Number of filled elements in *grp* array.
- *
  */
 static inline uint16_t
 rte_pdcp_pkt_crypto_group(struct rte_crypto_op *cop[], struct rte_mbuf *mb[],
diff --git a/lib/pipeline/rte_pipeline.c b/lib/pipeline/rte_pipeline.c
index ff86c7cf96..1fa9f9c47e 100644
--- a/lib/pipeline/rte_pipeline.c
+++ b/lib/pipeline/rte_pipeline.c
@@ -155,7 +155,6 @@ rte_pipeline_port_out_free(struct rte_port_out *port);
 
 /*
  * Pipeline
- *
  */
 static int
 rte_pipeline_check_params(struct rte_pipeline_params *params)
@@ -267,7 +266,6 @@ rte_pipeline_free(struct rte_pipeline *p)
 
 /*
  * Table
- *
  */
 static int
 rte_table_check_params(struct rte_pipeline *p,
@@ -682,7 +680,6 @@ int rte_pipeline_table_entry_delete_bulk(struct rte_pipeline *p,
 
 /*
  * Port
- *
  */
 static int
 rte_pipeline_port_in_check_params(struct rte_pipeline *p,
@@ -1030,7 +1027,6 @@ rte_pipeline_port_in_disable(struct rte_pipeline *p, uint32_t port_id)
 
 /*
  * Pipeline run-time
- *
  */
 int
 rte_pipeline_check(struct rte_pipeline *p)
diff --git a/lib/pipeline/rte_pipeline.h b/lib/pipeline/rte_pipeline.h
index 3cfb6868f7..267dbcfa2c 100644
--- a/lib/pipeline/rte_pipeline.h
+++ b/lib/pipeline/rte_pipeline.h
@@ -51,7 +51,6 @@ extern "C" {
  * <B>Thread safety.</B> It is possible to have multiple pipelines running on
  * the same CPU core, but it is not allowed (for thread safety reasons) to have
  * multiple CPU cores running the same pipeline instance.
- *
  ***/
 
 #include <stdint.h>
@@ -64,7 +63,6 @@ struct rte_mbuf;
 
 /*
  * Pipeline
- *
  */
 /** Opaque data type for pipeline */
 struct rte_pipeline;
@@ -175,7 +173,6 @@ int rte_pipeline_flush(struct rte_pipeline *p);
 
 /*
  * Actions
- *
  */
 /** Reserved actions */
 enum rte_pipeline_action {
@@ -197,7 +194,6 @@ enum rte_pipeline_action {
 
 /*
  * Table
- *
  */
 /** Maximum number of tables allowed for any given pipeline instance. The
 	value of this parameter cannot be changed. */
@@ -530,7 +526,6 @@ int rte_pipeline_table_stats_read(struct rte_pipeline *p, uint32_t table_id,
 
 /*
  * Port IN
- *
  */
 /** Maximum number of input ports allowed for any given pipeline instance. The
 	value of this parameter cannot be changed. */
@@ -662,7 +657,6 @@ int rte_pipeline_port_in_stats_read(struct rte_pipeline *p, uint32_t port_id,
 
 /*
  * Port OUT
- *
  */
 /** Maximum number of output ports allowed for any given pipeline instance. The
 	value of this parameter cannot be changed. */
@@ -753,7 +747,6 @@ int rte_pipeline_port_out_stats_read(struct rte_pipeline *p, uint32_t port_id,
 
 /*
  * Functions to be called as part of the port IN/OUT or table action handlers
- *
  */
 /**
  * Action handler packet insert to output port
diff --git a/lib/pipeline/rte_swx_ipsec.h b/lib/pipeline/rte_swx_ipsec.h
index ebfb7ea5ea..a43e341cac 100644
--- a/lib/pipeline/rte_swx_ipsec.h
+++ b/lib/pipeline/rte_swx_ipsec.h
@@ -87,7 +87,6 @@ struct rte_swx_ipsec_burst_size {
 
 /**
  * IPsec instance configuration parameters
- *
  */
 struct rte_swx_ipsec_params {
 	/** Input packet queue. */
@@ -111,7 +110,6 @@ struct rte_swx_ipsec_params {
 
 /**
  * IPsec input packet meta-data
- *
  */
 struct rte_swx_ipsec_input_packet_metadata {
 	/* SA ID. */
diff --git a/lib/pipeline/rte_swx_pipeline_spec.c b/lib/pipeline/rte_swx_pipeline_spec.c
index 006b24082a..2bba0d0524 100644
--- a/lib/pipeline/rte_swx_pipeline_spec.c
+++ b/lib/pipeline/rte_swx_pipeline_spec.c
@@ -102,7 +102,6 @@ extobj_statement_parse(struct extobj_spec *s,
 
 /*
  * struct.
- *
  */
 static void
 struct_spec_free(struct struct_spec *s)
@@ -279,7 +278,6 @@ struct_block_parse(struct struct_spec *s,
 
 /*
  * header.
- *
  */
 static void
 header_spec_free(struct header_spec *s)
@@ -331,7 +329,6 @@ header_statement_parse(struct header_spec *s,
 
 /*
  * metadata.
- *
  */
 static void
 metadata_spec_free(struct metadata_spec *s)
@@ -375,7 +372,6 @@ metadata_statement_parse(struct metadata_spec *s,
 
 /*
  * action.
- *
  */
 static void
 action_spec_free(struct action_spec *s)
@@ -504,7 +500,6 @@ action_block_parse(struct action_spec *s,
 
 /*
  * table.
- *
  */
 static void
 table_spec_free(struct table_spec *s)
@@ -1059,7 +1054,6 @@ table_block_parse(struct table_spec *s,
 
 /*
  * selector.
- *
  */
 static void
 selector_spec_free(struct selector_spec *s)
@@ -1345,7 +1339,6 @@ selector_block_parse(struct selector_spec *s,
 
 /*
  * learner.
- *
  */
 static void
 learner_spec_free(struct learner_spec *s)
@@ -1927,7 +1920,6 @@ learner_block_parse(struct learner_spec *s,
 
 /*
  * regarray.
- *
  */
 static void
 regarray_spec_free(struct regarray_spec *s)
@@ -1995,7 +1987,6 @@ regarray_statement_parse(struct regarray_spec *s,
 
 /*
  * metarray.
- *
  */
 static void
 metarray_spec_free(struct metarray_spec *s)
@@ -2052,7 +2043,6 @@ metarray_statement_parse(struct metarray_spec *s,
 /*
  *
  * rss
- *
  */
 
 static void
@@ -2097,7 +2087,6 @@ rss_statement_parse(struct rss_spec *s,
 
 /*
  * apply.
- *
  */
 static void
 apply_spec_free(struct apply_spec *s)
diff --git a/lib/port/rte_port.h b/lib/port/rte_port.h
index 6b6a2cdd17..f001ffbacf 100644
--- a/lib/port/rte_port.h
+++ b/lib/port/rte_port.h
@@ -15,7 +15,6 @@ extern "C" {
  *
  * This tool is part of the DPDK Packet Framework tool suite and provides
  * a standard interface to implement different types of packet ports.
- *
  ***/
 
 #include <stdint.h>
@@ -46,7 +45,6 @@ extern "C" {
 
 /*
  * Port IN
- *
  */
 /** Maximum number of packets read from any input port in a single burst.
 Cannot be changed. */
@@ -125,7 +123,6 @@ struct rte_port_in_ops {
 
 /*
  * Port OUT
- *
  */
 /** Output port statistics */
 struct rte_port_out_stats {
diff --git a/lib/port/rte_port_ethdev.h b/lib/port/rte_port_ethdev.h
index 7f28d512f1..b607365c98 100644
--- a/lib/port/rte_port_ethdev.h
+++ b/lib/port/rte_port_ethdev.h
@@ -15,7 +15,6 @@ extern "C" {
  *
  * ethdev_reader: input port built on top of pre-initialized NIC RX queue
  * ethdev_writer: output port built on top of pre-initialized NIC TX queue
- *
  ***/
 
 #include <stdint.h>
diff --git a/lib/port/rte_port_eventdev.h b/lib/port/rte_port_eventdev.h
index 966e9cdafb..bf3f8254af 100644
--- a/lib/port/rte_port_eventdev.h
+++ b/lib/port/rte_port_eventdev.h
@@ -17,7 +17,6 @@ extern "C" {
  * interface
  * eventdev_writer: output port built on top of pre-initialized eventdev
  * interface
- *
 **/
 
 #include <stdint.h>
diff --git a/lib/port/rte_port_fd.h b/lib/port/rte_port_fd.h
index c8cfd9765a..810b0e9cc0 100644
--- a/lib/port/rte_port_fd.h
+++ b/lib/port/rte_port_fd.h
@@ -15,7 +15,6 @@ extern "C" {
  *
  * fd_reader: input port built on top of valid non-blocking file descriptor
  * fd_writer: output port built on top of valid non-blocking file descriptor
- *
  ***/
 
 #include <stdint.h>
diff --git a/lib/port/rte_port_frag.h b/lib/port/rte_port_frag.h
index 07060297f6..69fdc000f1 100644
--- a/lib/port/rte_port_frag.h
+++ b/lib/port/rte_port_frag.h
@@ -24,7 +24,6 @@ extern "C" {
  * packets read from the ring are all non-jumbo frames. The complete IP
  * datagrams written to the ring are not changed. The jumbo frames are
  * fragmented into several IP packets with length less or equal to MTU.
- *
  ***/
 
 #include <stdint.h>
diff --git a/lib/port/rte_port_kni.h b/lib/port/rte_port_kni.h
index 35c6253806..54227251f6 100644
--- a/lib/port/rte_port_kni.h
+++ b/lib/port/rte_port_kni.h
@@ -16,7 +16,6 @@ extern "C" {
  *
  * kni_reader: input port built on top of pre-initialized KNI interface
  * kni_writer: output port built on top of pre-initialized KNI interface
- *
  ***/
 
 #include <stdint.h>
diff --git a/lib/port/rte_port_ras.h b/lib/port/rte_port_ras.h
index ee1d8ae21e..8fd8ae8444 100644
--- a/lib/port/rte_port_ras.h
+++ b/lib/port/rte_port_ras.h
@@ -25,7 +25,6 @@ extern "C" {
  * The complete IP datagrams written to the ring are not changed. The IP
  * fragments written to the ring are first reassembled and into complete IP
  * datagrams or dropped on error or IP reassembly time-out.
- *
  ***/
 
 #include <stdint.h>
diff --git a/lib/port/rte_port_ring.h b/lib/port/rte_port_ring.h
index ba609b3436..9532ac1d22 100644
--- a/lib/port/rte_port_ring.h
+++ b/lib/port/rte_port_ring.h
@@ -21,7 +21,6 @@ extern "C" {
  *      input port built on top of pre-initialized multi consumers ring
  * ring_multi_writer:
  *      output port built on top of pre-initialized multi producers ring
- *
  ***/
 
 #include <stdint.h>
diff --git a/lib/port/rte_port_sched.h b/lib/port/rte_port_sched.h
index 953451463f..5f46297a60 100644
--- a/lib/port/rte_port_sched.h
+++ b/lib/port/rte_port_sched.h
@@ -15,7 +15,6 @@ extern "C" {
  *
  * sched_reader: input port built on top of pre-initialized rte_sched_port
  * sched_writer: output port built on top of pre-initialized rte_sched_port
- *
  ***/
 
 #include <stdint.h>
diff --git a/lib/port/rte_port_source_sink.h b/lib/port/rte_port_source_sink.h
index 16b8318e52..c2ddb297f4 100644
--- a/lib/port/rte_port_source_sink.h
+++ b/lib/port/rte_port_source_sink.h
@@ -15,7 +15,6 @@ extern "C" {
  *
  * source: input port that can be used to generate packets
  * sink: output port that drops all packets written to it
- *
  ***/
 
 #include "rte_port.h"
diff --git a/lib/port/rte_port_sym_crypto.h b/lib/port/rte_port_sym_crypto.h
index 181f6ce01d..4cf8566633 100644
--- a/lib/port/rte_port_sym_crypto.h
+++ b/lib/port/rte_port_sym_crypto.h
@@ -15,7 +15,6 @@ extern "C" {
  *
  * crypto_reader: input port built on top of pre-initialized crypto interface
  * crypto_writer: output port built on top of pre-initialized crypto interface
- *
  **/
 
 #include <stdint.h>
diff --git a/lib/port/rte_swx_port_fd.h b/lib/port/rte_swx_port_fd.h
index c1a9200a4f..2dd1480a42 100644
--- a/lib/port/rte_swx_port_fd.h
+++ b/lib/port/rte_swx_port_fd.h
@@ -12,7 +12,6 @@ extern "C" {
 /**
  * @file
  * RTE SWX FD Input and Output Ports
- *
  ***/
 #include <stdint.h>
 
diff --git a/lib/power/guest_channel.h b/lib/power/guest_channel.h
index bdda1367f0..409fa67b74 100644
--- a/lib/power/guest_channel.h
+++ b/lib/power/guest_channel.h
@@ -39,7 +39,6 @@ int guest_channel_host_connect(const char *path, unsigned int lcore_id);
  *
  * @param lcore_id
  *  lcore_id.
- *
  */
 void guest_channel_host_disconnect(unsigned int lcore_id);
 
diff --git a/lib/rawdev/rte_rawdev.h b/lib/rawdev/rte_rawdev.h
index 66080eae9e..36c9c9a9b4 100644
--- a/lib/rawdev/rte_rawdev.h
+++ b/lib/rawdev/rte_rawdev.h
@@ -90,7 +90,6 @@ struct rte_rawdev_info;
  * @return
  *   - 0: Success, driver updates the contextual information of the raw device
  *   - <0: Error code returned by the driver info get function.
- *
  */
 int
 rte_rawdev_info_get(uint16_t dev_id, struct rte_rawdev_info *dev_info,
@@ -152,7 +151,6 @@ rte_rawdev_configure(uint16_t dev_id, struct rte_rawdev_info *dev_conf,
  *   - <0: Error code returned by the driver info get function.
  *
  * @see rte_raw_queue_setup()
- *
  */
 int
 rte_rawdev_queue_conf_get(uint16_t dev_id,
diff --git a/lib/rawdev/rte_rawdev_pmd.h b/lib/rawdev/rte_rawdev_pmd.h
index a51944c8ff..7b9ef1d09f 100644
--- a/lib/rawdev/rte_rawdev_pmd.h
+++ b/lib/rawdev/rte_rawdev_pmd.h
@@ -254,7 +254,6 @@ typedef int (*rawdev_queue_setup_t)(struct rte_rawdev *dev,
  *   Raw device pointer
  * @param queue_id
  *   Raw queue index
- *
  */
 typedef int (*rawdev_queue_release_t)(struct rte_rawdev *dev,
 				      uint16_t queue_id);
@@ -273,7 +272,6 @@ typedef int (*rawdev_queue_release_t)(struct rte_rawdev *dev,
  *   Raw device pointer
  * @return
  *   Number of queues; 0 is assumed to be a valid response.
- *
  */
 typedef uint16_t (*rawdev_queue_count_t)(struct rte_rawdev *dev);
 
@@ -339,7 +337,6 @@ typedef int (*rawdev_dequeue_bufs_t)(struct rte_rawdev *dev,
  * @return
  *   0 for success,
  *   !0 Error
- *
  */
 typedef int (*rawdev_dump_t)(struct rte_rawdev *dev, FILE *f);
 
diff --git a/lib/rcu/rte_rcu_qsbr.h b/lib/rcu/rte_rcu_qsbr.h
index 1aa078e2c2..87e1b55153 100644
--- a/lib/rcu/rte_rcu_qsbr.h
+++ b/lib/rcu/rte_rcu_qsbr.h
@@ -226,7 +226,6 @@ rte_rcu_qsbr_get_memsize(uint32_t max_threads);
  *   On error - 1 with error code set in rte_errno.
  *   Possible rte_errno codes are:
  *   - EINVAL - max_threads is 0 or 'v' is NULL.
- *
  */
 int
 rte_rcu_qsbr_init(struct rte_rcu_qsbr *v, uint32_t max_threads);
diff --git a/lib/regexdev/rte_regexdev_core.h b/lib/regexdev/rte_regexdev_core.h
index a5576d353f..15ba712b86 100644
--- a/lib/regexdev/rte_regexdev_core.h
+++ b/lib/regexdev/rte_regexdev_core.h
@@ -14,7 +14,6 @@
  * in order to expose their ops to the class.
  *
  * Applications should not use these API directly.
- *
  */
 
 struct rte_regexdev;
diff --git a/lib/reorder/rte_reorder.h b/lib/reorder/rte_reorder.h
index 06a8d56e3f..56a6507f9f 100644
--- a/lib/reorder/rte_reorder.h
+++ b/lib/reorder/rte_reorder.h
@@ -12,7 +12,6 @@
  * Reorder library is a component which is designed to
  * provide ordering of out of ordered packets based on
  * sequence number present in mbuf.
- *
  */
 
 #include <rte_compat.h>
diff --git a/lib/ring/rte_ring.h b/lib/ring/rte_ring.h
index 7e4cd60650..c709f30497 100644
--- a/lib/ring/rte_ring.h
+++ b/lib/ring/rte_ring.h
@@ -32,7 +32,6 @@
  * Note: the ring implementation is not preemptible. Refer to Programmer's
  * guide/Environment Abstraction Layer/Multiple pthread/Known Issues/rte_ring
  * for more information.
- *
  */
 
 #ifdef __cplusplus
diff --git a/lib/sched/rte_approx.h b/lib/sched/rte_approx.h
index 74d55f457b..0200fa1521 100644
--- a/lib/sched/rte_approx.h
+++ b/lib/sched/rte_approx.h
@@ -16,7 +16,6 @@ extern "C" {
  * Given a rational number alpha with 0 < alpha < 1 and a precision d, the goal
  * is to find positive integers p, q such that alpha - d < p/q < alpha + d, and
  * q is minimal.
- *
  ***/
 
 #include <stdint.h>
diff --git a/lib/sched/rte_pie.h b/lib/sched/rte_pie.h
index 2236b98a71..cb52fd933e 100644
--- a/lib/sched/rte_pie.h
+++ b/lib/sched/rte_pie.h
@@ -32,7 +32,6 @@ extern "C" {
 
 /**
  * PIE configuration parameters passed by user
- *
  */
 struct rte_pie_params {
 	uint16_t qdelay_ref;           /**< Latency Target (milliseconds) */
@@ -43,7 +42,6 @@ struct rte_pie_params {
 
 /**
  * PIE configuration parameters
- *
  */
 struct rte_pie_config {
 	uint64_t qdelay_ref;           /**< Latency Target (in CPU cycles.) */
diff --git a/lib/sched/rte_red.h b/lib/sched/rte_red.h
index 80b43b6da0..13a9ad24a8 100644
--- a/lib/sched/rte_red.h
+++ b/lib/sched/rte_red.h
@@ -12,8 +12,6 @@ extern "C" {
 /**
  * @file
  * RTE Random Early Detection (RED)
- *
- *
  ***/
 
 #include <stdint.h>
@@ -35,7 +33,6 @@ extern "C" {
 
 /**
  * Externs
- *
  */
 extern uint32_t rte_red_rand_val;
 extern uint32_t rte_red_rand_seed;
@@ -44,7 +41,6 @@ extern uint16_t rte_red_pow2_frac_inv[16];
 
 /**
  * RED configuration parameters passed by user
- *
  */
 struct rte_red_params {
 	uint16_t min_th;   /**< Minimum threshold for queue (max_th) */
diff --git a/lib/sched/rte_sched.c b/lib/sched/rte_sched.c
index 19768d8c38..e7787344b3 100644
--- a/lib/sched/rte_sched.c
+++ b/lib/sched/rte_sched.c
@@ -2043,7 +2043,6 @@ rte_sched_port_enqueue_qwa(struct rte_sched_port *port,
  *       |   0   |      |   1   |      |   2   |      |   3   |
  * ----->|_______|----->|_______|----->|_______|----->|_______|----->
  *   p01            p11            p21            p31
- *
  */
 int
 rte_sched_port_enqueue(struct rte_sched_port *port, struct rte_mbuf **pkts,
diff --git a/lib/sched/rte_sched.h b/lib/sched/rte_sched.h
index a33292b066..c7081ceeef 100644
--- a/lib/sched/rte_sched.h
+++ b/lib/sched/rte_sched.h
@@ -53,7 +53,6 @@ extern "C" {
  *	    the same user;
  *           - Weighted Round Robin (WRR) is used to service the
  *	    queues within same pipe lowest priority traffic class (best-effort).
- *
  */
 
 #include <rte_compat.h>
@@ -310,7 +309,6 @@ struct rte_sched_port_params {
 
 /*
  * Configuration
- *
  ***/
 
 /**
@@ -436,7 +434,6 @@ rte_sched_port_get_memory_footprint(struct rte_sched_port_params *port_params,
 	struct rte_sched_subport_params **subport_params);
 /*
  * Statistics
- *
  ***/
 
 /**
diff --git a/lib/sched/rte_sched_common.h b/lib/sched/rte_sched_common.h
index e4cbbd9077..419700b1a5 100644
--- a/lib/sched/rte_sched_common.h
+++ b/lib/sched/rte_sched_common.h
@@ -49,7 +49,6 @@ rte_min_pos_4_u16(uint16_t *x)
  * This implementation uses Euclid's algorithm:
  *    gcd(a, 0) = a
  *    gcd(a, b) = gcd(b, a mod b)
- *
  */
 static inline uint64_t
 rte_get_gcd64(uint64_t a, uint64_t b)
@@ -89,7 +88,6 @@ rte_get_gcd(uint32_t a, uint32_t b)
  * Compute the Lowest Common Denominator (LCD) of two numbers.
  * This implementation computes GCD first:
  *    LCD(a, b) = (a * b) / GCD(a, b)
- *
  */
 static inline uint32_t
 rte_get_lcd(uint32_t a, uint32_t b)
diff --git a/lib/security/rte_security.h b/lib/security/rte_security.h
index 30bac4e25a..daef846d40 100644
--- a/lib/security/rte_security.h
+++ b/lib/security/rte_security.h
@@ -10,7 +10,6 @@
  * @file rte_security.h
  *
  * RTE Security Common Definitions
- *
  */
 
 #ifdef __cplusplus
diff --git a/lib/security/rte_security_driver.h b/lib/security/rte_security_driver.h
index 677c7d1f91..31444a05d3 100644
--- a/lib/security/rte_security_driver.h
+++ b/lib/security/rte_security_driver.h
@@ -10,7 +10,6 @@
  * @file rte_security_driver.h
  *
  * RTE Security Common Definitions
- *
  */
 
 #ifdef __cplusplus
diff --git a/lib/table/rte_swx_table_em.c b/lib/table/rte_swx_table_em.c
index 2b5201e006..84837c8be4 100644
--- a/lib/table/rte_swx_table_em.c
+++ b/lib/table/rte_swx_table_em.c
@@ -489,7 +489,6 @@ table_mailbox_size_get(void)
  * match = 1111_1111_1111_1110 = 0xFFFE
  * match_many = 1111_1110_1110_1000 = 0xFEE8
  * match_pos = 0001_0010_0001_0011__0001_0010_0001_0000 = 0x12131210
- *
  */
 
 #define LUT_MATCH      0xFFFE
diff --git a/lib/table/rte_table.h b/lib/table/rte_table.h
index 096ab8a7c8..3f592d1aa2 100644
--- a/lib/table/rte_table.h
+++ b/lib/table/rte_table.h
@@ -22,7 +22,6 @@ extern "C" {
  * use-case, the lookup key is an n-tuple of packet fields that uniquely
  * identifies a traffic flow, while data represents actions and action
  * meta-data associated with the same traffic flow.
- *
  ***/
 
 #include <stdint.h>
diff --git a/lib/table/rte_table_acl.h b/lib/table/rte_table_acl.h
index 516819213c..673725f82e 100644
--- a/lib/table/rte_table_acl.h
+++ b/lib/table/rte_table_acl.h
@@ -17,7 +17,6 @@ extern "C" {
  * associate data to lookup keys.
  *
  * Use-cases: Firewall rule database, etc.
- *
  ***/
 
 #include <stdint.h>
diff --git a/lib/table/rte_table_array.h b/lib/table/rte_table_array.h
index b16c5dfe5b..ac3ca59c75 100644
--- a/lib/table/rte_table_array.h
+++ b/lib/table/rte_table_array.h
@@ -14,7 +14,6 @@ extern "C" {
  * RTE Table Array
  *
  * Simple array indexing. Lookup key is the array entry index.
- *
  ***/
 
 #include <stdint.h>
diff --git a/lib/table/rte_table_hash.h b/lib/table/rte_table_hash.h
index 61a0eed6c5..5d1a0e2bea 100644
--- a/lib/table/rte_table_hash.h
+++ b/lib/table/rte_table_hash.h
@@ -46,7 +46,6 @@ extern "C" {
  * 2. Key size:
  *     a. Configurable key size
  *     b. Single key size (8-byte, 16-byte or 32-byte key size)
- *
  ***/
 #include <stdint.h>
 
diff --git a/lib/table/rte_table_hash_cuckoo.h b/lib/table/rte_table_hash_cuckoo.h
index d9d4312190..cb5a771c8b 100644
--- a/lib/table/rte_table_hash_cuckoo.h
+++ b/lib/table/rte_table_hash_cuckoo.h
@@ -12,7 +12,6 @@ extern "C" {
 /**
  * @file
  * RTE Table Hash Cuckoo
- *
  ***/
 #include <stdint.h>
 
diff --git a/lib/table/rte_table_hash_ext.c b/lib/table/rte_table_hash_ext.c
index 70ea84fa2e..bd97dc5eba 100644
--- a/lib/table/rte_table_hash_ext.c
+++ b/lib/table/rte_table_hash_ext.c
@@ -552,7 +552,6 @@ static int rte_table_hash_ext_lookup_unoptimized(
  * match = 0xFFFELLU
  * match_many = 0xFEE8LLU
  * match_pos = 0x12131210LLU
- *
  ***/
 
 #define LUT_MATCH						0xFFFELLU
@@ -844,7 +843,6 @@ static int rte_table_hash_ext_lookup_unoptimized(
 *
 * The naming convention is:
 *    pXY = packet Y of stage X, X = 0 .. 3, Y = 0 .. 1
-*
 ***/
 static int rte_table_hash_ext_lookup(
 	void *table,
diff --git a/lib/table/rte_table_hash_lru.c b/lib/table/rte_table_hash_lru.c
index c31acc11cf..354cd5aee4 100644
--- a/lib/table/rte_table_hash_lru.c
+++ b/lib/table/rte_table_hash_lru.c
@@ -489,7 +489,6 @@ static int rte_table_hash_lru_lookup_unoptimized(
 * match = 0xFFFELLU
 * match_many = 0xFEE8LLU
 * match_pos = 0x12131210LLU
-*
 ***/
 
 #define LUT_MATCH						0xFFFELLU
@@ -796,7 +795,6 @@ static int rte_table_hash_lru_lookup_unoptimized(
 *
 * The naming convention is:
 *	  pXY = packet Y of stage X, X = 0 .. 3, Y = 0 .. 1
-*
 ***/
 static int rte_table_hash_lru_lookup(
 	void *table,
diff --git a/lib/table/rte_table_lpm.h b/lib/table/rte_table_lpm.h
index 571ff2f009..135f07384c 100644
--- a/lib/table/rte_table_lpm.h
+++ b/lib/table/rte_table_lpm.h
@@ -39,7 +39,6 @@ extern "C" {
  * has to carefully manage the format of the LPM table entry (i.e.  the next
  * hop information) so that any next hop data that changes value during
  * run-time (e.g. counters) is placed outside of this area.
- *
  ***/
 
 #include <stdint.h>
diff --git a/lib/table/rte_table_lpm_ipv6.h b/lib/table/rte_table_lpm_ipv6.h
index eadc316ee1..a6cea2c707 100644
--- a/lib/table/rte_table_lpm_ipv6.h
+++ b/lib/table/rte_table_lpm_ipv6.h
@@ -39,7 +39,6 @@ extern "C" {
  * has to carefully manage the format of the LPM table entry (i.e.  the next
  * hop information) so that any next hop data that changes value during
  * run-time (e.g. counters) is placed outside of this area.
- *
  ***/
 
 #include <stdint.h>
diff --git a/lib/table/rte_table_stub.h b/lib/table/rte_table_stub.h
index 9086e4edcc..b4aa0a16a2 100644
--- a/lib/table/rte_table_stub.h
+++ b/lib/table/rte_table_stub.h
@@ -14,7 +14,6 @@ extern "C" {
  * RTE Table Stub
  *
  * The stub table lookup operation produces lookup miss for all input packets.
- *
  ***/
 
 
diff --git a/lib/telemetry/telemetry_internal.h b/lib/telemetry/telemetry_internal.h
index d085c492dc..37d79bcb24 100644
--- a/lib/telemetry/telemetry_internal.h
+++ b/lib/telemetry/telemetry_internal.h
@@ -14,7 +14,6 @@
  *
  * @file
  * RTE Telemetry Legacy and internal definitions
- *
  ***/
 
 /**
diff --git a/lib/telemetry/telemetry_json.h b/lib/telemetry/telemetry_json.h
index 7a246deacb..31a3d56756 100644
--- a/lib/telemetry/telemetry_json.h
+++ b/lib/telemetry/telemetry_json.h
@@ -18,7 +18,6 @@
  *
  * This file contains small inline functions to make it easier for applications
  * to build up valid JSON responses to telemetry requests.
- *
  ***/
 
 /**
-- 
2.40.1


^ permalink raw reply	[relevance 1%]

* Re: [PATCH v1 1/1] doc: announce change in bbdev api related to operation extension
  2023-06-13 20:00  4%                     ` Maxime Coquelin
@ 2023-06-13 21:22  3%                       ` Stephen Hemminger
  2023-06-14 18:18  0%                       ` Chautru, Nicolas
  1 sibling, 0 replies; 200+ results
From: Stephen Hemminger @ 2023-06-13 21:22 UTC (permalink / raw)
  To: Maxime Coquelin
  Cc: Chautru, Nicolas, David Marchand, dev, Rix, Tom, hemant.agrawal,
	Vargas, Hernan

On Tue, 13 Jun 2023 22:00:25 +0200
Maxime Coquelin <maxime.coquelin@redhat.com> wrote:

> >>
> >> If we are going to break the ABI, better to do the right rework directly. Otherwise
> >> we'll end-up breaking it again next year.  
> > 
> > With the suggested change, this will not break ABI next year. Any future functions are added at the end of the structure anyway.  

Do it right in 23.11, break the ABI and fix the few drivers.
It is not hard to have one ops struct (and it can/should be const) that is pointed
to by the bbdev.  That will hide the ops from the application.

^ permalink raw reply	[relevance 3%]

* Re: [PATCH v1 1/1] doc: announce change in bbdev api related to operation extension
  2023-06-13 17:16  3%                   ` Chautru, Nicolas
@ 2023-06-13 20:00  4%                     ` Maxime Coquelin
  2023-06-13 21:22  3%                       ` Stephen Hemminger
  2023-06-14 18:18  0%                       ` Chautru, Nicolas
  0 siblings, 2 replies; 200+ results
From: Maxime Coquelin @ 2023-06-13 20:00 UTC (permalink / raw)
  To: Chautru, Nicolas, David Marchand
  Cc: Stephen Hemminger, dev, Rix, Tom, hemant.agrawal, Vargas, Hernan

Hi,

On 6/13/23 19:16, Chautru, Nicolas wrote:
> Hi Maxime,
> 
>> -----Original Message-----
>> From: Maxime Coquelin <maxime.coquelin@redhat.com>
> 
>>
>> On 6/12/23 22:53, Chautru, Nicolas wrote:
>>> Hi Maxime, David,
>>>
>>>> -----Original Message-----
>>>> From: Maxime Coquelin <maxime.coquelin@redhat.com>
>>>>
>>>> On 6/6/23 23:01, Chautru, Nicolas wrote:
>>>>> Hi David,
>>>>>
>>>>>> -----Original Message-----
>>>>>> From: David Marchand <david.marchand@redhat.com>> >> On Mon, Jun
>> 5,
>>>>>> 2023 at 10:08 PM Chautru, Nicolas <nicolas.chautru@intel.com>
>>>>>> wrote:
>>>>>>> Wrt the MLD functions: these are new into the related serie but
>>>>>>> still the
>>>>>> break the ABI since the struct rte_bbdev includes these functions
>>>>>> hence causing offset changes.
>>>>>>>
>>>>>>> Should I then just rephrase as:
>>>>>>>
>>>>>>> +* bbdev: Will extend the API to support the new operation type
>>>>>>>     +``RTE_BBDEV_OP_MLDTS`` as per
>>>>>>>     +  this `v1
>>>>>>>     +<https://patches.dpdk.org/project/dpdk/list/?series=28192>`.
>>>>>>> This
>>>>>>> + will notably introduce  +  new symbols for
>>>>>>> ``rte_bbdev_dequeue_mldts_ops``,  +``rte_bbdev_enqueue_mldts_ops``
>>>>>>> into the stuct rte_bbdev.
>>>>>>
>>>>>> I don't think we need this deprecation notice.
>>>>>>
>>>>>>
>>>>>> Do you need to expose those new mldts ops in rte_bbdev?
>>>>>> Can't they go to dev_ops?
>>>>>> If you can't, at least moving those new ops at the end of the
>>>>>> structure would avoid the breakage on rte_bbdev.
>>>>>
>>>>> It would probably be best to move all these ops at the end of the
>>>>> structure
>>>> (ie. keep them together).
>>>>> In that case the deprecation notice would call out that the
>>>>> rte_bbdev
>>>> structure content is more generally modified. Probably best for the
>>>> longer run.
>>>>> David, Maxime, ok with that option?
>>>>>
>>>>> struct __rte_cache_aligned rte_bbdev {
>>>>>         rte_bbdev_enqueue_enc_ops_t enqueue_enc_ops;
>>>>>         rte_bbdev_enqueue_dec_ops_t enqueue_dec_ops;
>>>>>         rte_bbdev_dequeue_enc_ops_t dequeue_enc_ops;
>>>>>         rte_bbdev_dequeue_dec_ops_t dequeue_dec_ops;
>>>>>         rte_bbdev_enqueue_enc_ops_t enqueue_ldpc_enc_ops;
>>>>>         rte_bbdev_enqueue_dec_ops_t enqueue_ldpc_dec_ops;
>>>>>         rte_bbdev_dequeue_enc_ops_t dequeue_ldpc_enc_ops;
>>>>>         rte_bbdev_dequeue_dec_ops_t dequeue_ldpc_dec_ops;
>>>>>         rte_bbdev_enqueue_fft_ops_t enqueue_fft_ops;
>>>>>         rte_bbdev_dequeue_fft_ops_t dequeue_fft_ops;
>>>>>         const struct rte_bbdev_ops *dev_ops;
>>>>>         struct rte_bbdev_data *data;
>>>>>         enum rte_bbdev_state state;
>>>>>         struct rte_device *device;
>>>>>         struct rte_bbdev_cb_list list_cbs;
>>>>>         struct rte_intr_handle *intr_handle;
>>>>>     };
>>>>
>>>> The best thing, as suggested by David, would be to move all the ops
>>>> out of struct rte_bbdev, as these should not be visible to the application.
>>>
>>> That would be quite disruptive across all PMDs and possible perf impact to
>> validate. I don’t think this is anywhere realistic to consider such a change in
>> 23.11.
>>> I believe moving these function at the end of the structure is a good
>> compromise to avoid future breakage of rte_bbdev structure with almost
>> seamless impact (purely a ABI break when moving into 23.11 which is not
>> avoidable. Retrospectively we should have done that in 22.11 really.
>>
>> If we are going to break the ABI, better to do the right rework directly. Otherwise
>> we'll end-up breaking it again next year.
> 
> With the suggested change, this will not break ABI next year. Any future functions are added at the end of the structure anyway.

I'm not so sure, it depends if adding a new field at the end cross a 
cacheline boundary or not:

/*
  * Global array of all devices. This is not static because it's used by the
  * inline enqueue and dequeue functions
  */
struct rte_bbdev rte_bbdev_devices[RTE_BBDEV_MAX_DEVS];

If the older inlined functions used by the application retrieve the dev
pointer from the array directly (they do) and added new fields in new
version cross a cacheline, then there will be a misalignement between
the new lib version and the application using the older inlined
functions.

ABI-wise, this is not really future proof.

> 
>>
>> IMHO, moving these ops should be quite trivial and not much work.
>>
>> Otherwise, if we just placed the rte_bbdev_dequeue_mldts_ops and
>> rte_bbdev_enqueue_mldts_ops at the bottom of struct rte_bbdev, it may not
>> break the ABI, but that's a bit fragile:
>> - rte_bbdev_devices[] is not static, but is placed in the BSS section so
>>     should be OK
>> - struct rte_bbdev is cache-aligned, so it may work if adding these two
>>     ops do not overlap a cacheline which depends on the CPU architecture.
> 
> If you prefer to add the only 2 new functions at the end of the structure that is okay. I believe it would be cleaner to move all these enqueue/dequeue funs down together without drawback I can think of. Let me know.

Adding the new ones at the end is not future proof, but at least it does 
not break ABI just for cosmetic reasons (that's a big drawback IMHO).

I just checked using pahole:

struct rte_bbdev {
	rte_bbdev_enqueue_enc_ops_t enqueue_enc_ops;     /*     0     8 */
	rte_bbdev_enqueue_dec_ops_t enqueue_dec_ops;     /*     8     8 */
	rte_bbdev_dequeue_enc_ops_t dequeue_enc_ops;     /*    16     8 */
	rte_bbdev_dequeue_dec_ops_t dequeue_dec_ops;     /*    24     8 */
	rte_bbdev_enqueue_enc_ops_t enqueue_ldpc_enc_ops; /*    32     8 */
	rte_bbdev_enqueue_dec_ops_t enqueue_ldpc_dec_ops; /*    40     8 */
	rte_bbdev_dequeue_enc_ops_t dequeue_ldpc_enc_ops; /*    48     8 */
	rte_bbdev_dequeue_dec_ops_t dequeue_ldpc_dec_ops; /*    56     8 */
	/* --- cacheline 1 boundary (64 bytes) --- */
	rte_bbdev_enqueue_fft_ops_t enqueue_fft_ops;     /*    64     8 */
	rte_bbdev_dequeue_fft_ops_t dequeue_fft_ops;     /*    72     8 */
	const struct rte_bbdev_ops  * dev_ops;           /*    80     8 */
	struct rte_bbdev_data *    data;                 /*    88     8 */
	enum rte_bbdev_state       state;                /*    96     4 */

	/* XXX 4 bytes hole, try to pack */

	struct rte_device *        device;               /*   104     8 */
	struct rte_bbdev_cb_list   list_cbs;             /*   112    16 */
	/* --- cacheline 2 boundary (128 bytes) --- */
	struct rte_intr_handle *   intr_handle;          /*   128     8 */

	/* size: 192, cachelines: 3, members: 16 */
	/* sum members: 132, holes: 1, sum holes: 4 */
	/* padding: 56 */
} __attribute__((__aligned__(64)));

We're lucky on x86, we still have 56 bytes, so we can add 7 new ops at 
the end before breaking the ABI if I'm not mistaken.

I checked the other architecture, and it seems we don't support any with
32B cacheline size so we're good for a while.

Maxime

> 
>>
>> Maxime
>>
>>> What do you think Maxime, David? Based on this I can adjust the change for
>> 23.11 and update slightly the deprecation notice accordingly.
>>>
>>> Thanks
>>> Nic
>>>
> 


^ permalink raw reply	[relevance 4%]

* RE: [PATCH v1 1/1] doc: announce change in bbdev api related to operation extension
  2023-06-13  8:14  4%                 ` Maxime Coquelin
@ 2023-06-13 17:16  3%                   ` Chautru, Nicolas
  2023-06-13 20:00  4%                     ` Maxime Coquelin
  0 siblings, 1 reply; 200+ results
From: Chautru, Nicolas @ 2023-06-13 17:16 UTC (permalink / raw)
  To: Maxime Coquelin, David Marchand
  Cc: Stephen Hemminger, dev, Rix, Tom, hemant.agrawal, Vargas, Hernan

Hi Maxime, 

> -----Original Message-----
> From: Maxime Coquelin <maxime.coquelin@redhat.com>

> 
> On 6/12/23 22:53, Chautru, Nicolas wrote:
> > Hi Maxime, David,
> >
> >> -----Original Message-----
> >> From: Maxime Coquelin <maxime.coquelin@redhat.com>
> >>
> >> On 6/6/23 23:01, Chautru, Nicolas wrote:
> >>> Hi David,
> >>>
> >>>> -----Original Message-----
> >>>> From: David Marchand <david.marchand@redhat.com>> >> On Mon, Jun
> 5,
> >>>> 2023 at 10:08 PM Chautru, Nicolas <nicolas.chautru@intel.com>
> >>>> wrote:
> >>>>> Wrt the MLD functions: these are new into the related serie but
> >>>>> still the
> >>>> break the ABI since the struct rte_bbdev includes these functions
> >>>> hence causing offset changes.
> >>>>>
> >>>>> Should I then just rephrase as:
> >>>>>
> >>>>> +* bbdev: Will extend the API to support the new operation type
> >>>>>    +``RTE_BBDEV_OP_MLDTS`` as per
> >>>>>    +  this `v1
> >>>>>    +<https://patches.dpdk.org/project/dpdk/list/?series=28192>`.
> >>>>> This
> >>>>> + will notably introduce  +  new symbols for
> >>>>> ``rte_bbdev_dequeue_mldts_ops``,  +``rte_bbdev_enqueue_mldts_ops``
> >>>>> into the stuct rte_bbdev.
> >>>>
> >>>> I don't think we need this deprecation notice.
> >>>>
> >>>>
> >>>> Do you need to expose those new mldts ops in rte_bbdev?
> >>>> Can't they go to dev_ops?
> >>>> If you can't, at least moving those new ops at the end of the
> >>>> structure would avoid the breakage on rte_bbdev.
> >>>
> >>> It would probably be best to move all these ops at the end of the
> >>> structure
> >> (ie. keep them together).
> >>> In that case the deprecation notice would call out that the
> >>> rte_bbdev
> >> structure content is more generally modified. Probably best for the
> >> longer run.
> >>> David, Maxime, ok with that option?
> >>>
> >>> struct __rte_cache_aligned rte_bbdev {
> >>>        rte_bbdev_enqueue_enc_ops_t enqueue_enc_ops;
> >>>        rte_bbdev_enqueue_dec_ops_t enqueue_dec_ops;
> >>>        rte_bbdev_dequeue_enc_ops_t dequeue_enc_ops;
> >>>        rte_bbdev_dequeue_dec_ops_t dequeue_dec_ops;
> >>>        rte_bbdev_enqueue_enc_ops_t enqueue_ldpc_enc_ops;
> >>>        rte_bbdev_enqueue_dec_ops_t enqueue_ldpc_dec_ops;
> >>>        rte_bbdev_dequeue_enc_ops_t dequeue_ldpc_enc_ops;
> >>>        rte_bbdev_dequeue_dec_ops_t dequeue_ldpc_dec_ops;
> >>>        rte_bbdev_enqueue_fft_ops_t enqueue_fft_ops;
> >>>        rte_bbdev_dequeue_fft_ops_t dequeue_fft_ops;
> >>>        const struct rte_bbdev_ops *dev_ops;
> >>>        struct rte_bbdev_data *data;
> >>>        enum rte_bbdev_state state;
> >>>        struct rte_device *device;
> >>>        struct rte_bbdev_cb_list list_cbs;
> >>>        struct rte_intr_handle *intr_handle;
> >>>    };
> >>
> >> The best thing, as suggested by David, would be to move all the ops
> >> out of struct rte_bbdev, as these should not be visible to the application.
> >
> > That would be quite disruptive across all PMDs and possible perf impact to
> validate. I don’t think this is anywhere realistic to consider such a change in
> 23.11.
> > I believe moving these function at the end of the structure is a good
> compromise to avoid future breakage of rte_bbdev structure with almost
> seamless impact (purely a ABI break when moving into 23.11 which is not
> avoidable. Retrospectively we should have done that in 22.11 really.
> 
> If we are going to break the ABI, better to do the right rework directly. Otherwise
> we'll end-up breaking it again next year.

With the suggested change, this will not break ABI next year. Any future functions are added at the end of the structure anyway. 

> 
> IMHO, moving these ops should be quite trivial and not much work.
> 
> Otherwise, if we just placed the rte_bbdev_dequeue_mldts_ops and
> rte_bbdev_enqueue_mldts_ops at the bottom of struct rte_bbdev, it may not
> break the ABI, but that's a bit fragile:
> - rte_bbdev_devices[] is not static, but is placed in the BSS section so
>    should be OK
> - struct rte_bbdev is cache-aligned, so it may work if adding these two
>    ops do not overlap a cacheline which depends on the CPU architecture.

If you prefer to add the only 2 new functions at the end of the structure that is okay. I believe it would be cleaner to move all these enqueue/dequeue funs down together without drawback I can think of. Let me know. 

> 
> Maxime
> 
> > What do you think Maxime, David? Based on this I can adjust the change for
> 23.11 and update slightly the deprecation notice accordingly.
> >
> > Thanks
> > Nic
> >


^ permalink raw reply	[relevance 3%]

* [PATCH v4] build: prevent accidentally building without NUMA support
  2023-06-13 16:58  4% [PATCH v3] build: prevent accidentally building without NUMA support Bruce Richardson
@ 2023-06-13 17:08  4% ` Bruce Richardson
  2023-06-15 14:38  4% ` [PATCH v5] " Bruce Richardson
  1 sibling, 0 replies; 200+ results
From: Bruce Richardson @ 2023-06-13 17:08 UTC (permalink / raw)
  To: dev; +Cc: Bruce Richardson, David Marchand

When libnuma development package is missing on a system, DPDK can still
be built but will be missing much-needed support for NUMA memory
management. This may later cause issues at runtime if the resulting
binary is run on a NUMA system.

We can reduce the incidence of such runtime errors by ensuring that, for
native builds*, libnuma is present - unless the user actually specifies
via "max_numa_nodes" that they don't require NUMA support. Having this
as an error condition is also in keeping with what is documented in the
Linux GSG doc, where libnuma is listed as a requirement for building
DPDK [1].

* NOTE: cross-compilation builds have a different logic set, with a
  separate "numa" value indicating if numa support is necessary.

Depends-on: series-28489 ("replace int flags with booleans")

[1] https://doc.dpdk.org/guides-23.03/linux_gsg/sys_reqs.html

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Signed-off-by: David Marchand <david.marchand@redhat.com>

---
V4: Add Depends-on tag so CI picks up dependency

V3:
- install 32-bit libnuma packages on CI systems [thanks to David
  for the changes]
- split the patch out of the previous patchset, so it can be tracked
  separately from the more minor fixup changes.

V2: Limit check to linux only
---
 .github/workflows/build.yml | 5 ++++-
 config/meson.build          | 9 +++++++++
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 3b629fcdbd..a479783bbc 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -91,6 +91,9 @@ jobs:
       with:
         path: reference
         key: ${{ steps.get_ref_keys.outputs.abi }}
+    - name: Configure i386 architecture
+      if: env.BUILD_32BIT == 'true'
+      run: sudo dpkg --add-architecture i386
     - name: Update APT cache
       run: sudo apt update || true
     - name: Install packages
@@ -104,7 +107,7 @@ jobs:
         pkg-config
     - name: Install i386 cross compiling packages
       if: env.BUILD_32BIT == 'true'
-      run: sudo apt install -y gcc-multilib g++-multilib
+      run: sudo apt install -y gcc-multilib g++-multilib libnuma-dev:i386
     - name: Install aarch64 cross compiling packages
       if: env.AARCH64 == 'true'
       run: sudo apt install -y crossbuild-essential-arm64
diff --git a/config/meson.build b/config/meson.build
index 22d7d908b7..d8223718e4 100644
--- a/config/meson.build
+++ b/config/meson.build
@@ -381,6 +381,15 @@ endif
 if not dpdk_conf.has('RTE_MAX_NUMA_NODES')
     error('Number of NUMA nodes not specified.')
 endif
+if (is_linux and
+        dpdk_conf.get('RTE_MAX_NUMA_NODES') > 1 and
+        not meson.is_cross_build() and
+        not has_libnuma)
+    error('''
+No NUMA library (development package) found, yet DPDK configured for multiple NUMA nodes.
+Please install libnuma, or set 'max_numa_nodes' option to '1' to build without NUMA support.
+''')
+endif
 
 # set the install path for the drivers
 dpdk_conf.set_quoted('RTE_EAL_PMD_PATH', eal_pmd_path)
-- 
2.39.2


^ permalink raw reply	[relevance 4%]

* [PATCH v3] build: prevent accidentally building without NUMA support
@ 2023-06-13 16:58  4% Bruce Richardson
  2023-06-13 17:08  4% ` [PATCH v4] " Bruce Richardson
  2023-06-15 14:38  4% ` [PATCH v5] " Bruce Richardson
  0 siblings, 2 replies; 200+ results
From: Bruce Richardson @ 2023-06-13 16:58 UTC (permalink / raw)
  To: dev; +Cc: Bruce Richardson, David Marchand

When libnuma development package is missing on a system, DPDK can still
be built but will be missing much-needed support for NUMA memory
management. This may later cause issues at runtime if the resulting
binary is run on a NUMA system.

We can reduce the incidence of such runtime errors by ensuring that, for
native builds*, libnuma is present - unless the user actually specifies
via "max_numa_nodes" that they don't require NUMA support. Having this
as an error condition is also in keeping with what is documented in the
Linux GSG doc, where libnuma is listed as a requirement for building
DPDK [1].

* NOTE: cross-compilation builds have a different logic set, with a
  separate "numa" value indicating if numa support is necessary.

[1] https://doc.dpdk.org/guides-23.03/linux_gsg/sys_reqs.html

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Signed-off-by: David Marchand <david.marchand@redhat.com>

---
V3: 
- install 32-bit libnuma packages on CI systems [thanks to David
  for the changes]
- split the patch out of the previous patchset, so it can be tracked
  separately from the more minor fixup changes.

V2: Limit check to linux only
---
 .github/workflows/build.yml | 5 ++++-
 config/meson.build          | 9 +++++++++
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 3b629fcdbd..a479783bbc 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -91,6 +91,9 @@ jobs:
       with:
         path: reference
         key: ${{ steps.get_ref_keys.outputs.abi }}
+    - name: Configure i386 architecture
+      if: env.BUILD_32BIT == 'true'
+      run: sudo dpkg --add-architecture i386
     - name: Update APT cache
       run: sudo apt update || true
     - name: Install packages
@@ -104,7 +107,7 @@ jobs:
         pkg-config
     - name: Install i386 cross compiling packages
       if: env.BUILD_32BIT == 'true'
-      run: sudo apt install -y gcc-multilib g++-multilib
+      run: sudo apt install -y gcc-multilib g++-multilib libnuma-dev:i386
     - name: Install aarch64 cross compiling packages
       if: env.AARCH64 == 'true'
       run: sudo apt install -y crossbuild-essential-arm64
diff --git a/config/meson.build b/config/meson.build
index 22d7d908b7..d8223718e4 100644
--- a/config/meson.build
+++ b/config/meson.build
@@ -381,6 +381,15 @@ endif
 if not dpdk_conf.has('RTE_MAX_NUMA_NODES')
     error('Number of NUMA nodes not specified.')
 endif
+if (is_linux and
+        dpdk_conf.get('RTE_MAX_NUMA_NODES') > 1 and
+        not meson.is_cross_build() and
+        not has_libnuma)
+    error('''
+No NUMA library (development package) found, yet DPDK configured for multiple NUMA nodes.
+Please install libnuma, or set 'max_numa_nodes' option to '1' to build without NUMA support.
+''')
+endif
 
 # set the install path for the drivers
 dpdk_conf.set_quoted('RTE_EAL_PMD_PATH', eal_pmd_path)
-- 
2.39.2


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] fbarray: get fbarrays from containerized secondary
  @ 2023-06-13 16:51  3% ` Stephen Hemminger
  0 siblings, 0 replies; 200+ results
From: Stephen Hemminger @ 2023-06-13 16:51 UTC (permalink / raw)
  To: ogawa.yasufumi; +Cc: anatoly.burakov, dev, stable

On Tue, 16 Apr 2019 10:59:12 +0900
ogawa.yasufumi@lab.ntt.co.jp wrote:

> From: Yasufumi Ogawa <ogawa.yasufumi@lab.ntt.co.jp>
> 
> In secondary_msl_create_walk(), it creates a file for fbarrays with its
> PID for reserving unique name among secondary processes. However, it
> does not work as expected if secondary is run as app container becuase
> each of containerized secondary has PID 1. To reserve unique name, use
> hostname instead of PID if the value is 1.
> 
> Cc: stable@dpdk.org
> 
> Signed-off-by: Yasufumi Ogawa <ogawa.yasufumi@lab.ntt.co.jp>
> ---

Since this is an ABI break. I propose that a more invasive solution
would be better. Either change to using something more unique GUID
or change the fbarray structure to be a variable length array.
The internals of fbarray should also be hidden (ie not in rte_fbarray.h)
and the init() function changed into something that allocates the array.

The current patch has not gotten any followup or acceptance in 4 years.
So marking it as changes requested.

^ permalink raw reply	[relevance 3%]

* [PATCH v2 4/4] ci: build examples externally
  @ 2023-06-13 14:06 10%   ` David Marchand
  0 siblings, 0 replies; 200+ results
From: David Marchand @ 2023-06-13 14:06 UTC (permalink / raw)
  To: dev; +Cc: thomas, bruce.richardson, Aaron Conole, Michael Santana

Enhance our CI coverage by building examples against an installed DPDK.

Signed-off-by: David Marchand <david.marchand@redhat.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---
Changes since v1:
- reworked built examples discovery,
- added comment for people who are not sed fluent,

---
 .ci/linux-build.sh          | 27 ++++++++++++++++++++++++++-
 .github/workflows/build.yml |  6 +++---
 2 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/.ci/linux-build.sh b/.ci/linux-build.sh
index 9631e342b5..b8f80760c2 100755
--- a/.ci/linux-build.sh
+++ b/.ci/linux-build.sh
@@ -1,7 +1,7 @@
 #!/bin/sh -xe
 
 if [ -z "${DEF_LIB:-}" ]; then
-    DEF_LIB=static ABI_CHECKS= BUILD_DOCS= RUN_TESTS= $0
+    DEF_LIB=static ABI_CHECKS= BUILD_DOCS= BUILD_EXAMPLES= RUN_TESTS= $0
     DEF_LIB=shared $0
     exit
 fi
@@ -99,6 +99,7 @@ if [ "$MINI" = "true" ]; then
 else
     OPTS="$OPTS -Ddisable_libs="
 fi
+OPTS="$OPTS -Dlibdir=lib"
 
 if [ "$ASAN" = "true" ]; then
     OPTS="$OPTS -Db_sanitize=address"
@@ -168,3 +169,27 @@ if [ "$RUN_TESTS" = "true" ]; then
     catch_coredump
     [ "$failed" != "true" ]
 fi
+
+# Test examples compilation with an installed dpdk
+if [ "$BUILD_EXAMPLES" = "true" ]; then
+    [ -d install ] || DESTDIR=$(pwd)/install ninja -C build install
+    export LD_LIBRARY_PATH=$(dirname $(find $(pwd)/install -name librte_eal.so)):$LD_LIBRARY_PATH
+    export PKG_CONFIG_PATH=$(dirname $(find $(pwd)/install -name libdpdk.pc)):$PKG_CONFIG_PATH
+    export PKGCONF="pkg-config --define-prefix"
+    find build/examples -maxdepth 1 -type f -name "dpdk-*" |
+    while read target; do
+        target=${target%%:*}
+        target=${target#build/examples/dpdk-}
+        if [ -e examples/$target/Makefile ]; then
+            echo $target
+            continue
+        fi
+        # Some examples binaries are built from an example sub
+        # directory, discover the "top level" example name.
+        find examples -name Makefile |
+        sed -ne "s,examples/\([^/]*\)\(/.*\|\)/$target/Makefile,\1,p"
+    done | sort -u |
+    while read example; do
+        make -C install/usr/local/share/dpdk/examples/$example clean shared
+    done
+fi
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 3b629fcdbd..414dd089e0 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -20,6 +20,7 @@ jobs:
       BUILD_32BIT: ${{ matrix.config.cross == 'i386' }}
       BUILD_DEBUG: ${{ contains(matrix.config.checks, 'debug') }}
       BUILD_DOCS: ${{ contains(matrix.config.checks, 'doc') }}
+      BUILD_EXAMPLES: ${{ contains(matrix.config.checks, 'examples') }}
       CC: ccache ${{ matrix.config.compiler }}
       DEF_LIB: ${{ matrix.config.library }}
       LIBABIGAIL_VERSION: libabigail-2.1
@@ -39,7 +40,7 @@ jobs:
             mini: mini
           - os: ubuntu-20.04
             compiler: gcc
-            checks: abi+debug+doc+tests
+            checks: abi+debug+doc+examples+tests
           - os: ubuntu-20.04
             compiler: clang
             checks: asan+doc+tests
@@ -96,12 +97,11 @@ jobs:
     - name: Install packages
       run: sudo apt install -y ccache libarchive-dev libbsd-dev libfdt-dev
         libibverbs-dev libjansson-dev libnuma-dev libpcap-dev libssl-dev
-        ninja-build python3-pip python3-pyelftools python3-setuptools
+        ninja-build pkg-config python3-pip python3-pyelftools python3-setuptools
         python3-wheel zlib1g-dev
     - name: Install libabigail build dependencies if no cache is available
       if: env.ABI_CHECKS == 'true' && steps.libabigail-cache.outputs.cache-hit != 'true'
       run: sudo apt install -y autoconf automake libdw-dev libtool libxml2-dev
-        pkg-config
     - name: Install i386 cross compiling packages
       if: env.BUILD_32BIT == 'true'
       run: sudo apt install -y gcc-multilib g++-multilib
-- 
2.40.1


^ permalink raw reply	[relevance 10%]

* [PATCH 4/4] ci: build examples externally
  @ 2023-06-13  8:17 10% ` David Marchand
      2 siblings, 0 replies; 200+ results
From: David Marchand @ 2023-06-13  8:17 UTC (permalink / raw)
  To: dev; +Cc: thomas, bruce.richardson, Aaron Conole, Michael Santana

Enhance our CI coverage by building examples against an installed DPDK.

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
 .ci/linux-build.sh          | 25 ++++++++++++++++++++++++-
 .github/workflows/build.yml |  6 +++---
 2 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/.ci/linux-build.sh b/.ci/linux-build.sh
index 9631e342b5..1b1f9d07f3 100755
--- a/.ci/linux-build.sh
+++ b/.ci/linux-build.sh
@@ -1,7 +1,7 @@
 #!/bin/sh -xe
 
 if [ -z "${DEF_LIB:-}" ]; then
-    DEF_LIB=static ABI_CHECKS= BUILD_DOCS= RUN_TESTS= $0
+    DEF_LIB=static ABI_CHECKS= BUILD_DOCS= BUILD_EXAMPLES= RUN_TESTS= $0
     DEF_LIB=shared $0
     exit
 fi
@@ -99,6 +99,7 @@ if [ "$MINI" = "true" ]; then
 else
     OPTS="$OPTS -Ddisable_libs="
 fi
+OPTS="$OPTS -Dlibdir=lib"
 
 if [ "$ASAN" = "true" ]; then
     OPTS="$OPTS -Db_sanitize=address"
@@ -168,3 +169,25 @@ if [ "$RUN_TESTS" = "true" ]; then
     catch_coredump
     [ "$failed" != "true" ]
 fi
+
+# Test examples compilation with an installed dpdk
+if [ "$BUILD_EXAMPLES" = "true" ]; then
+    [ -d install ] || DESTDIR=$(pwd)/install ninja -C build install
+    export LD_LIBRARY_PATH=$(dirname $(find $(pwd)/install -name librte_eal.so)):$LD_LIBRARY_PATH
+    export PKG_CONFIG_PATH=$(dirname $(find $(pwd)/install -name libdpdk.pc)):$PKG_CONFIG_PATH
+    export PKGCONF="pkg-config --define-prefix"
+    ninja -C build -t targets all | grep 'examples/.*:.*c_LINKER' |
+    while read target; do
+        target=${target%%:*}
+        target=${target#examples/dpdk-}
+        if [ -e examples/$target/Makefile ]; then
+            echo $target
+            continue
+        fi
+        find examples -name Makefile |
+        sed -ne "s,examples/\([^/]*\)\(/.*\|\)/$target/Makefile,\1,p"
+    done | sort -u |
+    while read example; do
+        make -C install/usr/local/share/dpdk/examples/$example clean shared
+    done
+fi
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 3b629fcdbd..414dd089e0 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -20,6 +20,7 @@ jobs:
       BUILD_32BIT: ${{ matrix.config.cross == 'i386' }}
       BUILD_DEBUG: ${{ contains(matrix.config.checks, 'debug') }}
       BUILD_DOCS: ${{ contains(matrix.config.checks, 'doc') }}
+      BUILD_EXAMPLES: ${{ contains(matrix.config.checks, 'examples') }}
       CC: ccache ${{ matrix.config.compiler }}
       DEF_LIB: ${{ matrix.config.library }}
       LIBABIGAIL_VERSION: libabigail-2.1
@@ -39,7 +40,7 @@ jobs:
             mini: mini
           - os: ubuntu-20.04
             compiler: gcc
-            checks: abi+debug+doc+tests
+            checks: abi+debug+doc+examples+tests
           - os: ubuntu-20.04
             compiler: clang
             checks: asan+doc+tests
@@ -96,12 +97,11 @@ jobs:
     - name: Install packages
       run: sudo apt install -y ccache libarchive-dev libbsd-dev libfdt-dev
         libibverbs-dev libjansson-dev libnuma-dev libpcap-dev libssl-dev
-        ninja-build python3-pip python3-pyelftools python3-setuptools
+        ninja-build pkg-config python3-pip python3-pyelftools python3-setuptools
         python3-wheel zlib1g-dev
     - name: Install libabigail build dependencies if no cache is available
       if: env.ABI_CHECKS == 'true' && steps.libabigail-cache.outputs.cache-hit != 'true'
       run: sudo apt install -y autoconf automake libdw-dev libtool libxml2-dev
-        pkg-config
     - name: Install i386 cross compiling packages
       if: env.BUILD_32BIT == 'true'
       run: sudo apt install -y gcc-multilib g++-multilib
-- 
2.40.1


^ permalink raw reply	[relevance 10%]

* Re: [PATCH v1 1/1] doc: announce change in bbdev api related to operation extension
  2023-06-12 20:53  3%               ` Chautru, Nicolas
@ 2023-06-13  8:14  4%                 ` Maxime Coquelin
  2023-06-13 17:16  3%                   ` Chautru, Nicolas
  0 siblings, 1 reply; 200+ results
From: Maxime Coquelin @ 2023-06-13  8:14 UTC (permalink / raw)
  To: Chautru, Nicolas, David Marchand
  Cc: Stephen Hemminger, dev, Rix, Tom, hemant.agrawal, Vargas, Hernan



On 6/12/23 22:53, Chautru, Nicolas wrote:
> Hi Maxime, David,
> 
>> -----Original Message-----
>> From: Maxime Coquelin <maxime.coquelin@redhat.com>
>>
>> On 6/6/23 23:01, Chautru, Nicolas wrote:
>>> Hi David,
>>>
>>>> -----Original Message-----
>>>> From: David Marchand <david.marchand@redhat.com>> >>
>>>> On Mon, Jun 5, 2023 at 10:08 PM Chautru, Nicolas
>>>> <nicolas.chautru@intel.com> wrote:
>>>>> Wrt the MLD functions: these are new into the related serie but
>>>>> still the
>>>> break the ABI since the struct rte_bbdev includes these functions
>>>> hence causing offset changes.
>>>>>
>>>>> Should I then just rephrase as:
>>>>>
>>>>> +* bbdev: Will extend the API to support the new operation type
>>>>>    +``RTE_BBDEV_OP_MLDTS`` as per
>>>>>    +  this `v1
>>>>>    +<https://patches.dpdk.org/project/dpdk/list/?series=28192>`. This
>>>>> + will notably introduce  +  new symbols for
>>>>> ``rte_bbdev_dequeue_mldts_ops``,  +``rte_bbdev_enqueue_mldts_ops``
>>>>> into the stuct rte_bbdev.
>>>>
>>>> I don't think we need this deprecation notice.
>>>>
>>>>
>>>> Do you need to expose those new mldts ops in rte_bbdev?
>>>> Can't they go to dev_ops?
>>>> If you can't, at least moving those new ops at the end of the
>>>> structure would avoid the breakage on rte_bbdev.
>>>
>>> It would probably be best to move all these ops at the end of the structure
>> (ie. keep them together).
>>> In that case the deprecation notice would call out that the rte_bbdev
>> structure content is more generally modified. Probably best for the longer
>> run.
>>> David, Maxime, ok with that option?
>>>
>>> struct __rte_cache_aligned rte_bbdev {
>>>        rte_bbdev_enqueue_enc_ops_t enqueue_enc_ops;
>>>        rte_bbdev_enqueue_dec_ops_t enqueue_dec_ops;
>>>        rte_bbdev_dequeue_enc_ops_t dequeue_enc_ops;
>>>        rte_bbdev_dequeue_dec_ops_t dequeue_dec_ops;
>>>        rte_bbdev_enqueue_enc_ops_t enqueue_ldpc_enc_ops;
>>>        rte_bbdev_enqueue_dec_ops_t enqueue_ldpc_dec_ops;
>>>        rte_bbdev_dequeue_enc_ops_t dequeue_ldpc_enc_ops;
>>>        rte_bbdev_dequeue_dec_ops_t dequeue_ldpc_dec_ops;
>>>        rte_bbdev_enqueue_fft_ops_t enqueue_fft_ops;
>>>        rte_bbdev_dequeue_fft_ops_t dequeue_fft_ops;
>>>        const struct rte_bbdev_ops *dev_ops;
>>>        struct rte_bbdev_data *data;
>>>        enum rte_bbdev_state state;
>>>        struct rte_device *device;
>>>        struct rte_bbdev_cb_list list_cbs;
>>>        struct rte_intr_handle *intr_handle;
>>>    };
>>
>> The best thing, as suggested by David, would be to move all the ops out of
>> struct rte_bbdev, as these should not be visible to the application.
> 
> That would be quite disruptive across all PMDs and possible perf impact to validate. I don’t think this is anywhere realistic to consider such a change in 23.11.
> I believe moving these function at the end of the structure is a good compromise to avoid future breakage of rte_bbdev structure with almost seamless impact (purely a ABI break when moving into 23.11 which is not avoidable. Retrospectively we should have done that in 22.11 really.

If we are going to break the ABI, better to do the right rework 
directly. Otherwise we'll end-up breaking it again next year.

IMHO, moving these ops should be quite trivial and not much work.

Otherwise, if we just placed the rte_bbdev_dequeue_mldts_ops and
rte_bbdev_enqueue_mldts_ops at the bottom of struct rte_bbdev, it may
not break the ABI, but that's a bit fragile:
- rte_bbdev_devices[] is not static, but is placed in the BSS section so
   should be OK
- struct rte_bbdev is cache-aligned, so it may work if adding these two
   ops do not overlap a cacheline which depends on the CPU architecture.

Maxime

> What do you think Maxime, David? Based on this I can adjust the change for 23.11 and update slightly the deprecation notice accordingly.
> 
> Thanks
> Nic
> 


^ permalink raw reply	[relevance 4%]

* RE: [PATCH v1 1/1] doc: announce change in bbdev api related to operation extension
  2023-06-08  8:47  0%             ` Maxime Coquelin
@ 2023-06-12 20:53  3%               ` Chautru, Nicolas
  2023-06-13  8:14  4%                 ` Maxime Coquelin
  0 siblings, 1 reply; 200+ results
From: Chautru, Nicolas @ 2023-06-12 20:53 UTC (permalink / raw)
  To: Maxime Coquelin, David Marchand
  Cc: Stephen Hemminger, dev, Rix, Tom, hemant.agrawal, Vargas, Hernan

Hi Maxime, David, 

> -----Original Message-----
> From: Maxime Coquelin <maxime.coquelin@redhat.com>
> 
> On 6/6/23 23:01, Chautru, Nicolas wrote:
> > Hi David,
> >
> >> -----Original Message-----
> >> From: David Marchand <david.marchand@redhat.com>> >>
> >> On Mon, Jun 5, 2023 at 10:08 PM Chautru, Nicolas
> >> <nicolas.chautru@intel.com> wrote:
> >>> Wrt the MLD functions: these are new into the related serie but
> >>> still the
> >> break the ABI since the struct rte_bbdev includes these functions
> >> hence causing offset changes.
> >>>
> >>> Should I then just rephrase as:
> >>>
> >>> +* bbdev: Will extend the API to support the new operation type
> >>>   +``RTE_BBDEV_OP_MLDTS`` as per
> >>>   +  this `v1
> >>>   +<https://patches.dpdk.org/project/dpdk/list/?series=28192>`. This
> >>> + will notably introduce  +  new symbols for
> >>> ``rte_bbdev_dequeue_mldts_ops``,  +``rte_bbdev_enqueue_mldts_ops``
> >>> into the stuct rte_bbdev.
> >>
> >> I don't think we need this deprecation notice.
> >>
> >>
> >> Do you need to expose those new mldts ops in rte_bbdev?
> >> Can't they go to dev_ops?
> >> If you can't, at least moving those new ops at the end of the
> >> structure would avoid the breakage on rte_bbdev.
> >
> > It would probably be best to move all these ops at the end of the structure
> (ie. keep them together).
> > In that case the deprecation notice would call out that the rte_bbdev
> structure content is more generally modified. Probably best for the longer
> run.
> > David, Maxime, ok with that option?
> >
> > struct __rte_cache_aligned rte_bbdev {
> >       rte_bbdev_enqueue_enc_ops_t enqueue_enc_ops;
> >       rte_bbdev_enqueue_dec_ops_t enqueue_dec_ops;
> >       rte_bbdev_dequeue_enc_ops_t dequeue_enc_ops;
> >       rte_bbdev_dequeue_dec_ops_t dequeue_dec_ops;
> >       rte_bbdev_enqueue_enc_ops_t enqueue_ldpc_enc_ops;
> >       rte_bbdev_enqueue_dec_ops_t enqueue_ldpc_dec_ops;
> >       rte_bbdev_dequeue_enc_ops_t dequeue_ldpc_enc_ops;
> >       rte_bbdev_dequeue_dec_ops_t dequeue_ldpc_dec_ops;
> >       rte_bbdev_enqueue_fft_ops_t enqueue_fft_ops;
> >       rte_bbdev_dequeue_fft_ops_t dequeue_fft_ops;
> >       const struct rte_bbdev_ops *dev_ops;
> >       struct rte_bbdev_data *data;
> >       enum rte_bbdev_state state;
> >       struct rte_device *device;
> >       struct rte_bbdev_cb_list list_cbs;
> >       struct rte_intr_handle *intr_handle;
> >   };
> 
> The best thing, as suggested by David, would be to move all the ops out of
> struct rte_bbdev, as these should not be visible to the application.

That would be quite disruptive across all PMDs and possible perf impact to validate. I don’t think this is anywhere realistic to consider such a change in 23.11.
I believe moving these function at the end of the structure is a good compromise to avoid future breakage of rte_bbdev structure with almost seamless impact (purely a ABI break when moving into 23.11 which is not avoidable. Retrospectively we should have done that in 22.11 really. 

What do you think Maxime, David? Based on this I can adjust the change for 23.11 and update slightly the deprecation notice accordingly. 

Thanks
Nic

> >>>
> >>> Pasting below the ABI results for reference
> >>>
> >>>    [C] 'function rte_bbdev* rte_bbdev_allocate(const char*)' at
> >> rte_bbdev.c:174:1 has some indirect sub-type changes:
> >>>      return type changed:
> >>>        in pointed to type 'struct rte_bbdev' at rte_bbdev.h:498:1:
> >>>          type size hasn't changed
> >>>          2 data member insertions:
> >>>            'rte_bbdev_enqueue_mldts_ops_t
> >>> rte_bbdev::enqueue_mldts_ops',
> >> at offset 640 (in bits) at rte_bbdev.h:520:1
> >>>            'rte_bbdev_dequeue_mldts_ops_t
> >>> rte_bbdev::dequeue_mldts_ops',
> >> at offset 704 (in bits) at rte_bbdev.h:522:1
> >>>          7 data member changes (9 filtered):
> >>>            type of 'rte_bbdev_dequeue_fft_ops_t
> rte_bbdev::dequeue_fft_ops'
> >> changed:
> >>>              underlying type 'typedef uint16_t
> >>> (rte_bbdev_queue_data*,
> >> rte_bbdev_fft_op**, typedef uint16_t)*' changed:
> >>>                in pointed to type 'function type typedef uint16_t
> >> (rte_bbdev_queue_data*, rte_bbdev_fft_op**, typedef uint16_t)':
> >>>                  parameter 2 of type 'rte_bbdev_fft_op**' has sub-type
> changes:
> >>>                    in pointed to type 'rte_bbdev_fft_op*':
> >>>                      in pointed to type 'struct rte_bbdev_fft_op' at
> >> rte_bbdev_op.h:978:1:
> >>>                        type size changed from 832 to 1664 (in bits)
> >>>                        1 data member change:
> >>>                          type of 'rte_bbdev_op_fft rte_bbdev_fft_op::fft'
> changed:
> >>>                            type size changed from 640 to 1472 (in bits)
> >>>                            6 data member insertions:
> >>>                              'rte_bbdev_op_data
> >> rte_bbdev_op_fft::dewindowing_input', at offset 256 (in bits) at
> >> rte_bbdev_op.h:771:1
> >>>                              'int8_t
> >>> rte_bbdev_op_fft::freq_resample_mode', at offset
> >> 768 (in bits) at rte_bbdev_op.h:807:1
> >>>                              'uint16_t
> >>> rte_bbdev_op_fft::output_depadded_size', at
> >> offset 784 (in bits) at rte_bbdev_op.h:809:1
> >>>                              'uint16_t
> >>> rte_bbdev_op_fft::cs_theta_0[12]', at offset 800
> >> (in bits) at rte_bbdev_op.h:811:1
> >>>                              'uint32_t
> >>> rte_bbdev_op_fft::cs_theta_d[12]', at offset 992
> >> (in bits) at rte_bbdev_op.h:813:1
> >>>                              'int8_t
> >>> rte_bbdev_op_fft::time_offset[12]', at offset 1376
> >> (in bits) at rte_bbdev_op.h:815:1
> >>>                            17 data member changes:
> >>>                              'rte_bbdev_op_data
> >> rte_bbdev_op_fft::power_meas_output' offset changed from 256 to 384
> >> (in
> >> bits) (by +128 bits)
> >>>                              'uint32_t rte_bbdev_op_fft::op_flags'
> >>> offset changed from
> >> 384 to 512 (in bits) (by +128 bits)
> >>>                              'uint16_t
> >>> rte_bbdev_op_fft::input_sequence_size' offset
> >> changed from 416 to 544 (in bits) (by +128 bits)
> >>>                              'uint16_t rte_bbdev_op_fft::input_leading_padding'
> >> offset changed from 432 to 560 (in bits) (by +128 bits)
> >>>                              'uint16_t
> >>> rte_bbdev_op_fft::output_sequence_size' offset
> >> changed from 448 to 576 (in bits) (by +128 bits)
> >>>                              'uint16_t
> rte_bbdev_op_fft::output_leading_depadding'
> >> offset changed from 464 to 592 (in bits) (by +128 bits)
> >>>                              'uint8_t
> >>> rte_bbdev_op_fft::window_index[6]' offset
> >> changed from 480 to 608 (in bits) (by +128 bits)
> >>>                              'uint16_t rte_bbdev_op_fft::cs_bitmap'
> >>> offset changed
> >> from 528 to 656 (in bits) (by +128 bits)
> >>>                              'uint8_t
> >>> rte_bbdev_op_fft::num_antennas_log2' offset
> >> changed from 544 to 672 (in bits) (by +128 bits)
> >>>                              'uint8_t rte_bbdev_op_fft::idft_log2'
> >>> offset changed from
> >> 552 to 680 (in bits) (by +128 bits)
> >>>                              'uint8_t rte_bbdev_op_fft::dft_log2'
> >>> offset changed from
> >> 560 to 688 (in bits) (by +128 bits)
> >>>                              'int8_t
> >>> rte_bbdev_op_fft::cs_time_adjustment' offset
> >> changed from 568 to 696 (in bits) (by +128 bits)
> >>>                              'int8_t rte_bbdev_op_fft::idft_shift'
> >>> offset changed from
> >> 576 to 704 (in bits) (by +128 bits)
> >>>                              'int8_t rte_bbdev_op_fft::dft_shift'
> >>> offset changed from
> >> 584 to 712 (in bits) (by +128 bits)
> >>>                              'uint16_t
> >>> rte_bbdev_op_fft::ncs_reciprocal' offset
> >> changed from 592 to 720 (in bits) (by +128 bits)
> >>>                              'uint16_t
> >>> rte_bbdev_op_fft::power_shift' offset changed
> >> from 608 to 736 (in bits) (by +128 bits)
> >>>                              'uint16_t
> >>> rte_bbdev_op_fft::fp16_exp_adjust' offset
> >> changed from 624 to 752 (in bits) (by +128 bits)
> >>>            'const rte_bbdev_ops* rte_bbdev::dev_ops' offset changed
> >>> from 640
> >> to 768 (in bits) (by +128 bits)
> >>>            'rte_bbdev_data* rte_bbdev::data' offset changed from 704
> >>> to 832
> >> (in bits) (by +128 bits)
> >>>            'rte_bbdev_state rte_bbdev::state' offset changed from
> >>> 768 to 896
> >> (in bits) (by +128 bits)
> >>>            'rte_device* rte_bbdev::device' offset changed from 832
> >>> to 960 (in
> >> bits) (by +128 bits)
> >>>            'rte_bbdev_cb_list rte_bbdev::list_cbs' offset changed
> >>> from 896 to
> >> 1024 (in bits) (by +128 bits)
> >>>            'rte_intr_handle* rte_bbdev::intr_handle' offset changed
> >>> from 1024 to 1152 (in bits) (by +128 bits)
> >>
> >> As for the report on the rte_bbdev_op_fft structure changes:
> >> - wrt to its size, I think it is okay to waive it, rte_bbdev_fft_op
> >> objects are coming from a bbdev mempool which is created by the bbdev
> >> library itself (with the right element size if the application asked
> >> for RTE_BBDEV_OP_FFT type),
> >> - wrt to the fields locations, an application may have been touching
> >> those fields, so moving all the added fields at the end of the
> >> structure would be better.
> >>    But on the other hand, an application will have to call an fft_ops
> >> experimental API at some point, and the application developer is
> >> already warned that ABI is not preserved on this part of the API,
> >>
> >> So I would waive the changes on rte_bbdev_fft_op with something like:
> >>
> >> diff --git a/devtools/libabigail.abignore
> >> b/devtools/libabigail.abignore index
> >> 3ff51509de..3cdce69418 100644
> >> --- a/devtools/libabigail.abignore
> >> +++ b/devtools/libabigail.abignore
> >> @@ -36,6 +36,8 @@
> >>   [suppress_type]
> >>           type_kind = enum
> >>           changed_enumerators = RTE_CRYPTO_ASYM_XFORM_ECPM,
> >> RTE_CRYPTO_ASYM_XFORM_TYPE_LIST_END
> >> +[suppress_type]
> >> +       name = rte_bbdev_fft_op
> >
> >
> > OK I did not know about this method. Shouldn't this apply more generally
> to all experimental structures?
> > This can be added into the serie for 23.11.
> >
> >
> > Thanks
> > Nic
> >
> >
> >
> >>
> >>   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> >>   ; Temporary exceptions till next major ABI version ;
> >>
> >>
> >> --


^ permalink raw reply	[relevance 3%]

* RE: [PATCH v6 1/4] ethdev: add API for mbufs recycle mode
  2023-06-07  0:00  0%               ` Ferruh Yigit
@ 2023-06-12  3:25  0%                 ` Feifei Wang
  0 siblings, 0 replies; 200+ results
From: Feifei Wang @ 2023-06-12  3:25 UTC (permalink / raw)
  To: Ferruh Yigit, Konstantin Ananyev,
	Константин
	Ананьев,
	thomas, Andrew Rybchenko
  Cc: dev, nd, Honnappa Nagarahalli, Ruifeng Wang, nd



> -----Original Message-----
> From: Ferruh Yigit <ferruh.yigit@amd.com>
> Sent: Wednesday, June 7, 2023 8:01 AM
> To: Konstantin Ananyev <konstantin.ananyev@huawei.com>; Feifei Wang
> <Feifei.Wang2@arm.com>; Константин Ананьев
> <konstantin.v.ananyev@yandex.ru>; thomas@monjalon.net; Andrew
> Rybchenko <andrew.rybchenko@oktetlabs.ru>
> Cc: dev@dpdk.org; nd <nd@arm.com>; Honnappa Nagarahalli
> <Honnappa.Nagarahalli@arm.com>; Ruifeng Wang
> <Ruifeng.Wang@arm.com>
> Subject: Re: [PATCH v6 1/4] ethdev: add API for mbufs recycle mode
> 
> On 6/6/2023 9:34 AM, Konstantin Ananyev wrote:
> >
> >
> >>
> >> [...]
> >>>> Probably I am missing something, but why it is not possible to do
> >>>> something
> >>> like that:
> >>>>
> >>>> rte_eth_recycle_mbufs(rx_port_id=X, rx_queue_id=Y, tx_port_id=N,
> >>>> tx_queue_id=M, ...); ....
> >>>> rte_eth_recycle_mbufs(rx_port_id=X, rx_queue_id=Y, tx_port_id=N,
> >>>> tx_queue_id=K, ...);
> >>>>
> >>>> I.E. feed rx queue from 2 tx queues?
> >>>>
> >>>> Two problems for this:
> >>>> 1. If we have 2 tx queues for rx, the thread should make the extra
> >>>> judgement to decide which one to choose in the driver layer.
> >>>
> >>> Not sure, why on the driver layer?
> >>> The example I gave above - decision is made on application layer.
> >>> Lets say first call didn't free enough mbufs, so app decided to use
> >>> second txq for rearm.
> >> [Feifei] I think currently mbuf recycle mode can support this usage. For
> examples:
> >> n =  rte_eth_recycle_mbufs(rx_port_id=X, rx_queue_id=Y, tx_port_id=N,
> >> tx_queue_id=M, ...); if (n < planned_number)
> >> rte_eth_recycle_mbufs(rx_port_id=X, rx_queue_id=Y, tx_port_id=N,
> >> tx_queue_id=K, ...);
> >>
> >> Thus, if users want, they can do like this.
> >
> > Yes, that was my thought, that's why I was surprise that in the comments we
> have:
> > " Currently, the rte_eth_recycle_mbufs() function can only support
> > one-time pairing
> > * between the receive queue and transmit queue. Do not pair one
> > receive queue with
> >  * multiple transmit queues or pair one transmit queue with multiple
> > receive queues,
> >  * in order to avoid memory error rewriting."
> >
> 
> I guess that is from previous versions of the set, it can be good to address
> limitations/restrictions again with latest version.

[Feifei]  Sorry, I think this is due to my ambiguous expression in function description.
I wanted to show 'mbufs_recycle' cannot support multiple threads.

I will change the description and add extra expression to tell users that they
can change config from one txq to another in single thread.
Thanks for the comments. 

> 
> 
> >>
> >>>
> >>>> On the other hand, current mechanism can support users to switch 1
> >>>> txq to another timely in the application layer. If user want to
> >>>> choose another txq, he just need to change the txq_queue_id parameter
> in the API.
> >>>> 2. If you want one rxq to support two txq at the same time, this
> >>>> needs to add spinlock on guard variable to avoid multi-thread conflict.
> >>>> Spinlock will decrease the data-path performance greatly.  Thus, we
> >>>> do not consider
> >>>> 1 rxq mapping multiple txqs here.
> >>>
> >>> I am talking about situation when one thread controls 2 tx queues.
> >>>
> >>>> + *
> >>>> + * @param rx_port_id
> >>>> + * Port identifying the receive side.
> >>>> + * @param rx_queue_id
> >>>> + * The index of the receive queue identifying the receive side.
> >>>> + * The value must be in the range [0, nb_rx_queue - 1] previously
> >>>> +supplied
> >>>> + * to rte_eth_dev_configure().
> >>>> + * @param tx_port_id
> >>>> + * Port identifying the transmit side.
> >>>> + * @param tx_queue_id
> >>>> + * The index of the transmit queue identifying the transmit side.
> >>>> + * The value must be in the range [0, nb_tx_queue - 1] previously
> >>>> +supplied
> >>>> + * to rte_eth_dev_configure().
> >>>> + * @param recycle_rxq_info
> >>>> + * A pointer to a structure of type *rte_eth_recycle_rxq_info*
> >>>> +which contains
> >>>> + * the information of the Rx queue mbuf ring.
> >>>> + * @return
> >>>> + * The number of recycling mbufs.
> >>>> + */
> >>>> +__rte_experimental
> >>>> +static inline uint16_t
> >>>> +rte_eth_recycle_mbufs(uint16_t rx_port_id, uint16_t rx_queue_id,
> >>>> +uint16_t tx_port_id, uint16_t tx_queue_id,  struct
> >>>> +rte_eth_recycle_rxq_info *recycle_rxq_info) {  struct
> >>>> +rte_eth_fp_ops *p;  void *qd;  uint16_t nb_mbufs;
> >>>> +
> >>>> +#ifdef RTE_ETHDEV_DEBUG_TX
> >>>> + if (tx_port_id >= RTE_MAX_ETHPORTS ||  tx_queue_id >=
> >>>> +RTE_MAX_QUEUES_PER_PORT) {  RTE_ETHDEV_LOG(ERR,  "Invalid
> >>>> +tx_port_id=%u or tx_queue_id=%u\n",  tx_port_id, tx_queue_id);
> >>>> +return 0;  } #endif
> >>>> +
> >>>> + /* fetch pointer to queue data */ p =
> >>>> + &rte_eth_fp_ops[tx_port_id]; qd = p->txq.data[tx_queue_id];
> >>>> +
> >>>> +#ifdef RTE_ETHDEV_DEBUG_TX
> >>>> + RTE_ETH_VALID_PORTID_OR_ERR_RET(tx_port_id, 0);
> >>>> +
> >>>> + if (qd == NULL) {
> >>>> + RTE_ETHDEV_LOG(ERR, "Invalid Tx queue_id=%u for port_id=%u\n",
> >>>> +tx_queue_id, tx_port_id);  return 0;  } #endif  if
> >>>> +(p->recycle_tx_mbufs_reuse == NULL)  return 0;
> >>>> +
> >>>> + /* Copy used *rte_mbuf* buffer pointers from Tx mbuf ring
> >>>> + * into Rx mbuf ring.
> >>>> + */
> >>>> + nb_mbufs = p->recycle_tx_mbufs_reuse(qd, recycle_rxq_info);
> >>>> +
> >>>> + /* If no recycling mbufs, return 0. */ if (nb_mbufs == 0) return
> >>>> + 0;
> >>>> +
> >>>> +#ifdef RTE_ETHDEV_DEBUG_RX
> >>>> + if (rx_port_id >= RTE_MAX_ETHPORTS ||  rx_queue_id >=
> >>>> +RTE_MAX_QUEUES_PER_PORT) {  RTE_ETHDEV_LOG(ERR, "Invalid
> >>>> +rx_port_id=%u or rx_queue_id=%u\n",  rx_port_id, rx_queue_id);
> >>>> +return 0;  } #endif
> >>>> +
> >>>> + /* fetch pointer to queue data */ p =
> >>>> + &rte_eth_fp_ops[rx_port_id]; qd = p->rxq.data[rx_queue_id];
> >>>> +
> >>>> +#ifdef RTE_ETHDEV_DEBUG_RX
> >>>> + RTE_ETH_VALID_PORTID_OR_ERR_RET(rx_port_id, 0);
> >>>> +
> >>>> + if (qd == NULL) {
> >>>> + RTE_ETHDEV_LOG(ERR, "Invalid Rx queue_id=%u for port_id=%u\n",
> >>>> +rx_queue_id, rx_port_id);  return 0;  } #endif
> >>>> +
> >>>> + if (p->recycle_rx_descriptors_refill == NULL) return 0;
> >>>> +
> >>>> + /* Replenish the Rx descriptors with the recycling
> >>>> + * into Rx mbuf ring.
> >>>> + */
> >>>> + p->recycle_rx_descriptors_refill(qd, nb_mbufs);
> >>>> +
> >>>> + return nb_mbufs;
> >>>> +}
> >>>> +
> >>>>  /**
> >>>>   * @warning
> >>>>   * @b EXPERIMENTAL: this API may change without prior notice diff
> >>>> --git a/lib/ethdev/rte_ethdev_core.h b/lib/ethdev/rte_ethdev_core.h
> >>>> index dcf8adab92..a2e6ea6b6c 100644
> >>>> --- a/lib/ethdev/rte_ethdev_core.h
> >>>> +++ b/lib/ethdev/rte_ethdev_core.h
> >>>> @@ -56,6 +56,13 @@ typedef int (*eth_rx_descriptor_status_t)(void
> >>>> *rxq, uint16_t offset);
> >>>>  /** @internal Check the status of a Tx descriptor */  typedef int
> >>>> (*eth_tx_descriptor_status_t)(void *txq, uint16_t offset);
> >>>>
> >>>> +/** @internal Copy used mbufs from Tx mbuf ring into Rx mbuf ring
> >>>> +*/ typedef uint16_t (*eth_recycle_tx_mbufs_reuse_t)(void *txq,
> >>>> +struct rte_eth_recycle_rxq_info *recycle_rxq_info);
> >>>> +
> >>>> +/** @internal Refill Rx descriptors with the recycling mbufs */
> >>>> +typedef void (*eth_recycle_rx_descriptors_refill_t)(void *rxq,
> >>>> +uint16_t nb);
> >>>> +
> >>>>  /**
> >>>>   * @internal
> >>>>   * Structure used to hold opaque pointers to internal ethdev Rx/Tx
> >>>> @@
> >>>> -90,9 +97,11 @@ struct rte_eth_fp_ops {
> >>>>          eth_rx_queue_count_t rx_queue_count;
> >>>>          /** Check the status of a Rx descriptor. */
> >>>>          eth_rx_descriptor_status_t rx_descriptor_status;
> >>>> + /** Refill Rx descriptors with the recycling mbufs. */
> >>>> + eth_recycle_rx_descriptors_refill_t
> >>>> + recycle_rx_descriptors_refill;
> >>>> I am afraid we can't put new fields here without ABI breakage.
> >>>>
> >>>> Agree
> >>>>
> >>>> It has to be below rxq.
> >>>> Now thinking about current layout probably not the best one, and
> >>>> when introducing this struct, I should probably put rxq either on
> >>>> the top of the struct, or on the next cache line.
> >>>> But such change is not possible right now anyway.
> >>>> Same story for txq.
> >>>>
> >>>> Thus we should rearrange the structure like below:
> >>>> struct rte_eth_fp_ops {
> >>>>     struct rte_ethdev_qdata rxq;
> >>>>          eth_rx_burst_t rx_pkt_burst;
> >>>>          eth_rx_queue_count_t rx_queue_count;
> >>>>          eth_rx_descriptor_status_t rx_descriptor_status;
> >>>>        eth_recycle_rx_descriptors_refill_t recycle_rx_descriptors_refill;
> >>>>               uintptr_t reserved1[2]; }
> >>>
> >>> Yes, I think such layout will be better.
> >>> The only problem here - we have to wait for 23.11 for that.
> >>>
> >> Ok, if not this change, maybe we still need to wait. Because
> >> mbufs_recycle have other ABI breakage. Such as the change for 'struct
> rte_eth_dev'.
> >
> > Ok by me.
> >
> >>>>
> >>>>
> >>>>          /** Rx queues data. */
> >>>>          struct rte_ethdev_qdata rxq;
> >>>> - uintptr_t reserved1[3];
> >>>> + uintptr_t reserved1[2];
> >>>>          /**@}*/
> >>>>
> >>>>          /**@{*/
> >>>> @@ -106,9 +115,11 @@ struct rte_eth_fp_ops {
> >>>>          eth_tx_prep_t tx_pkt_prepare;
> >>>>          /** Check the status of a Tx descriptor. */
> >>>>          eth_tx_descriptor_status_t tx_descriptor_status;
> >>>> + /** Copy used mbufs from Tx mbuf ring into Rx. */
> >>>> + eth_recycle_tx_mbufs_reuse_t recycle_tx_mbufs_reuse;
> >>>>          /** Tx queues data. */
> >>>>          struct rte_ethdev_qdata txq;
> >>>> - uintptr_t reserved2[3];
> >>>> + uintptr_t reserved2[2];
> >>>>          /**@}*/
> >>>>
> >>>>  } __rte_cache_aligned;
> >>>> diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map index
> >>>> 357d1a88c0..45c417f6bd 100644
> >>>> --- a/lib/ethdev/version.map
> >>>> +++ b/lib/ethdev/version.map
> >>>> @@ -299,6 +299,10 @@ EXPERIMENTAL {
> >>>>          rte_flow_action_handle_query_update;
> >>>>          rte_flow_async_action_handle_query_update;
> >>>>          rte_flow_async_create_by_index;
> >>>> +
> >>>> + # added in 23.07
> >>>> + rte_eth_recycle_mbufs;
> >>>> + rte_eth_recycle_rx_queue_info_get;
> >>>>  };
> >>>>
> >>>>  INTERNAL {
> >>>> --
> >>>> 2.25.1
> >>>>


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [RFC PATCH] mark experimental variables
  @ 2023-06-12  2:49  0% ` Stephen Hemminger
  0 siblings, 0 replies; 200+ results
From: Stephen Hemminger @ 2023-06-12  2:49 UTC (permalink / raw)
  To: David Marchand
  Cc: nhorman, dev, thomas, arybchenko, stable, Ray Kinsella,
	John McNamara, Marko Kovacevic, Qiming Yang, Wenzhuo Lu,
	Declan Doherty, Adrien Mazarguil, Ferruh Yigit,
	Cristian Dumitrescu

On Mon, 25 Nov 2019 17:13:14 +0100
David Marchand <david.marchand@redhat.com> wrote:

> So far, we did not pay attention to direct access to variables but they
> are part of the API/ABI too and should be clearly identified.
> 
> Introduce a __rte_experimental_var tag and mark existing variables.
> 
> Fixes: a4bcd61de82d ("buildtools: add script to check experimental API exports")
> Cc: stable@dpdk.org
> 
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> ---
> Quick patch to try to catch experimental variables.
> Not sure if we could use a single section, so please advise if there is
> better to do about this.
> 
> ---
>  buildtools/check-experimental-syms.sh      | 17 +++++++++++++++--
>  devtools/checkpatches.sh                   | 14 +++++++++-----
>  doc/guides/contributing/abi_policy.rst     |  7 ++++---
>  drivers/net/ice/rte_pmd_ice.h              |  3 +++
>  lib/librte_cryptodev/rte_crypto_asym.h     |  3 +++
>  lib/librte_eal/common/include/rte_compat.h |  5 +++++
>  lib/librte_ethdev/rte_flow.h               | 17 +++++++++++++++++
>  lib/librte_port/rte_port_eventdev.h        |  5 +++++
>  8 files changed, 61 insertions(+), 10 deletions(-)

This is a good idea, but the patch has gone stale in 4 years.
Symbols have changed, directories have changed.
If someone wants to continue this, please rebase and recheck.

Marking the original patch with Changes Requested.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 0/2] eal/bitmap: support reverse bitmap scan
  @ 2023-06-12  2:23  4% ` Stephen Hemminger
  0 siblings, 0 replies; 200+ results
From: Stephen Hemminger @ 2023-06-12  2:23 UTC (permalink / raw)
  To: Vivek Sharma; +Cc: dev, cristian.dumitrescu

On Tue,  9 Oct 2018 13:24:57 +0530
Vivek Sharma <vivek.sharma@caviumnetworks.com> wrote:

> This patchset implements the support for reverse bitmap scanning along with
> test support. Reverse scanning is quite useful when bit position signifies
> an ordering according to some attribute, e.g., priority ordering.
> 
> Prerequisite:
> * Note that this patchset is dependent on patch:-
>   'http://patches.dpdk.org/patch/45307/'
> 
> Vivek Sharma (2):
>   eal/bitmap: support bitmap reverse scanning
>   test/bitmap: implement reverse bitmap scan test
> 
>  lib/librte_eal/common/include/rte_bitmap.h | 164 +++++++++++++++++++++++++----
>  test/test/test_bitmap.c                    |  71 ++++++++++++-
>  2 files changed, 213 insertions(+), 22 deletions(-)
> 

This patchset has had no feedback in 5 years.
* There was never an application that needed it.
* EAL directory structure changed.
* It would cause an ABI breakage.

If you have an example that needs it, then rebase and follow ABI
rules and the next ABI change will be for 23.11


^ permalink raw reply	[relevance 4%]

* [PATCH v3] doc: prefer installing using meson rather than ninja
    2023-06-09 13:34  3% ` [PATCH v2] " Bruce Richardson
@ 2023-06-09 14:51  3% ` Bruce Richardson
  2023-06-23 11:43  4% ` [PATCH v4] " Bruce Richardson
  2 siblings, 0 replies; 200+ results
From: Bruce Richardson @ 2023-06-09 14:51 UTC (permalink / raw)
  To: dev; +Cc: david.marchand, Bruce Richardson

After doing a build, to install DPDK system-wide our documentation
recommended using the "ninja install" command. However, for anyone
building as a non-root user and only installing as root, the "meson
install" command is a better alternative, as it provides for
automatically dropping or elevating privileges as necessary in more
recent meson releases [1].

[1] https://mesonbuild.com/Installing.html#installing-as-the-superuser

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>

---
V3:
* correct order of arguments to meson in CI scripts. The "-C" option
  must follow the meson "install" command. [This is consistent with
  other uses e.g. meson compile -C ..., meson test -C ...]

V2:
* Fix one missed reference to "ninja install" in Linux GSG
* Changed CI scripts to use "meson install" to ensure step is properly
  tested.
---
 .ci/linux-build.sh                           | 4 ++--
 doc/guides/contributing/coding_style.rst     | 2 +-
 doc/guides/cryptodevs/uadk.rst               | 2 +-
 doc/guides/freebsd_gsg/build_dpdk.rst        | 2 +-
 doc/guides/freebsd_gsg/build_sample_apps.rst | 2 +-
 doc/guides/linux_gsg/build_dpdk.rst          | 4 ++--
 doc/guides/prog_guide/build-sdk-meson.rst    | 4 ++--
 7 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/.ci/linux-build.sh b/.ci/linux-build.sh
index 9631e342b5..76d3e776af 100755
--- a/.ci/linux-build.sh
+++ b/.ci/linux-build.sh
@@ -150,14 +150,14 @@ if [ "$ABI_CHECKS" = "true" ]; then
         git clone --single-branch -b "$REF_GIT_TAG" $REF_GIT_REPO $refsrcdir
         meson setup $OPTS -Dexamples= $refsrcdir $refsrcdir/build
         ninja -C $refsrcdir/build
-        DESTDIR=$(pwd)/reference ninja -C $refsrcdir/build install
+        DESTDIR=$(pwd)/reference meson install -C $refsrcdir/build
         find reference/usr/local -name '*.a' -delete
         rm -rf reference/usr/local/bin
         rm -rf reference/usr/local/share
         echo $REF_GIT_TAG > reference/VERSION
     fi
 
-    DESTDIR=$(pwd)/install ninja -C build install
+    DESTDIR=$(pwd)/install meson install -C build
     devtools/check-abi.sh reference install ${ABI_CHECKS_WARN_ONLY:-}
 fi
 
diff --git a/doc/guides/contributing/coding_style.rst b/doc/guides/contributing/coding_style.rst
index 89db6260cf..00d6270624 100644
--- a/doc/guides/contributing/coding_style.rst
+++ b/doc/guides/contributing/coding_style.rst
@@ -956,7 +956,7 @@ ext_deps
 headers
 	**Default Value = []**.
 	Used to return the list of header files for the library that should be
-	installed to $PREFIX/include when ``ninja install`` is run. As with
+	installed to $PREFIX/include when ``meson install`` is run. As with
 	source files, these should be specified using the meson ``files()``
 	function.
 	When ``check_includes`` build option is set to ``true``, each header file
diff --git a/doc/guides/cryptodevs/uadk.rst b/doc/guides/cryptodevs/uadk.rst
index 9af6b88a5a..136ab4be6a 100644
--- a/doc/guides/cryptodevs/uadk.rst
+++ b/doc/guides/cryptodevs/uadk.rst
@@ -90,7 +90,7 @@ Test steps
       meson setup build (--reconfigure)
       cd build
       ninja
-      sudo ninja install
+      sudo meson install
 
 #. Prepare hugepages for DPDK (see also :doc:`../tools/hugepages`)
 
diff --git a/doc/guides/freebsd_gsg/build_dpdk.rst b/doc/guides/freebsd_gsg/build_dpdk.rst
index 514d18c870..86e8e5a805 100644
--- a/doc/guides/freebsd_gsg/build_dpdk.rst
+++ b/doc/guides/freebsd_gsg/build_dpdk.rst
@@ -47,7 +47,7 @@ The final, install, step generally needs to be run as root::
   meson setup build
   cd build
   ninja
-  ninja install
+  meson install
 
 This will install the DPDK libraries and drivers to `/usr/local/lib` with a
 pkg-config file `libdpdk.pc` installed to `/usr/local/lib/pkgconfig`. The
diff --git a/doc/guides/freebsd_gsg/build_sample_apps.rst b/doc/guides/freebsd_gsg/build_sample_apps.rst
index c87e982759..b1ab7545b1 100644
--- a/doc/guides/freebsd_gsg/build_sample_apps.rst
+++ b/doc/guides/freebsd_gsg/build_sample_apps.rst
@@ -22,7 +22,7 @@ the system when DPDK is installed, and so can be built using GNU make.
    on the FreeBSD system.
 
 The following shows how to compile the helloworld example app, following
-the installation of DPDK using `ninja install` as described previously::
+the installation of DPDK using `meson install` as described previously::
 
         $ export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
 
diff --git a/doc/guides/linux_gsg/build_dpdk.rst b/doc/guides/linux_gsg/build_dpdk.rst
index bbd2efc9d8..9c0dd9daf6 100644
--- a/doc/guides/linux_gsg/build_dpdk.rst
+++ b/doc/guides/linux_gsg/build_dpdk.rst
@@ -68,11 +68,11 @@ Once configured, to build and then install DPDK system-wide use:
 
         cd build
         ninja
-        ninja install
+        meson install
         ldconfig
 
 The last two commands above generally need to be run as root,
-with the `ninja install` step copying the built objects to their final system-wide locations,
+with the `meson install` step copying the built objects to their final system-wide locations,
 and the last step causing the dynamic loader `ld.so` to update its cache to take account of the new objects.
 
 .. note::
diff --git a/doc/guides/prog_guide/build-sdk-meson.rst b/doc/guides/prog_guide/build-sdk-meson.rst
index 5deabbe54c..93aa1f80e3 100644
--- a/doc/guides/prog_guide/build-sdk-meson.rst
+++ b/doc/guides/prog_guide/build-sdk-meson.rst
@@ -12,7 +12,7 @@ following set of commands::
 	meson setup build
 	cd build
 	ninja
-	ninja install
+	meson install
 
 This will compile DPDK in the ``build`` subdirectory, and then install the
 resulting libraries, drivers and header files onto the system - generally
@@ -165,7 +165,7 @@ printing each command on a new line as it runs.
 Installing the Compiled Files
 ------------------------------
 
-Use ``ninja install`` to install the required DPDK files onto the system.
+Use ``meson install`` to install the required DPDK files onto the system.
 The install prefix defaults to ``/usr/local`` but can be used as with other
 options above. The environment variable ``DESTDIR`` can be used to adjust
 the root directory for the install, for example when packaging.
-- 
2.39.2


^ permalink raw reply	[relevance 3%]

* [PATCH v2] doc: prefer installing using meson rather than ninja
  @ 2023-06-09 13:34  3% ` Bruce Richardson
  2023-06-09 14:51  3% ` [PATCH v3] " Bruce Richardson
  2023-06-23 11:43  4% ` [PATCH v4] " Bruce Richardson
  2 siblings, 0 replies; 200+ results
From: Bruce Richardson @ 2023-06-09 13:34 UTC (permalink / raw)
  To: dev; +Cc: david.marchand, Bruce Richardson

After doing a build, to install DPDK system-wide our documentation
recommended using the "ninja install" command. However, for anyone
building as a non-root user and only installing as root, the "meson
install" command is a better alternative, as it provides for
automatically dropping or elevating privileges as necessary in more
recent meson releases [1].

[1] https://mesonbuild.com/Installing.html#installing-as-the-superuser

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>

---
V2:
* Fix one missed reference to "ninja install" in Linux GSG
* Changed CI scripts to use "meson install" to ensure step is properly
  tested.
---
 .ci/linux-build.sh                           | 4 ++--
 doc/guides/contributing/coding_style.rst     | 2 +-
 doc/guides/cryptodevs/uadk.rst               | 2 +-
 doc/guides/freebsd_gsg/build_dpdk.rst        | 2 +-
 doc/guides/freebsd_gsg/build_sample_apps.rst | 2 +-
 doc/guides/linux_gsg/build_dpdk.rst          | 4 ++--
 doc/guides/prog_guide/build-sdk-meson.rst    | 4 ++--
 7 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/.ci/linux-build.sh b/.ci/linux-build.sh
index 9631e342b5..69ca46a6a1 100755
--- a/.ci/linux-build.sh
+++ b/.ci/linux-build.sh
@@ -150,14 +150,14 @@ if [ "$ABI_CHECKS" = "true" ]; then
         git clone --single-branch -b "$REF_GIT_TAG" $REF_GIT_REPO $refsrcdir
         meson setup $OPTS -Dexamples= $refsrcdir $refsrcdir/build
         ninja -C $refsrcdir/build
-        DESTDIR=$(pwd)/reference ninja -C $refsrcdir/build install
+        DESTDIR=$(pwd)/reference meson -C $refsrcdir/build install
         find reference/usr/local -name '*.a' -delete
         rm -rf reference/usr/local/bin
         rm -rf reference/usr/local/share
         echo $REF_GIT_TAG > reference/VERSION
     fi
 
-    DESTDIR=$(pwd)/install ninja -C build install
+    DESTDIR=$(pwd)/install meson -C build install
     devtools/check-abi.sh reference install ${ABI_CHECKS_WARN_ONLY:-}
 fi
 
diff --git a/doc/guides/contributing/coding_style.rst b/doc/guides/contributing/coding_style.rst
index 89db6260cf..00d6270624 100644
--- a/doc/guides/contributing/coding_style.rst
+++ b/doc/guides/contributing/coding_style.rst
@@ -956,7 +956,7 @@ ext_deps
 headers
 	**Default Value = []**.
 	Used to return the list of header files for the library that should be
-	installed to $PREFIX/include when ``ninja install`` is run. As with
+	installed to $PREFIX/include when ``meson install`` is run. As with
 	source files, these should be specified using the meson ``files()``
 	function.
 	When ``check_includes`` build option is set to ``true``, each header file
diff --git a/doc/guides/cryptodevs/uadk.rst b/doc/guides/cryptodevs/uadk.rst
index 9af6b88a5a..136ab4be6a 100644
--- a/doc/guides/cryptodevs/uadk.rst
+++ b/doc/guides/cryptodevs/uadk.rst
@@ -90,7 +90,7 @@ Test steps
       meson setup build (--reconfigure)
       cd build
       ninja
-      sudo ninja install
+      sudo meson install
 
 #. Prepare hugepages for DPDK (see also :doc:`../tools/hugepages`)
 
diff --git a/doc/guides/freebsd_gsg/build_dpdk.rst b/doc/guides/freebsd_gsg/build_dpdk.rst
index 514d18c870..86e8e5a805 100644
--- a/doc/guides/freebsd_gsg/build_dpdk.rst
+++ b/doc/guides/freebsd_gsg/build_dpdk.rst
@@ -47,7 +47,7 @@ The final, install, step generally needs to be run as root::
   meson setup build
   cd build
   ninja
-  ninja install
+  meson install
 
 This will install the DPDK libraries and drivers to `/usr/local/lib` with a
 pkg-config file `libdpdk.pc` installed to `/usr/local/lib/pkgconfig`. The
diff --git a/doc/guides/freebsd_gsg/build_sample_apps.rst b/doc/guides/freebsd_gsg/build_sample_apps.rst
index c87e982759..b1ab7545b1 100644
--- a/doc/guides/freebsd_gsg/build_sample_apps.rst
+++ b/doc/guides/freebsd_gsg/build_sample_apps.rst
@@ -22,7 +22,7 @@ the system when DPDK is installed, and so can be built using GNU make.
    on the FreeBSD system.
 
 The following shows how to compile the helloworld example app, following
-the installation of DPDK using `ninja install` as described previously::
+the installation of DPDK using `meson install` as described previously::
 
         $ export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
 
diff --git a/doc/guides/linux_gsg/build_dpdk.rst b/doc/guides/linux_gsg/build_dpdk.rst
index bbd2efc9d8..9c0dd9daf6 100644
--- a/doc/guides/linux_gsg/build_dpdk.rst
+++ b/doc/guides/linux_gsg/build_dpdk.rst
@@ -68,11 +68,11 @@ Once configured, to build and then install DPDK system-wide use:
 
         cd build
         ninja
-        ninja install
+        meson install
         ldconfig
 
 The last two commands above generally need to be run as root,
-with the `ninja install` step copying the built objects to their final system-wide locations,
+with the `meson install` step copying the built objects to their final system-wide locations,
 and the last step causing the dynamic loader `ld.so` to update its cache to take account of the new objects.
 
 .. note::
diff --git a/doc/guides/prog_guide/build-sdk-meson.rst b/doc/guides/prog_guide/build-sdk-meson.rst
index 5deabbe54c..93aa1f80e3 100644
--- a/doc/guides/prog_guide/build-sdk-meson.rst
+++ b/doc/guides/prog_guide/build-sdk-meson.rst
@@ -12,7 +12,7 @@ following set of commands::
 	meson setup build
 	cd build
 	ninja
-	ninja install
+	meson install
 
 This will compile DPDK in the ``build`` subdirectory, and then install the
 resulting libraries, drivers and header files onto the system - generally
@@ -165,7 +165,7 @@ printing each command on a new line as it runs.
 Installing the Compiled Files
 ------------------------------
 
-Use ``ninja install`` to install the required DPDK files onto the system.
+Use ``meson install`` to install the required DPDK files onto the system.
 The install prefix defaults to ``/usr/local`` but can be used as with other
 options above. The environment variable ``DESTDIR`` can be used to adjust
 the root directory for the install, for example when packaging.
-- 
2.39.2


^ permalink raw reply	[relevance 3%]

* Re: [PATCH v1 1/1] doc: announce change in bbdev api related to operation extension
  2023-06-06 21:01  0%           ` Chautru, Nicolas
@ 2023-06-08  8:47  0%             ` Maxime Coquelin
  2023-06-12 20:53  3%               ` Chautru, Nicolas
  0 siblings, 1 reply; 200+ results
From: Maxime Coquelin @ 2023-06-08  8:47 UTC (permalink / raw)
  To: Chautru, Nicolas, David Marchand
  Cc: Stephen Hemminger, dev, Rix, Tom, hemant.agrawal, Vargas, Hernan



On 6/6/23 23:01, Chautru, Nicolas wrote:
> Hi David,
> 
>> -----Original Message-----
>> From: David Marchand <david.marchand@redhat.com>
>> Sent: Tuesday, June 6, 2023 2:21 AM
>> To: Chautru, Nicolas <nicolas.chautru@intel.com>
>> Cc: Maxime Coquelin <maxime.coquelin@redhat.com>; Stephen Hemminger
>> <stephen@networkplumber.org>; dev@dpdk.org; Rix, Tom
>> <trix@redhat.com>; hemant.agrawal@nxp.com; Vargas, Hernan
>> <hernan.vargas@intel.com>
>> Subject: Re: [PATCH v1 1/1] doc: announce change in bbdev api related to
>> operation extension
>>
>> On Mon, Jun 5, 2023 at 10:08 PM Chautru, Nicolas
>> <nicolas.chautru@intel.com> wrote:
>>> Wrt the MLD functions: these are new into the related serie but still the
>> break the ABI since the struct rte_bbdev includes these functions hence
>> causing offset changes.
>>>
>>> Should I then just rephrase as:
>>>
>>> +* bbdev: Will extend the API to support the new operation type
>>>   +``RTE_BBDEV_OP_MLDTS`` as per
>>>   +  this `v1
>>>   +<https://patches.dpdk.org/project/dpdk/list/?series=28192>`. This  +
>>> will notably introduce  +  new symbols for
>>> ``rte_bbdev_dequeue_mldts_ops``,  +``rte_bbdev_enqueue_mldts_ops``
>>> into the stuct rte_bbdev.
>>
>> I don't think we need this deprecation notice.
>>
>>
>> Do you need to expose those new mldts ops in rte_bbdev?
>> Can't they go to dev_ops?
>> If you can't, at least moving those new ops at the end of the structure
>> would avoid the breakage on rte_bbdev.
> 
> It would probably be best to move all these ops at the end of the structure (ie. keep them together).
> In that case the deprecation notice would call out that the rte_bbdev structure content is more generally modified. Probably best for the longer run.
> David, Maxime, ok with that option?
> 
> struct __rte_cache_aligned rte_bbdev {
>       rte_bbdev_enqueue_enc_ops_t enqueue_enc_ops;
>       rte_bbdev_enqueue_dec_ops_t enqueue_dec_ops;
>       rte_bbdev_dequeue_enc_ops_t dequeue_enc_ops;
>       rte_bbdev_dequeue_dec_ops_t dequeue_dec_ops;
>       rte_bbdev_enqueue_enc_ops_t enqueue_ldpc_enc_ops;
>       rte_bbdev_enqueue_dec_ops_t enqueue_ldpc_dec_ops;
>       rte_bbdev_dequeue_enc_ops_t dequeue_ldpc_enc_ops;
>       rte_bbdev_dequeue_dec_ops_t dequeue_ldpc_dec_ops;
>       rte_bbdev_enqueue_fft_ops_t enqueue_fft_ops;
>       rte_bbdev_dequeue_fft_ops_t dequeue_fft_ops;
>       const struct rte_bbdev_ops *dev_ops;
>       struct rte_bbdev_data *data;
>       enum rte_bbdev_state state;
>       struct rte_device *device;
>       struct rte_bbdev_cb_list list_cbs;
>       struct rte_intr_handle *intr_handle;
>   };

The best thing, as suggested by David, would be to move all the ops out 
of struct rte_bbdev, as these should not be visible to the application.

> 
> 
> 
>>
>>
>>>
>>> Pasting below the ABI results for reference
>>>
>>>    [C] 'function rte_bbdev* rte_bbdev_allocate(const char*)' at
>> rte_bbdev.c:174:1 has some indirect sub-type changes:
>>>      return type changed:
>>>        in pointed to type 'struct rte_bbdev' at rte_bbdev.h:498:1:
>>>          type size hasn't changed
>>>          2 data member insertions:
>>>            'rte_bbdev_enqueue_mldts_ops_t rte_bbdev::enqueue_mldts_ops',
>> at offset 640 (in bits) at rte_bbdev.h:520:1
>>>            'rte_bbdev_dequeue_mldts_ops_t rte_bbdev::dequeue_mldts_ops',
>> at offset 704 (in bits) at rte_bbdev.h:522:1
>>>          7 data member changes (9 filtered):
>>>            type of 'rte_bbdev_dequeue_fft_ops_t rte_bbdev::dequeue_fft_ops'
>> changed:
>>>              underlying type 'typedef uint16_t (rte_bbdev_queue_data*,
>> rte_bbdev_fft_op**, typedef uint16_t)*' changed:
>>>                in pointed to type 'function type typedef uint16_t
>> (rte_bbdev_queue_data*, rte_bbdev_fft_op**, typedef uint16_t)':
>>>                  parameter 2 of type 'rte_bbdev_fft_op**' has sub-type changes:
>>>                    in pointed to type 'rte_bbdev_fft_op*':
>>>                      in pointed to type 'struct rte_bbdev_fft_op' at
>> rte_bbdev_op.h:978:1:
>>>                        type size changed from 832 to 1664 (in bits)
>>>                        1 data member change:
>>>                          type of 'rte_bbdev_op_fft rte_bbdev_fft_op::fft' changed:
>>>                            type size changed from 640 to 1472 (in bits)
>>>                            6 data member insertions:
>>>                              'rte_bbdev_op_data
>> rte_bbdev_op_fft::dewindowing_input', at offset 256 (in bits) at
>> rte_bbdev_op.h:771:1
>>>                              'int8_t rte_bbdev_op_fft::freq_resample_mode', at offset
>> 768 (in bits) at rte_bbdev_op.h:807:1
>>>                              'uint16_t rte_bbdev_op_fft::output_depadded_size', at
>> offset 784 (in bits) at rte_bbdev_op.h:809:1
>>>                              'uint16_t rte_bbdev_op_fft::cs_theta_0[12]', at offset 800
>> (in bits) at rte_bbdev_op.h:811:1
>>>                              'uint32_t rte_bbdev_op_fft::cs_theta_d[12]', at offset 992
>> (in bits) at rte_bbdev_op.h:813:1
>>>                              'int8_t rte_bbdev_op_fft::time_offset[12]', at offset 1376
>> (in bits) at rte_bbdev_op.h:815:1
>>>                            17 data member changes:
>>>                              'rte_bbdev_op_data
>> rte_bbdev_op_fft::power_meas_output' offset changed from 256 to 384 (in
>> bits) (by +128 bits)
>>>                              'uint32_t rte_bbdev_op_fft::op_flags' offset changed from
>> 384 to 512 (in bits) (by +128 bits)
>>>                              'uint16_t rte_bbdev_op_fft::input_sequence_size' offset
>> changed from 416 to 544 (in bits) (by +128 bits)
>>>                              'uint16_t rte_bbdev_op_fft::input_leading_padding'
>> offset changed from 432 to 560 (in bits) (by +128 bits)
>>>                              'uint16_t rte_bbdev_op_fft::output_sequence_size' offset
>> changed from 448 to 576 (in bits) (by +128 bits)
>>>                              'uint16_t rte_bbdev_op_fft::output_leading_depadding'
>> offset changed from 464 to 592 (in bits) (by +128 bits)
>>>                              'uint8_t rte_bbdev_op_fft::window_index[6]' offset
>> changed from 480 to 608 (in bits) (by +128 bits)
>>>                              'uint16_t rte_bbdev_op_fft::cs_bitmap' offset changed
>> from 528 to 656 (in bits) (by +128 bits)
>>>                              'uint8_t rte_bbdev_op_fft::num_antennas_log2' offset
>> changed from 544 to 672 (in bits) (by +128 bits)
>>>                              'uint8_t rte_bbdev_op_fft::idft_log2' offset changed from
>> 552 to 680 (in bits) (by +128 bits)
>>>                              'uint8_t rte_bbdev_op_fft::dft_log2' offset changed from
>> 560 to 688 (in bits) (by +128 bits)
>>>                              'int8_t rte_bbdev_op_fft::cs_time_adjustment' offset
>> changed from 568 to 696 (in bits) (by +128 bits)
>>>                              'int8_t rte_bbdev_op_fft::idft_shift' offset changed from
>> 576 to 704 (in bits) (by +128 bits)
>>>                              'int8_t rte_bbdev_op_fft::dft_shift' offset changed from
>> 584 to 712 (in bits) (by +128 bits)
>>>                              'uint16_t rte_bbdev_op_fft::ncs_reciprocal' offset
>> changed from 592 to 720 (in bits) (by +128 bits)
>>>                              'uint16_t rte_bbdev_op_fft::power_shift' offset changed
>> from 608 to 736 (in bits) (by +128 bits)
>>>                              'uint16_t rte_bbdev_op_fft::fp16_exp_adjust' offset
>> changed from 624 to 752 (in bits) (by +128 bits)
>>>            'const rte_bbdev_ops* rte_bbdev::dev_ops' offset changed from 640
>> to 768 (in bits) (by +128 bits)
>>>            'rte_bbdev_data* rte_bbdev::data' offset changed from 704 to 832
>> (in bits) (by +128 bits)
>>>            'rte_bbdev_state rte_bbdev::state' offset changed from 768 to 896
>> (in bits) (by +128 bits)
>>>            'rte_device* rte_bbdev::device' offset changed from 832 to 960 (in
>> bits) (by +128 bits)
>>>            'rte_bbdev_cb_list rte_bbdev::list_cbs' offset changed from 896 to
>> 1024 (in bits) (by +128 bits)
>>>            'rte_intr_handle* rte_bbdev::intr_handle' offset changed
>>> from 1024 to 1152 (in bits) (by +128 bits)
>>
>> As for the report on the rte_bbdev_op_fft structure changes:
>> - wrt to its size, I think it is okay to waive it, rte_bbdev_fft_op objects are
>> coming from a bbdev mempool which is created by the bbdev library itself
>> (with the right element size if the application asked for RTE_BBDEV_OP_FFT
>> type),
>> - wrt to the fields locations, an application may have been touching those
>> fields, so moving all the added fields at the end of the structure would be
>> better.
>>    But on the other hand, an application will have to call an fft_ops
>> experimental API at some point, and the application developer is already
>> warned that ABI is not preserved on this part of the API,
>>
>> So I would waive the changes on rte_bbdev_fft_op with something like:
>>
>> diff --git a/devtools/libabigail.abignore b/devtools/libabigail.abignore index
>> 3ff51509de..3cdce69418 100644
>> --- a/devtools/libabigail.abignore
>> +++ b/devtools/libabigail.abignore
>> @@ -36,6 +36,8 @@
>>   [suppress_type]
>>           type_kind = enum
>>           changed_enumerators = RTE_CRYPTO_ASYM_XFORM_ECPM,
>> RTE_CRYPTO_ASYM_XFORM_TYPE_LIST_END
>> +[suppress_type]
>> +       name = rte_bbdev_fft_op
> 
> 
> OK I did not know about this method. Shouldn't this apply more generally to all experimental structures?
> This can be added into the serie for 23.11.
> 
> 
> Thanks
> Nic
> 
> 
> 
>>
>>   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
>>   ; Temporary exceptions till next major ABI version ;
>>
>>
>> --
>> David Marchand
> 


^ permalink raw reply	[relevance 0%]

* RE: [EXT] Re: [PATCH v2 01/13] security: add direction in SA/SC configuration
  2023-06-07 19:49  3%     ` David Marchand
@ 2023-06-08  6:58  0%       ` Akhil Goyal
  0 siblings, 0 replies; 200+ results
From: Akhil Goyal @ 2023-06-08  6:58 UTC (permalink / raw)
  To: David Marchand
  Cc: dev, thomas, olivier.matz, orika, hemant.agrawal,
	Vamsi Krishna Attunuru, ferruh.yigit, andrew.rybchenko,
	Jerin Jacob Kollanukkaran, Ankur Dwivedi, Dodji Seketeli

> On Wed, Jun 7, 2023 at 5:20 PM Akhil Goyal <gakhil@marvell.com> wrote:
> >
> > MACsec SC/SA ids are created based on direction of the flow.
> > Hence, added the missing field for configuration and cleanup
> > of the SCs and SAs.
> >
> > Signed-off-by: Akhil Goyal <gakhil@marvell.com>
> > ---
> >  devtools/libabigail.abignore       |  7 +++++++
> >  lib/security/rte_security.c        | 16 ++++++++++------
> >  lib/security/rte_security.h        | 14 ++++++++++----
> >  lib/security/rte_security_driver.h | 12 ++++++++++--
> >  4 files changed, 37 insertions(+), 12 deletions(-)
> >
> 
> Looking at the report with no supression rule:
> $ abidiff --suppr .../next-cryptodev/devtools/libabigail.abignore
> --no-added-syms --headers-dir1
> .../abi/v23.03/build-gcc-shared/usr/local/include --headers-dir2
> .../next-cryptodev/build-gcc-shared/install/usr/local/include
> .../abi/v23.03/build-gcc-shared/usr/local/lib64/librte_security.so.23.1
> .../next-cryptodev/build-gcc-
> shared/install/usr/local/lib64/librte_security.so.23.2
> Functions changes summary: 0 Removed, 1 Changed (13 filtered out), 0
> Added functions
> Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
> 
> 1 function with some indirect sub-type change:
> 
>   [C] 'function const rte_security_capability*
> rte_security_capabilities_get(rte_security_ctx*)' at
> rte_security.c:241:1 has some indirect sub-type changes:
>     parameter 1 of type 'rte_security_ctx*' has sub-type changes:
>       in pointed to type 'struct rte_security_ctx' at rte_security.h:69:1:
>         type size hasn't changed
>         1 data member change:
>           type of 'const rte_security_ops* ops' changed:
>             in pointed to type 'const rte_security_ops':
>               in unqualified underlying type 'struct rte_security_ops'
> at rte_security_driver.h:230:1:
>                 type size hasn't changed
>                 4 data member changes (4 filtered):
>                   type of 'security_macsec_sc_create_t
> macsec_sc_create' changed:
>                     underlying type 'int (void*,
> rte_security_macsec_sc*)*' changed:
>                       in pointed to type 'function type int (void*,
> rte_security_macsec_sc*)':
>                         parameter 2 of type 'rte_security_macsec_sc*'
> has sub-type changes:
>                           in pointed to type 'struct
> rte_security_macsec_sc' at rte_security.h:399:1:
>                             type size changed from 256 to 320 (in bits)
>                             1 data member insertion:
>                               'union {struct {uint16_t sa_id[4];
> uint8_t sa_in_use[4]; uint8_t active; uint8_t is_xpn; uint8_t
> reserved;} sc_rx; struct {uint16_t sa_id; uint16_t sa_id_rekey;
> uint64_t sci; uint8_t active; uint8_t re_key_en; uint8_t is_xpn;
> uint8_t reserved;} sc_tx;}', at offset 128 (in bits)
>                             1 data member change:
>                               anonymous data member union {struct
> {uint16_t sa_id[4]; uint8_t sa_in_use[4]; uint8_t active; uint8_t
> reserved;} sc_rx; struct {uint16_t sa_id; uint16_t sa_id_rekey;
> uint64_t sci; uint8_t active; uint8_t re_key_en; uint8_t reserved;}
> sc_tx;} at offset 64 (in bits) became data member 'uint64_t
> pn_threshold'
>                               and size changed from 192 to 64 (in
> bits) (by -128 bits)
>                   type of 'security_macsec_sc_destroy_t
> macsec_sc_destroy' changed:
>                     underlying type 'int (void*, typedef uint16_t)*' changed:
>                       in pointed to type 'function type int (void*,
> typedef uint16_t)':
>                         parameter 3 of type 'enum
> rte_security_macsec_direction' was added
>                   type of 'security_macsec_sc_stats_get_t
> macsec_sc_stats_get' changed:
>                     underlying type 'int (void*, typedef uint16_t,
> rte_security_macsec_sc_stats*)*' changed:
>                       in pointed to type 'function type int (void*,
> typedef uint16_t, rte_security_macsec_sc_stats*)':
>                         parameter 3 of type
> 'rte_security_macsec_sc_stats*' changed:
>                           entity changed from
> 'rte_security_macsec_sc_stats*' to 'enum
> rte_security_macsec_direction' at rte_security.h:361:1
>                           type size changed from 64 to 32 (in bits)
>                           type alignment changed from 0 to 32
>                         parameter 4 of type
> 'rte_security_macsec_sc_stats*' was added
>                   type of 'security_macsec_sa_stats_get_t
> macsec_sa_stats_get' changed:
>                     underlying type 'int (void*, typedef uint16_t,
> rte_security_macsec_sa_stats*)*' changed:
>                       in pointed to type 'function type int (void*,
> typedef uint16_t, rte_security_macsec_sa_stats*)':
>                         parameter 3 of type
> 'rte_security_macsec_sa_stats*' changed:
>                           entity changed from
> 'rte_security_macsec_sa_stats*' to 'enum
> rte_security_macsec_direction' at rte_security.h:361:1
>                           type size changed from 64 to 32 (in bits)
>                           type alignment changed from 0 to 32
>                         parameter 4 of type
> 'rte_security_macsec_sa_stats*' was added
> 
> The report complains about the macsec ops type changes.
> 
> > diff --git a/devtools/libabigail.abignore b/devtools/libabigail.abignore
> > index c0361bfc7b..14d8fa4293 100644
> > --- a/devtools/libabigail.abignore
> > +++ b/devtools/libabigail.abignore
> > @@ -37,6 +37,13 @@
> >  [suppress_type]
> >          type_kind = enum
> >          changed_enumerators = RTE_CRYPTO_ASYM_XFORM_ECPM,
> RTE_CRYPTO_ASYM_XFORM_TYPE_LIST_END
> > +; Ignore changes to rte_security_ops MACsec APIs which are experimental
> > +[suppress_type]
> > +        name = rte_security_ops
> > +        has_data_member_inserted_between =
> > +        {
> > +                offset_of(security_macsec_sc_create_t),
> offset_of(security_macsec_sa_stats_get_t)
> > +        }
> 
> So I don't get the intent with this rule.
> There is no field named neither security_macsec_sc_create_t nor
> security_macsec_sa_stats_get_t in the rte_security_ops struct.
> 
> Now.. why is this rule making the check pass... it is a mystery to me.
> I already hit a case when libabigail ignored statements that are
> invalid or make no sense, so my guess is that this rule is actually
> applied as a simple:
> [suppress_type]
>         name = rte_security_ops
> 
> And well, this rule is ok from my pov: this rte_security_ops struct
> does not change in size.
> An application is not supposed to know about its content (that is
> defined in a driver header) and all accesses to those ops are supposed
> to be through symbols from the security library.
> So I would go with this "larger" and simpler rule.

The intent was to make it specific to MACsec APIs only.
I am ok with both as these are internal thing and would change it in next release.
Updated the v3 as per your suggestion.

> 
> 
> Just a small addition to this, as discussed offlist, this is going to
> be reworked in v23.11 and this rule on rte_security_ops will be
> unneccesary, so please move it in the relevant block (at the end) of
> the libabigail.abignore file.
Ack

^ permalink raw reply	[relevance 0%]

* [PATCH v3 01/13] security: add direction in SA/SC configuration
  @ 2023-06-08  6:54  3%     ` Akhil Goyal
  0 siblings, 0 replies; 200+ results
From: Akhil Goyal @ 2023-06-08  6:54 UTC (permalink / raw)
  To: dev
  Cc: thomas, olivier.matz, orika, david.marchand, hemant.agrawal,
	vattunuru, ferruh.yigit, andrew.rybchenko, jerinj, adwivedi,
	Akhil Goyal

MACsec SC/SA ids are created based on direction of the flow.
Hence, added the missing field for configuration and cleanup
of the SCs and SAs.

Signed-off-by: Akhil Goyal <gakhil@marvell.com>
---
 devtools/libabigail.abignore       |  4 ++++
 lib/security/rte_security.c        | 16 ++++++++++------
 lib/security/rte_security.h        | 14 ++++++++++----
 lib/security/rte_security_driver.h | 12 ++++++++++--
 4 files changed, 34 insertions(+), 12 deletions(-)

diff --git a/devtools/libabigail.abignore b/devtools/libabigail.abignore
index c0361bfc7b..03bfbce259 100644
--- a/devtools/libabigail.abignore
+++ b/devtools/libabigail.abignore
@@ -41,3 +41,7 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; Temporary exceptions till next major ABI version ;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+; Ignore changes to rte_security_ops which are internal to PMD.
+[suppress_type]
+        name = rte_security_ops
diff --git a/lib/security/rte_security.c b/lib/security/rte_security.c
index e102c55e55..c4d64bb8e9 100644
--- a/lib/security/rte_security.c
+++ b/lib/security/rte_security.c
@@ -164,13 +164,14 @@ rte_security_macsec_sa_create(struct rte_security_ctx *instance,
 }
 
 int
-rte_security_macsec_sc_destroy(struct rte_security_ctx *instance, uint16_t sc_id)
+rte_security_macsec_sc_destroy(struct rte_security_ctx *instance, uint16_t sc_id,
+			       enum rte_security_macsec_direction dir)
 {
 	int ret;
 
 	RTE_PTR_CHAIN3_OR_ERR_RET(instance, ops, macsec_sc_destroy, -EINVAL, -ENOTSUP);
 
-	ret = instance->ops->macsec_sc_destroy(instance->device, sc_id);
+	ret = instance->ops->macsec_sc_destroy(instance->device, sc_id, dir);
 	if (ret != 0)
 		return ret;
 
@@ -181,13 +182,14 @@ rte_security_macsec_sc_destroy(struct rte_security_ctx *instance, uint16_t sc_id
 }
 
 int
-rte_security_macsec_sa_destroy(struct rte_security_ctx *instance, uint16_t sa_id)
+rte_security_macsec_sa_destroy(struct rte_security_ctx *instance, uint16_t sa_id,
+			       enum rte_security_macsec_direction dir)
 {
 	int ret;
 
 	RTE_PTR_CHAIN3_OR_ERR_RET(instance, ops, macsec_sa_destroy, -EINVAL, -ENOTSUP);
 
-	ret = instance->ops->macsec_sa_destroy(instance->device, sa_id);
+	ret = instance->ops->macsec_sa_destroy(instance->device, sa_id, dir);
 	if (ret != 0)
 		return ret;
 
@@ -199,22 +201,24 @@ rte_security_macsec_sa_destroy(struct rte_security_ctx *instance, uint16_t sa_id
 
 int
 rte_security_macsec_sc_stats_get(struct rte_security_ctx *instance, uint16_t sc_id,
+				 enum rte_security_macsec_direction dir,
 				 struct rte_security_macsec_sc_stats *stats)
 {
 	RTE_PTR_CHAIN3_OR_ERR_RET(instance, ops, macsec_sc_stats_get, -EINVAL, -ENOTSUP);
 	RTE_PTR_OR_ERR_RET(stats, -EINVAL);
 
-	return instance->ops->macsec_sc_stats_get(instance->device, sc_id, stats);
+	return instance->ops->macsec_sc_stats_get(instance->device, sc_id, dir, stats);
 }
 
 int
 rte_security_macsec_sa_stats_get(struct rte_security_ctx *instance, uint16_t sa_id,
+				 enum rte_security_macsec_direction dir,
 				 struct rte_security_macsec_sa_stats *stats)
 {
 	RTE_PTR_CHAIN3_OR_ERR_RET(instance, ops, macsec_sa_stats_get, -EINVAL, -ENOTSUP);
 	RTE_PTR_OR_ERR_RET(stats, -EINVAL);
 
-	return instance->ops->macsec_sa_stats_get(instance->device, sa_id, stats);
+	return instance->ops->macsec_sa_stats_get(instance->device, sa_id, dir, stats);
 }
 
 int
diff --git a/lib/security/rte_security.h b/lib/security/rte_security.h
index 4bacf9fcd9..c7a523b6d6 100644
--- a/lib/security/rte_security.h
+++ b/lib/security/rte_security.h
@@ -761,6 +761,7 @@ rte_security_macsec_sc_create(struct rte_security_ctx *instance,
  *
  * @param   instance	security instance
  * @param   sc_id	SC ID to be destroyed
+ * @param   dir		direction of the SC
  * @return
  *  - 0 if successful.
  *  - -EINVAL if sc_id is invalid or instance is NULL.
@@ -768,7 +769,8 @@ rte_security_macsec_sc_create(struct rte_security_ctx *instance,
  */
 __rte_experimental
 int
-rte_security_macsec_sc_destroy(struct rte_security_ctx *instance, uint16_t sc_id);
+rte_security_macsec_sc_destroy(struct rte_security_ctx *instance, uint16_t sc_id,
+			       enum rte_security_macsec_direction dir);
 
 /**
  * @warning
@@ -798,6 +800,7 @@ rte_security_macsec_sa_create(struct rte_security_ctx *instance,
  *
  * @param   instance	security instance
  * @param   sa_id	SA ID to be destroyed
+ * @param   dir		direction of the SA
  * @return
  *  - 0 if successful.
  *  - -EINVAL if sa_id is invalid or instance is NULL.
@@ -805,7 +808,8 @@ rte_security_macsec_sa_create(struct rte_security_ctx *instance,
  */
 __rte_experimental
 int
-rte_security_macsec_sa_destroy(struct rte_security_ctx *instance, uint16_t sa_id);
+rte_security_macsec_sa_destroy(struct rte_security_ctx *instance, uint16_t sa_id,
+			       enum rte_security_macsec_direction dir);
 
 /** Device-specific metadata field type */
 typedef uint64_t rte_security_dynfield_t;
@@ -1077,6 +1081,7 @@ rte_security_session_stats_get(struct rte_security_ctx *instance,
  *
  * @param	instance	security instance
  * @param	sa_id		SA ID for which stats are needed
+ * @param	dir		direction of the SA
  * @param	stats		statistics
  * @return
  *  - On success, return 0.
@@ -1085,7 +1090,7 @@ rte_security_session_stats_get(struct rte_security_ctx *instance,
 __rte_experimental
 int
 rte_security_macsec_sa_stats_get(struct rte_security_ctx *instance,
-				 uint16_t sa_id,
+				 uint16_t sa_id, enum rte_security_macsec_direction dir,
 				 struct rte_security_macsec_sa_stats *stats);
 
 /**
@@ -1096,6 +1101,7 @@ rte_security_macsec_sa_stats_get(struct rte_security_ctx *instance,
  *
  * @param	instance	security instance
  * @param	sc_id		SC ID for which stats are needed
+ * @param	dir		direction of the SC
  * @param	stats		SC statistics
  * @return
  *  - On success, return 0.
@@ -1104,7 +1110,7 @@ rte_security_macsec_sa_stats_get(struct rte_security_ctx *instance,
 __rte_experimental
 int
 rte_security_macsec_sc_stats_get(struct rte_security_ctx *instance,
-				 uint16_t sc_id,
+				 uint16_t sc_id, enum rte_security_macsec_direction dir,
 				 struct rte_security_macsec_sc_stats *stats);
 
 /**
diff --git a/lib/security/rte_security_driver.h b/lib/security/rte_security_driver.h
index 421e6f7780..677c7d1f91 100644
--- a/lib/security/rte_security_driver.h
+++ b/lib/security/rte_security_driver.h
@@ -106,8 +106,10 @@ typedef int (*security_macsec_sc_create_t)(void *device, struct rte_security_mac
  *
  * @param	device		Crypto/eth device pointer
  * @param	sc_id		MACsec SC ID
+ * @param	dir		Direction of SC
  */
-typedef int (*security_macsec_sc_destroy_t)(void *device, uint16_t sc_id);
+typedef int (*security_macsec_sc_destroy_t)(void *device, uint16_t sc_id,
+		enum rte_security_macsec_direction dir);
 
 /**
  * Configure a MACsec security Association (SA) on a device.
@@ -128,8 +130,10 @@ typedef int (*security_macsec_sa_create_t)(void *device, struct rte_security_mac
  *
  * @param	device		Crypto/eth device pointer
  * @param	sa_id		MACsec SA ID
+ * @param	dir		Direction of SA
  */
-typedef int (*security_macsec_sa_destroy_t)(void *device, uint16_t sa_id);
+typedef int (*security_macsec_sa_destroy_t)(void *device, uint16_t sa_id,
+		enum rte_security_macsec_direction dir);
 
 /**
  * Get the size of a security session
@@ -162,6 +166,7 @@ typedef int (*security_session_stats_get_t)(void *device,
  *
  * @param	device		Crypto/eth device pointer
  * @param	sc_id		secure channel ID created by rte_security_macsec_sc_create()
+ * @param	dir		direction of SC
  * @param	stats		SC stats of the driver
  *
  * @return
@@ -169,6 +174,7 @@ typedef int (*security_session_stats_get_t)(void *device,
  *  - -EINVAL if sc_id or device is invalid.
  */
 typedef int (*security_macsec_sc_stats_get_t)(void *device, uint16_t sc_id,
+		enum rte_security_macsec_direction dir,
 		struct rte_security_macsec_sc_stats *stats);
 
 /**
@@ -176,6 +182,7 @@ typedef int (*security_macsec_sc_stats_get_t)(void *device, uint16_t sc_id,
  *
  * @param	device		Crypto/eth device pointer
  * @param	sa_id		secure channel ID created by rte_security_macsec_sc_create()
+ * @param	dir		direction of SA
  * @param	stats		SC stats of the driver
  *
  * @return
@@ -183,6 +190,7 @@ typedef int (*security_macsec_sc_stats_get_t)(void *device, uint16_t sc_id,
  *  - -EINVAL if sa_id or device is invalid.
  */
 typedef int (*security_macsec_sa_stats_get_t)(void *device, uint16_t sa_id,
+		enum rte_security_macsec_direction dir,
 		struct rte_security_macsec_sa_stats *stats);
 
 
-- 
2.25.1


^ permalink raw reply	[relevance 3%]

* Re: [PATCH v2 01/13] security: add direction in SA/SC configuration
  2023-06-07 15:19  3%   ` [PATCH v2 01/13] security: add direction in SA/SC configuration Akhil Goyal
@ 2023-06-07 19:49  3%     ` David Marchand
  2023-06-08  6:58  0%       ` [EXT] " Akhil Goyal
  0 siblings, 1 reply; 200+ results
From: David Marchand @ 2023-06-07 19:49 UTC (permalink / raw)
  To: Akhil Goyal
  Cc: dev, thomas, olivier.matz, orika, hemant.agrawal, vattunuru,
	ferruh.yigit, andrew.rybchenko, jerinj, adwivedi, Dodji Seketeli

On Wed, Jun 7, 2023 at 5:20 PM Akhil Goyal <gakhil@marvell.com> wrote:
>
> MACsec SC/SA ids are created based on direction of the flow.
> Hence, added the missing field for configuration and cleanup
> of the SCs and SAs.
>
> Signed-off-by: Akhil Goyal <gakhil@marvell.com>
> ---
>  devtools/libabigail.abignore       |  7 +++++++
>  lib/security/rte_security.c        | 16 ++++++++++------
>  lib/security/rte_security.h        | 14 ++++++++++----
>  lib/security/rte_security_driver.h | 12 ++++++++++--
>  4 files changed, 37 insertions(+), 12 deletions(-)
>

Looking at the report with no supression rule:
$ abidiff --suppr .../next-cryptodev/devtools/libabigail.abignore
--no-added-syms --headers-dir1
.../abi/v23.03/build-gcc-shared/usr/local/include --headers-dir2
.../next-cryptodev/build-gcc-shared/install/usr/local/include
.../abi/v23.03/build-gcc-shared/usr/local/lib64/librte_security.so.23.1
.../next-cryptodev/build-gcc-shared/install/usr/local/lib64/librte_security.so.23.2
Functions changes summary: 0 Removed, 1 Changed (13 filtered out), 0
Added functions
Variables changes summary: 0 Removed, 0 Changed, 0 Added variable

1 function with some indirect sub-type change:

  [C] 'function const rte_security_capability*
rte_security_capabilities_get(rte_security_ctx*)' at
rte_security.c:241:1 has some indirect sub-type changes:
    parameter 1 of type 'rte_security_ctx*' has sub-type changes:
      in pointed to type 'struct rte_security_ctx' at rte_security.h:69:1:
        type size hasn't changed
        1 data member change:
          type of 'const rte_security_ops* ops' changed:
            in pointed to type 'const rte_security_ops':
              in unqualified underlying type 'struct rte_security_ops'
at rte_security_driver.h:230:1:
                type size hasn't changed
                4 data member changes (4 filtered):
                  type of 'security_macsec_sc_create_t
macsec_sc_create' changed:
                    underlying type 'int (void*,
rte_security_macsec_sc*)*' changed:
                      in pointed to type 'function type int (void*,
rte_security_macsec_sc*)':
                        parameter 2 of type 'rte_security_macsec_sc*'
has sub-type changes:
                          in pointed to type 'struct
rte_security_macsec_sc' at rte_security.h:399:1:
                            type size changed from 256 to 320 (in bits)
                            1 data member insertion:
                              'union {struct {uint16_t sa_id[4];
uint8_t sa_in_use[4]; uint8_t active; uint8_t is_xpn; uint8_t
reserved;} sc_rx; struct {uint16_t sa_id; uint16_t sa_id_rekey;
uint64_t sci; uint8_t active; uint8_t re_key_en; uint8_t is_xpn;
uint8_t reserved;} sc_tx;}', at offset 128 (in bits)
                            1 data member change:
                              anonymous data member union {struct
{uint16_t sa_id[4]; uint8_t sa_in_use[4]; uint8_t active; uint8_t
reserved;} sc_rx; struct {uint16_t sa_id; uint16_t sa_id_rekey;
uint64_t sci; uint8_t active; uint8_t re_key_en; uint8_t reserved;}
sc_tx;} at offset 64 (in bits) became data member 'uint64_t
pn_threshold'
                              and size changed from 192 to 64 (in
bits) (by -128 bits)
                  type of 'security_macsec_sc_destroy_t
macsec_sc_destroy' changed:
                    underlying type 'int (void*, typedef uint16_t)*' changed:
                      in pointed to type 'function type int (void*,
typedef uint16_t)':
                        parameter 3 of type 'enum
rte_security_macsec_direction' was added
                  type of 'security_macsec_sc_stats_get_t
macsec_sc_stats_get' changed:
                    underlying type 'int (void*, typedef uint16_t,
rte_security_macsec_sc_stats*)*' changed:
                      in pointed to type 'function type int (void*,
typedef uint16_t, rte_security_macsec_sc_stats*)':
                        parameter 3 of type
'rte_security_macsec_sc_stats*' changed:
                          entity changed from
'rte_security_macsec_sc_stats*' to 'enum
rte_security_macsec_direction' at rte_security.h:361:1
                          type size changed from 64 to 32 (in bits)
                          type alignment changed from 0 to 32
                        parameter 4 of type
'rte_security_macsec_sc_stats*' was added
                  type of 'security_macsec_sa_stats_get_t
macsec_sa_stats_get' changed:
                    underlying type 'int (void*, typedef uint16_t,
rte_security_macsec_sa_stats*)*' changed:
                      in pointed to type 'function type int (void*,
typedef uint16_t, rte_security_macsec_sa_stats*)':
                        parameter 3 of type
'rte_security_macsec_sa_stats*' changed:
                          entity changed from
'rte_security_macsec_sa_stats*' to 'enum
rte_security_macsec_direction' at rte_security.h:361:1
                          type size changed from 64 to 32 (in bits)
                          type alignment changed from 0 to 32
                        parameter 4 of type
'rte_security_macsec_sa_stats*' was added

The report complains about the macsec ops type changes.

> diff --git a/devtools/libabigail.abignore b/devtools/libabigail.abignore
> index c0361bfc7b..14d8fa4293 100644
> --- a/devtools/libabigail.abignore
> +++ b/devtools/libabigail.abignore
> @@ -37,6 +37,13 @@
>  [suppress_type]
>          type_kind = enum
>          changed_enumerators = RTE_CRYPTO_ASYM_XFORM_ECPM, RTE_CRYPTO_ASYM_XFORM_TYPE_LIST_END
> +; Ignore changes to rte_security_ops MACsec APIs which are experimental
> +[suppress_type]
> +        name = rte_security_ops
> +        has_data_member_inserted_between =
> +        {
> +                offset_of(security_macsec_sc_create_t), offset_of(security_macsec_sa_stats_get_t)
> +        }

So I don't get the intent with this rule.
There is no field named neither security_macsec_sc_create_t nor
security_macsec_sa_stats_get_t in the rte_security_ops struct.

Now.. why is this rule making the check pass... it is a mystery to me.
I already hit a case when libabigail ignored statements that are
invalid or make no sense, so my guess is that this rule is actually
applied as a simple:
[suppress_type]
        name = rte_security_ops

And well, this rule is ok from my pov: this rte_security_ops struct
does not change in size.
An application is not supposed to know about its content (that is
defined in a driver header) and all accesses to those ops are supposed
to be through symbols from the security library.
So I would go with this "larger" and simpler rule.


Just a small addition to this, as discussed offlist, this is going to
be reworked in v23.11 and this rule on rte_security_ops will be
unneccesary, so please move it in the relevant block (at the end) of
the libabigail.abignore file.


-- 
David Marchand


^ permalink raw reply	[relevance 3%]

* [PATCH v2 01/13] security: add direction in SA/SC configuration
  @ 2023-06-07 15:19  3%   ` Akhil Goyal
  2023-06-07 19:49  3%     ` David Marchand
    1 sibling, 1 reply; 200+ results
From: Akhil Goyal @ 2023-06-07 15:19 UTC (permalink / raw)
  To: dev
  Cc: thomas, olivier.matz, orika, david.marchand, hemant.agrawal,
	vattunuru, ferruh.yigit, andrew.rybchenko, jerinj, adwivedi,
	Akhil Goyal

MACsec SC/SA ids are created based on direction of the flow.
Hence, added the missing field for configuration and cleanup
of the SCs and SAs.

Signed-off-by: Akhil Goyal <gakhil@marvell.com>
---
 devtools/libabigail.abignore       |  7 +++++++
 lib/security/rte_security.c        | 16 ++++++++++------
 lib/security/rte_security.h        | 14 ++++++++++----
 lib/security/rte_security_driver.h | 12 ++++++++++--
 4 files changed, 37 insertions(+), 12 deletions(-)

diff --git a/devtools/libabigail.abignore b/devtools/libabigail.abignore
index c0361bfc7b..14d8fa4293 100644
--- a/devtools/libabigail.abignore
+++ b/devtools/libabigail.abignore
@@ -37,6 +37,13 @@
 [suppress_type]
         type_kind = enum
         changed_enumerators = RTE_CRYPTO_ASYM_XFORM_ECPM, RTE_CRYPTO_ASYM_XFORM_TYPE_LIST_END
+; Ignore changes to rte_security_ops MACsec APIs which are experimental
+[suppress_type]
+        name = rte_security_ops
+        has_data_member_inserted_between =
+        {
+                offset_of(security_macsec_sc_create_t), offset_of(security_macsec_sa_stats_get_t)
+        }
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; Temporary exceptions till next major ABI version ;
diff --git a/lib/security/rte_security.c b/lib/security/rte_security.c
index e102c55e55..c4d64bb8e9 100644
--- a/lib/security/rte_security.c
+++ b/lib/security/rte_security.c
@@ -164,13 +164,14 @@ rte_security_macsec_sa_create(struct rte_security_ctx *instance,
 }
 
 int
-rte_security_macsec_sc_destroy(struct rte_security_ctx *instance, uint16_t sc_id)
+rte_security_macsec_sc_destroy(struct rte_security_ctx *instance, uint16_t sc_id,
+			       enum rte_security_macsec_direction dir)
 {
 	int ret;
 
 	RTE_PTR_CHAIN3_OR_ERR_RET(instance, ops, macsec_sc_destroy, -EINVAL, -ENOTSUP);
 
-	ret = instance->ops->macsec_sc_destroy(instance->device, sc_id);
+	ret = instance->ops->macsec_sc_destroy(instance->device, sc_id, dir);
 	if (ret != 0)
 		return ret;
 
@@ -181,13 +182,14 @@ rte_security_macsec_sc_destroy(struct rte_security_ctx *instance, uint16_t sc_id
 }
 
 int
-rte_security_macsec_sa_destroy(struct rte_security_ctx *instance, uint16_t sa_id)
+rte_security_macsec_sa_destroy(struct rte_security_ctx *instance, uint16_t sa_id,
+			       enum rte_security_macsec_direction dir)
 {
 	int ret;
 
 	RTE_PTR_CHAIN3_OR_ERR_RET(instance, ops, macsec_sa_destroy, -EINVAL, -ENOTSUP);
 
-	ret = instance->ops->macsec_sa_destroy(instance->device, sa_id);
+	ret = instance->ops->macsec_sa_destroy(instance->device, sa_id, dir);
 	if (ret != 0)
 		return ret;
 
@@ -199,22 +201,24 @@ rte_security_macsec_sa_destroy(struct rte_security_ctx *instance, uint16_t sa_id
 
 int
 rte_security_macsec_sc_stats_get(struct rte_security_ctx *instance, uint16_t sc_id,
+				 enum rte_security_macsec_direction dir,
 				 struct rte_security_macsec_sc_stats *stats)
 {
 	RTE_PTR_CHAIN3_OR_ERR_RET(instance, ops, macsec_sc_stats_get, -EINVAL, -ENOTSUP);
 	RTE_PTR_OR_ERR_RET(stats, -EINVAL);
 
-	return instance->ops->macsec_sc_stats_get(instance->device, sc_id, stats);
+	return instance->ops->macsec_sc_stats_get(instance->device, sc_id, dir, stats);
 }
 
 int
 rte_security_macsec_sa_stats_get(struct rte_security_ctx *instance, uint16_t sa_id,
+				 enum rte_security_macsec_direction dir,
 				 struct rte_security_macsec_sa_stats *stats)
 {
 	RTE_PTR_CHAIN3_OR_ERR_RET(instance, ops, macsec_sa_stats_get, -EINVAL, -ENOTSUP);
 	RTE_PTR_OR_ERR_RET(stats, -EINVAL);
 
-	return instance->ops->macsec_sa_stats_get(instance->device, sa_id, stats);
+	return instance->ops->macsec_sa_stats_get(instance->device, sa_id, dir, stats);
 }
 
 int
diff --git a/lib/security/rte_security.h b/lib/security/rte_security.h
index 4bacf9fcd9..c7a523b6d6 100644
--- a/lib/security/rte_security.h
+++ b/lib/security/rte_security.h
@@ -761,6 +761,7 @@ rte_security_macsec_sc_create(struct rte_security_ctx *instance,
  *
  * @param   instance	security instance
  * @param   sc_id	SC ID to be destroyed
+ * @param   dir		direction of the SC
  * @return
  *  - 0 if successful.
  *  - -EINVAL if sc_id is invalid or instance is NULL.
@@ -768,7 +769,8 @@ rte_security_macsec_sc_create(struct rte_security_ctx *instance,
  */
 __rte_experimental
 int
-rte_security_macsec_sc_destroy(struct rte_security_ctx *instance, uint16_t sc_id);
+rte_security_macsec_sc_destroy(struct rte_security_ctx *instance, uint16_t sc_id,
+			       enum rte_security_macsec_direction dir);
 
 /**
  * @warning
@@ -798,6 +800,7 @@ rte_security_macsec_sa_create(struct rte_security_ctx *instance,
  *
  * @param   instance	security instance
  * @param   sa_id	SA ID to be destroyed
+ * @param   dir		direction of the SA
  * @return
  *  - 0 if successful.
  *  - -EINVAL if sa_id is invalid or instance is NULL.
@@ -805,7 +808,8 @@ rte_security_macsec_sa_create(struct rte_security_ctx *instance,
  */
 __rte_experimental
 int
-rte_security_macsec_sa_destroy(struct rte_security_ctx *instance, uint16_t sa_id);
+rte_security_macsec_sa_destroy(struct rte_security_ctx *instance, uint16_t sa_id,
+			       enum rte_security_macsec_direction dir);
 
 /** Device-specific metadata field type */
 typedef uint64_t rte_security_dynfield_t;
@@ -1077,6 +1081,7 @@ rte_security_session_stats_get(struct rte_security_ctx *instance,
  *
  * @param	instance	security instance
  * @param	sa_id		SA ID for which stats are needed
+ * @param	dir		direction of the SA
  * @param	stats		statistics
  * @return
  *  - On success, return 0.
@@ -1085,7 +1090,7 @@ rte_security_session_stats_get(struct rte_security_ctx *instance,
 __rte_experimental
 int
 rte_security_macsec_sa_stats_get(struct rte_security_ctx *instance,
-				 uint16_t sa_id,
+				 uint16_t sa_id, enum rte_security_macsec_direction dir,
 				 struct rte_security_macsec_sa_stats *stats);
 
 /**
@@ -1096,6 +1101,7 @@ rte_security_macsec_sa_stats_get(struct rte_security_ctx *instance,
  *
  * @param	instance	security instance
  * @param	sc_id		SC ID for which stats are needed
+ * @param	dir		direction of the SC
  * @param	stats		SC statistics
  * @return
  *  - On success, return 0.
@@ -1104,7 +1110,7 @@ rte_security_macsec_sa_stats_get(struct rte_security_ctx *instance,
 __rte_experimental
 int
 rte_security_macsec_sc_stats_get(struct rte_security_ctx *instance,
-				 uint16_t sc_id,
+				 uint16_t sc_id, enum rte_security_macsec_direction dir,
 				 struct rte_security_macsec_sc_stats *stats);
 
 /**
diff --git a/lib/security/rte_security_driver.h b/lib/security/rte_security_driver.h
index 421e6f7780..677c7d1f91 100644
--- a/lib/security/rte_security_driver.h
+++ b/lib/security/rte_security_driver.h
@@ -106,8 +106,10 @@ typedef int (*security_macsec_sc_create_t)(void *device, struct rte_security_mac
  *
  * @param	device		Crypto/eth device pointer
  * @param	sc_id		MACsec SC ID
+ * @param	dir		Direction of SC
  */
-typedef int (*security_macsec_sc_destroy_t)(void *device, uint16_t sc_id);
+typedef int (*security_macsec_sc_destroy_t)(void *device, uint16_t sc_id,
+		enum rte_security_macsec_direction dir);
 
 /**
  * Configure a MACsec security Association (SA) on a device.
@@ -128,8 +130,10 @@ typedef int (*security_macsec_sa_create_t)(void *device, struct rte_security_mac
  *
  * @param	device		Crypto/eth device pointer
  * @param	sa_id		MACsec SA ID
+ * @param	dir		Direction of SA
  */
-typedef int (*security_macsec_sa_destroy_t)(void *device, uint16_t sa_id);
+typedef int (*security_macsec_sa_destroy_t)(void *device, uint16_t sa_id,
+		enum rte_security_macsec_direction dir);
 
 /**
  * Get the size of a security session
@@ -162,6 +166,7 @@ typedef int (*security_session_stats_get_t)(void *device,
  *
  * @param	device		Crypto/eth device pointer
  * @param	sc_id		secure channel ID created by rte_security_macsec_sc_create()
+ * @param	dir		direction of SC
  * @param	stats		SC stats of the driver
  *
  * @return
@@ -169,6 +174,7 @@ typedef int (*security_session_stats_get_t)(void *device,
  *  - -EINVAL if sc_id or device is invalid.
  */
 typedef int (*security_macsec_sc_stats_get_t)(void *device, uint16_t sc_id,
+		enum rte_security_macsec_direction dir,
 		struct rte_security_macsec_sc_stats *stats);
 
 /**
@@ -176,6 +182,7 @@ typedef int (*security_macsec_sc_stats_get_t)(void *device, uint16_t sc_id,
  *
  * @param	device		Crypto/eth device pointer
  * @param	sa_id		secure channel ID created by rte_security_macsec_sc_create()
+ * @param	dir		direction of SA
  * @param	stats		SC stats of the driver
  *
  * @return
@@ -183,6 +190,7 @@ typedef int (*security_macsec_sc_stats_get_t)(void *device, uint16_t sc_id,
  *  - -EINVAL if sa_id or device is invalid.
  */
 typedef int (*security_macsec_sa_stats_get_t)(void *device, uint16_t sa_id,
+		enum rte_security_macsec_direction dir,
 		struct rte_security_macsec_sa_stats *stats);
 
 
-- 
2.25.1


^ permalink raw reply	[relevance 3%]

* Re: [PATCH V6 0/5] app/testpmd: support multiple process attach and detach port
  2023-06-06 16:26  0%   ` [PATCH V6 0/5] app/testpmd: support multiple process attach and detach port Ferruh Yigit
@ 2023-06-07 10:14  0%     ` lihuisong (C)
  0 siblings, 0 replies; 200+ results
From: lihuisong (C) @ 2023-06-07 10:14 UTC (permalink / raw)
  To: Ferruh Yigit, dev
  Cc: thomas, andrew.rybchenko, liudongdong3, liuyonglong, fengchengwen


在 2023/6/7 0:26, Ferruh Yigit 写道:
> On 5/27/2023 3:11 AM, Huisong Li wrote:
>> This patchset fix some bugs and support attaching and detaching port
>> in primary and secondary.
>>
> Hi Huisong,
>
> As commented on v4, I have some concerns on this set.
please see my reply.
>
> The set does multiple ethdev/testpmd change, but the main target of the
> patch is not described clearly/simply.
The main target is to support attaching and detaching port in primary 
and secondary.
Fixed some problems by the way.
>
> It looks like intention is to be able to register NEW event callback in
> the secondary process and be able to setup device in secondary when
> primary attaches a device,
> but my question is why not multi-process communication socket can't be
> used for this?
>
> MP socket/communication/thread is developed for this reason, I am not
> convinced why it can't be used to sync primary and secondary for device
> attach/detach.
The secondary process automatically probes the device when primary 
attaches a device.
The primary process automatically probes the device before doing probe 
phase in secondary when secondary attaches a device.
Above behavior itself is attributed to multi-process socket 
communication(see hogplug_mp.c).
This series are just to support this feature in testpmd.
But hogplug_mp cannot do something for application, like updating 
information, which is the duty of application.
>
>
>> ---
>>   -v6: adjust rte_eth_dev_is_used position based on alphabetical order
>>        in version.map
>>   -v5: move 'ALLOCATED' state to the back of 'REMOVED' to avoid abi break.
>>   -v4: fix a misspelling.
>>   -v3:
>>     #1 merge patch 1/6 and patch 2/6 into patch 1/5, and add modification
>>        for other bus type.
>>     #2 add a RTE_ETH_DEV_ALLOCATED state in rte_eth_dev_state to resolve
>>        the probelm in patch 2/5.
>>   -v2: resend due to CI unexplained failure.
>>
>> Huisong Li (5):
>>    drivers/bus: restore driver assignment at front of probing
>>    ethdev: fix skip valid port in probing callback
>>    app/testpmd: check the validity of the port
>>    app/testpmd: add attach and detach port for multiple process
>>    app/testpmd: stop forwarding in new or destroy event
>>
>>   app/test-pmd/testpmd.c                   | 47 +++++++++++++++---------
>>   app/test-pmd/testpmd.h                   |  1 -
>>   drivers/bus/auxiliary/auxiliary_common.c |  9 ++++-
>>   drivers/bus/dpaa/dpaa_bus.c              |  9 ++++-
>>   drivers/bus/fslmc/fslmc_bus.c            |  8 +++-
>>   drivers/bus/ifpga/ifpga_bus.c            | 12 ++++--
>>   drivers/bus/pci/pci_common.c             |  9 ++++-
>>   drivers/bus/vdev/vdev.c                  | 10 ++++-
>>   drivers/bus/vmbus/vmbus_common.c         |  9 ++++-
>>   drivers/net/bnxt/bnxt_ethdev.c           |  3 +-
>>   drivers/net/bonding/bonding_testpmd.c    |  1 -
>>   drivers/net/mlx5/mlx5.c                  |  2 +-
>>   lib/ethdev/ethdev_driver.c               | 13 +++++--
>>   lib/ethdev/ethdev_driver.h               | 12 ++++++
>>   lib/ethdev/ethdev_pci.h                  |  2 +-
>>   lib/ethdev/rte_class_eth.c               |  2 +-
>>   lib/ethdev/rte_ethdev.c                  |  4 +-
>>   lib/ethdev/rte_ethdev.h                  |  4 +-
>>   lib/ethdev/version.map                   |  1 +
>>   19 files changed, 114 insertions(+), 44 deletions(-)
>>
> .

^ permalink raw reply	[relevance 0%]

* [PATCH 02/10] net/nfp: add a check function for the NFD version
  @ 2023-06-07  1:57 12% ` Chaoyong He
  0 siblings, 0 replies; 200+ results
From: Chaoyong He @ 2023-06-07  1:57 UTC (permalink / raw)
  To: dev; +Cc: oss-drivers, niklas.soderlund, Chaoyong He

Add a check function for the NFD version, this will make the logics
which using this version free from validaty check, thus simplify
the driver.

Signed-off-by: Chaoyong He <chaoyong.he@corigine.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@corigine.com>
---
 drivers/net/nfp/flower/nfp_flower.c |  3 +++
 drivers/net/nfp/nfp_common.c        | 37 ++++++++++++++++++-----------
 drivers/net/nfp/nfp_common.h        |  1 +
 drivers/net/nfp/nfp_ethdev.c        | 35 +++++++++------------------
 drivers/net/nfp/nfp_ethdev_vf.c     | 32 ++++++++-----------------
 drivers/net/nfp/nfp_rxtx.c          | 14 ++---------
 6 files changed, 50 insertions(+), 72 deletions(-)

diff --git a/drivers/net/nfp/flower/nfp_flower.c b/drivers/net/nfp/flower/nfp_flower.c
index c5cc537790..afb4e5b344 100644
--- a/drivers/net/nfp/flower/nfp_flower.c
+++ b/drivers/net/nfp/flower/nfp_flower.c
@@ -649,6 +649,9 @@ nfp_flower_init_vnic_common(struct nfp_net_hw *hw, const char *vnic_type)
 
 	/* Get some of the read-only fields from the config BAR */
 	nfp_net_cfg_read_version(hw);
+	if (!nfp_net_is_valid_nfd_version(hw->ver))
+		return -EINVAL;
+
 	hw->cap = nn_cfg_readl(hw, NFP_NET_CFG_CAP);
 	hw->max_mtu = nn_cfg_readl(hw, NFP_NET_CFG_MAX_MTU);
 	/* Set the current MTU to the maximum supported */
diff --git a/drivers/net/nfp/nfp_common.c b/drivers/net/nfp/nfp_common.c
index 497128f6a6..08f9529ead 100644
--- a/drivers/net/nfp/nfp_common.c
+++ b/drivers/net/nfp/nfp_common.c
@@ -1162,22 +1162,10 @@ nfp_net_tx_desc_limits(struct nfp_net_hw *hw,
 {
 	uint16_t tx_dpp;
 
-	switch (hw->ver.extend) {
-	case NFP_NET_CFG_VERSION_DP_NFD3:
+	if (hw->ver.extend == NFP_NET_CFG_VERSION_DP_NFD3)
 		tx_dpp = NFD3_TX_DESC_PER_PKT;
-		break;
-	case NFP_NET_CFG_VERSION_DP_NFDK:
-		if (hw->ver.major < 5) {
-			PMD_DRV_LOG(ERR, "NFDK must use ABI 5 or newer, found: %d",
-					hw->ver.major);
-			return -EINVAL;
-		}
+	else
 		tx_dpp = NFDK_TX_DESC_PER_SIMPLE_PKT;
-		break;
-	default:
-		PMD_DRV_LOG(ERR, "The version of firmware is not correct.");
-		return -EINVAL;
-	}
 
 	*max_tx_desc = NFP_NET_MAX_TX_DESC / tx_dpp;
 
@@ -2106,3 +2094,24 @@ nfp_repr_firmware_version_get(struct rte_eth_dev *dev,
 
 	return 0;
 }
+
+bool
+nfp_net_is_valid_nfd_version(struct nfp_net_fw_ver version)
+{
+	uint8_t nfd_version = version.extend;
+
+	if (nfd_version == NFP_NET_CFG_VERSION_DP_NFD3)
+		return true;
+
+	if (nfd_version == NFP_NET_CFG_VERSION_DP_NFDK) {
+		if (version.major < 5) {
+			PMD_INIT_LOG(ERR, "NFDK must use ABI 5 or newer, found: %d",
+					version.major);
+			return false;
+		}
+
+		return true;
+	}
+
+	return false;
+}
diff --git a/drivers/net/nfp/nfp_common.h b/drivers/net/nfp/nfp_common.h
index 2281445861..acb34535c5 100644
--- a/drivers/net/nfp/nfp_common.h
+++ b/drivers/net/nfp/nfp_common.h
@@ -444,6 +444,7 @@ void nfp_net_init_metadata_format(struct nfp_net_hw *hw);
 void nfp_net_cfg_read_version(struct nfp_net_hw *hw);
 int nfp_net_firmware_version_get(struct rte_eth_dev *dev, char *fw_version, size_t fw_size);
 int nfp_repr_firmware_version_get(struct rte_eth_dev *dev, char *fw_version, size_t fw_size);
+bool nfp_net_is_valid_nfd_version(struct nfp_net_fw_ver version);
 
 #define NFP_NET_DEV_PRIVATE_TO_HW(adapter)\
 	(&((struct nfp_net_adapter *)adapter)->hw)
diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c
index e84d2ac82e..0ccb543f14 100644
--- a/drivers/net/nfp/nfp_ethdev.c
+++ b/drivers/net/nfp/nfp_ethdev.c
@@ -474,31 +474,18 @@ static const struct eth_dev_ops nfp_net_eth_dev_ops = {
 	.fw_version_get         = nfp_net_firmware_version_get,
 };
 
-static inline int
-nfp_net_ethdev_ops_mount(struct nfp_net_hw *hw, struct rte_eth_dev *eth_dev)
+static inline void
+nfp_net_ethdev_ops_mount(struct nfp_net_hw *hw,
+		struct rte_eth_dev *eth_dev)
 {
-	switch (hw->ver.extend) {
-	case NFP_NET_CFG_VERSION_DP_NFD3:
-		eth_dev->tx_pkt_burst = &nfp_net_nfd3_xmit_pkts;
-		break;
-	case NFP_NET_CFG_VERSION_DP_NFDK:
-		if (hw->ver.major < 5) {
-			PMD_DRV_LOG(ERR, "NFDK must use ABI 5 or newer, found: %d",
-					hw->ver.major);
-			return -EINVAL;
-		}
-		eth_dev->tx_pkt_burst = &nfp_net_nfdk_xmit_pkts;
-		break;
-	default:
-		PMD_DRV_LOG(ERR, "The version of firmware is not correct.");
-		return -EINVAL;
-	}
+	if (hw->ver.extend == NFP_NET_CFG_VERSION_DP_NFD3)
+		eth_dev->tx_pkt_burst = nfp_net_nfd3_xmit_pkts;
+	else
+		eth_dev->tx_pkt_burst = nfp_net_nfdk_xmit_pkts;
 
 	eth_dev->dev_ops = &nfp_net_eth_dev_ops;
 	eth_dev->rx_queue_count = nfp_net_rx_queue_count;
 	eth_dev->rx_pkt_burst = &nfp_net_recv_pkts;
-
-	return 0;
 }
 
 static int
@@ -583,12 +570,13 @@ nfp_net_init(struct rte_eth_dev *eth_dev)
 	PMD_INIT_LOG(DEBUG, "MAC stats: %p", hw->mac_stats);
 
 	nfp_net_cfg_read_version(hw);
+	if (!nfp_net_is_valid_nfd_version(hw->ver))
+		return -EINVAL;
 
 	if (nfp_net_check_dma_mask(hw, pci_dev->name) != 0)
 		return -ENODEV;
 
-	if (nfp_net_ethdev_ops_mount(hw, eth_dev))
-		return -EINVAL;
+	nfp_net_ethdev_ops_mount(hw, eth_dev);
 
 	hw->max_rx_queues = nn_cfg_readl(hw, NFP_NET_CFG_MAX_RXRINGS);
 	hw->max_tx_queues = nn_cfg_readl(hw, NFP_NET_CFG_MAX_TXRINGS);
@@ -1133,8 +1121,7 @@ nfp_secondary_init_app_fw_nic(struct rte_pci_device *pci_dev,
 
 		eth_dev->process_private = cpp;
 		hw = NFP_NET_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
-		if (nfp_net_ethdev_ops_mount(hw, eth_dev))
-			return -EINVAL;
+		nfp_net_ethdev_ops_mount(hw, eth_dev);
 
 		rte_eth_dev_probing_finish(eth_dev);
 	}
diff --git a/drivers/net/nfp/nfp_ethdev_vf.c b/drivers/net/nfp/nfp_ethdev_vf.c
index 71f5020ecd..f971bb8903 100644
--- a/drivers/net/nfp/nfp_ethdev_vf.c
+++ b/drivers/net/nfp/nfp_ethdev_vf.c
@@ -244,31 +244,18 @@ static const struct eth_dev_ops nfp_netvf_eth_dev_ops = {
 	.fw_version_get         = nfp_net_firmware_version_get,
 };
 
-static inline int
-nfp_netvf_ethdev_ops_mount(struct nfp_net_hw *hw, struct rte_eth_dev *eth_dev)
+static inline void
+nfp_netvf_ethdev_ops_mount(struct nfp_net_hw *hw,
+		struct rte_eth_dev *eth_dev)
 {
-	switch (hw->ver.extend) {
-	case NFP_NET_CFG_VERSION_DP_NFD3:
-		eth_dev->tx_pkt_burst = &nfp_net_nfd3_xmit_pkts;
-		break;
-	case NFP_NET_CFG_VERSION_DP_NFDK:
-		if (hw->ver.major < 5) {
-			PMD_DRV_LOG(ERR, "NFDK must use ABI 5 or newer, found: %d",
-					hw->ver.major);
-			return -EINVAL;
-		}
-		eth_dev->tx_pkt_burst = &nfp_net_nfdk_xmit_pkts;
-		break;
-	default:
-		PMD_DRV_LOG(ERR, "The version of firmware is not correct.");
-		return -EINVAL;
-	}
+	if (hw->ver.extend == NFP_NET_CFG_VERSION_DP_NFD3)
+		eth_dev->tx_pkt_burst = nfp_net_nfd3_xmit_pkts;
+	else
+		eth_dev->tx_pkt_burst = nfp_net_nfdk_xmit_pkts;
 
 	eth_dev->dev_ops = &nfp_netvf_eth_dev_ops;
 	eth_dev->rx_queue_count = nfp_net_rx_queue_count;
 	eth_dev->rx_pkt_burst = &nfp_net_recv_pkts;
-
-	return 0;
 }
 
 static int
@@ -300,12 +287,13 @@ nfp_netvf_init(struct rte_eth_dev *eth_dev)
 	PMD_INIT_LOG(DEBUG, "ctrl bar: %p", hw->ctrl_bar);
 
 	nfp_net_cfg_read_version(hw);
+	if (!nfp_net_is_valid_nfd_version(hw->ver))
+		return -EINVAL;
 
 	if (nfp_net_check_dma_mask(hw, pci_dev->name) != 0)
 		return -ENODEV;
 
-	if (nfp_netvf_ethdev_ops_mount(hw, eth_dev))
-		return -EINVAL;
+	nfp_netvf_ethdev_ops_mount(hw, eth_dev);
 
 	/* For secondary processes, the primary has done all the work */
 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
diff --git a/drivers/net/nfp/nfp_rxtx.c b/drivers/net/nfp/nfp_rxtx.c
index 0ac9d6db03..ce9a07309e 100644
--- a/drivers/net/nfp/nfp_rxtx.c
+++ b/drivers/net/nfp/nfp_rxtx.c
@@ -889,20 +889,10 @@ nfp_net_tx_queue_setup(struct rte_eth_dev *dev,
 
 	hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 
-	switch (hw->ver.extend) {
-	case NFP_NET_CFG_VERSION_DP_NFD3:
+	if (hw->ver.extend == NFP_NET_CFG_VERSION_DP_NFD3)
 		return nfp_net_nfd3_tx_queue_setup(dev, queue_idx,
 				nb_desc, socket_id, tx_conf);
-	case NFP_NET_CFG_VERSION_DP_NFDK:
-		if (hw->ver.major < 5) {
-			PMD_DRV_LOG(ERR, "NFDK must use ABI 5 or newer, found: %d",
-					hw->ver.major);
-			return -EINVAL;
-		}
+	else
 		return nfp_net_nfdk_tx_queue_setup(dev, queue_idx,
 				nb_desc, socket_id, tx_conf);
-	default:
-		PMD_DRV_LOG(ERR, "The version of firmware is not correct.");
-		return -EINVAL;
-	}
 }
-- 
2.39.1


^ permalink raw reply	[relevance 12%]

* Re: [PATCH v6 1/4] ethdev: add API for mbufs recycle mode
  2023-06-06  8:34  0%             ` Konstantin Ananyev
@ 2023-06-07  0:00  0%               ` Ferruh Yigit
  2023-06-12  3:25  0%                 ` Feifei Wang
  0 siblings, 1 reply; 200+ results
From: Ferruh Yigit @ 2023-06-07  0:00 UTC (permalink / raw)
  To: Konstantin Ananyev, Feifei Wang,
	Константин
	Ананьев,
	thomas, Andrew Rybchenko
  Cc: dev, nd, Honnappa Nagarahalli, Ruifeng Wang

On 6/6/2023 9:34 AM, Konstantin Ananyev wrote:
> 
> 
>>
>> [...]
>>>> Probably I am missing something, but why it is not possible to do something
>>> like that:
>>>>
>>>> rte_eth_recycle_mbufs(rx_port_id=X, rx_queue_id=Y, tx_port_id=N,
>>>> tx_queue_id=M, ...); ....
>>>> rte_eth_recycle_mbufs(rx_port_id=X, rx_queue_id=Y, tx_port_id=N,
>>>> tx_queue_id=K, ...);
>>>>
>>>> I.E. feed rx queue from 2 tx queues?
>>>>
>>>> Two problems for this:
>>>> 1. If we have 2 tx queues for rx, the thread should make the extra
>>>> judgement to decide which one to choose in the driver layer.
>>>
>>> Not sure, why on the driver layer?
>>> The example I gave above - decision is made on application layer.
>>> Lets say first call didn't free enough mbufs, so app decided to use second txq
>>> for rearm.
>> [Feifei] I think currently mbuf recycle mode can support this usage. For examples:
>> n =  rte_eth_recycle_mbufs(rx_port_id=X, rx_queue_id=Y, tx_port_id=N, tx_queue_id=M, ...);
>> if (n < planned_number)
>> rte_eth_recycle_mbufs(rx_port_id=X, rx_queue_id=Y, tx_port_id=N, tx_queue_id=K, ...);
>>
>> Thus, if users want, they can do like this.
> 
> Yes, that was my thought, that's why I was surprise that in the comments we have:
> " Currently, the rte_eth_recycle_mbufs() function can only support one-time pairing
> * between the receive queue and transmit queue. Do not pair one receive queue with
>  * multiple transmit queues or pair one transmit queue with multiple receive queues,
>  * in order to avoid memory error rewriting."
> 

I guess that is from previous versions of the set, it can be good to
address limitations/restrictions again with latest version.


>>
>>>
>>>> On the other hand, current mechanism can support users to switch 1 txq
>>>> to another timely in the application layer. If user want to choose
>>>> another txq, he just need to change the txq_queue_id parameter in the API.
>>>> 2. If you want one rxq to support two txq at the same time, this needs
>>>> to add spinlock on guard variable to avoid multi-thread conflict.
>>>> Spinlock will decrease the data-path performance greatly.  Thus, we do
>>>> not consider
>>>> 1 rxq mapping multiple txqs here.
>>>
>>> I am talking about situation when one thread controls 2 tx queues.
>>>
>>>> + *
>>>> + * @param rx_port_id
>>>> + * Port identifying the receive side.
>>>> + * @param rx_queue_id
>>>> + * The index of the receive queue identifying the receive side.
>>>> + * The value must be in the range [0, nb_rx_queue - 1] previously
>>>> +supplied
>>>> + * to rte_eth_dev_configure().
>>>> + * @param tx_port_id
>>>> + * Port identifying the transmit side.
>>>> + * @param tx_queue_id
>>>> + * The index of the transmit queue identifying the transmit side.
>>>> + * The value must be in the range [0, nb_tx_queue - 1] previously
>>>> +supplied
>>>> + * to rte_eth_dev_configure().
>>>> + * @param recycle_rxq_info
>>>> + * A pointer to a structure of type *rte_eth_recycle_rxq_info* which
>>>> +contains
>>>> + * the information of the Rx queue mbuf ring.
>>>> + * @return
>>>> + * The number of recycling mbufs.
>>>> + */
>>>> +__rte_experimental
>>>> +static inline uint16_t
>>>> +rte_eth_recycle_mbufs(uint16_t rx_port_id, uint16_t rx_queue_id,
>>>> +uint16_t tx_port_id, uint16_t tx_queue_id,  struct
>>>> +rte_eth_recycle_rxq_info *recycle_rxq_info) {  struct rte_eth_fp_ops
>>>> +*p;  void *qd;  uint16_t nb_mbufs;
>>>> +
>>>> +#ifdef RTE_ETHDEV_DEBUG_TX
>>>> + if (tx_port_id >= RTE_MAX_ETHPORTS ||  tx_queue_id >=
>>>> +RTE_MAX_QUEUES_PER_PORT) {  RTE_ETHDEV_LOG(ERR,  "Invalid
>>>> +tx_port_id=%u or tx_queue_id=%u\n",  tx_port_id, tx_queue_id);
>>>> +return 0;  } #endif
>>>> +
>>>> + /* fetch pointer to queue data */
>>>> + p = &rte_eth_fp_ops[tx_port_id];
>>>> + qd = p->txq.data[tx_queue_id];
>>>> +
>>>> +#ifdef RTE_ETHDEV_DEBUG_TX
>>>> + RTE_ETH_VALID_PORTID_OR_ERR_RET(tx_port_id, 0);
>>>> +
>>>> + if (qd == NULL) {
>>>> + RTE_ETHDEV_LOG(ERR, "Invalid Tx queue_id=%u for port_id=%u\n",
>>>> +tx_queue_id, tx_port_id);  return 0;  } #endif  if
>>>> +(p->recycle_tx_mbufs_reuse == NULL)  return 0;
>>>> +
>>>> + /* Copy used *rte_mbuf* buffer pointers from Tx mbuf ring
>>>> + * into Rx mbuf ring.
>>>> + */
>>>> + nb_mbufs = p->recycle_tx_mbufs_reuse(qd, recycle_rxq_info);
>>>> +
>>>> + /* If no recycling mbufs, return 0. */ if (nb_mbufs == 0) return 0;
>>>> +
>>>> +#ifdef RTE_ETHDEV_DEBUG_RX
>>>> + if (rx_port_id >= RTE_MAX_ETHPORTS ||  rx_queue_id >=
>>>> +RTE_MAX_QUEUES_PER_PORT) {  RTE_ETHDEV_LOG(ERR, "Invalid
>>>> +rx_port_id=%u or rx_queue_id=%u\n",  rx_port_id, rx_queue_id);
>>>> +return 0;  } #endif
>>>> +
>>>> + /* fetch pointer to queue data */
>>>> + p = &rte_eth_fp_ops[rx_port_id];
>>>> + qd = p->rxq.data[rx_queue_id];
>>>> +
>>>> +#ifdef RTE_ETHDEV_DEBUG_RX
>>>> + RTE_ETH_VALID_PORTID_OR_ERR_RET(rx_port_id, 0);
>>>> +
>>>> + if (qd == NULL) {
>>>> + RTE_ETHDEV_LOG(ERR, "Invalid Rx queue_id=%u for port_id=%u\n",
>>>> +rx_queue_id, rx_port_id);  return 0;  } #endif
>>>> +
>>>> + if (p->recycle_rx_descriptors_refill == NULL) return 0;
>>>> +
>>>> + /* Replenish the Rx descriptors with the recycling
>>>> + * into Rx mbuf ring.
>>>> + */
>>>> + p->recycle_rx_descriptors_refill(qd, nb_mbufs);
>>>> +
>>>> + return nb_mbufs;
>>>> +}
>>>> +
>>>>  /**
>>>>   * @warning
>>>>   * @b EXPERIMENTAL: this API may change without prior notice diff
>>>> --git a/lib/ethdev/rte_ethdev_core.h b/lib/ethdev/rte_ethdev_core.h
>>>> index dcf8adab92..a2e6ea6b6c 100644
>>>> --- a/lib/ethdev/rte_ethdev_core.h
>>>> +++ b/lib/ethdev/rte_ethdev_core.h
>>>> @@ -56,6 +56,13 @@ typedef int (*eth_rx_descriptor_status_t)(void
>>>> *rxq, uint16_t offset);
>>>>  /** @internal Check the status of a Tx descriptor */  typedef int
>>>> (*eth_tx_descriptor_status_t)(void *txq, uint16_t offset);
>>>>
>>>> +/** @internal Copy used mbufs from Tx mbuf ring into Rx mbuf ring */
>>>> +typedef uint16_t (*eth_recycle_tx_mbufs_reuse_t)(void *txq,  struct
>>>> +rte_eth_recycle_rxq_info *recycle_rxq_info);
>>>> +
>>>> +/** @internal Refill Rx descriptors with the recycling mbufs */
>>>> +typedef void (*eth_recycle_rx_descriptors_refill_t)(void *rxq,
>>>> +uint16_t nb);
>>>> +
>>>>  /**
>>>>   * @internal
>>>>   * Structure used to hold opaque pointers to internal ethdev Rx/Tx @@
>>>> -90,9 +97,11 @@ struct rte_eth_fp_ops {
>>>>          eth_rx_queue_count_t rx_queue_count;
>>>>          /** Check the status of a Rx descriptor. */
>>>>          eth_rx_descriptor_status_t rx_descriptor_status;
>>>> + /** Refill Rx descriptors with the recycling mbufs. */
>>>> + eth_recycle_rx_descriptors_refill_t recycle_rx_descriptors_refill;
>>>> I am afraid we can't put new fields here without ABI breakage.
>>>>
>>>> Agree
>>>>
>>>> It has to be below rxq.
>>>> Now thinking about current layout probably not the best one, and when
>>>> introducing this struct, I should probably put rxq either on the top
>>>> of the struct, or on the next cache line.
>>>> But such change is not possible right now anyway.
>>>> Same story for txq.
>>>>
>>>> Thus we should rearrange the structure like below:
>>>> struct rte_eth_fp_ops {
>>>>     struct rte_ethdev_qdata rxq;
>>>>          eth_rx_burst_t rx_pkt_burst;
>>>>          eth_rx_queue_count_t rx_queue_count;
>>>>          eth_rx_descriptor_status_t rx_descriptor_status;
>>>>        eth_recycle_rx_descriptors_refill_t recycle_rx_descriptors_refill;
>>>>               uintptr_t reserved1[2];
>>>> }
>>>
>>> Yes, I think such layout will be better.
>>> The only problem here - we have to wait for 23.11 for that.
>>>
>> Ok, if not this change, maybe we still need to wait. Because mbufs_recycle have other
>> ABI breakage. Such as the change for 'struct rte_eth_dev'.
> 
> Ok by me.
> 
>>>>
>>>>
>>>>          /** Rx queues data. */
>>>>          struct rte_ethdev_qdata rxq;
>>>> - uintptr_t reserved1[3];
>>>> + uintptr_t reserved1[2];
>>>>          /**@}*/
>>>>
>>>>          /**@{*/
>>>> @@ -106,9 +115,11 @@ struct rte_eth_fp_ops {
>>>>          eth_tx_prep_t tx_pkt_prepare;
>>>>          /** Check the status of a Tx descriptor. */
>>>>          eth_tx_descriptor_status_t tx_descriptor_status;
>>>> + /** Copy used mbufs from Tx mbuf ring into Rx. */
>>>> + eth_recycle_tx_mbufs_reuse_t recycle_tx_mbufs_reuse;
>>>>          /** Tx queues data. */
>>>>          struct rte_ethdev_qdata txq;
>>>> - uintptr_t reserved2[3];
>>>> + uintptr_t reserved2[2];
>>>>          /**@}*/
>>>>
>>>>  } __rte_cache_aligned;
>>>> diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map index
>>>> 357d1a88c0..45c417f6bd 100644
>>>> --- a/lib/ethdev/version.map
>>>> +++ b/lib/ethdev/version.map
>>>> @@ -299,6 +299,10 @@ EXPERIMENTAL {
>>>>          rte_flow_action_handle_query_update;
>>>>          rte_flow_async_action_handle_query_update;
>>>>          rte_flow_async_create_by_index;
>>>> +
>>>> + # added in 23.07
>>>> + rte_eth_recycle_mbufs;
>>>> + rte_eth_recycle_rx_queue_info_get;
>>>>  };
>>>>
>>>>  INTERNAL {
>>>> --
>>>> 2.25.1
>>>>


^ permalink raw reply	[relevance 0%]

* RE: [PATCH v1 1/1] doc: announce change in bbdev api related to operation extension
  2023-06-06  9:20  4%         ` David Marchand
@ 2023-06-06 21:01  0%           ` Chautru, Nicolas
  2023-06-08  8:47  0%             ` Maxime Coquelin
  0 siblings, 1 reply; 200+ results
From: Chautru, Nicolas @ 2023-06-06 21:01 UTC (permalink / raw)
  To: David Marchand
  Cc: Maxime Coquelin, Stephen Hemminger, dev, Rix, Tom,
	hemant.agrawal, Vargas, Hernan

Hi David, 

> -----Original Message-----
> From: David Marchand <david.marchand@redhat.com>
> Sent: Tuesday, June 6, 2023 2:21 AM
> To: Chautru, Nicolas <nicolas.chautru@intel.com>
> Cc: Maxime Coquelin <maxime.coquelin@redhat.com>; Stephen Hemminger
> <stephen@networkplumber.org>; dev@dpdk.org; Rix, Tom
> <trix@redhat.com>; hemant.agrawal@nxp.com; Vargas, Hernan
> <hernan.vargas@intel.com>
> Subject: Re: [PATCH v1 1/1] doc: announce change in bbdev api related to
> operation extension
> 
> On Mon, Jun 5, 2023 at 10:08 PM Chautru, Nicolas
> <nicolas.chautru@intel.com> wrote:
> > Wrt the MLD functions: these are new into the related serie but still the
> break the ABI since the struct rte_bbdev includes these functions hence
> causing offset changes.
> >
> > Should I then just rephrase as:
> >
> > +* bbdev: Will extend the API to support the new operation type
> >  +``RTE_BBDEV_OP_MLDTS`` as per
> >  +  this `v1
> >  +<https://patches.dpdk.org/project/dpdk/list/?series=28192>`. This  +
> > will notably introduce  +  new symbols for
> > ``rte_bbdev_dequeue_mldts_ops``,  +``rte_bbdev_enqueue_mldts_ops``
> > into the stuct rte_bbdev.
> 
> I don't think we need this deprecation notice.
> 
> 
> Do you need to expose those new mldts ops in rte_bbdev?
> Can't they go to dev_ops?
> If you can't, at least moving those new ops at the end of the structure
> would avoid the breakage on rte_bbdev.

It would probably be best to move all these ops at the end of the structure (ie. keep them together). 
In that case the deprecation notice would call out that the rte_bbdev structure content is more generally modified. Probably best for the longer run. 
David, Maxime, ok with that option?

struct __rte_cache_aligned rte_bbdev {
     rte_bbdev_enqueue_enc_ops_t enqueue_enc_ops;
     rte_bbdev_enqueue_dec_ops_t enqueue_dec_ops;
     rte_bbdev_dequeue_enc_ops_t dequeue_enc_ops;
     rte_bbdev_dequeue_dec_ops_t dequeue_dec_ops;
     rte_bbdev_enqueue_enc_ops_t enqueue_ldpc_enc_ops;
     rte_bbdev_enqueue_dec_ops_t enqueue_ldpc_dec_ops;
     rte_bbdev_dequeue_enc_ops_t dequeue_ldpc_enc_ops;
     rte_bbdev_dequeue_dec_ops_t dequeue_ldpc_dec_ops;
     rte_bbdev_enqueue_fft_ops_t enqueue_fft_ops;
     rte_bbdev_dequeue_fft_ops_t dequeue_fft_ops;
     const struct rte_bbdev_ops *dev_ops;  
     struct rte_bbdev_data *data;  
     enum rte_bbdev_state state;  
     struct rte_device *device; 
     struct rte_bbdev_cb_list list_cbs;
     struct rte_intr_handle *intr_handle; 
 };



> 
> 
> >
> > Pasting below the ABI results for reference
> >
> >   [C] 'function rte_bbdev* rte_bbdev_allocate(const char*)' at
> rte_bbdev.c:174:1 has some indirect sub-type changes:
> >     return type changed:
> >       in pointed to type 'struct rte_bbdev' at rte_bbdev.h:498:1:
> >         type size hasn't changed
> >         2 data member insertions:
> >           'rte_bbdev_enqueue_mldts_ops_t rte_bbdev::enqueue_mldts_ops',
> at offset 640 (in bits) at rte_bbdev.h:520:1
> >           'rte_bbdev_dequeue_mldts_ops_t rte_bbdev::dequeue_mldts_ops',
> at offset 704 (in bits) at rte_bbdev.h:522:1
> >         7 data member changes (9 filtered):
> >           type of 'rte_bbdev_dequeue_fft_ops_t rte_bbdev::dequeue_fft_ops'
> changed:
> >             underlying type 'typedef uint16_t (rte_bbdev_queue_data*,
> rte_bbdev_fft_op**, typedef uint16_t)*' changed:
> >               in pointed to type 'function type typedef uint16_t
> (rte_bbdev_queue_data*, rte_bbdev_fft_op**, typedef uint16_t)':
> >                 parameter 2 of type 'rte_bbdev_fft_op**' has sub-type changes:
> >                   in pointed to type 'rte_bbdev_fft_op*':
> >                     in pointed to type 'struct rte_bbdev_fft_op' at
> rte_bbdev_op.h:978:1:
> >                       type size changed from 832 to 1664 (in bits)
> >                       1 data member change:
> >                         type of 'rte_bbdev_op_fft rte_bbdev_fft_op::fft' changed:
> >                           type size changed from 640 to 1472 (in bits)
> >                           6 data member insertions:
> >                             'rte_bbdev_op_data
> rte_bbdev_op_fft::dewindowing_input', at offset 256 (in bits) at
> rte_bbdev_op.h:771:1
> >                             'int8_t rte_bbdev_op_fft::freq_resample_mode', at offset
> 768 (in bits) at rte_bbdev_op.h:807:1
> >                             'uint16_t rte_bbdev_op_fft::output_depadded_size', at
> offset 784 (in bits) at rte_bbdev_op.h:809:1
> >                             'uint16_t rte_bbdev_op_fft::cs_theta_0[12]', at offset 800
> (in bits) at rte_bbdev_op.h:811:1
> >                             'uint32_t rte_bbdev_op_fft::cs_theta_d[12]', at offset 992
> (in bits) at rte_bbdev_op.h:813:1
> >                             'int8_t rte_bbdev_op_fft::time_offset[12]', at offset 1376
> (in bits) at rte_bbdev_op.h:815:1
> >                           17 data member changes:
> >                             'rte_bbdev_op_data
> rte_bbdev_op_fft::power_meas_output' offset changed from 256 to 384 (in
> bits) (by +128 bits)
> >                             'uint32_t rte_bbdev_op_fft::op_flags' offset changed from
> 384 to 512 (in bits) (by +128 bits)
> >                             'uint16_t rte_bbdev_op_fft::input_sequence_size' offset
> changed from 416 to 544 (in bits) (by +128 bits)
> >                             'uint16_t rte_bbdev_op_fft::input_leading_padding'
> offset changed from 432 to 560 (in bits) (by +128 bits)
> >                             'uint16_t rte_bbdev_op_fft::output_sequence_size' offset
> changed from 448 to 576 (in bits) (by +128 bits)
> >                             'uint16_t rte_bbdev_op_fft::output_leading_depadding'
> offset changed from 464 to 592 (in bits) (by +128 bits)
> >                             'uint8_t rte_bbdev_op_fft::window_index[6]' offset
> changed from 480 to 608 (in bits) (by +128 bits)
> >                             'uint16_t rte_bbdev_op_fft::cs_bitmap' offset changed
> from 528 to 656 (in bits) (by +128 bits)
> >                             'uint8_t rte_bbdev_op_fft::num_antennas_log2' offset
> changed from 544 to 672 (in bits) (by +128 bits)
> >                             'uint8_t rte_bbdev_op_fft::idft_log2' offset changed from
> 552 to 680 (in bits) (by +128 bits)
> >                             'uint8_t rte_bbdev_op_fft::dft_log2' offset changed from
> 560 to 688 (in bits) (by +128 bits)
> >                             'int8_t rte_bbdev_op_fft::cs_time_adjustment' offset
> changed from 568 to 696 (in bits) (by +128 bits)
> >                             'int8_t rte_bbdev_op_fft::idft_shift' offset changed from
> 576 to 704 (in bits) (by +128 bits)
> >                             'int8_t rte_bbdev_op_fft::dft_shift' offset changed from
> 584 to 712 (in bits) (by +128 bits)
> >                             'uint16_t rte_bbdev_op_fft::ncs_reciprocal' offset
> changed from 592 to 720 (in bits) (by +128 bits)
> >                             'uint16_t rte_bbdev_op_fft::power_shift' offset changed
> from 608 to 736 (in bits) (by +128 bits)
> >                             'uint16_t rte_bbdev_op_fft::fp16_exp_adjust' offset
> changed from 624 to 752 (in bits) (by +128 bits)
> >           'const rte_bbdev_ops* rte_bbdev::dev_ops' offset changed from 640
> to 768 (in bits) (by +128 bits)
> >           'rte_bbdev_data* rte_bbdev::data' offset changed from 704 to 832
> (in bits) (by +128 bits)
> >           'rte_bbdev_state rte_bbdev::state' offset changed from 768 to 896
> (in bits) (by +128 bits)
> >           'rte_device* rte_bbdev::device' offset changed from 832 to 960 (in
> bits) (by +128 bits)
> >           'rte_bbdev_cb_list rte_bbdev::list_cbs' offset changed from 896 to
> 1024 (in bits) (by +128 bits)
> >           'rte_intr_handle* rte_bbdev::intr_handle' offset changed
> > from 1024 to 1152 (in bits) (by +128 bits)
> 
> As for the report on the rte_bbdev_op_fft structure changes:
> - wrt to its size, I think it is okay to waive it, rte_bbdev_fft_op objects are
> coming from a bbdev mempool which is created by the bbdev library itself
> (with the right element size if the application asked for RTE_BBDEV_OP_FFT
> type),
> - wrt to the fields locations, an application may have been touching those
> fields, so moving all the added fields at the end of the structure would be
> better.
>   But on the other hand, an application will have to call an fft_ops
> experimental API at some point, and the application developer is already
> warned that ABI is not preserved on this part of the API,
> 
> So I would waive the changes on rte_bbdev_fft_op with something like:
> 
> diff --git a/devtools/libabigail.abignore b/devtools/libabigail.abignore index
> 3ff51509de..3cdce69418 100644
> --- a/devtools/libabigail.abignore
> +++ b/devtools/libabigail.abignore
> @@ -36,6 +36,8 @@
>  [suppress_type]
>          type_kind = enum
>          changed_enumerators = RTE_CRYPTO_ASYM_XFORM_ECPM,
> RTE_CRYPTO_ASYM_XFORM_TYPE_LIST_END
> +[suppress_type]
> +       name = rte_bbdev_fft_op


OK I did not know about this method. Shouldn't this apply more generally to all experimental structures?
This can be added into the serie for 23.11.


Thanks
Nic



> 
>  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
>  ; Temporary exceptions till next major ABI version ;
> 
> 
> --
> David Marchand


^ permalink raw reply	[relevance 0%]

* Re: [PATCH] doc: deprecation notice to add RSS hash algorithm field
  2023-06-06 15:50  3%   ` Ferruh Yigit
@ 2023-06-06 16:35  3%     ` Stephen Hemminger
  2023-07-28 15:06  0%       ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Stephen Hemminger @ 2023-06-06 16:35 UTC (permalink / raw)
  To: Ferruh Yigit; +Cc: Dongdong Liu, dev

On Tue, 6 Jun 2023 16:50:53 +0100
Ferruh Yigit <ferruh.yigit@amd.com> wrote:

> On 6/6/2023 4:39 PM, Stephen Hemminger wrote:
> > On Tue, 6 Jun 2023 20:11:26 +0800
> > Dongdong Liu <liudongdong3@huawei.com> wrote:
> >   
> >> Deprecation notice to add "func" field to ``rte_eth_rss_conf``
> >> structure for RSS hash algorithm.
> >>
> >> Signed-off-by: Dongdong Liu <liudongdong3@huawei.com>
> >> ---  
> > 
> > New fields do not require deprecation notice.
> > Since this seems to be a repeated issue, perhaps someone should
> > add this to the documentation.
> >  
> 
> 
> Hi Stephen,
> 
> This is follow up to an existing patchset:
> https://patches.dpdk.org/project/dpdk/list/?series=27400&state=*
> 
> Although field is addition to the "struct rte_eth_rss_conf" struct, it
> is embedded into "struct rte_eth_conf" which is parameter to an API, so
> change cause size increase in outer struct and causes ABI breakage,
> requiring deprecation notice.

It will change ABI so will have to wait for 23.11.
But the purpose of deprecation notice is more about telling users that API
will change.

The automated tools may give false complaint. Ok to add to deprecation,
but really not necessary.

^ permalink raw reply	[relevance 3%]

* Re: [PATCH V6 0/5] app/testpmd: support multiple process attach and detach port
  2023-05-27  2:11  3% ` [PATCH V6 0/5] app/testpmd: support multiple process attach and detach port Huisong Li
  2023-05-27  2:11  2%   ` [PATCH V6 2/5] ethdev: fix skip valid port in probing callback Huisong Li
@ 2023-06-06 16:26  0%   ` Ferruh Yigit
  2023-06-07 10:14  0%     ` lihuisong (C)
  2023-07-14  7:21  0%   ` lihuisong (C)
  2 siblings, 1 reply; 200+ results
From: Ferruh Yigit @ 2023-06-06 16:26 UTC (permalink / raw)
  To: Huisong Li, dev
  Cc: thomas, andrew.rybchenko, liudongdong3, liuyonglong, fengchengwen

On 5/27/2023 3:11 AM, Huisong Li wrote:
> This patchset fix some bugs and support attaching and detaching port
> in primary and secondary.
> 

Hi Huisong,

As commented on v4, I have some concerns on this set.

The set does multiple ethdev/testpmd change, but the main target of the
patch is not described clearly/simply.

It looks like intention is to be able to register NEW event callback in
the secondary process and be able to setup device in secondary when
primary attaches a device,
but my question is why not multi-process communication socket can't be
used for this?

MP socket/communication/thread is developed for this reason, I am not
convinced why it can't be used to sync primary and secondary for device
attach/detach.


> ---
>  -v6: adjust rte_eth_dev_is_used position based on alphabetical order
>       in version.map
>  -v5: move 'ALLOCATED' state to the back of 'REMOVED' to avoid abi break.
>  -v4: fix a misspelling. 
>  -v3:
>    #1 merge patch 1/6 and patch 2/6 into patch 1/5, and add modification
>       for other bus type.
>    #2 add a RTE_ETH_DEV_ALLOCATED state in rte_eth_dev_state to resolve
>       the probelm in patch 2/5. 
>  -v2: resend due to CI unexplained failure.
> 
> Huisong Li (5):
>   drivers/bus: restore driver assignment at front of probing
>   ethdev: fix skip valid port in probing callback
>   app/testpmd: check the validity of the port
>   app/testpmd: add attach and detach port for multiple process
>   app/testpmd: stop forwarding in new or destroy event
> 
>  app/test-pmd/testpmd.c                   | 47 +++++++++++++++---------
>  app/test-pmd/testpmd.h                   |  1 -
>  drivers/bus/auxiliary/auxiliary_common.c |  9 ++++-
>  drivers/bus/dpaa/dpaa_bus.c              |  9 ++++-
>  drivers/bus/fslmc/fslmc_bus.c            |  8 +++-
>  drivers/bus/ifpga/ifpga_bus.c            | 12 ++++--
>  drivers/bus/pci/pci_common.c             |  9 ++++-
>  drivers/bus/vdev/vdev.c                  | 10 ++++-
>  drivers/bus/vmbus/vmbus_common.c         |  9 ++++-
>  drivers/net/bnxt/bnxt_ethdev.c           |  3 +-
>  drivers/net/bonding/bonding_testpmd.c    |  1 -
>  drivers/net/mlx5/mlx5.c                  |  2 +-
>  lib/ethdev/ethdev_driver.c               | 13 +++++--
>  lib/ethdev/ethdev_driver.h               | 12 ++++++
>  lib/ethdev/ethdev_pci.h                  |  2 +-
>  lib/ethdev/rte_class_eth.c               |  2 +-
>  lib/ethdev/rte_ethdev.c                  |  4 +-
>  lib/ethdev/rte_ethdev.h                  |  4 +-
>  lib/ethdev/version.map                   |  1 +
>  19 files changed, 114 insertions(+), 44 deletions(-)
> 


^ permalink raw reply	[relevance 0%]

* Re: [PATCH] doc: deprecation notice to add RSS hash algorithm field
  @ 2023-06-06 15:50  3%   ` Ferruh Yigit
  2023-06-06 16:35  3%     ` Stephen Hemminger
  0 siblings, 1 reply; 200+ results
From: Ferruh Yigit @ 2023-06-06 15:50 UTC (permalink / raw)
  To: Stephen Hemminger, Dongdong Liu; +Cc: dev

On 6/6/2023 4:39 PM, Stephen Hemminger wrote:
> On Tue, 6 Jun 2023 20:11:26 +0800
> Dongdong Liu <liudongdong3@huawei.com> wrote:
> 
>> Deprecation notice to add "func" field to ``rte_eth_rss_conf``
>> structure for RSS hash algorithm.
>>
>> Signed-off-by: Dongdong Liu <liudongdong3@huawei.com>
>> ---
> 
> New fields do not require deprecation notice.
> Since this seems to be a repeated issue, perhaps someone should
> add this to the documentation.
>


Hi Stephen,

This is follow up to an existing patchset:
https://patches.dpdk.org/project/dpdk/list/?series=27400&state=*

Although field is addition to the "struct rte_eth_rss_conf" struct, it
is embedded into "struct rte_eth_conf" which is parameter to an API, so
change cause size increase in outer struct and causes ABI breakage,
requiring deprecation notice.


^ permalink raw reply	[relevance 3%]

* Re: [PATCH] ethdev: validate reserved fields
  2023-06-06 15:24  3% ` Ferruh Yigit
@ 2023-06-06 15:38  0%   ` Stephen Hemminger
  0 siblings, 0 replies; 200+ results
From: Stephen Hemminger @ 2023-06-06 15:38 UTC (permalink / raw)
  To: Ferruh Yigit; +Cc: dev, thomas, Andrew Rybchenko

On Tue, 6 Jun 2023 16:24:36 +0100
Ferruh Yigit <ferruh.yigit@amd.com> wrote:

> No objection on validating reserved fields, but if any application
> passing not zero values before (I think this was possible), it will
> break with this change, so can we get this patch in this release?
> 
> Or should it need to wait ABI break release?
> If we will wait v23.11, perhaps this should be applied to all structs
> with reserved fields, and may be good to add a deprecation notice in
> this release, what do you t

Yes, do this in 23.11 (early in merge cycle).
Did ethdev because it is heavily used, and easy to test and validate.

^ permalink raw reply	[relevance 0%]

* Re: [PATCH] ethdev: validate reserved fields
    2023-05-26  8:15  0% ` Bruce Richardson
@ 2023-06-06 15:24  3% ` Ferruh Yigit
  2023-06-06 15:38  0%   ` Stephen Hemminger
  1 sibling, 1 reply; 200+ results
From: Ferruh Yigit @ 2023-06-06 15:24 UTC (permalink / raw)
  To: Stephen Hemminger, dev; +Cc: thomas, Andrew Rybchenko

On 5/25/2023 9:39 PM, Stephen Hemminger wrote:
> The various reserved fields added to ethdev could not be
> safely used for future extensions because they were never
> checked on input. Therefore ABI would be broken if these
> fields were added in a future DPDK release.
> 
> Fixes: 436b3a6b6e62 ("ethdev: reserve space in main structs for extension")
> Cc: thomas@monjalon.net
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
>  lib/ethdev/rte_ethdev.c | 41 +++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 41 insertions(+)
> 
> diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
> index 4d0325568322..4f937a1914c9 100644
> --- a/lib/ethdev/rte_ethdev.c
> +++ b/lib/ethdev/rte_ethdev.c
> @@ -1228,6 +1228,25 @@ rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
>  	/* Backup mtu for rollback */
>  	old_mtu = dev->data->mtu;
>  
> +	/* fields must be zero to reserve them for future ABI changes */
> +	if (dev_conf->rxmode.reserved_64s[0] != 0 ||
> +	    dev_conf->rxmode.reserved_64s[1] != 0 ||
> +	    dev_conf->rxmode.reserved_ptrs[0] != NULL ||
> +	    dev_conf->rxmode.reserved_ptrs[1] != NULL) {
> +		RTE_ETHDEV_LOG(ERR, "Rxmode reserved fields not zero\n");
> +		ret = -EINVAL;
> +		goto rollback;
> +	}
> +
> +	if (dev_conf->txmode.reserved_64s[0] != 0 ||
> +	    dev_conf->txmode.reserved_64s[1] != 0 ||
> +	    dev_conf->txmode.reserved_ptrs[0] != NULL ||
> +	    dev_conf->txmode.reserved_ptrs[1] != NULL) {
> +		RTE_ETHDEV_LOG(ERR, "txmode reserved fields not zero\n");
> +		ret = -EINVAL;
> +		goto rollback;
> +	}
> +
>


No objection on validating reserved fields, but if any application
passing not zero values before (I think this was possible), it will
break with this change, so can we get this patch in this release?

Or should it need to wait ABI break release?
If we will wait v23.11, perhaps this should be applied to all structs
with reserved fields, and may be good to add a deprecation notice in
this release, what do you think?


^ permalink raw reply	[relevance 3%]

* Re: [PATCH v1 1/1] doc: announce change in bbdev api related to operation extension
  2023-06-05 20:08  4%       ` Chautru, Nicolas
@ 2023-06-06  9:20  4%         ` David Marchand
  2023-06-06 21:01  0%           ` Chautru, Nicolas
  0 siblings, 1 reply; 200+ results
From: David Marchand @ 2023-06-06  9:20 UTC (permalink / raw)
  To: Chautru, Nicolas
  Cc: Maxime Coquelin, Stephen Hemminger, dev, Rix, Tom,
	hemant.agrawal, Vargas, Hernan

On Mon, Jun 5, 2023 at 10:08 PM Chautru, Nicolas
<nicolas.chautru@intel.com> wrote:
> Wrt the MLD functions: these are new into the related serie but still the break the ABI since the struct rte_bbdev includes these functions hence causing offset changes.
>
> Should I then just rephrase as:
>
> +* bbdev: Will extend the API to support the new operation type
>  +``RTE_BBDEV_OP_MLDTS`` as per
>  +  this `v1
>  +<https://patches.dpdk.org/project/dpdk/list/?series=28192>`. This
>  +  will notably introduce
>  +  new symbols for ``rte_bbdev_dequeue_mldts_ops``,
>  +``rte_bbdev_enqueue_mldts_ops`` into the stuct rte_bbdev.

I don't think we need this deprecation notice.


Do you need to expose those new mldts ops in rte_bbdev?
Can't they go to dev_ops?
If you can't, at least moving those new ops at the end of the
structure would avoid the breakage on rte_bbdev.


>
> Pasting below the ABI results for reference
>
>   [C] 'function rte_bbdev* rte_bbdev_allocate(const char*)' at rte_bbdev.c:174:1 has some indirect sub-type changes:
>     return type changed:
>       in pointed to type 'struct rte_bbdev' at rte_bbdev.h:498:1:
>         type size hasn't changed
>         2 data member insertions:
>           'rte_bbdev_enqueue_mldts_ops_t rte_bbdev::enqueue_mldts_ops', at offset 640 (in bits) at rte_bbdev.h:520:1
>           'rte_bbdev_dequeue_mldts_ops_t rte_bbdev::dequeue_mldts_ops', at offset 704 (in bits) at rte_bbdev.h:522:1
>         7 data member changes (9 filtered):
>           type of 'rte_bbdev_dequeue_fft_ops_t rte_bbdev::dequeue_fft_ops' changed:
>             underlying type 'typedef uint16_t (rte_bbdev_queue_data*, rte_bbdev_fft_op**, typedef uint16_t)*' changed:
>               in pointed to type 'function type typedef uint16_t (rte_bbdev_queue_data*, rte_bbdev_fft_op**, typedef uint16_t)':
>                 parameter 2 of type 'rte_bbdev_fft_op**' has sub-type changes:
>                   in pointed to type 'rte_bbdev_fft_op*':
>                     in pointed to type 'struct rte_bbdev_fft_op' at rte_bbdev_op.h:978:1:
>                       type size changed from 832 to 1664 (in bits)
>                       1 data member change:
>                         type of 'rte_bbdev_op_fft rte_bbdev_fft_op::fft' changed:
>                           type size changed from 640 to 1472 (in bits)
>                           6 data member insertions:
>                             'rte_bbdev_op_data rte_bbdev_op_fft::dewindowing_input', at offset 256 (in bits) at rte_bbdev_op.h:771:1
>                             'int8_t rte_bbdev_op_fft::freq_resample_mode', at offset 768 (in bits) at rte_bbdev_op.h:807:1
>                             'uint16_t rte_bbdev_op_fft::output_depadded_size', at offset 784 (in bits) at rte_bbdev_op.h:809:1
>                             'uint16_t rte_bbdev_op_fft::cs_theta_0[12]', at offset 800 (in bits) at rte_bbdev_op.h:811:1
>                             'uint32_t rte_bbdev_op_fft::cs_theta_d[12]', at offset 992 (in bits) at rte_bbdev_op.h:813:1
>                             'int8_t rte_bbdev_op_fft::time_offset[12]', at offset 1376 (in bits) at rte_bbdev_op.h:815:1
>                           17 data member changes:
>                             'rte_bbdev_op_data rte_bbdev_op_fft::power_meas_output' offset changed from 256 to 384 (in bits) (by +128 bits)
>                             'uint32_t rte_bbdev_op_fft::op_flags' offset changed from 384 to 512 (in bits) (by +128 bits)
>                             'uint16_t rte_bbdev_op_fft::input_sequence_size' offset changed from 416 to 544 (in bits) (by +128 bits)
>                             'uint16_t rte_bbdev_op_fft::input_leading_padding' offset changed from 432 to 560 (in bits) (by +128 bits)
>                             'uint16_t rte_bbdev_op_fft::output_sequence_size' offset changed from 448 to 576 (in bits) (by +128 bits)
>                             'uint16_t rte_bbdev_op_fft::output_leading_depadding' offset changed from 464 to 592 (in bits) (by +128 bits)
>                             'uint8_t rte_bbdev_op_fft::window_index[6]' offset changed from 480 to 608 (in bits) (by +128 bits)
>                             'uint16_t rte_bbdev_op_fft::cs_bitmap' offset changed from 528 to 656 (in bits) (by +128 bits)
>                             'uint8_t rte_bbdev_op_fft::num_antennas_log2' offset changed from 544 to 672 (in bits) (by +128 bits)
>                             'uint8_t rte_bbdev_op_fft::idft_log2' offset changed from 552 to 680 (in bits) (by +128 bits)
>                             'uint8_t rte_bbdev_op_fft::dft_log2' offset changed from 560 to 688 (in bits) (by +128 bits)
>                             'int8_t rte_bbdev_op_fft::cs_time_adjustment' offset changed from 568 to 696 (in bits) (by +128 bits)
>                             'int8_t rte_bbdev_op_fft::idft_shift' offset changed from 576 to 704 (in bits) (by +128 bits)
>                             'int8_t rte_bbdev_op_fft::dft_shift' offset changed from 584 to 712 (in bits) (by +128 bits)
>                             'uint16_t rte_bbdev_op_fft::ncs_reciprocal' offset changed from 592 to 720 (in bits) (by +128 bits)
>                             'uint16_t rte_bbdev_op_fft::power_shift' offset changed from 608 to 736 (in bits) (by +128 bits)
>                             'uint16_t rte_bbdev_op_fft::fp16_exp_adjust' offset changed from 624 to 752 (in bits) (by +128 bits)
>           'const rte_bbdev_ops* rte_bbdev::dev_ops' offset changed from 640 to 768 (in bits) (by +128 bits)
>           'rte_bbdev_data* rte_bbdev::data' offset changed from 704 to 832 (in bits) (by +128 bits)
>           'rte_bbdev_state rte_bbdev::state' offset changed from 768 to 896 (in bits) (by +128 bits)
>           'rte_device* rte_bbdev::device' offset changed from 832 to 960 (in bits) (by +128 bits)
>           'rte_bbdev_cb_list rte_bbdev::list_cbs' offset changed from 896 to 1024 (in bits) (by +128 bits)
>           'rte_intr_handle* rte_bbdev::intr_handle' offset changed from 1024 to 1152 (in bits) (by +128 bits)

As for the report on the rte_bbdev_op_fft structure changes:
- wrt to its size, I think it is okay to waive it, rte_bbdev_fft_op
objects are coming from a bbdev mempool which is created by the bbdev
library itself (with the right element size if the application asked
for RTE_BBDEV_OP_FFT type),
- wrt to the fields locations, an application may have been touching
those fields, so moving all the added fields at the end of the
structure would be better.
  But on the other hand, an application will have to call an fft_ops
experimental API at some point, and the application developer is
already warned that ABI is not preserved on this part of the API,

So I would waive the changes on rte_bbdev_fft_op with something like:

diff --git a/devtools/libabigail.abignore b/devtools/libabigail.abignore
index 3ff51509de..3cdce69418 100644
--- a/devtools/libabigail.abignore
+++ b/devtools/libabigail.abignore
@@ -36,6 +36,8 @@
 [suppress_type]
         type_kind = enum
         changed_enumerators = RTE_CRYPTO_ASYM_XFORM_ECPM,
RTE_CRYPTO_ASYM_XFORM_TYPE_LIST_END
+[suppress_type]
+       name = rte_bbdev_fft_op

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; Temporary exceptions till next major ABI version ;


-- 
David Marchand


^ permalink raw reply	[relevance 4%]

* RE: [PATCH v6 1/4] ethdev: add API for mbufs recycle mode
  2023-06-06  7:31  3%           ` Feifei Wang
@ 2023-06-06  8:34  0%             ` Konstantin Ananyev
  2023-06-07  0:00  0%               ` Ferruh Yigit
  0 siblings, 1 reply; 200+ results
From: Konstantin Ananyev @ 2023-06-06  8:34 UTC (permalink / raw)
  To: Feifei Wang,
	Константин
	Ананьев,
	thomas, Ferruh Yigit, Andrew Rybchenko
  Cc: dev, nd, Honnappa Nagarahalli, Ruifeng Wang, nd, nd



> 
> [...]
> > > Probably I am missing something, but why it is not possible to do something
> > like that:
> > >
> > > rte_eth_recycle_mbufs(rx_port_id=X, rx_queue_id=Y, tx_port_id=N,
> > > tx_queue_id=M, ...); ....
> > > rte_eth_recycle_mbufs(rx_port_id=X, rx_queue_id=Y, tx_port_id=N,
> > > tx_queue_id=K, ...);
> > >
> > > I.E. feed rx queue from 2 tx queues?
> > >
> > > Two problems for this:
> > > 1. If we have 2 tx queues for rx, the thread should make the extra
> > > judgement to decide which one to choose in the driver layer.
> >
> > Not sure, why on the driver layer?
> > The example I gave above - decision is made on application layer.
> > Lets say first call didn't free enough mbufs, so app decided to use second txq
> > for rearm.
> [Feifei] I think currently mbuf recycle mode can support this usage. For examples:
> n =  rte_eth_recycle_mbufs(rx_port_id=X, rx_queue_id=Y, tx_port_id=N, tx_queue_id=M, ...);
> if (n < planned_number)
> rte_eth_recycle_mbufs(rx_port_id=X, rx_queue_id=Y, tx_port_id=N, tx_queue_id=K, ...);
> 
> Thus, if users want, they can do like this.

Yes, that was my thought, that's why I was surprise that in the comments we have:
" Currently, the rte_eth_recycle_mbufs() function can only support one-time pairing
* between the receive queue and transmit queue. Do not pair one receive queue with
 * multiple transmit queues or pair one transmit queue with multiple receive queues,
 * in order to avoid memory error rewriting."

> 
> >
> > > On the other hand, current mechanism can support users to switch 1 txq
> > > to another timely in the application layer. If user want to choose
> > > another txq, he just need to change the txq_queue_id parameter in the API.
> > > 2. If you want one rxq to support two txq at the same time, this needs
> > > to add spinlock on guard variable to avoid multi-thread conflict.
> > > Spinlock will decrease the data-path performance greatly.  Thus, we do
> > > not consider
> > > 1 rxq mapping multiple txqs here.
> >
> > I am talking about situation when one thread controls 2 tx queues.
> >
> > > + *
> > > + * @param rx_port_id
> > > + * Port identifying the receive side.
> > > + * @param rx_queue_id
> > > + * The index of the receive queue identifying the receive side.
> > > + * The value must be in the range [0, nb_rx_queue - 1] previously
> > > +supplied
> > > + * to rte_eth_dev_configure().
> > > + * @param tx_port_id
> > > + * Port identifying the transmit side.
> > > + * @param tx_queue_id
> > > + * The index of the transmit queue identifying the transmit side.
> > > + * The value must be in the range [0, nb_tx_queue - 1] previously
> > > +supplied
> > > + * to rte_eth_dev_configure().
> > > + * @param recycle_rxq_info
> > > + * A pointer to a structure of type *rte_eth_recycle_rxq_info* which
> > > +contains
> > > + * the information of the Rx queue mbuf ring.
> > > + * @return
> > > + * The number of recycling mbufs.
> > > + */
> > > +__rte_experimental
> > > +static inline uint16_t
> > > +rte_eth_recycle_mbufs(uint16_t rx_port_id, uint16_t rx_queue_id,
> > > +uint16_t tx_port_id, uint16_t tx_queue_id,  struct
> > > +rte_eth_recycle_rxq_info *recycle_rxq_info) {  struct rte_eth_fp_ops
> > > +*p;  void *qd;  uint16_t nb_mbufs;
> > > +
> > > +#ifdef RTE_ETHDEV_DEBUG_TX
> > > + if (tx_port_id >= RTE_MAX_ETHPORTS ||  tx_queue_id >=
> > > +RTE_MAX_QUEUES_PER_PORT) {  RTE_ETHDEV_LOG(ERR,  "Invalid
> > > +tx_port_id=%u or tx_queue_id=%u\n",  tx_port_id, tx_queue_id);
> > > +return 0;  } #endif
> > > +
> > > + /* fetch pointer to queue data */
> > > + p = &rte_eth_fp_ops[tx_port_id];
> > > + qd = p->txq.data[tx_queue_id];
> > > +
> > > +#ifdef RTE_ETHDEV_DEBUG_TX
> > > + RTE_ETH_VALID_PORTID_OR_ERR_RET(tx_port_id, 0);
> > > +
> > > + if (qd == NULL) {
> > > + RTE_ETHDEV_LOG(ERR, "Invalid Tx queue_id=%u for port_id=%u\n",
> > > +tx_queue_id, tx_port_id);  return 0;  } #endif  if
> > > +(p->recycle_tx_mbufs_reuse == NULL)  return 0;
> > > +
> > > + /* Copy used *rte_mbuf* buffer pointers from Tx mbuf ring
> > > + * into Rx mbuf ring.
> > > + */
> > > + nb_mbufs = p->recycle_tx_mbufs_reuse(qd, recycle_rxq_info);
> > > +
> > > + /* If no recycling mbufs, return 0. */ if (nb_mbufs == 0) return 0;
> > > +
> > > +#ifdef RTE_ETHDEV_DEBUG_RX
> > > + if (rx_port_id >= RTE_MAX_ETHPORTS ||  rx_queue_id >=
> > > +RTE_MAX_QUEUES_PER_PORT) {  RTE_ETHDEV_LOG(ERR, "Invalid
> > > +rx_port_id=%u or rx_queue_id=%u\n",  rx_port_id, rx_queue_id);
> > > +return 0;  } #endif
> > > +
> > > + /* fetch pointer to queue data */
> > > + p = &rte_eth_fp_ops[rx_port_id];
> > > + qd = p->rxq.data[rx_queue_id];
> > > +
> > > +#ifdef RTE_ETHDEV_DEBUG_RX
> > > + RTE_ETH_VALID_PORTID_OR_ERR_RET(rx_port_id, 0);
> > > +
> > > + if (qd == NULL) {
> > > + RTE_ETHDEV_LOG(ERR, "Invalid Rx queue_id=%u for port_id=%u\n",
> > > +rx_queue_id, rx_port_id);  return 0;  } #endif
> > > +
> > > + if (p->recycle_rx_descriptors_refill == NULL) return 0;
> > > +
> > > + /* Replenish the Rx descriptors with the recycling
> > > + * into Rx mbuf ring.
> > > + */
> > > + p->recycle_rx_descriptors_refill(qd, nb_mbufs);
> > > +
> > > + return nb_mbufs;
> > > +}
> > > +
> > >  /**
> > >   * @warning
> > >   * @b EXPERIMENTAL: this API may change without prior notice diff
> > > --git a/lib/ethdev/rte_ethdev_core.h b/lib/ethdev/rte_ethdev_core.h
> > > index dcf8adab92..a2e6ea6b6c 100644
> > > --- a/lib/ethdev/rte_ethdev_core.h
> > > +++ b/lib/ethdev/rte_ethdev_core.h
> > > @@ -56,6 +56,13 @@ typedef int (*eth_rx_descriptor_status_t)(void
> > > *rxq, uint16_t offset);
> > >  /** @internal Check the status of a Tx descriptor */  typedef int
> > > (*eth_tx_descriptor_status_t)(void *txq, uint16_t offset);
> > >
> > > +/** @internal Copy used mbufs from Tx mbuf ring into Rx mbuf ring */
> > > +typedef uint16_t (*eth_recycle_tx_mbufs_reuse_t)(void *txq,  struct
> > > +rte_eth_recycle_rxq_info *recycle_rxq_info);
> > > +
> > > +/** @internal Refill Rx descriptors with the recycling mbufs */
> > > +typedef void (*eth_recycle_rx_descriptors_refill_t)(void *rxq,
> > > +uint16_t nb);
> > > +
> > >  /**
> > >   * @internal
> > >   * Structure used to hold opaque pointers to internal ethdev Rx/Tx @@
> > > -90,9 +97,11 @@ struct rte_eth_fp_ops {
> > >          eth_rx_queue_count_t rx_queue_count;
> > >          /** Check the status of a Rx descriptor. */
> > >          eth_rx_descriptor_status_t rx_descriptor_status;
> > > + /** Refill Rx descriptors with the recycling mbufs. */
> > > + eth_recycle_rx_descriptors_refill_t recycle_rx_descriptors_refill;
> > > I am afraid we can't put new fields here without ABI breakage.
> > >
> > > Agree
> > >
> > > It has to be below rxq.
> > > Now thinking about current layout probably not the best one, and when
> > > introducing this struct, I should probably put rxq either on the top
> > > of the struct, or on the next cache line.
> > > But such change is not possible right now anyway.
> > > Same story for txq.
> > >
> > > Thus we should rearrange the structure like below:
> > > struct rte_eth_fp_ops {
> > >     struct rte_ethdev_qdata rxq;
> > >          eth_rx_burst_t rx_pkt_burst;
> > >          eth_rx_queue_count_t rx_queue_count;
> > >          eth_rx_descriptor_status_t rx_descriptor_status;
> > >        eth_recycle_rx_descriptors_refill_t recycle_rx_descriptors_refill;
> > >               uintptr_t reserved1[2];
> > > }
> >
> > Yes, I think such layout will be better.
> > The only problem here - we have to wait for 23.11 for that.
> >
> Ok, if not this change, maybe we still need to wait. Because mbufs_recycle have other
> ABI breakage. Such as the change for 'struct rte_eth_dev'.

Ok by me.

> > >
> > >
> > >          /** Rx queues data. */
> > >          struct rte_ethdev_qdata rxq;
> > > - uintptr_t reserved1[3];
> > > + uintptr_t reserved1[2];
> > >          /**@}*/
> > >
> > >          /**@{*/
> > > @@ -106,9 +115,11 @@ struct rte_eth_fp_ops {
> > >          eth_tx_prep_t tx_pkt_prepare;
> > >          /** Check the status of a Tx descriptor. */
> > >          eth_tx_descriptor_status_t tx_descriptor_status;
> > > + /** Copy used mbufs from Tx mbuf ring into Rx. */
> > > + eth_recycle_tx_mbufs_reuse_t recycle_tx_mbufs_reuse;
> > >          /** Tx queues data. */
> > >          struct rte_ethdev_qdata txq;
> > > - uintptr_t reserved2[3];
> > > + uintptr_t reserved2[2];
> > >          /**@}*/
> > >
> > >  } __rte_cache_aligned;
> > > diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map index
> > > 357d1a88c0..45c417f6bd 100644
> > > --- a/lib/ethdev/version.map
> > > +++ b/lib/ethdev/version.map
> > > @@ -299,6 +299,10 @@ EXPERIMENTAL {
> > >          rte_flow_action_handle_query_update;
> > >          rte_flow_async_action_handle_query_update;
> > >          rte_flow_async_create_by_index;
> > > +
> > > + # added in 23.07
> > > + rte_eth_recycle_mbufs;
> > > + rte_eth_recycle_rx_queue_info_get;
> > >  };
> > >
> > >  INTERNAL {
> > > --
> > > 2.25.1
> > >

^ permalink raw reply	[relevance 0%]

* RE: [PATCH v6 1/4] ethdev: add API for mbufs recycle mode
  2023-06-06  7:10  0%         ` Konstantin Ananyev
@ 2023-06-06  7:31  3%           ` Feifei Wang
  2023-06-06  8:34  0%             ` Konstantin Ananyev
  0 siblings, 1 reply; 200+ results
From: Feifei Wang @ 2023-06-06  7:31 UTC (permalink / raw)
  To: Konstantin Ananyev,
	Константин
	Ананьев,
	thomas, Ferruh Yigit, Andrew Rybchenko
  Cc: dev, nd, Honnappa Nagarahalli, Ruifeng Wang, nd, nd

[...]
> > Probably I am missing something, but why it is not possible to do something
> like that:
> >
> > rte_eth_recycle_mbufs(rx_port_id=X, rx_queue_id=Y, tx_port_id=N,
> > tx_queue_id=M, ...); ....
> > rte_eth_recycle_mbufs(rx_port_id=X, rx_queue_id=Y, tx_port_id=N,
> > tx_queue_id=K, ...);
> >
> > I.E. feed rx queue from 2 tx queues?
> >
> > Two problems for this:
> > 1. If we have 2 tx queues for rx, the thread should make the extra
> > judgement to decide which one to choose in the driver layer.
> 
> Not sure, why on the driver layer?
> The example I gave above - decision is made on application layer.
> Lets say first call didn't free enough mbufs, so app decided to use second txq
> for rearm.
[Feifei] I think currently mbuf recycle mode can support this usage. For examples:
n =  rte_eth_recycle_mbufs(rx_port_id=X, rx_queue_id=Y, tx_port_id=N, tx_queue_id=M, ...);
if (n < planned_number)
rte_eth_recycle_mbufs(rx_port_id=X, rx_queue_id=Y, tx_port_id=N, tx_queue_id=K, ...);

Thus, if users want, they can do like this. 

> 
> > On the other hand, current mechanism can support users to switch 1 txq
> > to another timely in the application layer. If user want to choose
> > another txq, he just need to change the txq_queue_id parameter in the API.
> > 2. If you want one rxq to support two txq at the same time, this needs
> > to add spinlock on guard variable to avoid multi-thread conflict.
> > Spinlock will decrease the data-path performance greatly.  Thus, we do
> > not consider
> > 1 rxq mapping multiple txqs here.
> 
> I am talking about situation when one thread controls 2 tx queues.
> 
> > + *
> > + * @param rx_port_id
> > + * Port identifying the receive side.
> > + * @param rx_queue_id
> > + * The index of the receive queue identifying the receive side.
> > + * The value must be in the range [0, nb_rx_queue - 1] previously
> > +supplied
> > + * to rte_eth_dev_configure().
> > + * @param tx_port_id
> > + * Port identifying the transmit side.
> > + * @param tx_queue_id
> > + * The index of the transmit queue identifying the transmit side.
> > + * The value must be in the range [0, nb_tx_queue - 1] previously
> > +supplied
> > + * to rte_eth_dev_configure().
> > + * @param recycle_rxq_info
> > + * A pointer to a structure of type *rte_eth_recycle_rxq_info* which
> > +contains
> > + * the information of the Rx queue mbuf ring.
> > + * @return
> > + * The number of recycling mbufs.
> > + */
> > +__rte_experimental
> > +static inline uint16_t
> > +rte_eth_recycle_mbufs(uint16_t rx_port_id, uint16_t rx_queue_id,
> > +uint16_t tx_port_id, uint16_t tx_queue_id,  struct
> > +rte_eth_recycle_rxq_info *recycle_rxq_info) {  struct rte_eth_fp_ops
> > +*p;  void *qd;  uint16_t nb_mbufs;
> > +
> > +#ifdef RTE_ETHDEV_DEBUG_TX
> > + if (tx_port_id >= RTE_MAX_ETHPORTS ||  tx_queue_id >=
> > +RTE_MAX_QUEUES_PER_PORT) {  RTE_ETHDEV_LOG(ERR,  "Invalid
> > +tx_port_id=%u or tx_queue_id=%u\n",  tx_port_id, tx_queue_id);
> > +return 0;  } #endif
> > +
> > + /* fetch pointer to queue data */
> > + p = &rte_eth_fp_ops[tx_port_id];
> > + qd = p->txq.data[tx_queue_id];
> > +
> > +#ifdef RTE_ETHDEV_DEBUG_TX
> > + RTE_ETH_VALID_PORTID_OR_ERR_RET(tx_port_id, 0);
> > +
> > + if (qd == NULL) {
> > + RTE_ETHDEV_LOG(ERR, "Invalid Tx queue_id=%u for port_id=%u\n",
> > +tx_queue_id, tx_port_id);  return 0;  } #endif  if
> > +(p->recycle_tx_mbufs_reuse == NULL)  return 0;
> > +
> > + /* Copy used *rte_mbuf* buffer pointers from Tx mbuf ring
> > + * into Rx mbuf ring.
> > + */
> > + nb_mbufs = p->recycle_tx_mbufs_reuse(qd, recycle_rxq_info);
> > +
> > + /* If no recycling mbufs, return 0. */ if (nb_mbufs == 0) return 0;
> > +
> > +#ifdef RTE_ETHDEV_DEBUG_RX
> > + if (rx_port_id >= RTE_MAX_ETHPORTS ||  rx_queue_id >=
> > +RTE_MAX_QUEUES_PER_PORT) {  RTE_ETHDEV_LOG(ERR, "Invalid
> > +rx_port_id=%u or rx_queue_id=%u\n",  rx_port_id, rx_queue_id);
> > +return 0;  } #endif
> > +
> > + /* fetch pointer to queue data */
> > + p = &rte_eth_fp_ops[rx_port_id];
> > + qd = p->rxq.data[rx_queue_id];
> > +
> > +#ifdef RTE_ETHDEV_DEBUG_RX
> > + RTE_ETH_VALID_PORTID_OR_ERR_RET(rx_port_id, 0);
> > +
> > + if (qd == NULL) {
> > + RTE_ETHDEV_LOG(ERR, "Invalid Rx queue_id=%u for port_id=%u\n",
> > +rx_queue_id, rx_port_id);  return 0;  } #endif
> > +
> > + if (p->recycle_rx_descriptors_refill == NULL) return 0;
> > +
> > + /* Replenish the Rx descriptors with the recycling
> > + * into Rx mbuf ring.
> > + */
> > + p->recycle_rx_descriptors_refill(qd, nb_mbufs);
> > +
> > + return nb_mbufs;
> > +}
> > +
> >  /**
> >   * @warning
> >   * @b EXPERIMENTAL: this API may change without prior notice diff
> > --git a/lib/ethdev/rte_ethdev_core.h b/lib/ethdev/rte_ethdev_core.h
> > index dcf8adab92..a2e6ea6b6c 100644
> > --- a/lib/ethdev/rte_ethdev_core.h
> > +++ b/lib/ethdev/rte_ethdev_core.h
> > @@ -56,6 +56,13 @@ typedef int (*eth_rx_descriptor_status_t)(void
> > *rxq, uint16_t offset);
> >  /** @internal Check the status of a Tx descriptor */  typedef int
> > (*eth_tx_descriptor_status_t)(void *txq, uint16_t offset);
> >
> > +/** @internal Copy used mbufs from Tx mbuf ring into Rx mbuf ring */
> > +typedef uint16_t (*eth_recycle_tx_mbufs_reuse_t)(void *txq,  struct
> > +rte_eth_recycle_rxq_info *recycle_rxq_info);
> > +
> > +/** @internal Refill Rx descriptors with the recycling mbufs */
> > +typedef void (*eth_recycle_rx_descriptors_refill_t)(void *rxq,
> > +uint16_t nb);
> > +
> >  /**
> >   * @internal
> >   * Structure used to hold opaque pointers to internal ethdev Rx/Tx @@
> > -90,9 +97,11 @@ struct rte_eth_fp_ops {
> >          eth_rx_queue_count_t rx_queue_count;
> >          /** Check the status of a Rx descriptor. */
> >          eth_rx_descriptor_status_t rx_descriptor_status;
> > + /** Refill Rx descriptors with the recycling mbufs. */
> > + eth_recycle_rx_descriptors_refill_t recycle_rx_descriptors_refill;
> > I am afraid we can't put new fields here without ABI breakage.
> >
> > Agree
> >
> > It has to be below rxq.
> > Now thinking about current layout probably not the best one, and when
> > introducing this struct, I should probably put rxq either on the top
> > of the struct, or on the next cache line.
> > But such change is not possible right now anyway.
> > Same story for txq.
> >
> > Thus we should rearrange the structure like below:
> > struct rte_eth_fp_ops {
> >     struct rte_ethdev_qdata rxq;
> >          eth_rx_burst_t rx_pkt_burst;
> >          eth_rx_queue_count_t rx_queue_count;
> >          eth_rx_descriptor_status_t rx_descriptor_status;
> >        eth_recycle_rx_descriptors_refill_t recycle_rx_descriptors_refill;
> >               uintptr_t reserved1[2];
> > }
> 
> Yes, I think such layout will be better.
> The only problem here - we have to wait for 23.11 for that.
> 
Ok, if not this change, maybe we still need to wait. Because mbufs_recycle have other
ABI breakage. Such as the change for 'struct rte_eth_dev'.
> >
> >
> >          /** Rx queues data. */
> >          struct rte_ethdev_qdata rxq;
> > - uintptr_t reserved1[3];
> > + uintptr_t reserved1[2];
> >          /**@}*/
> >
> >          /**@{*/
> > @@ -106,9 +115,11 @@ struct rte_eth_fp_ops {
> >          eth_tx_prep_t tx_pkt_prepare;
> >          /** Check the status of a Tx descriptor. */
> >          eth_tx_descriptor_status_t tx_descriptor_status;
> > + /** Copy used mbufs from Tx mbuf ring into Rx. */
> > + eth_recycle_tx_mbufs_reuse_t recycle_tx_mbufs_reuse;
> >          /** Tx queues data. */
> >          struct rte_ethdev_qdata txq;
> > - uintptr_t reserved2[3];
> > + uintptr_t reserved2[2];
> >          /**@}*/
> >
> >  } __rte_cache_aligned;
> > diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map index
> > 357d1a88c0..45c417f6bd 100644
> > --- a/lib/ethdev/version.map
> > +++ b/lib/ethdev/version.map
> > @@ -299,6 +299,10 @@ EXPERIMENTAL {
> >          rte_flow_action_handle_query_update;
> >          rte_flow_async_action_handle_query_update;
> >          rte_flow_async_create_by_index;
> > +
> > + # added in 23.07
> > + rte_eth_recycle_mbufs;
> > + rte_eth_recycle_rx_queue_info_get;
> >  };
> >
> >  INTERNAL {
> > --
> > 2.25.1
> >

^ permalink raw reply	[relevance 3%]

* RE: [PATCH v6 1/4] ethdev: add API for mbufs recycle mode
  2023-06-06  2:55  1%       ` Feifei Wang
@ 2023-06-06  7:10  0%         ` Konstantin Ananyev
  2023-06-06  7:31  3%           ` Feifei Wang
  0 siblings, 1 reply; 200+ results
From: Konstantin Ananyev @ 2023-06-06  7:10 UTC (permalink / raw)
  To: Feifei Wang,
	Константин
	Ананьев,
	thomas, Ferruh Yigit, Andrew Rybchenko
  Cc: dev, nd, Honnappa Nagarahalli, Ruifeng Wang, nd

> 
> Thanks for the comments.
> 
> From: Константин Ананьев <mailto:konstantin.v.ananyev@yandex.ru>
> Sent: Monday, June 5, 2023 8:54 PM
> To: Feifei Wang <mailto:Feifei.Wang2@arm.com>; mailto:thomas@monjalon.net; Ferruh Yigit <mailto:ferruh.yigit@amd.com>;
> Andrew Rybchenko <mailto:andrew.rybchenko@oktetlabs.ru>
> Cc: mailto:dev@dpdk.org; nd <mailto:nd@arm.com>; Honnappa Nagarahalli <mailto:Honnappa.Nagarahalli@arm.com>; Ruifeng Wang
> <mailto:Ruifeng.Wang@arm.com>
> Subject: Re: [PATCH v6 1/4] ethdev: add API for mbufs recycle mode
> 
> 
> 
> Hi Feifei,
> 
> few more comments from me, see below.
> Add 'rte_eth_recycle_rx_queue_info_get' and 'rte_eth_recycle_mbufs'
> APIs to recycle used mbufs from a transmit queue of an Ethernet device,
> and move these mbufs into a mbuf ring for a receive queue of an Ethernet
> device. This can bypass mempool 'put/get' operations hence saving CPU
> cycles.
> 
> For each recycling mbufs, the rte_eth_recycle_mbufs() function performs
> the following operations:
> - Copy used *rte_mbuf* buffer pointers from Tx mbuf ring into Rx mbuf
> ring.
> - Replenish the Rx descriptors with the recycling *rte_mbuf* mbufs freed
> from the Tx mbuf ring.
> 
> Suggested-by: Honnappa Nagarahalli <mailto:honnappa.nagarahalli@arm.com>
> Suggested-by: Ruifeng Wang <mailto:ruifeng.wang@arm.com>
> Signed-off-by: Feifei Wang <mailto:feifei.wang2@arm.com>
> Reviewed-by: Ruifeng Wang <mailto:ruifeng.wang@arm.com>
> Reviewed-by: Honnappa Nagarahalli <mailto:honnappa.nagarahalli@arm.com>
> ---
>  doc/guides/rel_notes/release_23_07.rst | 7 +
>  lib/ethdev/ethdev_driver.h | 10 ++
>  lib/ethdev/ethdev_private.c | 2 +
>  lib/ethdev/rte_ethdev.c | 31 +++++
>  lib/ethdev/rte_ethdev.h | 182 +++++++++++++++++++++++++
>  lib/ethdev/rte_ethdev_core.h | 15 +-
>  lib/ethdev/version.map | 4 +
>  7 files changed, 249 insertions(+), 2 deletions(-)
> 
> diff --git a/doc/guides/rel_notes/release_23_07.rst b/doc/guides/rel_notes/release_23_07.rst
> index a9b1293689..f279036cb9 100644
> --- a/doc/guides/rel_notes/release_23_07.rst
> +++ b/doc/guides/rel_notes/release_23_07.rst
> @@ -55,6 +55,13 @@ New Features
>       Also, make sure to start the actual text at the margin.
>       =======================================================
> 
> +* **Add mbufs recycling support. **
> + Added ``rte_eth_recycle_rx_queue_info_get`` and ``rte_eth_recycle_mbufs``
> + APIs which allow the user to copy used mbufs from the Tx mbuf ring
> + into the Rx mbuf ring. This feature supports the case that the Rx Ethernet
> + device is different from the Tx Ethernet device with respective driver
> + callback functions in ``rte_eth_recycle_mbufs``.
> +
> 
>  Removed Items
>  -------------
> diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h
> index 2c9d615fb5..c6723d5277 100644
> --- a/lib/ethdev/ethdev_driver.h
> +++ b/lib/ethdev/ethdev_driver.h
> @@ -59,6 +59,10 @@ struct rte_eth_dev {
>          eth_rx_descriptor_status_t rx_descriptor_status;
>          /** Check the status of a Tx descriptor */
>          eth_tx_descriptor_status_t tx_descriptor_status;
> + /** Pointer to PMD transmit mbufs reuse function */
> + eth_recycle_tx_mbufs_reuse_t recycle_tx_mbufs_reuse;
> + /** Pointer to PMD receive descriptors refill function */
> + eth_recycle_rx_descriptors_refill_t recycle_rx_descriptors_refill;
> 
>          /**
>           * Device data that is shared between primary and secondary processes
> @@ -504,6 +508,10 @@ typedef void (*eth_rxq_info_get_t)(struct rte_eth_dev *dev,
>  typedef void (*eth_txq_info_get_t)(struct rte_eth_dev *dev,
>          uint16_t tx_queue_id, struct rte_eth_txq_info *qinfo);
> 
> +typedef void (*eth_recycle_rxq_info_get_t)(struct rte_eth_dev *dev,
> + uint16_t rx_queue_id,
> + struct rte_eth_recycle_rxq_info *recycle_rxq_info);
> +
>  typedef int (*eth_burst_mode_get_t)(struct rte_eth_dev *dev,
>          uint16_t queue_id, struct rte_eth_burst_mode *mode);
> 
> @@ -1247,6 +1255,8 @@ struct eth_dev_ops {
>          eth_rxq_info_get_t rxq_info_get;
>          /** Retrieve Tx queue information */
>          eth_txq_info_get_t txq_info_get;
> + /** Retrieve mbufs recycle Rx queue information */
> + eth_recycle_rxq_info_get_t recycle_rxq_info_get;
>          eth_burst_mode_get_t rx_burst_mode_get; /**< Get Rx burst mode */
>          eth_burst_mode_get_t tx_burst_mode_get; /**< Get Tx burst mode */
>          eth_fw_version_get_t fw_version_get; /**< Get firmware version */
> diff --git a/lib/ethdev/ethdev_private.c b/lib/ethdev/ethdev_private.c
> index 14ec8c6ccf..f8ab64f195 100644
> --- a/lib/ethdev/ethdev_private.c
> +++ b/lib/ethdev/ethdev_private.c
> @@ -277,6 +277,8 @@ eth_dev_fp_ops_setup(struct rte_eth_fp_ops *fpo,
>          fpo->rx_queue_count = dev->rx_queue_count;
>          fpo->rx_descriptor_status = dev->rx_descriptor_status;
>          fpo->tx_descriptor_status = dev->tx_descriptor_status;
> + fpo->recycle_tx_mbufs_reuse = dev->recycle_tx_mbufs_reuse;
> + fpo->recycle_rx_descriptors_refill = dev->recycle_rx_descriptors_refill;
> 
>          fpo->rxq.data = dev->data->rx_queues;
>          fpo->rxq.clbk = (void **)(uintptr_t)dev->post_rx_burst_cbs;
> diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
> index 4d03255683..7c27dcfea4 100644
> --- a/lib/ethdev/rte_ethdev.c
> +++ b/lib/ethdev/rte_ethdev.c
> @@ -5784,6 +5784,37 @@ rte_eth_tx_queue_info_get(uint16_t port_id, uint16_t queue_id,
>          return 0;
>  }
> 
> +int
> +rte_eth_recycle_rx_queue_info_get(uint16_t port_id, uint16_t queue_id,
> + struct rte_eth_recycle_rxq_info *recycle_rxq_info)
> +{
> + struct rte_eth_dev *dev;
> +
> + RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
> + dev = &rte_eth_devices[port_id];
> +
> + if (queue_id >= dev->data->nb_rx_queues) {
> + RTE_ETHDEV_LOG(ERR, "Invalid Rx queue_id=%u\n", queue_id);
> + return -EINVAL;
> + }
> +
> + if (dev->data->rx_queues == NULL ||
> + dev->data->rx_queues[queue_id] == NULL) {
> + RTE_ETHDEV_LOG(ERR,
> + "Rx queue %"PRIu16" of device with port_id=%"
> + PRIu16" has not been setup\n",
> + queue_id, port_id);
> + return -EINVAL;
> + }
> +
> + if (*dev->dev_ops->recycle_rxq_info_get == NULL)
> + return -ENOTSUP;
> +
> + dev->dev_ops->recycle_rxq_info_get(dev, queue_id, recycle_rxq_info);
> +
> + return 0;
> +}
> +
>  int
>  rte_eth_rx_burst_mode_get(uint16_t port_id, uint16_t queue_id,
>                            struct rte_eth_burst_mode *mode)
> diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h
> index 99fe9e238b..7434aa2483 100644
> --- a/lib/ethdev/rte_ethdev.h
> +++ b/lib/ethdev/rte_ethdev.h
> @@ -1820,6 +1820,30 @@ struct rte_eth_txq_info {
>          uint8_t queue_state; /**< one of RTE_ETH_QUEUE_STATE_*. */
>  } __rte_cache_min_aligned;
> 
> +/**
> + * @warning
> + * @b EXPERIMENTAL: this structure may change without prior notice.
> + *
> + * Ethernet device Rx queue information structure for recycling mbufs.
> + * Used to retrieve Rx queue information when Tx queue reusing mbufs and moving
> + * them into Rx mbuf ring.
> + */
> +struct rte_eth_recycle_rxq_info {
> + struct rte_mbuf **mbuf_ring; /**< mbuf ring of Rx queue. */
> + struct rte_mempool *mp; /**< mempool of Rx queue. */
> + uint16_t *refill_head; /**< head of Rx queue refilling mbufs. */
> + uint16_t *receive_tail; /**< tail of Rx queue receiving pkts. */
> + uint16_t mbuf_ring_size; /**< configured number of mbuf ring size. */
> + /**
> + * Requirement on mbuf refilling batch size of Rx mbuf ring.
> + * For some PMD drivers, the number of Rx mbuf ring refilling mbufs
> + * should be aligned with mbuf ring size, in order to simplify
> + * ring wrapping around.
> + * Value 0 means that PMD drivers have no requirement for this.
> + */
> + uint16_t refill_requirement;
> +} __rte_cache_min_aligned;
> +
>  /* Generic Burst mode flag definition, values can be ORed. */
> 
>  /**
> @@ -4809,6 +4833,31 @@ int rte_eth_rx_queue_info_get(uint16_t port_id, uint16_t queue_id,
>  int rte_eth_tx_queue_info_get(uint16_t port_id, uint16_t queue_id,
>          struct rte_eth_txq_info *qinfo);
> 
> +/**
> + * @warning
> + * @b EXPERIMENTAL: this API may change, or be removed, without prior notice
> + *
> + * Retrieve information about given ports's Rx queue for recycling mbufs.
> + *
> + * @param port_id
> + * The port identifier of the Ethernet device.
> + * @param queue_id
> + * The Rx queue on the Ethernet devicefor which information
> + * will be retrieved.
> + * @param recycle_rxq_info
> + * A pointer to a structure of type *rte_eth_recycle_rxq_info* to be filled.
> + *
> + * @return
> + * - 0: Success
> + * - -ENODEV: If *port_id* is invalid.
> + * - -ENOTSUP: routine is not supported by the device PMD.
> + * - -EINVAL: The queue_id is out of range.
> + */
> +__rte_experimental
> +int rte_eth_recycle_rx_queue_info_get(uint16_t port_id,
> + uint16_t queue_id,
> + struct rte_eth_recycle_rxq_info *recycle_rxq_info);
> +
>  /**
>   * Retrieve information about the Rx packet burst mode.
>   *
> @@ -6483,6 +6532,139 @@ 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
> + *
> + * Recycle used mbufs from a transmit queue of an Ethernet device, and move
> + * these mbufs into a mbuf ring for a receive queue of an Ethernet device.
> + * This can bypass mempool path to save CPU cycles.
> + *
> + * The rte_eth_recycle_mbufs() function loops, with rte_eth_rx_burst() and
> + * rte_eth_tx_burst() functions, freeing Tx used mbufs and replenishing Rx
> + * descriptors. The number of recycling mbufs depends on the request of Rx mbuf
> + * ring, with the constraint of enough used mbufs from Tx mbuf ring.
> + *
> + * For each recycling mbufs, the rte_eth_recycle_mbufs() function performs the
> + * following operations:
> + *
> + * - Copy used *rte_mbuf* buffer pointers from Tx mbuf ring into Rx mbuf ring.
> + *
> + * - Replenish the Rx descriptors with the recycling *rte_mbuf* mbufs freed
> + * from the Tx mbuf ring.
> + *
> + * This function spilts Rx and Tx path with different callback functions. The
> + * callback function recycle_tx_mbufs_reuse is for Tx driver. The callback
> + * function recycle_rx_descriptors_refill is for Rx driver. rte_eth_recycle_mbufs()
> + * can support the case that Rx Ethernet device is different from Tx Ethernet device.
> + *
> + * It is the responsibility of users to select the Rx/Tx queue pair to recycle
> + * mbufs. Before call this function, users must call rte_eth_recycle_rxq_info_get
> + * function to retrieve selected Rx queue information.
> + * @see rte_eth_recycle_rxq_info_get, struct rte_eth_recycle_rxq_info
> + *
> + * Currently, the rte_eth_recycle_mbufs() function can only support one-time pairing
> + * between the receive queue and transmit queue. Do not pair one receive queue with
> + * multiple transmit queues or pair one transmit queue with multiple receive queues,
> + * in order to avoid memory error rewriting.
> Probably I am missing something, but why it is not possible to do something like that:
> 
> rte_eth_recycle_mbufs(rx_port_id=X, rx_queue_id=Y, tx_port_id=N, tx_queue_id=M, ...);
> ....
> rte_eth_recycle_mbufs(rx_port_id=X, rx_queue_id=Y, tx_port_id=N, tx_queue_id=K, ...);
> 
> I.E. feed rx queue from 2 tx queues?
> 
> Two problems for this:
> 1. If we have 2 tx queues for rx, the thread should make the extra judgement to
> decide which one to choose in the driver layer.

Not sure, why on the driver layer?
The example I gave above - decision is made on application layer.
Lets say first call didn't free enough mbufs, so app decided to use second txq for rearm.

> On the other hand, current mechanism can support users to switch 1 txq to another timely
> in the application layer. If user want to choose another txq, he just need to change the txq_queue_id parameter
> in the API.
> 2. If you want one rxq to support two txq at the same time, this needs to add spinlock on guard variable to
> avoid multi-thread conflict. Spinlock will decrease the data-path performance greatly.  Thus, we do not consider
> 1 rxq mapping multiple txqs here.
 
I am talking about situation when one thread controls 2 tx queues.

> + *
> + * @param rx_port_id
> + * Port identifying the receive side.
> + * @param rx_queue_id
> + * The index of the receive queue identifying the receive side.
> + * The value must be in the range [0, nb_rx_queue - 1] previously supplied
> + * to rte_eth_dev_configure().
> + * @param tx_port_id
> + * Port identifying the transmit side.
> + * @param tx_queue_id
> + * The index of the transmit queue identifying the transmit side.
> + * The value must be in the range [0, nb_tx_queue - 1] previously supplied
> + * to rte_eth_dev_configure().
> + * @param recycle_rxq_info
> + * A pointer to a structure of type *rte_eth_recycle_rxq_info* which contains
> + * the information of the Rx queue mbuf ring.
> + * @return
> + * The number of recycling mbufs.
> + */
> +__rte_experimental
> +static inline uint16_t
> +rte_eth_recycle_mbufs(uint16_t rx_port_id, uint16_t rx_queue_id,
> + uint16_t tx_port_id, uint16_t tx_queue_id,
> + struct rte_eth_recycle_rxq_info *recycle_rxq_info)
> +{
> + struct rte_eth_fp_ops *p;
> + void *qd;
> + uint16_t nb_mbufs;
> +
> +#ifdef RTE_ETHDEV_DEBUG_TX
> + if (tx_port_id >= RTE_MAX_ETHPORTS ||
> + tx_queue_id >= RTE_MAX_QUEUES_PER_PORT) {
> + RTE_ETHDEV_LOG(ERR,
> + "Invalid tx_port_id=%u or tx_queue_id=%u\n",
> + tx_port_id, tx_queue_id);
> + return 0;
> + }
> +#endif
> +
> + /* fetch pointer to queue data */
> + p = &rte_eth_fp_ops[tx_port_id];
> + qd = p->txq.data[tx_queue_id];
> +
> +#ifdef RTE_ETHDEV_DEBUG_TX
> + RTE_ETH_VALID_PORTID_OR_ERR_RET(tx_port_id, 0);
> +
> + if (qd == NULL) {
> + RTE_ETHDEV_LOG(ERR, "Invalid Tx queue_id=%u for port_id=%u\n",
> + tx_queue_id, tx_port_id);
> + return 0;
> + }
> +#endif
> + if (p->recycle_tx_mbufs_reuse == NULL)
> + return 0;
> +
> + /* Copy used *rte_mbuf* buffer pointers from Tx mbuf ring
> + * into Rx mbuf ring.
> + */
> + nb_mbufs = p->recycle_tx_mbufs_reuse(qd, recycle_rxq_info);
> +
> + /* If no recycling mbufs, return 0. */
> + if (nb_mbufs == 0)
> + return 0;
> +
> +#ifdef RTE_ETHDEV_DEBUG_RX
> + if (rx_port_id >= RTE_MAX_ETHPORTS ||
> + rx_queue_id >= RTE_MAX_QUEUES_PER_PORT) {
> + RTE_ETHDEV_LOG(ERR, "Invalid rx_port_id=%u or rx_queue_id=%u\n",
> + rx_port_id, rx_queue_id);
> + return 0;
> + }
> +#endif
> +
> + /* fetch pointer to queue data */
> + p = &rte_eth_fp_ops[rx_port_id];
> + qd = p->rxq.data[rx_queue_id];
> +
> +#ifdef RTE_ETHDEV_DEBUG_RX
> + RTE_ETH_VALID_PORTID_OR_ERR_RET(rx_port_id, 0);
> +
> + if (qd == NULL) {
> + RTE_ETHDEV_LOG(ERR, "Invalid Rx queue_id=%u for port_id=%u\n",
> + rx_queue_id, rx_port_id);
> + return 0;
> + }
> +#endif
> +
> + if (p->recycle_rx_descriptors_refill == NULL)
> + return 0;
> +
> + /* Replenish the Rx descriptors with the recycling
> + * into Rx mbuf ring.
> + */
> + p->recycle_rx_descriptors_refill(qd, nb_mbufs);
> +
> + return nb_mbufs;
> +}
> +
>  /**
>   * @warning
>   * @b EXPERIMENTAL: this API may change without prior notice
> diff --git a/lib/ethdev/rte_ethdev_core.h b/lib/ethdev/rte_ethdev_core.h
> index dcf8adab92..a2e6ea6b6c 100644
> --- a/lib/ethdev/rte_ethdev_core.h
> +++ b/lib/ethdev/rte_ethdev_core.h
> @@ -56,6 +56,13 @@ typedef int (*eth_rx_descriptor_status_t)(void *rxq, uint16_t offset);
>  /** @internal Check the status of a Tx descriptor */
>  typedef int (*eth_tx_descriptor_status_t)(void *txq, uint16_t offset);
> 
> +/** @internal Copy used mbufs from Tx mbuf ring into Rx mbuf ring */
> +typedef uint16_t (*eth_recycle_tx_mbufs_reuse_t)(void *txq,
> + struct rte_eth_recycle_rxq_info *recycle_rxq_info);
> +
> +/** @internal Refill Rx descriptors with the recycling mbufs */
> +typedef void (*eth_recycle_rx_descriptors_refill_t)(void *rxq, uint16_t nb);
> +
>  /**
>   * @internal
>   * Structure used to hold opaque pointers to internal ethdev Rx/Tx
> @@ -90,9 +97,11 @@ struct rte_eth_fp_ops {
>          eth_rx_queue_count_t rx_queue_count;
>          /** Check the status of a Rx descriptor. */
>          eth_rx_descriptor_status_t rx_descriptor_status;
> + /** Refill Rx descriptors with the recycling mbufs. */
> + eth_recycle_rx_descriptors_refill_t recycle_rx_descriptors_refill;
> I am afraid we can't put new fields here without ABI breakage.
> 
> Agree
> 
> It has to be below rxq.
> Now thinking about current layout probably not the best one,
> and when introducing this struct, I should probably put rxq either
> on the top of the struct, or on the next cache line.
> But such change is not possible right now anyway.
> Same story for txq.
> 
> Thus we should rearrange the structure like below:
> struct rte_eth_fp_ops {
>     struct rte_ethdev_qdata rxq;
>          eth_rx_burst_t rx_pkt_burst;
>          eth_rx_queue_count_t rx_queue_count;
>          eth_rx_descriptor_status_t rx_descriptor_status;
>        eth_recycle_rx_descriptors_refill_t recycle_rx_descriptors_refill;
>               uintptr_t reserved1[2];
> }

Yes, I think such layout will be better.
The only problem here - we have to wait for 23.11 for that. 

> 
> 
>          /** Rx queues data. */
>          struct rte_ethdev_qdata rxq;
> - uintptr_t reserved1[3];
> + uintptr_t reserved1[2];
>          /**@}*/
> 
>          /**@{*/
> @@ -106,9 +115,11 @@ struct rte_eth_fp_ops {
>          eth_tx_prep_t tx_pkt_prepare;
>          /** Check the status of a Tx descriptor. */
>          eth_tx_descriptor_status_t tx_descriptor_status;
> + /** Copy used mbufs from Tx mbuf ring into Rx. */
> + eth_recycle_tx_mbufs_reuse_t recycle_tx_mbufs_reuse;
>          /** Tx queues data. */
>          struct rte_ethdev_qdata txq;
> - uintptr_t reserved2[3];
> + uintptr_t reserved2[2];
>          /**@}*/
> 
>  } __rte_cache_aligned;
> diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map
> index 357d1a88c0..45c417f6bd 100644
> --- a/lib/ethdev/version.map
> +++ b/lib/ethdev/version.map
> @@ -299,6 +299,10 @@ EXPERIMENTAL {
>          rte_flow_action_handle_query_update;
>          rte_flow_async_action_handle_query_update;
>          rte_flow_async_create_by_index;
> +
> + # added in 23.07
> + rte_eth_recycle_mbufs;
> + rte_eth_recycle_rx_queue_info_get;
>  };
> 
>  INTERNAL {
> --
> 2.25.1
>

^ permalink raw reply	[relevance 0%]

* RE: [PATCH v6 1/4] ethdev: add API for mbufs recycle mode
  @ 2023-06-06  2:55  1%       ` Feifei Wang
  2023-06-06  7:10  0%         ` Konstantin Ananyev
  0 siblings, 1 reply; 200+ results
From: Feifei Wang @ 2023-06-06  2:55 UTC (permalink / raw)
  To: Константин
	Ананьев,
	thomas, Ferruh Yigit, Andrew Rybchenko
  Cc: dev, nd, Honnappa Nagarahalli, Ruifeng Wang, nd

[-- Attachment #1: Type: text/plain, Size: 17652 bytes --]

Thanks for the comments.

From: Константин Ананьев <konstantin.v.ananyev@yandex.ru>
Sent: Monday, June 5, 2023 8:54 PM
To: Feifei Wang <Feifei.Wang2@arm.com>; thomas@monjalon.net; Ferruh Yigit <ferruh.yigit@amd.com>; Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Cc: dev@dpdk.org; nd <nd@arm.com>; Honnappa Nagarahalli <Honnappa.Nagarahalli@arm.com>; Ruifeng Wang <Ruifeng.Wang@arm.com>
Subject: Re: [PATCH v6 1/4] ethdev: add API for mbufs recycle mode



Hi Feifei,

few more comments from me, see below.

Add 'rte_eth_recycle_rx_queue_info_get' and 'rte_eth_recycle_mbufs'
APIs to recycle used mbufs from a transmit queue of an Ethernet device,
and move these mbufs into a mbuf ring for a receive queue of an Ethernet
device. This can bypass mempool 'put/get' operations hence saving CPU
cycles.

For each recycling mbufs, the rte_eth_recycle_mbufs() function performs
the following operations:
- Copy used *rte_mbuf* buffer pointers from Tx mbuf ring into Rx mbuf
ring.
- Replenish the Rx descriptors with the recycling *rte_mbuf* mbufs freed
from the Tx mbuf ring.

Suggested-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com<mailto:honnappa.nagarahalli@arm.com>>
Suggested-by: Ruifeng Wang <ruifeng.wang@arm.com<mailto:ruifeng.wang@arm.com>>
Signed-off-by: Feifei Wang <feifei.wang2@arm.com<mailto:feifei.wang2@arm.com>>
Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com<mailto:ruifeng.wang@arm.com>>
Reviewed-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com<mailto:honnappa.nagarahalli@arm.com>>
---
 doc/guides/rel_notes/release_23_07.rst | 7 +
 lib/ethdev/ethdev_driver.h | 10 ++
 lib/ethdev/ethdev_private.c | 2 +
 lib/ethdev/rte_ethdev.c | 31 +++++
 lib/ethdev/rte_ethdev.h | 182 +++++++++++++++++++++++++
 lib/ethdev/rte_ethdev_core.h | 15 +-
 lib/ethdev/version.map | 4 +
 7 files changed, 249 insertions(+), 2 deletions(-)

diff --git a/doc/guides/rel_notes/release_23_07.rst b/doc/guides/rel_notes/release_23_07.rst
index a9b1293689..f279036cb9 100644
--- a/doc/guides/rel_notes/release_23_07.rst
+++ b/doc/guides/rel_notes/release_23_07.rst
@@ -55,6 +55,13 @@ New Features
      Also, make sure to start the actual text at the margin.
      =======================================================

+* **Add mbufs recycling support. **
+ Added ``rte_eth_recycle_rx_queue_info_get`` and ``rte_eth_recycle_mbufs``
+ APIs which allow the user to copy used mbufs from the Tx mbuf ring
+ into the Rx mbuf ring. This feature supports the case that the Rx Ethernet
+ device is different from the Tx Ethernet device with respective driver
+ callback functions in ``rte_eth_recycle_mbufs``.
+

 Removed Items
 -------------
diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h
index 2c9d615fb5..c6723d5277 100644
--- a/lib/ethdev/ethdev_driver.h
+++ b/lib/ethdev/ethdev_driver.h
@@ -59,6 +59,10 @@ struct rte_eth_dev {
         eth_rx_descriptor_status_t rx_descriptor_status;
         /** Check the status of a Tx descriptor */
         eth_tx_descriptor_status_t tx_descriptor_status;
+ /** Pointer to PMD transmit mbufs reuse function */
+ eth_recycle_tx_mbufs_reuse_t recycle_tx_mbufs_reuse;
+ /** Pointer to PMD receive descriptors refill function */
+ eth_recycle_rx_descriptors_refill_t recycle_rx_descriptors_refill;

         /**
          * Device data that is shared between primary and secondary processes
@@ -504,6 +508,10 @@ typedef void (*eth_rxq_info_get_t)(struct rte_eth_dev *dev,
 typedef void (*eth_txq_info_get_t)(struct rte_eth_dev *dev,
         uint16_t tx_queue_id, struct rte_eth_txq_info *qinfo);

+typedef void (*eth_recycle_rxq_info_get_t)(struct rte_eth_dev *dev,
+ uint16_t rx_queue_id,
+ struct rte_eth_recycle_rxq_info *recycle_rxq_info);
+
 typedef int (*eth_burst_mode_get_t)(struct rte_eth_dev *dev,
         uint16_t queue_id, struct rte_eth_burst_mode *mode);

@@ -1247,6 +1255,8 @@ struct eth_dev_ops {
         eth_rxq_info_get_t rxq_info_get;
         /** Retrieve Tx queue information */
         eth_txq_info_get_t txq_info_get;
+ /** Retrieve mbufs recycle Rx queue information */
+ eth_recycle_rxq_info_get_t recycle_rxq_info_get;
         eth_burst_mode_get_t rx_burst_mode_get; /**< Get Rx burst mode */
         eth_burst_mode_get_t tx_burst_mode_get; /**< Get Tx burst mode */
         eth_fw_version_get_t fw_version_get; /**< Get firmware version */
diff --git a/lib/ethdev/ethdev_private.c b/lib/ethdev/ethdev_private.c
index 14ec8c6ccf..f8ab64f195 100644
--- a/lib/ethdev/ethdev_private.c
+++ b/lib/ethdev/ethdev_private.c
@@ -277,6 +277,8 @@ eth_dev_fp_ops_setup(struct rte_eth_fp_ops *fpo,
         fpo->rx_queue_count = dev->rx_queue_count;
         fpo->rx_descriptor_status = dev->rx_descriptor_status;
         fpo->tx_descriptor_status = dev->tx_descriptor_status;
+ fpo->recycle_tx_mbufs_reuse = dev->recycle_tx_mbufs_reuse;
+ fpo->recycle_rx_descriptors_refill = dev->recycle_rx_descriptors_refill;

         fpo->rxq.data = dev->data->rx_queues;
         fpo->rxq.clbk = (void **)(uintptr_t)dev->post_rx_burst_cbs;
diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
index 4d03255683..7c27dcfea4 100644
--- a/lib/ethdev/rte_ethdev.c
+++ b/lib/ethdev/rte_ethdev.c
@@ -5784,6 +5784,37 @@ rte_eth_tx_queue_info_get(uint16_t port_id, uint16_t queue_id,
         return 0;
 }

+int
+rte_eth_recycle_rx_queue_info_get(uint16_t port_id, uint16_t queue_id,
+ struct rte_eth_recycle_rxq_info *recycle_rxq_info)
+{
+ struct rte_eth_dev *dev;
+
+ RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
+ dev = &rte_eth_devices[port_id];
+
+ if (queue_id >= dev->data->nb_rx_queues) {
+ RTE_ETHDEV_LOG(ERR, "Invalid Rx queue_id=%u\n", queue_id);
+ return -EINVAL;
+ }
+
+ if (dev->data->rx_queues == NULL ||
+ dev->data->rx_queues[queue_id] == NULL) {
+ RTE_ETHDEV_LOG(ERR,
+ "Rx queue %"PRIu16" of device with port_id=%"
+ PRIu16" has not been setup\n",
+ queue_id, port_id);
+ return -EINVAL;
+ }
+
+ if (*dev->dev_ops->recycle_rxq_info_get == NULL)
+ return -ENOTSUP;
+
+ dev->dev_ops->recycle_rxq_info_get(dev, queue_id, recycle_rxq_info);
+
+ return 0;
+}
+
 int
 rte_eth_rx_burst_mode_get(uint16_t port_id, uint16_t queue_id,
                           struct rte_eth_burst_mode *mode)
diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h
index 99fe9e238b..7434aa2483 100644
--- a/lib/ethdev/rte_ethdev.h
+++ b/lib/ethdev/rte_ethdev.h
@@ -1820,6 +1820,30 @@ struct rte_eth_txq_info {
         uint8_t queue_state; /**< one of RTE_ETH_QUEUE_STATE_*. */
 } __rte_cache_min_aligned;

+/**
+ * @warning
+ * @b EXPERIMENTAL: this structure may change without prior notice.
+ *
+ * Ethernet device Rx queue information structure for recycling mbufs.
+ * Used to retrieve Rx queue information when Tx queue reusing mbufs and moving
+ * them into Rx mbuf ring.
+ */
+struct rte_eth_recycle_rxq_info {
+ struct rte_mbuf **mbuf_ring; /**< mbuf ring of Rx queue. */
+ struct rte_mempool *mp; /**< mempool of Rx queue. */
+ uint16_t *refill_head; /**< head of Rx queue refilling mbufs. */
+ uint16_t *receive_tail; /**< tail of Rx queue receiving pkts. */
+ uint16_t mbuf_ring_size; /**< configured number of mbuf ring size. */
+ /**
+ * Requirement on mbuf refilling batch size of Rx mbuf ring.
+ * For some PMD drivers, the number of Rx mbuf ring refilling mbufs
+ * should be aligned with mbuf ring size, in order to simplify
+ * ring wrapping around.
+ * Value 0 means that PMD drivers have no requirement for this.
+ */
+ uint16_t refill_requirement;
+} __rte_cache_min_aligned;
+
 /* Generic Burst mode flag definition, values can be ORed. */

 /**
@@ -4809,6 +4833,31 @@ int rte_eth_rx_queue_info_get(uint16_t port_id, uint16_t queue_id,
 int rte_eth_tx_queue_info_get(uint16_t port_id, uint16_t queue_id,
         struct rte_eth_txq_info *qinfo);

+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice
+ *
+ * Retrieve information about given ports's Rx queue for recycling mbufs.
+ *
+ * @param port_id
+ * The port identifier of the Ethernet device.
+ * @param queue_id
+ * The Rx queue on the Ethernet devicefor which information
+ * will be retrieved.
+ * @param recycle_rxq_info
+ * A pointer to a structure of type *rte_eth_recycle_rxq_info* to be filled.
+ *
+ * @return
+ * - 0: Success
+ * - -ENODEV: If *port_id* is invalid.
+ * - -ENOTSUP: routine is not supported by the device PMD.
+ * - -EINVAL: The queue_id is out of range.
+ */
+__rte_experimental
+int rte_eth_recycle_rx_queue_info_get(uint16_t port_id,
+ uint16_t queue_id,
+ struct rte_eth_recycle_rxq_info *recycle_rxq_info);
+
 /**
  * Retrieve information about the Rx packet burst mode.
  *
@@ -6483,6 +6532,139 @@ 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
+ *
+ * Recycle used mbufs from a transmit queue of an Ethernet device, and move
+ * these mbufs into a mbuf ring for a receive queue of an Ethernet device.
+ * This can bypass mempool path to save CPU cycles.
+ *
+ * The rte_eth_recycle_mbufs() function loops, with rte_eth_rx_burst() and
+ * rte_eth_tx_burst() functions, freeing Tx used mbufs and replenishing Rx
+ * descriptors. The number of recycling mbufs depends on the request of Rx mbuf
+ * ring, with the constraint of enough used mbufs from Tx mbuf ring.
+ *
+ * For each recycling mbufs, the rte_eth_recycle_mbufs() function performs the
+ * following operations:
+ *
+ * - Copy used *rte_mbuf* buffer pointers from Tx mbuf ring into Rx mbuf ring.
+ *
+ * - Replenish the Rx descriptors with the recycling *rte_mbuf* mbufs freed
+ * from the Tx mbuf ring.
+ *
+ * This function spilts Rx and Tx path with different callback functions. The
+ * callback function recycle_tx_mbufs_reuse is for Tx driver. The callback
+ * function recycle_rx_descriptors_refill is for Rx driver. rte_eth_recycle_mbufs()
+ * can support the case that Rx Ethernet device is different from Tx Ethernet device.
+ *
+ * It is the responsibility of users to select the Rx/Tx queue pair to recycle
+ * mbufs. Before call this function, users must call rte_eth_recycle_rxq_info_get
+ * function to retrieve selected Rx queue information.
+ * @see rte_eth_recycle_rxq_info_get, struct rte_eth_recycle_rxq_info
+ *
+ * Currently, the rte_eth_recycle_mbufs() function can only support one-time pairing
+ * between the receive queue and transmit queue. Do not pair one receive queue with
+ * multiple transmit queues or pair one transmit queue with multiple receive queues,
+ * in order to avoid memory error rewriting.
Probably I am missing something, but why it is not possible to do something like that:

rte_eth_recycle_mbufs(rx_port_id=X, rx_queue_id=Y, tx_port_id=N, tx_queue_id=M, ...);
....
rte_eth_recycle_mbufs(rx_port_id=X, rx_queue_id=Y, tx_port_id=N, tx_queue_id=K, ...);

I.E. feed rx queue from 2 tx queues?

Two problems for this:

  1.  If we have 2 tx queues for rx, the thread should make the extra judgement to

decide which one to choose in the driver layer.

On the other hand, current mechanism can support users to switch 1 txq to another timely

in the application layer. If user want to choose another txq, he just need to change the txq_queue_id parameter

in the API.

  1.  If you want one rxq to support two txq at the same time, this needs to add spinlock on guard variable to

avoid multi-thread conflict. Spinlock will decrease the data-path performance greatly.  Thus, we do not consider

1 rxq mapping multiple txqs here.

+ *
+ * @param rx_port_id
+ * Port identifying the receive side.
+ * @param rx_queue_id
+ * The index of the receive queue identifying the receive side.
+ * The value must be in the range [0, nb_rx_queue - 1] previously supplied
+ * to rte_eth_dev_configure().
+ * @param tx_port_id
+ * Port identifying the transmit side.
+ * @param tx_queue_id
+ * The index of the transmit queue identifying the transmit side.
+ * The value must be in the range [0, nb_tx_queue - 1] previously supplied
+ * to rte_eth_dev_configure().
+ * @param recycle_rxq_info
+ * A pointer to a structure of type *rte_eth_recycle_rxq_info* which contains
+ * the information of the Rx queue mbuf ring.
+ * @return
+ * The number of recycling mbufs.
+ */
+__rte_experimental
+static inline uint16_t
+rte_eth_recycle_mbufs(uint16_t rx_port_id, uint16_t rx_queue_id,
+ uint16_t tx_port_id, uint16_t tx_queue_id,
+ struct rte_eth_recycle_rxq_info *recycle_rxq_info)
+{
+ struct rte_eth_fp_ops *p;
+ void *qd;
+ uint16_t nb_mbufs;
+
+#ifdef RTE_ETHDEV_DEBUG_TX
+ if (tx_port_id >= RTE_MAX_ETHPORTS ||
+ tx_queue_id >= RTE_MAX_QUEUES_PER_PORT) {
+ RTE_ETHDEV_LOG(ERR,
+ "Invalid tx_port_id=%u or tx_queue_id=%u\n",
+ tx_port_id, tx_queue_id);
+ return 0;
+ }
+#endif
+
+ /* fetch pointer to queue data */
+ p = &rte_eth_fp_ops[tx_port_id];
+ qd = p->txq.data[tx_queue_id];
+
+#ifdef RTE_ETHDEV_DEBUG_TX
+ RTE_ETH_VALID_PORTID_OR_ERR_RET(tx_port_id, 0);
+
+ if (qd == NULL) {
+ RTE_ETHDEV_LOG(ERR, "Invalid Tx queue_id=%u for port_id=%u\n",
+ tx_queue_id, tx_port_id);
+ return 0;
+ }
+#endif
+ if (p->recycle_tx_mbufs_reuse == NULL)
+ return 0;
+
+ /* Copy used *rte_mbuf* buffer pointers from Tx mbuf ring
+ * into Rx mbuf ring.
+ */
+ nb_mbufs = p->recycle_tx_mbufs_reuse(qd, recycle_rxq_info);
+
+ /* If no recycling mbufs, return 0. */
+ if (nb_mbufs == 0)
+ return 0;
+
+#ifdef RTE_ETHDEV_DEBUG_RX
+ if (rx_port_id >= RTE_MAX_ETHPORTS ||
+ rx_queue_id >= RTE_MAX_QUEUES_PER_PORT) {
+ RTE_ETHDEV_LOG(ERR, "Invalid rx_port_id=%u or rx_queue_id=%u\n",
+ rx_port_id, rx_queue_id);
+ return 0;
+ }
+#endif
+
+ /* fetch pointer to queue data */
+ p = &rte_eth_fp_ops[rx_port_id];
+ qd = p->rxq.data[rx_queue_id];
+
+#ifdef RTE_ETHDEV_DEBUG_RX
+ RTE_ETH_VALID_PORTID_OR_ERR_RET(rx_port_id, 0);
+
+ if (qd == NULL) {
+ RTE_ETHDEV_LOG(ERR, "Invalid Rx queue_id=%u for port_id=%u\n",
+ rx_queue_id, rx_port_id);
+ return 0;
+ }
+#endif
+
+ if (p->recycle_rx_descriptors_refill == NULL)
+ return 0;
+
+ /* Replenish the Rx descriptors with the recycling
+ * into Rx mbuf ring.
+ */
+ p->recycle_rx_descriptors_refill(qd, nb_mbufs);
+
+ return nb_mbufs;
+}
+
 /**
  * @warning
  * @b EXPERIMENTAL: this API may change without prior notice
diff --git a/lib/ethdev/rte_ethdev_core.h b/lib/ethdev/rte_ethdev_core.h
index dcf8adab92..a2e6ea6b6c 100644
--- a/lib/ethdev/rte_ethdev_core.h
+++ b/lib/ethdev/rte_ethdev_core.h
@@ -56,6 +56,13 @@ typedef int (*eth_rx_descriptor_status_t)(void *rxq, uint16_t offset);
 /** @internal Check the status of a Tx descriptor */
 typedef int (*eth_tx_descriptor_status_t)(void *txq, uint16_t offset);

+/** @internal Copy used mbufs from Tx mbuf ring into Rx mbuf ring */
+typedef uint16_t (*eth_recycle_tx_mbufs_reuse_t)(void *txq,
+ struct rte_eth_recycle_rxq_info *recycle_rxq_info);
+
+/** @internal Refill Rx descriptors with the recycling mbufs */
+typedef void (*eth_recycle_rx_descriptors_refill_t)(void *rxq, uint16_t nb);
+
 /**
  * @internal
  * Structure used to hold opaque pointers to internal ethdev Rx/Tx
@@ -90,9 +97,11 @@ struct rte_eth_fp_ops {
         eth_rx_queue_count_t rx_queue_count;
         /** Check the status of a Rx descriptor. */
         eth_rx_descriptor_status_t rx_descriptor_status;
+ /** Refill Rx descriptors with the recycling mbufs. */
+ eth_recycle_rx_descriptors_refill_t recycle_rx_descriptors_refill;
I am afraid we can't put new fields here without ABI breakage.

Agree

It has to be below rxq.
Now thinking about current layout probably not the best one,
and when introducing this struct, I should probably put rxq either
on the top of the struct, or on the next cache line.
But such change is not possible right now anyway.
Same story for txq.

Thus we should rearrange the structure like below:
struct rte_eth_fp_ops {
    struct rte_ethdev_qdata rxq;
         eth_rx_burst_t rx_pkt_burst;
         eth_rx_queue_count_t rx_queue_count;
         eth_rx_descriptor_status_t rx_descriptor_status;
       eth_recycle_rx_descriptors_refill_t recycle_rx_descriptors_refill;
              uintptr_t reserved1[2];
}



         /** Rx queues data. */
         struct rte_ethdev_qdata rxq;
- uintptr_t reserved1[3];
+ uintptr_t reserved1[2];
         /**@}*/

         /**@{*/
@@ -106,9 +115,11 @@ struct rte_eth_fp_ops {
         eth_tx_prep_t tx_pkt_prepare;
         /** Check the status of a Tx descriptor. */
         eth_tx_descriptor_status_t tx_descriptor_status;
+ /** Copy used mbufs from Tx mbuf ring into Rx. */
+ eth_recycle_tx_mbufs_reuse_t recycle_tx_mbufs_reuse;
         /** Tx queues data. */
         struct rte_ethdev_qdata txq;
- uintptr_t reserved2[3];
+ uintptr_t reserved2[2];
         /**@}*/

 } __rte_cache_aligned;
diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map
index 357d1a88c0..45c417f6bd 100644
--- a/lib/ethdev/version.map
+++ b/lib/ethdev/version.map
@@ -299,6 +299,10 @@ EXPERIMENTAL {
         rte_flow_action_handle_query_update;
         rte_flow_async_action_handle_query_update;
         rte_flow_async_create_by_index;
+
+ # added in 23.07
+ rte_eth_recycle_mbufs;
+ rte_eth_recycle_rx_queue_info_get;
 };

 INTERNAL {
--
2.25.1


[-- Attachment #2: Type: text/html, Size: 29050 bytes --]

^ permalink raw reply	[relevance 1%]

* RE: [PATCH v1 1/1] doc: announce change in bbdev api related to operation extension
  @ 2023-06-05 20:08  4%       ` Chautru, Nicolas
  2023-06-06  9:20  4%         ` David Marchand
  0 siblings, 1 reply; 200+ results
From: Chautru, Nicolas @ 2023-06-05 20:08 UTC (permalink / raw)
  To: Maxime Coquelin, Stephen Hemminger
  Cc: dev, Rix, Tom, hemant.agrawal, david.marchand, Vargas, Hernan

Hi Maxime, 

So basically the fft structure change is okay since these are still marked as rte_experimental (it got reported in the ABI report though). 

Wrt the MLD functions: these are new into the related serie but still the break the ABI since the struct rte_bbdev includes these functions hence causing offset changes.

Should I then just rephrase as:

+* bbdev: Will extend the API to support the new operation type
 +``RTE_BBDEV_OP_MLDTS`` as per
 +  this `v1
 +<https://patches.dpdk.org/project/dpdk/list/?series=28192>`. This
 +  will notably introduce
 +  new symbols for ``rte_bbdev_dequeue_mldts_ops``,
 +``rte_bbdev_enqueue_mldts_ops`` into the stuct rte_bbdev. 

Pasting below the ABI results for reference

  [C] 'function rte_bbdev* rte_bbdev_allocate(const char*)' at rte_bbdev.c:174:1 has some indirect sub-type changes:
    return type changed:
      in pointed to type 'struct rte_bbdev' at rte_bbdev.h:498:1:
        type size hasn't changed
        2 data member insertions:
          'rte_bbdev_enqueue_mldts_ops_t rte_bbdev::enqueue_mldts_ops', at offset 640 (in bits) at rte_bbdev.h:520:1
          'rte_bbdev_dequeue_mldts_ops_t rte_bbdev::dequeue_mldts_ops', at offset 704 (in bits) at rte_bbdev.h:522:1
        7 data member changes (9 filtered):
          type of 'rte_bbdev_dequeue_fft_ops_t rte_bbdev::dequeue_fft_ops' changed:
            underlying type 'typedef uint16_t (rte_bbdev_queue_data*, rte_bbdev_fft_op**, typedef uint16_t)*' changed:
              in pointed to type 'function type typedef uint16_t (rte_bbdev_queue_data*, rte_bbdev_fft_op**, typedef uint16_t)':
                parameter 2 of type 'rte_bbdev_fft_op**' has sub-type changes:
                  in pointed to type 'rte_bbdev_fft_op*':
                    in pointed to type 'struct rte_bbdev_fft_op' at rte_bbdev_op.h:978:1:
                      type size changed from 832 to 1664 (in bits)
                      1 data member change:
                        type of 'rte_bbdev_op_fft rte_bbdev_fft_op::fft' changed:
                          type size changed from 640 to 1472 (in bits)
                          6 data member insertions:
                            'rte_bbdev_op_data rte_bbdev_op_fft::dewindowing_input', at offset 256 (in bits) at rte_bbdev_op.h:771:1
                            'int8_t rte_bbdev_op_fft::freq_resample_mode', at offset 768 (in bits) at rte_bbdev_op.h:807:1
                            'uint16_t rte_bbdev_op_fft::output_depadded_size', at offset 784 (in bits) at rte_bbdev_op.h:809:1
                            'uint16_t rte_bbdev_op_fft::cs_theta_0[12]', at offset 800 (in bits) at rte_bbdev_op.h:811:1
                            'uint32_t rte_bbdev_op_fft::cs_theta_d[12]', at offset 992 (in bits) at rte_bbdev_op.h:813:1
                            'int8_t rte_bbdev_op_fft::time_offset[12]', at offset 1376 (in bits) at rte_bbdev_op.h:815:1
                          17 data member changes:
                            'rte_bbdev_op_data rte_bbdev_op_fft::power_meas_output' offset changed from 256 to 384 (in bits) (by +128 bits)
                            'uint32_t rte_bbdev_op_fft::op_flags' offset changed from 384 to 512 (in bits) (by +128 bits)
                            'uint16_t rte_bbdev_op_fft::input_sequence_size' offset changed from 416 to 544 (in bits) (by +128 bits)
                            'uint16_t rte_bbdev_op_fft::input_leading_padding' offset changed from 432 to 560 (in bits) (by +128 bits)
                            'uint16_t rte_bbdev_op_fft::output_sequence_size' offset changed from 448 to 576 (in bits) (by +128 bits)
                            'uint16_t rte_bbdev_op_fft::output_leading_depadding' offset changed from 464 to 592 (in bits) (by +128 bits)
                            'uint8_t rte_bbdev_op_fft::window_index[6]' offset changed from 480 to 608 (in bits) (by +128 bits)
                            'uint16_t rte_bbdev_op_fft::cs_bitmap' offset changed from 528 to 656 (in bits) (by +128 bits)
                            'uint8_t rte_bbdev_op_fft::num_antennas_log2' offset changed from 544 to 672 (in bits) (by +128 bits)
                            'uint8_t rte_bbdev_op_fft::idft_log2' offset changed from 552 to 680 (in bits) (by +128 bits)
                            'uint8_t rte_bbdev_op_fft::dft_log2' offset changed from 560 to 688 (in bits) (by +128 bits)
                            'int8_t rte_bbdev_op_fft::cs_time_adjustment' offset changed from 568 to 696 (in bits) (by +128 bits)
                            'int8_t rte_bbdev_op_fft::idft_shift' offset changed from 576 to 704 (in bits) (by +128 bits)
                            'int8_t rte_bbdev_op_fft::dft_shift' offset changed from 584 to 712 (in bits) (by +128 bits)
                            'uint16_t rte_bbdev_op_fft::ncs_reciprocal' offset changed from 592 to 720 (in bits) (by +128 bits)
                            'uint16_t rte_bbdev_op_fft::power_shift' offset changed from 608 to 736 (in bits) (by +128 bits)
                            'uint16_t rte_bbdev_op_fft::fp16_exp_adjust' offset changed from 624 to 752 (in bits) (by +128 bits)
          'const rte_bbdev_ops* rte_bbdev::dev_ops' offset changed from 640 to 768 (in bits) (by +128 bits)
          'rte_bbdev_data* rte_bbdev::data' offset changed from 704 to 832 (in bits) (by +128 bits)
          'rte_bbdev_state rte_bbdev::state' offset changed from 768 to 896 (in bits) (by +128 bits)
          'rte_device* rte_bbdev::device' offset changed from 832 to 960 (in bits) (by +128 bits)
          'rte_bbdev_cb_list rte_bbdev::list_cbs' offset changed from 896 to 1024 (in bits) (by +128 bits)
          'rte_intr_handle* rte_bbdev::intr_handle' offset changed from 1024 to 1152 (in bits) (by +128 bits)

Thanks
Nic

> -----Original Message-----
> From: Maxime Coquelin <maxime.coquelin@redhat.com>
> Sent: Monday, June 5, 2023 12:08 PM
> To: Stephen Hemminger <stephen@networkplumber.org>; Chautru, Nicolas
> <nicolas.chautru@intel.com>
> Cc: dev@dpdk.org; Rix, Tom <trix@redhat.com>; hemant.agrawal@nxp.com;
> david.marchand@redhat.com; Vargas, Hernan <hernan.vargas@intel.com>
> Subject: Re: [PATCH v1 1/1] doc: announce change in bbdev api related to
> operation extension
> 
> 
> 
> On 5/26/23 05:47, Stephen Hemminger wrote:
> > On Fri, 26 May 2023 02:11:32 +0000
> > Nicolas Chautru <nicolas.chautru@intel.com> wrote:
> >
> >> +
> >> +* bbdev: Will extend the API to support the new operation type
> >> +``RTE_BBDEV_OP_MLDTS`` as per
> >> +  this `v1
> >> +<https://patches.dpdk.org/project/dpdk/list/?series=28192>`. This
> >> +will also introduce
> >> +  new symbols for ``rte_bbdev_dequeue_mldts_ops``,
> >> +``rte_bbdev_enqueue_mldts_ops``,
> >> +  ``rte_bbdev_mldts_op_alloc_bulk`` and
> >> +``rte_bbdev_mldts_op_free_bulk``. This will also extend
> >> +  the API related to the FFT operation in ``rte_bbdev_op_fft``.
> >> --
> >
> > New symbols do not require a deprecation notice.
> > Only changes and removal.
> >
> I agree with Stephen.
> There is some changes in struct rte_bbdev_op_fft, but the related API are
> experimental, so I think it is not needed to have a deprecation notice.
> 
> Regards,
> Maxime


^ permalink raw reply	[relevance 4%]

* Re: [PATCH v1 1/1] bbdev: extend range of allocation function
  2023-06-02 14:17  3%     ` Chautru, Nicolas
@ 2023-06-05 19:08  3%       ` Maxime Coquelin
  0 siblings, 0 replies; 200+ results
From: Maxime Coquelin @ 2023-06-05 19:08 UTC (permalink / raw)
  To: Chautru, Nicolas, dev; +Cc: hemant.agrawal, Vargas, Hernan



On 6/2/23 16:17, Chautru, Nicolas wrote:
> Hi Maxime,
> I don't think it does since no offset position change for the symbol. Also this only extends the type, so still fine if using uin16_t from application.
> I did not receive an email from CICD related to ABI change when pushing this (unlike the other serie for the MLD/FFT changes pushed earlier this week).
> Still let me know if you would like this added as well into deprecation notice, but it doesn't look required.

If ABI checks are OK, then this is good to me.

Thanks,
Maxime

> Thanks
> Nic
> 
>> -----Original Message-----
>> From: Maxime Coquelin <maxime.coquelin@redhat.com>
>> Sent: Friday, June 2, 2023 12:56 AM
>> To: Chautru, Nicolas <nicolas.chautru@intel.com>; dev@dpdk.org
>> Cc: hemant.agrawal@nxp.com; Vargas, Hernan <hernan.vargas@intel.com>
>> Subject: Re: [PATCH v1 1/1] bbdev: extend range of allocation function
>>
>>
>>
>> On 6/2/23 04:04, Nicolas Chautru wrote:
>>> Realigning the argument to unsigned int to align with number support
>>> by underlying rte_mempool_get_bulk function.
>>>
>>> Signed-off-by: Nicolas Chautru <nicolas.chautru@intel.com>
>>> ---
>>>    lib/bbdev/rte_bbdev_op.h | 6 +++---
>>>    1 file changed, 3 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/lib/bbdev/rte_bbdev_op.h b/lib/bbdev/rte_bbdev_op.h index
>>> 96a390cd9b..9353fd588b 100644
>>> --- a/lib/bbdev/rte_bbdev_op.h
>>> +++ b/lib/bbdev/rte_bbdev_op.h
>>> @@ -982,7 +982,7 @@ rte_bbdev_op_pool_create(const char *name,
>> enum rte_bbdev_op_type type,
>>>     */
>>>    static inline int
>>>    rte_bbdev_enc_op_alloc_bulk(struct rte_mempool *mempool,
>>> -		struct rte_bbdev_enc_op **ops, uint16_t num_ops)
>>> +		struct rte_bbdev_enc_op **ops, unsigned int num_ops)
>>>    {
>>>    	struct rte_bbdev_op_pool_private *priv;
>>>
>>> @@ -1013,7 +1013,7 @@ rte_bbdev_enc_op_alloc_bulk(struct
>> rte_mempool *mempool,
>>>     */
>>>    static inline int
>>>    rte_bbdev_dec_op_alloc_bulk(struct rte_mempool *mempool,
>>> -		struct rte_bbdev_dec_op **ops, uint16_t num_ops)
>>> +		struct rte_bbdev_dec_op **ops, unsigned int num_ops)
>>>    {
>>>    	struct rte_bbdev_op_pool_private *priv;
>>
>> Isn't it breaking the ABI?
>>
>>> @@ -1045,7 +1045,7 @@ rte_bbdev_dec_op_alloc_bulk(struct
>> rte_mempool *mempool,
>>>    __rte_experimental
>>>    static inline int
>>>    rte_bbdev_fft_op_alloc_bulk(struct rte_mempool *mempool,
>>> -		struct rte_bbdev_fft_op **ops, uint16_t num_ops)
>>> +		struct rte_bbdev_fft_op **ops, unsigned int num_ops)
>>>    {
>>>    	struct rte_bbdev_op_pool_private *priv;
>>>
> 


^ permalink raw reply	[relevance 3%]

* Re: [PATCH 1/5] ethdev: support setting and querying rss algorithm
  2023-06-02 20:19  0%       ` Ferruh Yigit
@ 2023-06-05 12:34  0%         ` Dongdong Liu
  0 siblings, 0 replies; 200+ results
From: Dongdong Liu @ 2023-06-05 12:34 UTC (permalink / raw)
  To: Ferruh Yigit, Thomas Monjalon, Jie Hai
  Cc: dev, andrew.rybchenko, reshma.pattan, stable, yisen.zhuang,
	david.marchand

Hi Ferruh

On 2023/6/3 4:19, Ferruh Yigit wrote:
> On 3/16/2023 1:16 PM, Dongdong Liu wrote:
>> Hi Thomas
>> On 2023/3/15 21:43, Thomas Monjalon wrote:
>>> 15/03/2023 12:00, Dongdong Liu:
>>>> From: Jie Hai <haijie1@huawei.com>
>>>> --- a/doc/guides/rel_notes/release_23_03.rst
>>>> +++ b/doc/guides/rel_notes/release_23_03.rst
>>>> -* No ABI change that would break compatibility with 22.11.
>>>> -
>>>> +* ethdev: Added "func" field to ``rte_eth_rss_conf`` structure for
>>>> RSS hash
>>>> +  algorithm.
>>>
>>> We cannot break ABI compatibility until 23.11.
>> Got it. Thank you for reminding.
>>
>
> Hi Dongdong,
>
> Please remember to send a deprecation notice for this release.
> Deprecation notice should be merged in this release so that it can be
> applied in v23.11
Thanks for pointing that.
Will do.

Thanks,
Dongdong
>
>
>> [PATCH 3/5] and [PATCH 4/5] do not relate with this ABI compatibility.
>> I will send them separately.
>>
>> Thanks,
>> Dongdong
>>>
>>>
>>>
>>> .
>>>
>
> .
>

^ permalink raw reply	[relevance 0%]

* Re: [PATCH 1/5] ethdev: support setting and querying rss algorithm
  @ 2023-06-02 20:19  0%       ` Ferruh Yigit
  2023-06-05 12:34  0%         ` Dongdong Liu
  0 siblings, 1 reply; 200+ results
From: Ferruh Yigit @ 2023-06-02 20:19 UTC (permalink / raw)
  To: Dongdong Liu, Thomas Monjalon, Jie Hai
  Cc: dev, andrew.rybchenko, reshma.pattan, stable, yisen.zhuang,
	david.marchand

On 3/16/2023 1:16 PM, Dongdong Liu wrote:
> Hi Thomas
> On 2023/3/15 21:43, Thomas Monjalon wrote:
>> 15/03/2023 12:00, Dongdong Liu:
>>> From: Jie Hai <haijie1@huawei.com>
>>> --- a/doc/guides/rel_notes/release_23_03.rst
>>> +++ b/doc/guides/rel_notes/release_23_03.rst
>>> -* No ABI change that would break compatibility with 22.11.
>>> -
>>> +* ethdev: Added "func" field to ``rte_eth_rss_conf`` structure for
>>> RSS hash
>>> +  algorithm.
>>
>> We cannot break ABI compatibility until 23.11.
> Got it. Thank you for reminding.
> 

Hi Dongdong,

Please remember to send a deprecation notice for this release.
Deprecation notice should be merged in this release so that it can be
applied in v23.11


> [PATCH 3/5] and [PATCH 4/5] do not relate with this ABI compatibility.
> I will send them separately.
> 
> Thanks,
> Dongdong
>>
>>
>>
>> .
>>


^ permalink raw reply	[relevance 0%]

* Re: [PATCH v4] net/bonding: replace master/slave to main/member
  @ 2023-06-02 15:05  0%     ` Ferruh Yigit
  0 siblings, 0 replies; 200+ results
From: Ferruh Yigit @ 2023-06-02 15:05 UTC (permalink / raw)
  To: Stephen Hemminger, Chaoyong He
  Cc: dev, oss-drivers, niklas.soderlund, Long Wu, James Hershaw

On 5/18/2023 4:39 PM, Stephen Hemminger wrote:
> On Thu, 18 May 2023 16:44:58 +0800
> Chaoyong He <chaoyong.he@corigine.com> wrote:
> 
>> From: Long Wu <long.wu@corigine.com>
>>
>> This patch replaces the usage of the word 'master/slave' with more
>> appropriate word 'main/member' in bonding PMD as well as in its docs
>> and examples. Also the test app and testpmd were modified to use the
>> new wording.
>>
>> The bonding PMD's public API was modified according to the changes
>> in word:
>> rte_eth_bond_8023ad_slave_info is now called
>> rte_eth_bond_8023ad_member_info,
>> rte_eth_bond_active_slaves_get is now called
>> rte_eth_bond_active_members_get,
>> rte_eth_bond_slave_add is now called
>> rte_eth_bond_member_add,
>> rte_eth_bond_slave_remove is now called
>> rte_eth_bond_member_remove,
>> rte_eth_bond_slaves_get is now called
>> rte_eth_bond_members_get.
>>
>> Also the macro RTE_ETH_DEV_BONDED_SLAVE was renamed to
>> RTE_ETH_DEV_BONDED_MEMBER.
>>
>> Mark the old visible API's as deprecated and remove
>> from the ABI.
>>
>> Signed-off-by: Long Wu <long.wu@corigine.com>
>> Acked-by: Niklas Söderlund <niklas.soderlund@corigine.com>
>> Reviewed-by: James Hershaw <james.hershaw@corigine.com>
> 
> Since this will be ABI change it will have to wait for 23.11 release.
> Could you make a deprecation notice now, to foreshadow that change?
> 
> Acked-by: Stephen Hemminger <stephen@networkplumber.org>
>

For reference, deprecation notice is:
https://patches.dpdk.org/project/dpdk/patch/20230519063334.1645933-1-chaoyong.he@corigine.com/


Deferring the patch to v23.11 release.

^ permalink raw reply	[relevance 0%]

* RE: [PATCH v1 1/1] bbdev: extend range of allocation function
  2023-06-02  7:56  3%   ` Maxime Coquelin
@ 2023-06-02 14:17  3%     ` Chautru, Nicolas
  2023-06-05 19:08  3%       ` Maxime Coquelin
  0 siblings, 1 reply; 200+ results
From: Chautru, Nicolas @ 2023-06-02 14:17 UTC (permalink / raw)
  To: Maxime Coquelin, dev; +Cc: hemant.agrawal, Vargas, Hernan

Hi Maxime, 
I don't think it does since no offset position change for the symbol. Also this only extends the type, so still fine if using uin16_t from application.
I did not receive an email from CICD related to ABI change when pushing this (unlike the other serie for the MLD/FFT changes pushed earlier this week).
Still let me know if you would like this added as well into deprecation notice, but it doesn't look required.
Thanks
Nic

> -----Original Message-----
> From: Maxime Coquelin <maxime.coquelin@redhat.com>
> Sent: Friday, June 2, 2023 12:56 AM
> To: Chautru, Nicolas <nicolas.chautru@intel.com>; dev@dpdk.org
> Cc: hemant.agrawal@nxp.com; Vargas, Hernan <hernan.vargas@intel.com>
> Subject: Re: [PATCH v1 1/1] bbdev: extend range of allocation function
> 
> 
> 
> On 6/2/23 04:04, Nicolas Chautru wrote:
> > Realigning the argument to unsigned int to align with number support
> > by underlying rte_mempool_get_bulk function.
> >
> > Signed-off-by: Nicolas Chautru <nicolas.chautru@intel.com>
> > ---
> >   lib/bbdev/rte_bbdev_op.h | 6 +++---
> >   1 file changed, 3 insertions(+), 3 deletions(-)
> >
> > diff --git a/lib/bbdev/rte_bbdev_op.h b/lib/bbdev/rte_bbdev_op.h index
> > 96a390cd9b..9353fd588b 100644
> > --- a/lib/bbdev/rte_bbdev_op.h
> > +++ b/lib/bbdev/rte_bbdev_op.h
> > @@ -982,7 +982,7 @@ rte_bbdev_op_pool_create(const char *name,
> enum rte_bbdev_op_type type,
> >    */
> >   static inline int
> >   rte_bbdev_enc_op_alloc_bulk(struct rte_mempool *mempool,
> > -		struct rte_bbdev_enc_op **ops, uint16_t num_ops)
> > +		struct rte_bbdev_enc_op **ops, unsigned int num_ops)
> >   {
> >   	struct rte_bbdev_op_pool_private *priv;
> >
> > @@ -1013,7 +1013,7 @@ rte_bbdev_enc_op_alloc_bulk(struct
> rte_mempool *mempool,
> >    */
> >   static inline int
> >   rte_bbdev_dec_op_alloc_bulk(struct rte_mempool *mempool,
> > -		struct rte_bbdev_dec_op **ops, uint16_t num_ops)
> > +		struct rte_bbdev_dec_op **ops, unsigned int num_ops)
> >   {
> >   	struct rte_bbdev_op_pool_private *priv;
> 
> Isn't it breaking the ABI?
> 
> > @@ -1045,7 +1045,7 @@ rte_bbdev_dec_op_alloc_bulk(struct
> rte_mempool *mempool,
> >   __rte_experimental
> >   static inline int
> >   rte_bbdev_fft_op_alloc_bulk(struct rte_mempool *mempool,
> > -		struct rte_bbdev_fft_op **ops, uint16_t num_ops)
> > +		struct rte_bbdev_fft_op **ops, unsigned int num_ops)
> >   {
> >   	struct rte_bbdev_op_pool_private *priv;
> >


^ permalink raw reply	[relevance 3%]

* Re: [PATCH v1 1/1] bbdev: extend range of allocation function
  @ 2023-06-02  7:56  3%   ` Maxime Coquelin
  2023-06-02 14:17  3%     ` Chautru, Nicolas
  0 siblings, 1 reply; 200+ results
From: Maxime Coquelin @ 2023-06-02  7:56 UTC (permalink / raw)
  To: Nicolas Chautru, dev; +Cc: hemant.agrawal, hernan.vargas



On 6/2/23 04:04, Nicolas Chautru wrote:
> Realigning the argument to unsigned int to
> align with number support by underlying
> rte_mempool_get_bulk function.
> 
> Signed-off-by: Nicolas Chautru <nicolas.chautru@intel.com>
> ---
>   lib/bbdev/rte_bbdev_op.h | 6 +++---
>   1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/lib/bbdev/rte_bbdev_op.h b/lib/bbdev/rte_bbdev_op.h
> index 96a390cd9b..9353fd588b 100644
> --- a/lib/bbdev/rte_bbdev_op.h
> +++ b/lib/bbdev/rte_bbdev_op.h
> @@ -982,7 +982,7 @@ rte_bbdev_op_pool_create(const char *name, enum rte_bbdev_op_type type,
>    */
>   static inline int
>   rte_bbdev_enc_op_alloc_bulk(struct rte_mempool *mempool,
> -		struct rte_bbdev_enc_op **ops, uint16_t num_ops)
> +		struct rte_bbdev_enc_op **ops, unsigned int num_ops)
>   {
>   	struct rte_bbdev_op_pool_private *priv;
>   
> @@ -1013,7 +1013,7 @@ rte_bbdev_enc_op_alloc_bulk(struct rte_mempool *mempool,
>    */
>   static inline int
>   rte_bbdev_dec_op_alloc_bulk(struct rte_mempool *mempool,
> -		struct rte_bbdev_dec_op **ops, uint16_t num_ops)
> +		struct rte_bbdev_dec_op **ops, unsigned int num_ops)
>   {
>   	struct rte_bbdev_op_pool_private *priv;

Isn't it breaking the ABI?

> @@ -1045,7 +1045,7 @@ rte_bbdev_dec_op_alloc_bulk(struct rte_mempool *mempool,
>   __rte_experimental
>   static inline int
>   rte_bbdev_fft_op_alloc_bulk(struct rte_mempool *mempool,
> -		struct rte_bbdev_fft_op **ops, uint16_t num_ops)
> +		struct rte_bbdev_fft_op **ops, unsigned int num_ops)
>   {
>   	struct rte_bbdev_op_pool_private *priv;
>   


^ permalink raw reply	[relevance 3%]

* Re: [PATCH v3 0/4] vhost: add device op to offload the interrupt kick
  2023-06-01 20:00  0% ` Maxime Coquelin
@ 2023-06-02  6:20  0%   ` Eelco Chaudron
  0 siblings, 0 replies; 200+ results
From: Eelco Chaudron @ 2023-06-02  6:20 UTC (permalink / raw)
  To: Maxime Coquelin; +Cc: chenbo.xia, david.marchand, dev



On 1 Jun 2023, at 22:00, Maxime Coquelin wrote:

> On 5/17/23 11:08, Eelco Chaudron wrote:
>> This series adds an operation callback which gets called every time the
>> library wants to call eventfd_write(). This eventfd_write() call could
>> result in a system call, which could potentially block the PMD thread.
>>
>> The callback function can decide whether it's ok to handle the
>> eventfd_write() now or have the newly introduced function,
>> rte_vhost_notify_guest(), called at a later time.
>>
>> This can be used by 3rd party applications, like OVS, to avoid system
>> calls being called as part of the PMD threads.
>>
>> v3:
>>      - Changed ABI compatibility code to no longer use a boolean
>>        to avoid having to disable specific GCC warnings.
>>      - Moved the fd check fix to a separate patch (patch 3/4).
>>      - Fixed some coding style issues.
>>
>> v2: - Used vhost_virtqueue->index to find index for operation.
>>      - Aligned function name to VDUSE RFC patchset.
>>      - Added error and offload statistics counter.
>>      - Mark new API as experimental.
>>      - Change the virtual queue spin lock to read/write spin lock.
>>      - Made shared counters atomic.
>>      - Add versioned rte_vhost_driver_callback_register() for
>>        ABI compliance.
>>
>> Eelco Chaudron (4):
>>        vhost: change vhost_virtqueue access lock to a read/write one
>>        vhost: make the guest_notifications statistic counter atomic
>>        vhost: fix invalid call FD handling
>>        vhost: add device op to offload the interrupt kick
>>
>>
>>   lib/eal/include/generic/rte_rwlock.h | 17 +++++
>>   lib/vhost/meson.build                |  2 +
>>   lib/vhost/rte_vhost.h                | 23 ++++++-
>>   lib/vhost/socket.c                   | 63 +++++++++++++++++--
>>   lib/vhost/version.map                |  9 +++
>>   lib/vhost/vhost.c                    | 92 +++++++++++++++++++++-------
>>   lib/vhost/vhost.h                    | 69 ++++++++++++++-------
>>   lib/vhost/vhost_user.c               | 14 ++---
>>   lib/vhost/virtio_net.c               | 90 +++++++++++++--------------
>>   9 files changed, 278 insertions(+), 101 deletions(-)
>>
>
>
> Applied to dpdk-next-virtio/main.

Thanks Maxime!

//Eelco


^ permalink raw reply	[relevance 0%]

* Re: [PATCH v3 0/4] vhost: add device op to offload the interrupt kick
  @ 2023-06-01 20:00  0% ` Maxime Coquelin
  2023-06-02  6:20  0%   ` Eelco Chaudron
  0 siblings, 1 reply; 200+ results
From: Maxime Coquelin @ 2023-06-01 20:00 UTC (permalink / raw)
  To: Eelco Chaudron, chenbo.xia, david.marchand; +Cc: dev



On 5/17/23 11:08, Eelco Chaudron wrote:
> This series adds an operation callback which gets called every time the
> library wants to call eventfd_write(). This eventfd_write() call could
> result in a system call, which could potentially block the PMD thread.
> 
> The callback function can decide whether it's ok to handle the
> eventfd_write() now or have the newly introduced function,
> rte_vhost_notify_guest(), called at a later time.
> 
> This can be used by 3rd party applications, like OVS, to avoid system
> calls being called as part of the PMD threads.
> 
> v3:
>      - Changed ABI compatibility code to no longer use a boolean
>        to avoid having to disable specific GCC warnings.
>      - Moved the fd check fix to a separate patch (patch 3/4).
>      - Fixed some coding style issues.
> 
> v2: - Used vhost_virtqueue->index to find index for operation.
>      - Aligned function name to VDUSE RFC patchset.
>      - Added error and offload statistics counter.
>      - Mark new API as experimental.
>      - Change the virtual queue spin lock to read/write spin lock.
>      - Made shared counters atomic.
>      - Add versioned rte_vhost_driver_callback_register() for
>        ABI compliance.
> 
> Eelco Chaudron (4):
>        vhost: change vhost_virtqueue access lock to a read/write one
>        vhost: make the guest_notifications statistic counter atomic
>        vhost: fix invalid call FD handling
>        vhost: add device op to offload the interrupt kick
> 
> 
>   lib/eal/include/generic/rte_rwlock.h | 17 +++++
>   lib/vhost/meson.build                |  2 +
>   lib/vhost/rte_vhost.h                | 23 ++++++-
>   lib/vhost/socket.c                   | 63 +++++++++++++++++--
>   lib/vhost/version.map                |  9 +++
>   lib/vhost/vhost.c                    | 92 +++++++++++++++++++++-------
>   lib/vhost/vhost.h                    | 69 ++++++++++++++-------
>   lib/vhost/vhost_user.c               | 14 ++---
>   lib/vhost/virtio_net.c               | 90 +++++++++++++--------------
>   9 files changed, 278 insertions(+), 101 deletions(-)
> 


Applied to dpdk-next-virtio/main.

Thanks,
Maxime


^ permalink raw reply	[relevance 0%]

* Re: [PATCH] common/sfc_efx/base: update fields name for MARK and FLAG actions
  2023-05-31  7:08  3% [PATCH] common/sfc_efx/base: update fields name for MARK and FLAG actions Artemii Morozov
@ 2023-06-01 15:43  0% ` Ferruh Yigit
  0 siblings, 0 replies; 200+ results
From: Ferruh Yigit @ 2023-06-01 15:43 UTC (permalink / raw)
  To: Artemii Morozov, dev; +Cc: Andy Moreton, Andrew Rybchenko

On 5/31/2023 8:08 AM, Artemii Morozov wrote:
> The MCDI headers have newer, but ABI-compatible field names for
> these actions.
> 
> Signed-off-by: Artemii Morozov <artemii.morozov@arknetworks.am>
> Reviewed-by: Andy Moreton <amoreton@xilinx.com>
>

Applied to dpdk-next-net/main, thanks.

^ permalink raw reply	[relevance 0%]

* Re: [PATCH v4 1/4] doc: announce new cpu flag added to rte_cpu_flag_t
  @ 2023-06-01  9:23  0%         ` David Marchand
  0 siblings, 0 replies; 200+ results
From: David Marchand @ 2023-06-01  9:23 UTC (permalink / raw)
  To: Bruce Richardson, Ferruh Yigit, Sivaprasad Tummala
  Cc: david.hunt, dev, Thomas Monjalon

On Tue, Apr 18, 2023 at 11:22 AM Bruce Richardson
<bruce.richardson@intel.com> wrote:
>
> On Tue, Apr 18, 2023 at 09:52:49AM +0100, Ferruh Yigit wrote:
> > On 4/18/2023 9:25 AM, Sivaprasad Tummala wrote:
> > > A new flag RTE_CPUFLAG_MONITORX is added to rte_cpu_flag_t in
> > > DPDK 23.07 release to support monitorx instruction on EPYC processors.
> > > This results in ABI breakage for legacy apps.
> > >
> > > Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
> > > ---
> > >  doc/guides/rel_notes/deprecation.rst | 3 +++
> > >  1 file changed, 3 insertions(+)
> > >
> > > diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
> > > index dcc1ca1696..831713983f 100644
> > > --- a/doc/guides/rel_notes/deprecation.rst
> > > +++ b/doc/guides/rel_notes/deprecation.rst
> > > @@ -163,3 +163,6 @@ Deprecation Notices
> > >    The new port library API (functions rte_swx_port_*)
> > >    will gradually transition from experimental to stable status
> > >    starting with DPDK 23.07 release.
> > > +
> > > +* eal/x86: The enum ``rte_cpu_flag_t`` will be extended with a new cpu flag
> > > +  ``RTE_CPUFLAG_MONITORX`` to support monitorx instruction on EPYC processors.

There is no need for announcing an addition.
The problem is moving/removing other elements of an enum.


> >
> >
> > OK to add new CPU flag,
> > Acked-by: Ferruh Yigit <ferruh.yigit@amd.com>
> >
> >
> > But @David, @Bruce, is it OK to break ABI whenever a new CPU flag is
> > added, should we hide CPU flags better?
> >
> > Or other option can be drop the 'RTE_CPUFLAG_NUMFLAGS' and allow
> > appending new flags to the end although this may lead enum become more
> > messy by time.
>
> +1 top drop the NUMFLAGS value. We should not break ABI each time we need a
> new flag.

+1.
So in 23.07 we need an announce for this removal to happen in 23.11.


-- 
David Marchand


^ permalink raw reply	[relevance 0%]

* RE: [PATCH 1/3] security: introduce out of place support for inline ingress
  2023-05-30 13:51  0%           ` Thomas Monjalon
@ 2023-05-31  9:26  5%             ` Morten Brørup
  0 siblings, 0 replies; 200+ results
From: Morten Brørup @ 2023-05-31  9:26 UTC (permalink / raw)
  To: Thomas Monjalon, Jerin Jacob
  Cc: Stephen Hemminger, Nithin Dabilpuram, Akhil Goyal, jerinj, dev,
	techboard

> From: Thomas Monjalon [mailto:thomas@monjalon.net]
> Sent: Tuesday, 30 May 2023 15.52
> 
> 30/05/2023 11:23, Jerin Jacob:
> > > > > > > +      */
> > > > > > > +     uint32_t ingress_oop : 1;
> > > > > > > +
> > > > > > >       /** Reserved bit fields for future extension
> > > > > > >        *
> > > > > > >        * User should ensure reserved_opts is cleared as it may
> change in
> > > > > > > @@ -282,7 +293,7 @@ struct rte_security_ipsec_sa_options {
> > > > > > >        *
> > > > > > >        * Note: Reduce number of bits in reserved_opts for every
> new option.
> > > > > > >        */
> > > > > > > -     uint32_t reserved_opts : 17;
> > > > > > > +     uint32_t reserved_opts : 16;
> > > > > > >  };
> > > > > >
> > > > > > NAK
> > > > > > Let me repeat the reserved bit rant. YAGNI
> > > > > >
> > > > > > Reserved space is not usable without ABI breakage unless the
> existing
> > > > > > code enforces that reserved space has to be zero.
> > > > > >
> > > > > > Just saying "User should ensure reserved_opts is cleared" is not
> enough.
> > > > >
> > > > > Yes. I think, we need to enforce to have _init functions for the
> > > > > structures which is using reserved filed.
> > > > >
> > > > > On the same note on YAGNI, I am wondering why NOT introduce
> > > > > RTE_NEXT_ABI marco kind of scheme to compile out ABI breaking changes.
> > > > > By keeping RTE_NEXT_ABI disable by default, enable explicitly if user
> > > > > wants it to avoid waiting for one year any ABI breaking changes.
> > > > > There are a lot of "fixed appliance" customers (not OS distribution
> > > > > driven customer) they are willing to recompile DPDK for new feature.
> > > > > What we are loosing with this scheme?
> > > >
> > > > RTE_NEXT_ABI is described in the ABI policy.
> > > > We are not doing it currently, but I think we could
> > > > when it is not too much complicate in the code.
> > > >
> > > > The only problems I see are:
> > > > - more #ifdef clutter
> > > > - 2 binary versions to test
> > > > - CI and checks must handle RTE_NEXT_ABI version
> > >
> > > I think, we have two buckets of ABI breakages via RTE_NEXT_ABI
> > >
> > > 1) Changes that introduces compilation failures like adding new
> > > argument to API or change API name etc
> > > 2) Structure size change which won't affect the compilation but breaks
> > > the ABI for shared library usage.
> > >
> > > I think, (1) is very distributive, and I don't see recently such
> > > changes. I think, we should avoid (1) for non XX.11 releases.(or two
> > > or three-year cycles if we decide that path)
> > >
> > > The (2) comes are very common due to the fact HW features are
> > > evolving. I think, to address the (2), we have two options
> > > a) Have reserved fields and have _init() function to initialize the
> structures

High probability that (a) is not going to work: There will not be enough reserved fields, and/or they will be in the wrong places in the structures.

Also, (a) is really intrusive on existing applications: They MUST be rewritten to call the _init() function instead of using pre-initialized structures, or the library will behave unexpectedly. Extreme example, to prove my point: A new field "allow_ingress" (don't drop all packets on ingress) is introduced, and _init() sets it to true. If the application doesn't call _init(), it will not receive any packets.

Are _init() functions required on all structures, or only some? And how about structures containing other structures?

How does the application developer know which structures have _init() functions, and which do not?

<irony>
We could also switch to C++, where the _init() function comes native in the form of an object constructor.
</irony>

> > > b) Follow YAGNI style and introduce RTE_NEXT_ABI for structure size
> change.

+1 for (b), because (a) is too problematic.

> > >
> > > The above concerns[1] can greatly reduce with option b OR option a.
> > >
> > > [1]
> > >  1) more #ifdef clutter
> > > For option (a) this is not needed or option (b) the clutter will be
> > > limited, it will be around structure which add the new filed and
> > > around the FULL block where new functions are added (not inside the
> > > functions)
> > >
> > > 2) 2 binary versions to test
> > > For option (a) this is not needed, for option (b) it is limited as for
> > > new features only one needs to test another binary (rather than NOT
> > > adding a new feature).
> > >
> > >  3) CI and checks must handle RTE_NEXT_ABI version
> > >
> > > I think, it is cheap to add this, at least for compilation test.
> > >
> > > IMO, We need to change the API break release to 3 year kind of time
> > > frame to have very good end user experience
> > > and allow ABI related change to get in every release and force
> > > _rebuild_ shared objects in major LTS release.
> > >
> > > I think, in this major LTS version(23.11) if we can decide (a) vs (b)
> > > then we can align the code accordingly . e.s.p for (a) we need to add
> > > _init() functions.
> > >
> > > Thoughts?
> >
> > Not much input from mailing list. Can we discuss this next TB meeting?
> > Especially how to align with next LTS release on
> > -YAGNI vs reserved fileds with init()

Whichever decision is made on this, remember to also consider if it has any consequences regarding older LTS versions and possibly backporting.

> > -What it takes to Extend the API breaking release more than a year as
> > first step.

Others might disagree, but in my personal opinion, DPDK is still evolving much too rapidly to lock down its ABI/API for more than one year. For reference, consider what has been changed within the last three years, i.e. since DPDK 20.05, and if those changes could have been done within the DPDK 20.05 ABI/API without requiring a substantial additional effort, and while still providing clean and understandable APIs (and not a bunch of weird hacks to shoehorn the new features into the existing APIs).

If you want continuity, use an LTS release. If we lock down the ABI/API for multiple years at a time, what is the point of the LTS releases?

PS: If we start using the RTE_NEXT_ABI concept more, we should remember to promote the additions with each ABI/API breaking release. And we should probably have a rule of thumb to choose between using RTE_NEXT_ABI and using "experimental" marking.

> 
> Yes I agree it should be discussed interactively in techboard meeting.

I'm unable to participate in today's techboard meeting, so I have provided my opinions in this email.

-Morten


^ permalink raw reply	[relevance 5%]

* [PATCH] common/sfc_efx/base: update fields name for MARK and FLAG actions
@ 2023-05-31  7:08  3% Artemii Morozov
  2023-06-01 15:43  0% ` Ferruh Yigit
  0 siblings, 1 reply; 200+ results
From: Artemii Morozov @ 2023-05-31  7:08 UTC (permalink / raw)
  To: dev; +Cc: Andy Moreton, Andrew Rybchenko

The MCDI headers have newer, but ABI-compatible field names for
these actions.

Signed-off-by: Artemii Morozov <artemii.morozov@arknetworks.am>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/common/sfc_efx/base/ef10_filter.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/common/sfc_efx/base/ef10_filter.c b/drivers/common/sfc_efx/base/ef10_filter.c
index 6d19797d16..d6940011c0 100644
--- a/drivers/common/sfc_efx/base/ef10_filter.c
+++ b/drivers/common/sfc_efx/base/ef10_filter.c
@@ -329,13 +329,13 @@ efx_mcdi_filter_op_add(
 		goto fail3;
 	}
 	if (spec->efs_flags & EFX_FILTER_FLAG_ACTION_MARK) {
-		MCDI_IN_SET_DWORD(req, FILTER_OP_V3_IN_MATCH_ACTION,
-		    MC_CMD_FILTER_OP_V3_IN_MATCH_ACTION_MARK);
+		MCDI_IN_SET_DWORD_FIELD(req, FILTER_OP_V3_IN_MATCH_ACTION_FLAGS,
+		    FILTER_OP_V3_IN_MATCH_SET_MARK, 1);
 		MCDI_IN_SET_DWORD(req, FILTER_OP_V3_IN_MATCH_MARK_VALUE,
 		    spec->efs_mark);
 	} else if (spec->efs_flags & EFX_FILTER_FLAG_ACTION_FLAG) {
-		MCDI_IN_SET_DWORD(req, FILTER_OP_V3_IN_MATCH_ACTION,
-		    MC_CMD_FILTER_OP_V3_IN_MATCH_ACTION_FLAG);
+		MCDI_IN_SET_DWORD_FIELD(req, FILTER_OP_V3_IN_MATCH_ACTION_FLAGS,
+		    FILTER_OP_V3_IN_MATCH_SET_FLAG, 1);
 	}
 
 	efx_mcdi_execute(enp, &req);
-- 
2.34.1


^ permalink raw reply	[relevance 3%]

* Re: [PATCH 1/3] security: introduce out of place support for inline ingress
  2023-05-30  9:23  0%         ` Jerin Jacob
@ 2023-05-30 13:51  0%           ` Thomas Monjalon
  2023-05-31  9:26  5%             ` Morten Brørup
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2023-05-30 13:51 UTC (permalink / raw)
  To: Jerin Jacob
  Cc: Stephen Hemminger, Nithin Dabilpuram, Akhil Goyal, jerinj, dev,
	Morten Brørup, techboard

30/05/2023 11:23, Jerin Jacob:
> > > > > > +      */
> > > > > > +     uint32_t ingress_oop : 1;
> > > > > > +
> > > > > >       /** Reserved bit fields for future extension
> > > > > >        *
> > > > > >        * User should ensure reserved_opts is cleared as it may change in
> > > > > > @@ -282,7 +293,7 @@ struct rte_security_ipsec_sa_options {
> > > > > >        *
> > > > > >        * Note: Reduce number of bits in reserved_opts for every new option.
> > > > > >        */
> > > > > > -     uint32_t reserved_opts : 17;
> > > > > > +     uint32_t reserved_opts : 16;
> > > > > >  };
> > > > >
> > > > > NAK
> > > > > Let me repeat the reserved bit rant. YAGNI
> > > > >
> > > > > Reserved space is not usable without ABI breakage unless the existing
> > > > > code enforces that reserved space has to be zero.
> > > > >
> > > > > Just saying "User should ensure reserved_opts is cleared" is not enough.
> > > >
> > > > Yes. I think, we need to enforce to have _init functions for the
> > > > structures which is using reserved filed.
> > > >
> > > > On the same note on YAGNI, I am wondering why NOT introduce
> > > > RTE_NEXT_ABI marco kind of scheme to compile out ABI breaking changes.
> > > > By keeping RTE_NEXT_ABI disable by default, enable explicitly if user
> > > > wants it to avoid waiting for one year any ABI breaking changes.
> > > > There are a lot of "fixed appliance" customers (not OS distribution
> > > > driven customer) they are willing to recompile DPDK for new feature.
> > > > What we are loosing with this scheme?
> > >
> > > RTE_NEXT_ABI is described in the ABI policy.
> > > We are not doing it currently, but I think we could
> > > when it is not too much complicate in the code.
> > >
> > > The only problems I see are:
> > > - more #ifdef clutter
> > > - 2 binary versions to test
> > > - CI and checks must handle RTE_NEXT_ABI version
> >
> > I think, we have two buckets of ABI breakages via RTE_NEXT_ABI
> >
> > 1) Changes that introduces compilation failures like adding new
> > argument to API or change API name etc
> > 2) Structure size change which won't affect the compilation but breaks
> > the ABI for shared library usage.
> >
> > I think, (1) is very distributive, and I don't see recently such
> > changes. I think, we should avoid (1) for non XX.11 releases.(or two
> > or three-year cycles if we decide that path)
> >
> > The (2) comes are very common due to the fact HW features are
> > evolving. I think, to address the (2), we have two options
> > a) Have reserved fields and have _init() function to initialize the structures
> > b) Follow YAGNI style and introduce RTE_NEXT_ABI for structure size change.
> >
> > The above concerns[1] can greatly reduce with option b OR option a.
> >
> > [1]
> >  1) more #ifdef clutter
> > For option (a) this is not needed or option (b) the clutter will be
> > limited, it will be around structure which add the new filed and
> > around the FULL block where new functions are added (not inside the
> > functions)
> >
> > 2) 2 binary versions to test
> > For option (a) this is not needed, for option (b) it is limited as for
> > new features only one needs to test another binary (rather than NOT
> > adding a new feature).
> >
> >  3) CI and checks must handle RTE_NEXT_ABI version
> >
> > I think, it is cheap to add this, at least for compilation test.
> >
> > IMO, We need to change the API break release to 3 year kind of time
> > frame to have very good end user experience
> > and allow ABI related change to get in every release and force
> > _rebuild_ shared objects in major LTS release.
> >
> > I think, in this major LTS version(23.11) if we can decide (a) vs (b)
> > then we can align the code accordingly . e.s.p for (a) we need to add
> > _init() functions.
> >
> > Thoughts?
> 
> Not much input from mailing list. Can we discuss this next TB meeting?
> Especially how to align with next LTS release on
> -YAGNI vs reserved fileds with init()
> -What it takes to Extend the API breaking release more than a year as
> first step.

Yes I agree it should be discussed interactively in techboard meeting.



^ permalink raw reply	[relevance 0%]

* Re: [PATCH v6 0/3] add telemetry cmds for ring
  @ 2023-05-30  9:27  0%   ` Jie Hai
  2023-07-04  9:04  3%   ` [PATCH v7 " Jie Hai
  1 sibling, 0 replies; 200+ results
From: Jie Hai @ 2023-05-30  9:27 UTC (permalink / raw)
  To: dev, thomas

Hi, Thomas and all maintainers,
Kindly ping for comments, thanks.

On 2023/5/9 17:24, Jie Hai wrote:
> This patch set supports telemetry cmd to list rings and dump information
> of a ring by its name.
> 
> v1->v2:
> 1. Add space after "switch".
> 2. Fix wrong strlen parameter.
> 
> v2->v3:
> 1. Remove prefix "rte_" for static function.
> 2. Add Acked-by Konstantin Ananyev for PATCH 1.
> 3. Introduce functions to return strings instead copy strings.
> 4. Check pointer to memzone of ring.
> 5. Remove redundant variable.
> 6. Hold lock when access ring data.
> 
> v3->v4:
> 1. Update changelog according to reviews of Honnappa Nagarahalli.
> 2. Add Reviewed-by Honnappa Nagarahalli.
> 3. Correct grammar in help information.
> 4. Correct spell warning on "te" reported by checkpatch.pl.
> 5. Use ring_walk() to query ring info instead of rte_ring_lookup().
> 6. Fix that type definition the flag field of rte_ring does not match the usage.
> 7. Use rte_tel_data_add_dict_uint_hex instead of rte_tel_data_add_dict_u64
>     for mask and flags.
> 
> v4->v5:
> 1. Add Acked-by Konstantin Ananyev and Chengwen Feng.
> 2. Add ABI change explanation for commit message of patch 1/3.
> 
> v5->v6:
> 1. Add Acked-by Morten Brørup.
> 2. Fix incorrect reference of commit.
> 
> Jie Hai (3):
>    ring: fix unmatched type definition and usage
>    ring: add telemetry cmd to list rings
>    ring: add telemetry cmd for ring info
> 
>   lib/ring/meson.build     |   1 +
>   lib/ring/rte_ring.c      | 139 +++++++++++++++++++++++++++++++++++++++
>   lib/ring/rte_ring_core.h |   2 +-
>   3 files changed, 141 insertions(+), 1 deletion(-)
> 

^ permalink raw reply	[relevance 0%]

* Re: [PATCH 1/3] security: introduce out of place support for inline ingress
  @ 2023-05-30  9:23  0%         ` Jerin Jacob
  2023-05-30 13:51  0%           ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Jerin Jacob @ 2023-05-30  9:23 UTC (permalink / raw)
  To: Thomas Monjalon
  Cc: Stephen Hemminger, Nithin Dabilpuram, Akhil Goyal, jerinj, dev,
	Morten Brørup, techboard

> > > > > +      */
> > > > > +     uint32_t ingress_oop : 1;
> > > > > +
> > > > >       /** Reserved bit fields for future extension
> > > > >        *
> > > > >        * User should ensure reserved_opts is cleared as it may change in
> > > > > @@ -282,7 +293,7 @@ struct rte_security_ipsec_sa_options {
> > > > >        *
> > > > >        * Note: Reduce number of bits in reserved_opts for every new option.
> > > > >        */
> > > > > -     uint32_t reserved_opts : 17;
> > > > > +     uint32_t reserved_opts : 16;
> > > > >  };
> > > >
> > > > NAK
> > > > Let me repeat the reserved bit rant. YAGNI
> > > >
> > > > Reserved space is not usable without ABI breakage unless the existing
> > > > code enforces that reserved space has to be zero.
> > > >
> > > > Just saying "User should ensure reserved_opts is cleared" is not enough.
> > >
> > > Yes. I think, we need to enforce to have _init functions for the
> > > structures which is using reserved filed.
> > >
> > > On the same note on YAGNI, I am wondering why NOT introduce
> > > RTE_NEXT_ABI marco kind of scheme to compile out ABI breaking changes.
> > > By keeping RTE_NEXT_ABI disable by default, enable explicitly if user
> > > wants it to avoid waiting for one year any ABI breaking changes.
> > > There are a lot of "fixed appliance" customers (not OS distribution
> > > driven customer) they are willing to recompile DPDK for new feature.
> > > What we are loosing with this scheme?
> >
> > RTE_NEXT_ABI is described in the ABI policy.
> > We are not doing it currently, but I think we could
> > when it is not too much complicate in the code.
> >
> > The only problems I see are:
> > - more #ifdef clutter
> > - 2 binary versions to test
> > - CI and checks must handle RTE_NEXT_ABI version
>
> I think, we have two buckets of ABI breakages via RTE_NEXT_ABI
>
> 1) Changes that introduces compilation failures like adding new
> argument to API or change API name etc
> 2) Structure size change which won't affect the compilation but breaks
> the ABI for shared library usage.
>
> I think, (1) is very distributive, and I don't see recently such
> changes. I think, we should avoid (1) for non XX.11 releases.(or two
> or three-year cycles if we decide that path)
>
> The (2) comes are very common due to the fact HW features are
> evolving. I think, to address the (2), we have two options
> a) Have reserved fields and have _init() function to initialize the structures
> b) Follow YAGNI style and introduce RTE_NEXT_ABI for structure size change.
>
> The above concerns[1] can greatly reduce with option b OR option a.
>
> [1]
>  1) more #ifdef clutter
> For option (a) this is not needed or option (b) the clutter will be
> limited, it will be around structure which add the new filed and
> around the FULL block where new functions are added (not inside the
> functions)
>
> 2) 2 binary versions to test
> For option (a) this is not needed, for option (b) it is limited as for
> new features only one needs to test another binary (rather than NOT
> adding a new feature).
>
>  3) CI and checks must handle RTE_NEXT_ABI version
>
> I think, it is cheap to add this, at least for compilation test.
>
> IMO, We need to change the API break release to 3 year kind of time
> frame to have very good end user experience
> and allow ABI related change to get in every release and force
> _rebuild_ shared objects in major LTS release.
>
> I think, in this major LTS version(23.11) if we can decide (a) vs (b)
> then we can align the code accordingly . e.s.p for (a) we need to add
> _init() functions.
>
> Thoughts?

Not much input from mailing list. Can we discuss this next TB meeting?
Especially how to align with next LTS release on
-YAGNI vs reserved fileds with init()
-What it takes to Extend the API breaking release more than a year as
first step.

^ permalink raw reply	[relevance 0%]

* 回复: [EXT] [PATCH v3 1/2] cryptodev: support SM3_HMAC,SM4_CFB and SM4_OFB
  2023-05-26  7:15  4% ` [EXT] " Akhil Goyal
@ 2023-05-29  3:06  4%   ` Sunyang Wu
  0 siblings, 0 replies; 200+ results
From: Sunyang Wu @ 2023-05-29  3:06 UTC (permalink / raw)
  To: Akhil Goyal, dev; +Cc: kai.ji

Hi Akhil,
Thank you very much for your patient guidance, the patches have been resubmitted.

Best wishes
Sunyang

> Add SM3_HMAC/SM4_CFB/SM4_OFB support in DPDK.
> 
> Signed-off-by: Sunyang Wu <sunyang.wu@jaguarmicro.com>
> ---
>  doc/guides/cryptodevs/features/default.ini | 3 +++
>  doc/guides/rel_notes/release_23_07.rst     | 5 +++++
>  lib/cryptodev/rte_crypto_sym.h             | 8 +++++++-
>  lib/cryptodev/rte_cryptodev.c              | 5 ++++-
>  4 files changed, 19 insertions(+), 2 deletions(-)
> 
> diff --git a/doc/guides/cryptodevs/features/default.ini
> b/doc/guides/cryptodevs/features/default.ini
> index 523da0cfa8..8f54d4a2a5 100644
> --- a/doc/guides/cryptodevs/features/default.ini
> +++ b/doc/guides/cryptodevs/features/default.ini
> @@ -64,6 +64,8 @@ ZUC EEA3       =
>  SM4 ECB        =
>  SM4 CBC        =
>  SM4 CTR        =
> +SM4 CFB        =
> +SM4 OFB        =
> 
>  ;
>  ; Supported authentication algorithms of a default crypto driver.
> @@ -99,6 +101,7 @@ SHA3_384 HMAC   =
>  SHA3_512        =
>  SHA3_512 HMAC   =
>  SM3             =
> +SM3 HMAC        =
>  SHAKE_128       =
>  SHAKE_256       =
> 
> diff --git a/doc/guides/rel_notes/release_23_07.rst
> b/doc/guides/rel_notes/release_23_07.rst
> index a9b1293689..405b34c6d2 100644
> --- a/doc/guides/rel_notes/release_23_07.rst
> +++ b/doc/guides/rel_notes/release_23_07.rst
> @@ -55,6 +55,11 @@ New Features
>       Also, make sure to start the actual text at the margin.
>       =======================================================
> 
> +* **Added new algorithms to cryptodev.**
> +
> +  * Added symmetric hash algorithm SM3-HMAC.
> +  * Added symmetric cipher algorithm ShangMi 4 (SM4) in CFB and OFB modes.
> +
> 
>  Removed Items
>  -------------
> diff --git a/lib/cryptodev/rte_crypto_sym.h 
> b/lib/cryptodev/rte_crypto_sym.h index b43174dbec..428603d06e 100644
> --- a/lib/cryptodev/rte_crypto_sym.h
> +++ b/lib/cryptodev/rte_crypto_sym.h
> @@ -172,8 +172,12 @@ enum rte_crypto_cipher_algorithm {
>  	/**< ShangMi 4 (SM4) algorithm in ECB mode */
>  	RTE_CRYPTO_CIPHER_SM4_CBC,
>  	/**< ShangMi 4 (SM4) algorithm in CBC mode */
> -	RTE_CRYPTO_CIPHER_SM4_CTR
> +	RTE_CRYPTO_CIPHER_SM4_CTR,
>  	/**< ShangMi 4 (SM4) algorithm in CTR mode */
> +	RTE_CRYPTO_CIPHER_SM4_OFB,
> +	/**< ShangMi 4 (SM4) algorithm in OFB mode */
> +	RTE_CRYPTO_CIPHER_SM4_CFB
> +	/**< ShangMi 4 (SM4) algorithm in CFB mode */
>  };
> 
>  /** Cipher algorithm name strings */
> @@ -376,6 +380,8 @@ enum rte_crypto_auth_algorithm {
>  	/**< HMAC using 512 bit SHA3 algorithm. */
>  	RTE_CRYPTO_AUTH_SM3,
>  	/**< ShangMi 3 (SM3) algorithm */
> +	RTE_CRYPTO_AUTH_SM3_HMAC,
> +	/** < HMAC using ShangMi 3 (SM3) algorithm */

You cannot insert in the middle of enum.
This will result in ABI break.
http://mails.dpdk.org/archives/test-report/2023-May/400475.html
Please move this change to end of enum for this release.

You can submit a patch for next release(which is an ABI break release.) to move it back.


> 
>  	RTE_CRYPTO_AUTH_SHAKE_128,
>  	/**< 128 bit SHAKE algorithm. */
> diff --git a/lib/cryptodev/rte_cryptodev.c 
> b/lib/cryptodev/rte_cryptodev.c index a96114b2da..4ff7046e97 100644
> --- a/lib/cryptodev/rte_cryptodev.c
> +++ b/lib/cryptodev/rte_cryptodev.c
> @@ -127,7 +127,9 @@ crypto_cipher_algorithm_strings[] = {
>  	[RTE_CRYPTO_CIPHER_ZUC_EEA3]	= "zuc-eea3",
>  	[RTE_CRYPTO_CIPHER_SM4_ECB]	= "sm4-ecb",
>  	[RTE_CRYPTO_CIPHER_SM4_CBC]	= "sm4-cbc",
> -	[RTE_CRYPTO_CIPHER_SM4_CTR]	= "sm4-ctr"
> +	[RTE_CRYPTO_CIPHER_SM4_CTR]	= "sm4-ctr",
> +	[RTE_CRYPTO_CIPHER_SM4_CFB]	= "sm4-cfb",
> +	[RTE_CRYPTO_CIPHER_SM4_OFB]	= "sm4-ofb"
>  };
> 
>  /**
> @@ -227,6 +229,7 @@ crypto_auth_algorithm_strings[] = {
>  	[RTE_CRYPTO_AUTH_SNOW3G_UIA2]	= "snow3g-uia2",
>  	[RTE_CRYPTO_AUTH_ZUC_EIA3]	= "zuc-eia3",
>  	[RTE_CRYPTO_AUTH_SM3]		= "sm3",
> +	[RTE_CRYPTO_AUTH_SM3_HMAC]	= "sm3-hmac",
> 
>  	[RTE_CRYPTO_AUTH_SHAKE_128]	 = "shake-128",
>  	[RTE_CRYPTO_AUTH_SHAKE_256]	 = "shake-256",
> --
> 2.19.0.rc0.windows.1


^ permalink raw reply	[relevance 4%]

* [PATCH V6 2/5] ethdev: fix skip valid port in probing callback
  2023-05-27  2:11  3% ` [PATCH V6 0/5] app/testpmd: support multiple process attach and detach port Huisong Li
@ 2023-05-27  2:11  2%   ` Huisong Li
  2023-06-06 16:26  0%   ` [PATCH V6 0/5] app/testpmd: support multiple process attach and detach port Ferruh Yigit
  2023-07-14  7:21  0%   ` lihuisong (C)
  2 siblings, 0 replies; 200+ results
From: Huisong Li @ 2023-05-27  2:11 UTC (permalink / raw)
  To: dev
  Cc: thomas, ferruh.yigit, andrew.rybchenko, liudongdong3,
	liuyonglong, fengchengwen, lihuisong

The event callback in application may use the macro RTE_ETH_FOREACH_DEV to
iterate over all enabled ports to do something(like, verifying the port id
validity) when receive a probing event. If the ethdev state of a port is
not RTE_ETH_DEV_UNUSED, this port will be considered as a valid port.

However, this state is set to RTE_ETH_DEV_ATTACHED after pushing probing
event. It means that probing callback will skip this port. But this
assignment can not move to front of probing notification. See
commit be8cd210379a ("ethdev: fix port probing notification")

So this patch has to add a new state, RTE_ETH_DEV_ALLOCATED. Set the ethdev
state to RTE_ETH_DEV_ALLOCATED before pushing probing event and set it to
RTE_ETH_DEV_ATTACHED after definitely probed. And this port is valid if its
device state is 'ALLOCATED' or 'ATTACHED'.

In addition, the new state has to be placed behind 'REMOVED' to avoid ABI
break. Fortunately, this ethdev state is internal and applications can not
access it directly. So this patch encapsulates an API, rte_eth_dev_is_used,
for ethdev or PMD to call and eliminate concerns about using this state
enum value comparison.

Fixes: be8cd210379a ("ethdev: fix port probing notification")
Cc: stable@dpdk.org

Signed-off-by: Huisong Li <lihuisong@huawei.com>
---
 drivers/net/bnxt/bnxt_ethdev.c |  3 ++-
 drivers/net/mlx5/mlx5.c        |  2 +-
 lib/ethdev/ethdev_driver.c     | 13 ++++++++++---
 lib/ethdev/ethdev_driver.h     | 12 ++++++++++++
 lib/ethdev/ethdev_pci.h        |  2 +-
 lib/ethdev/rte_class_eth.c     |  2 +-
 lib/ethdev/rte_ethdev.c        |  4 ++--
 lib/ethdev/rte_ethdev.h        |  4 +++-
 lib/ethdev/version.map         |  1 +
 9 files changed, 33 insertions(+), 10 deletions(-)

diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index ef7b8859d9..74ec0c88fb 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -6053,7 +6053,8 @@ bnxt_dev_uninit(struct rte_eth_dev *eth_dev)
 
 	PMD_DRV_LOG(DEBUG, "Calling Device uninit\n");
 
-	if (eth_dev->state != RTE_ETH_DEV_UNUSED)
+
+	if (rte_eth_dev_is_used(eth_dev->state))
 		bnxt_dev_close_op(eth_dev);
 
 	return 0;
diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
index a75fa1b7f0..881425bf83 100644
--- a/drivers/net/mlx5/mlx5.c
+++ b/drivers/net/mlx5/mlx5.c
@@ -3145,7 +3145,7 @@ mlx5_eth_find_next(uint16_t port_id, struct rte_device *odev)
 	while (port_id < RTE_MAX_ETHPORTS) {
 		struct rte_eth_dev *dev = &rte_eth_devices[port_id];
 
-		if (dev->state != RTE_ETH_DEV_UNUSED &&
+		if (rte_eth_dev_is_used(dev->state) &&
 		    dev->device &&
 		    (dev->device == odev ||
 		     (dev->device->driver &&
diff --git a/lib/ethdev/ethdev_driver.c b/lib/ethdev/ethdev_driver.c
index 0be1e8ca04..29e9417bea 100644
--- a/lib/ethdev/ethdev_driver.c
+++ b/lib/ethdev/ethdev_driver.c
@@ -50,8 +50,8 @@ eth_dev_find_free_port(void)
 	for (i = 0; i < RTE_MAX_ETHPORTS; i++) {
 		/* Using shared name field to find a free port. */
 		if (eth_dev_shared_data->data[i].name[0] == '\0') {
-			RTE_ASSERT(rte_eth_devices[i].state ==
-				   RTE_ETH_DEV_UNUSED);
+			RTE_ASSERT(!rte_eth_dev_is_used(
+					rte_eth_devices[i].state));
 			return i;
 		}
 	}
@@ -208,11 +208,18 @@ rte_eth_dev_probing_finish(struct rte_eth_dev *dev)
 	if (rte_eal_process_type() == RTE_PROC_SECONDARY)
 		eth_dev_fp_ops_setup(rte_eth_fp_ops + dev->data->port_id, dev);
 
+	dev->state = RTE_ETH_DEV_ALLOCATED;
 	rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_NEW, NULL);
 
 	dev->state = RTE_ETH_DEV_ATTACHED;
 }
 
+bool rte_eth_dev_is_used(uint16_t dev_state)
+{
+	return dev_state == RTE_ETH_DEV_ALLOCATED ||
+		dev_state == RTE_ETH_DEV_ATTACHED;
+}
+
 int
 rte_eth_dev_release_port(struct rte_eth_dev *eth_dev)
 {
@@ -221,7 +228,7 @@ rte_eth_dev_release_port(struct rte_eth_dev *eth_dev)
 
 	eth_dev_shared_data_prepare();
 
-	if (eth_dev->state != RTE_ETH_DEV_UNUSED)
+	if (rte_eth_dev_is_used(eth_dev->state))
 		rte_eth_dev_callback_process(eth_dev,
 				RTE_ETH_EVENT_DESTROY, NULL);
 
diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h
index 367c0c4878..d5fd6e19ba 100644
--- a/lib/ethdev/ethdev_driver.h
+++ b/lib/ethdev/ethdev_driver.h
@@ -1583,6 +1583,18 @@ int rte_eth_dev_callback_process(struct rte_eth_dev *dev,
 __rte_internal
 void rte_eth_dev_probing_finish(struct rte_eth_dev *dev);
 
+/**
+ * Check if a Ethernet device state is used or not
+ *
+ * @param dev_state
+ *   The state of the Ethernet device
+ * @return
+ *   - true if the state of the Ethernet device is allocated or attached
+ *   - false if this state is neither allocated nor attached
+ */
+__rte_internal
+bool rte_eth_dev_is_used(uint16_t dev_state);
+
 /**
  * Create memzone for HW rings.
  * malloc can't be used as the physical address is needed.
diff --git a/lib/ethdev/ethdev_pci.h b/lib/ethdev/ethdev_pci.h
index 94b8fba5d7..23270ccd73 100644
--- a/lib/ethdev/ethdev_pci.h
+++ b/lib/ethdev/ethdev_pci.h
@@ -164,7 +164,7 @@ rte_eth_dev_pci_generic_remove(struct rte_pci_device *pci_dev,
 	 * eth device has been released.
 	 */
 	if (rte_eal_process_type() == RTE_PROC_SECONDARY &&
-	    eth_dev->state == RTE_ETH_DEV_UNUSED)
+	    !rte_eth_dev_is_used(eth_dev->state))
 		return 0;
 
 	if (dev_uninit) {
diff --git a/lib/ethdev/rte_class_eth.c b/lib/ethdev/rte_class_eth.c
index b61dae849d..88e56dd9a4 100644
--- a/lib/ethdev/rte_class_eth.c
+++ b/lib/ethdev/rte_class_eth.c
@@ -118,7 +118,7 @@ eth_dev_match(const struct rte_eth_dev *edev,
 	const struct rte_kvargs *kvlist = arg->kvlist;
 	unsigned int pair;
 
-	if (edev->state == RTE_ETH_DEV_UNUSED)
+	if (!rte_eth_dev_is_used(edev->state))
 		return -1;
 	if (arg->device != NULL && arg->device != edev->device)
 		return -1;
diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
index d46e74504e..c8f800bb12 100644
--- a/lib/ethdev/rte_ethdev.c
+++ b/lib/ethdev/rte_ethdev.c
@@ -338,7 +338,7 @@ uint16_t
 rte_eth_find_next(uint16_t port_id)
 {
 	while (port_id < RTE_MAX_ETHPORTS &&
-			rte_eth_devices[port_id].state == RTE_ETH_DEV_UNUSED)
+	       !rte_eth_dev_is_used(rte_eth_devices[port_id].state))
 		port_id++;
 
 	if (port_id >= RTE_MAX_ETHPORTS)
@@ -397,7 +397,7 @@ rte_eth_dev_is_valid_port(uint16_t port_id)
 	int is_valid;
 
 	if (port_id >= RTE_MAX_ETHPORTS ||
-	    (rte_eth_devices[port_id].state == RTE_ETH_DEV_UNUSED))
+	    !rte_eth_dev_is_used(rte_eth_devices[port_id].state))
 		is_valid = 0;
 	else
 		is_valid = 1;
diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h
index fe8f7466c8..d4de7942d0 100644
--- a/lib/ethdev/rte_ethdev.h
+++ b/lib/ethdev/rte_ethdev.h
@@ -2002,10 +2002,12 @@ typedef uint16_t (*rte_tx_callback_fn)(uint16_t port_id, uint16_t queue,
 enum rte_eth_dev_state {
 	/** Device is unused before being probed. */
 	RTE_ETH_DEV_UNUSED = 0,
-	/** Device is attached when allocated in probing. */
+	/** Device is attached when definitely probed. */
 	RTE_ETH_DEV_ATTACHED,
 	/** Device is in removed state when plug-out is detected. */
 	RTE_ETH_DEV_REMOVED,
+	/** Device is allocated and is set before reporting new event. */
+	RTE_ETH_DEV_ALLOCATED,
 };
 
 struct rte_eth_dev_sriov {
diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map
index 041f0da31f..673123dfb7 100644
--- a/lib/ethdev/version.map
+++ b/lib/ethdev/version.map
@@ -317,6 +317,7 @@ INTERNAL {
 	rte_eth_dev_get_by_name;
 	rte_eth_dev_is_rx_hairpin_queue;
 	rte_eth_dev_is_tx_hairpin_queue;
+	rte_eth_dev_is_used;
 	rte_eth_dev_probing_finish;
 	rte_eth_dev_release_port;
 	rte_eth_dev_internal_reset;
-- 
2.22.0


^ permalink raw reply	[relevance 2%]

* [PATCH V6 0/5] app/testpmd: support multiple process attach and detach port
       [not found]     <20220825024425.10534-1-lihuisong@huawei.com>
@ 2023-05-27  2:11  3% ` Huisong Li
  2023-05-27  2:11  2%   ` [PATCH V6 2/5] ethdev: fix skip valid port in probing callback Huisong Li
                     ` (2 more replies)
  2023-08-02  3:15  3% ` [PATCH RESEND v6 " Huisong Li
  1 sibling, 3 replies; 200+ results
From: Huisong Li @ 2023-05-27  2:11 UTC (permalink / raw)
  To: dev
  Cc: thomas, ferruh.yigit, andrew.rybchenko, liudongdong3,
	liuyonglong, fengchengwen, lihuisong

This patchset fix some bugs and support attaching and detaching port
in primary and secondary.

---
 -v6: adjust rte_eth_dev_is_used position based on alphabetical order
      in version.map
 -v5: move 'ALLOCATED' state to the back of 'REMOVED' to avoid abi break.
 -v4: fix a misspelling. 
 -v3:
   #1 merge patch 1/6 and patch 2/6 into patch 1/5, and add modification
      for other bus type.
   #2 add a RTE_ETH_DEV_ALLOCATED state in rte_eth_dev_state to resolve
      the probelm in patch 2/5. 
 -v2: resend due to CI unexplained failure.

Huisong Li (5):
  drivers/bus: restore driver assignment at front of probing
  ethdev: fix skip valid port in probing callback
  app/testpmd: check the validity of the port
  app/testpmd: add attach and detach port for multiple process
  app/testpmd: stop forwarding in new or destroy event

 app/test-pmd/testpmd.c                   | 47 +++++++++++++++---------
 app/test-pmd/testpmd.h                   |  1 -
 drivers/bus/auxiliary/auxiliary_common.c |  9 ++++-
 drivers/bus/dpaa/dpaa_bus.c              |  9 ++++-
 drivers/bus/fslmc/fslmc_bus.c            |  8 +++-
 drivers/bus/ifpga/ifpga_bus.c            | 12 ++++--
 drivers/bus/pci/pci_common.c             |  9 ++++-
 drivers/bus/vdev/vdev.c                  | 10 ++++-
 drivers/bus/vmbus/vmbus_common.c         |  9 ++++-
 drivers/net/bnxt/bnxt_ethdev.c           |  3 +-
 drivers/net/bonding/bonding_testpmd.c    |  1 -
 drivers/net/mlx5/mlx5.c                  |  2 +-
 lib/ethdev/ethdev_driver.c               | 13 +++++--
 lib/ethdev/ethdev_driver.h               | 12 ++++++
 lib/ethdev/ethdev_pci.h                  |  2 +-
 lib/ethdev/rte_class_eth.c               |  2 +-
 lib/ethdev/rte_ethdev.c                  |  4 +-
 lib/ethdev/rte_ethdev.h                  |  4 +-
 lib/ethdev/version.map                   |  1 +
 19 files changed, 114 insertions(+), 44 deletions(-)

-- 
2.22.0


^ permalink raw reply	[relevance 3%]

* RE: [PATCH v6 04/15] graph: add get/set graph worker model APIs
  @ 2023-05-26  9:58  0%       ` Yan, Zhirun
  0 siblings, 0 replies; 200+ results
From: Yan, Zhirun @ 2023-05-26  9:58 UTC (permalink / raw)
  To: Jerin Jacob
  Cc: dev, jerinj, kirankumark, ndabilpuram, stephen, pbhagavatula,
	Liang, Cunming, Wang, Haiyue



> -----Original Message-----
> From: Jerin Jacob <jerinjacobk@gmail.com>
> Sent: Wednesday, May 24, 2023 2:09 PM
> To: Yan, Zhirun <zhirun.yan@intel.com>
> Cc: dev@dpdk.org; jerinj@marvell.com; kirankumark@marvell.com;
> ndabilpuram@marvell.com; stephen@networkplumber.org;
> pbhagavatula@marvell.com; Liang, Cunming <cunming.liang@intel.com>; Wang,
> Haiyue <haiyue.wang@intel.com>
> Subject: Re: [PATCH v6 04/15] graph: add get/set graph worker model APIs
> 
> On Tue, May 9, 2023 at 11:34 AM Zhirun Yan <zhirun.yan@intel.com> wrote:
> >
> > Add new get/set APIs to configure graph worker model which is used to
> > determine which model will be chosen.
> >
> > Signed-off-by: Haiyue Wang <haiyue.wang@intel.com>
> > Signed-off-by: Cunming Liang <cunming.liang@intel.com>
> > Signed-off-by: Zhirun Yan <zhirun.yan@intel.com>
> > ---
> > diff --git a/lib/graph/rte_graph_worker.c
> > b/lib/graph/rte_graph_worker.c new file mode 100644 index
> > 0000000000..cabc101262
> > --- /dev/null
> > +++ b/lib/graph/rte_graph_worker.c
> > @@ -0,0 +1,54 @@
> > +/* SPDX-License-Identifier: BSD-3-Clause
> > + * Copyright(C) 2023 Intel Corporation  */
> > +
> > +#include "rte_graph_worker_common.h"
> > +
> > +RTE_DEFINE_PER_LCORE(enum rte_graph_worker_model, worker_model) =
> > +RTE_GRAPH_MODEL_DEFAULT;
> > +
> > +/**
> > + * @warning
> > + * @b EXPERIMENTAL: this API may change, or be removed, without prior
> > +notice
> > + * Set the graph worker model
> 
> Just declaring this top of the header file enough to avoid duplicating in every
> functions as all functions in header is experimental. See lib/graph/rte_graph.h
> 
Got it, I will do in next version.

> 
> > + *
> > + * @note This function does not perform any locking, and is only safe to call
> > + *    before graph running.
> > + *
> > + * @param name
> > + *   Name of the graph worker model.
> > + *
> > + * @return
> > + *   0 on success, -1 otherwise.
> > + */
> > +int
> > +rte_graph_worker_model_set(enum rte_graph_worker_model model) {
> > +       if (model >= RTE_GRAPH_MODEL_LIST_END)
> > +               goto fail;
> > +
> > +       RTE_PER_LCORE(worker_model) = model;
> 
> Application needs to set this per core . Right?

Yes. Each worker needs to know its model.

> Are we anticipating a case where one core runs one model and another core
> runs with another model?
> If not OR it is not practically possible, then,  To make application programmer
> life easy, We could loop through all lore and set on all of them instead of
> application setting on each one separately.
> 

For current rtc and dispatch models, it is not necessary.
To some extent that models are mutually exclusive.

For this case:
    Core 1: A->B->C (RTC)

    Core 2: A' (DISPATCH)
    Core 3: B' (DISPATCH)
    Core 4: C' (DISPATCH)

It may change the graph topo,  or need some prerequisites like RSS before input node A.

BTW, if there are some requirements with more models in future, we could add some attributions for graph, lcore, node.
Like taint/affinity for node and model. Then we could allow a node to appeal/repel a set of models. 

I will change to put the model into struct rte_graph as you suggested in patch 12  for this release.

> 
> > +       return 0;
> > +
> > +fail:
> > +       RTE_PER_LCORE(worker_model) = RTE_GRAPH_MODEL_DEFAULT;
> > +       return -1;
> > +}
> > +
> 
> > +/** Graph worker models */
> > +enum rte_graph_worker_model {
> > +       RTE_GRAPH_MODEL_DEFAULT,
> 
> Add Doxygen comment
> > +       RTE_GRAPH_MODEL_RTC = RTE_GRAPH_MODEL_DEFAULT,
> 
> 
> Add Doxygen comment to explain what this mode does.
> 
> 
> > +       RTE_GRAPH_MODEL_MCORE_DISPATCH,
> 
> Add Doxygen comment to explain what this mode does.
> 
Ok, I will add Doxygen comments for these models.

> > +       RTE_GRAPH_MODEL_LIST_END
> 
> This can break the ABI if we add one in middle. Please remove this.
> See lib/crytodev for
> how to handle with _END symbols.

Yes, I will remove this.

^ permalink raw reply	[relevance 0%]

* Re: [PATCH] ethdev: validate reserved fields
  @ 2023-05-26  8:15  0% ` Bruce Richardson
  2023-06-06 15:24  3% ` Ferruh Yigit
  1 sibling, 0 replies; 200+ results
From: Bruce Richardson @ 2023-05-26  8:15 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: dev, thomas, Ferruh Yigit, Andrew Rybchenko

On Thu, May 25, 2023 at 01:39:42PM -0700, Stephen Hemminger wrote:
> The various reserved fields added to ethdev could not be
> safely used for future extensions because they were never
> checked on input. Therefore ABI would be broken if these
> fields were added in a future DPDK release.
> 
> Fixes: 436b3a6b6e62 ("ethdev: reserve space in main structs for extension")
> Cc: thomas@monjalon.net
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
>  lib/ethdev/rte_ethdev.c | 41 +++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 41 insertions(+)
> 
Acked-by: Bruce Richardson <bruce.richardson@intel.com>

^ permalink raw reply	[relevance 0%]

* RE: [EXT] [PATCH v3 1/2] cryptodev: support SM3_HMAC,SM4_CFB and SM4_OFB
  @ 2023-05-26  7:15  4% ` Akhil Goyal
  2023-05-29  3:06  4%   ` 回复: " Sunyang Wu
  0 siblings, 1 reply; 200+ results
From: Akhil Goyal @ 2023-05-26  7:15 UTC (permalink / raw)
  To: Sunyang Wu, dev; +Cc: kai.ji

> Add SM3_HMAC/SM4_CFB/SM4_OFB support in DPDK.
> 
> Signed-off-by: Sunyang Wu <sunyang.wu@jaguarmicro.com>
> ---
>  doc/guides/cryptodevs/features/default.ini | 3 +++
>  doc/guides/rel_notes/release_23_07.rst     | 5 +++++
>  lib/cryptodev/rte_crypto_sym.h             | 8 +++++++-
>  lib/cryptodev/rte_cryptodev.c              | 5 ++++-
>  4 files changed, 19 insertions(+), 2 deletions(-)
> 
> diff --git a/doc/guides/cryptodevs/features/default.ini
> b/doc/guides/cryptodevs/features/default.ini
> index 523da0cfa8..8f54d4a2a5 100644
> --- a/doc/guides/cryptodevs/features/default.ini
> +++ b/doc/guides/cryptodevs/features/default.ini
> @@ -64,6 +64,8 @@ ZUC EEA3       =
>  SM4 ECB        =
>  SM4 CBC        =
>  SM4 CTR        =
> +SM4 CFB        =
> +SM4 OFB        =
> 
>  ;
>  ; Supported authentication algorithms of a default crypto driver.
> @@ -99,6 +101,7 @@ SHA3_384 HMAC   =
>  SHA3_512        =
>  SHA3_512 HMAC   =
>  SM3             =
> +SM3 HMAC        =
>  SHAKE_128       =
>  SHAKE_256       =
> 
> diff --git a/doc/guides/rel_notes/release_23_07.rst
> b/doc/guides/rel_notes/release_23_07.rst
> index a9b1293689..405b34c6d2 100644
> --- a/doc/guides/rel_notes/release_23_07.rst
> +++ b/doc/guides/rel_notes/release_23_07.rst
> @@ -55,6 +55,11 @@ New Features
>       Also, make sure to start the actual text at the margin.
>       =======================================================
> 
> +* **Added new algorithms to cryptodev.**
> +
> +  * Added symmetric hash algorithm SM3-HMAC.
> +  * Added symmetric cipher algorithm ShangMi 4 (SM4) in CFB and OFB modes.
> +
> 
>  Removed Items
>  -------------
> diff --git a/lib/cryptodev/rte_crypto_sym.h b/lib/cryptodev/rte_crypto_sym.h
> index b43174dbec..428603d06e 100644
> --- a/lib/cryptodev/rte_crypto_sym.h
> +++ b/lib/cryptodev/rte_crypto_sym.h
> @@ -172,8 +172,12 @@ enum rte_crypto_cipher_algorithm {
>  	/**< ShangMi 4 (SM4) algorithm in ECB mode */
>  	RTE_CRYPTO_CIPHER_SM4_CBC,
>  	/**< ShangMi 4 (SM4) algorithm in CBC mode */
> -	RTE_CRYPTO_CIPHER_SM4_CTR
> +	RTE_CRYPTO_CIPHER_SM4_CTR,
>  	/**< ShangMi 4 (SM4) algorithm in CTR mode */
> +	RTE_CRYPTO_CIPHER_SM4_OFB,
> +	/**< ShangMi 4 (SM4) algorithm in OFB mode */
> +	RTE_CRYPTO_CIPHER_SM4_CFB
> +	/**< ShangMi 4 (SM4) algorithm in CFB mode */
>  };
> 
>  /** Cipher algorithm name strings */
> @@ -376,6 +380,8 @@ enum rte_crypto_auth_algorithm {
>  	/**< HMAC using 512 bit SHA3 algorithm. */
>  	RTE_CRYPTO_AUTH_SM3,
>  	/**< ShangMi 3 (SM3) algorithm */
> +	RTE_CRYPTO_AUTH_SM3_HMAC,
> +	/** < HMAC using ShangMi 3 (SM3) algorithm */

You cannot insert in the middle of enum.
This will result in ABI break.
http://mails.dpdk.org/archives/test-report/2023-May/400475.html
Please move this change to end of enum for this release.

You can submit a patch for next release(which is an ABI break release.) to move it back.


> 
>  	RTE_CRYPTO_AUTH_SHAKE_128,
>  	/**< 128 bit SHAKE algorithm. */
> diff --git a/lib/cryptodev/rte_cryptodev.c b/lib/cryptodev/rte_cryptodev.c
> index a96114b2da..4ff7046e97 100644
> --- a/lib/cryptodev/rte_cryptodev.c
> +++ b/lib/cryptodev/rte_cryptodev.c
> @@ -127,7 +127,9 @@ crypto_cipher_algorithm_strings[] = {
>  	[RTE_CRYPTO_CIPHER_ZUC_EEA3]	= "zuc-eea3",
>  	[RTE_CRYPTO_CIPHER_SM4_ECB]	= "sm4-ecb",
>  	[RTE_CRYPTO_CIPHER_SM4_CBC]	= "sm4-cbc",
> -	[RTE_CRYPTO_CIPHER_SM4_CTR]	= "sm4-ctr"
> +	[RTE_CRYPTO_CIPHER_SM4_CTR]	= "sm4-ctr",
> +	[RTE_CRYPTO_CIPHER_SM4_CFB]	= "sm4-cfb",
> +	[RTE_CRYPTO_CIPHER_SM4_OFB]	= "sm4-ofb"
>  };
> 
>  /**
> @@ -227,6 +229,7 @@ crypto_auth_algorithm_strings[] = {
>  	[RTE_CRYPTO_AUTH_SNOW3G_UIA2]	= "snow3g-uia2",
>  	[RTE_CRYPTO_AUTH_ZUC_EIA3]	= "zuc-eia3",
>  	[RTE_CRYPTO_AUTH_SM3]		= "sm3",
> +	[RTE_CRYPTO_AUTH_SM3_HMAC]	= "sm3-hmac",
> 
>  	[RTE_CRYPTO_AUTH_SHAKE_128]	 = "shake-128",
>  	[RTE_CRYPTO_AUTH_SHAKE_256]	 = "shake-256",
> --
> 2.19.0.rc0.windows.1


^ permalink raw reply	[relevance 4%]

* [PATCH v1 0/4] bbdev: API extension for 23.11
@ 2023-05-25 23:23  4% Nicolas Chautru
  0 siblings, 0 replies; 200+ results
From: Nicolas Chautru @ 2023-05-25 23:23 UTC (permalink / raw)
  To: dev, maxime.coquelin
  Cc: trix, hemant.agrawal, david.marchand, hernan.vargas, Nicolas Chautru

Hi, 

Including v1 for extending the bbdev api for 23.11.
The new MLD-TS is expected to be non ABI compatible, the other
ones should not break ABI. 
I will send a deprecation notice in parallel.

This introduces a new operation (on top of FEC and FFT) to
support equalization for MLD-TS. There also more modular
API extension for existing FFT and FEC operation. 

Thanks
Nic

Nicolas Chautru (4):
  bbdev: add operation type for MLDTS procession
  bbdev: add new capabilities for FFT processing
  bbdev: add new capability for FEC 5G UL processing
  bbdev: improving error handling for queue configuration

 doc/guides/prog_guide/bbdev.rst |  83 ++++++++++++++++++
 lib/bbdev/rte_bbdev.c           |  26 +++---
 lib/bbdev/rte_bbdev.h           |  76 +++++++++++++++++
 lib/bbdev/rte_bbdev_op.h        | 143 +++++++++++++++++++++++++++++++-
 lib/bbdev/version.map           |   5 ++
 5 files changed, 320 insertions(+), 13 deletions(-)

-- 
2.34.1


^ permalink raw reply	[relevance 4%]

Results 1401-1600 of ~18000   |  | reverse | sort options + mbox downloads above
-- links below jump to the message on this page --
2018-10-09  7:54     [dpdk-dev] [PATCH 0/2] eal/bitmap: support reverse bitmap scan Vivek Sharma
2023-06-12  2:23  4% ` Stephen Hemminger
2019-04-16  1:59     [dpdk-dev] [PATCH] fbarray: get fbarrays from containerized secondary ogawa.yasufumi
2023-06-13 16:51  3% ` Stephen Hemminger
2019-11-25 16:13     [dpdk-dev] [RFC PATCH] mark experimental variables David Marchand
2023-06-12  2:49  0% ` Stephen Hemminger
2021-06-18 16:36     [dpdk-dev] [PATCH] devtools: script to track map symbols Ray Kinsella
2021-09-09 13:48     ` [dpdk-dev] [PATCH v13 0/4] devtools: scripts to count and track symbols Ray Kinsella
2023-07-06 19:13  0%   ` Stephen Hemminger
2021-12-24 16:46     [RFC PATCH v1 0/4] Direct re-arming of buffers on receive side Feifei Wang
2023-05-25  9:45     ` [PATCH v6 0/4] Recycle mbufs from Tx queue to Rx queue Feifei Wang
2023-05-25  9:45       ` [PATCH v6 1/4] ethdev: add API for mbufs recycle mode Feifei Wang
2023-06-05 12:53         ` Константин Ананьев
2023-06-06  2:55  1%       ` Feifei Wang
2023-06-06  7:10  0%         ` Konstantin Ananyev
2023-06-06  7:31  3%           ` Feifei Wang
2023-06-06  8:34  0%             ` Konstantin Ananyev
2023-06-07  0:00  0%               ` Ferruh Yigit
2023-06-12  3:25  0%                 ` Feifei Wang
2022-04-20  8:16     [PATCH v1 0/5] Direct re-arming of buffers on receive side Feifei Wang
2023-08-02  7:38     ` [PATCH v8 0/4] Recycle mbufs from Tx queue into Rx queue Feifei Wang
2023-08-02  7:38  3%   ` [PATCH v8 1/4] ethdev: add API for mbufs recycle mode Feifei Wang
2023-08-02  8:08     ` [PATCH v9 0/4] Recycle mbufs from Tx queue into Rx queue Feifei Wang
2023-08-02  8:08  3%   ` [PATCH v9 1/4] ethdev: add API for mbufs recycle mode Feifei Wang
2022-04-21  4:38     kni: check abi version between kmod and lib Stephen Coleman
2023-07-04  2:56  7% ` Stephen Hemminger
2022-08-29 15:18     [RFC PATCH 0/3] Split logging out of EAL Bruce Richardson
2023-07-31 10:17  3% ` [PATCH v6 0/3] Split logging functionality " Bruce Richardson
2023-07-31 15:38  4% ` [PATCH v7 " Bruce Richardson
2023-01-31  2:28     [PATCH v3 0/2] add ring telemetry cmds Jie Hai
2023-06-20 14:34     ` [PATCH v4 3/3] ring: add telemetry cmd for ring info Thomas Monjalon
2023-07-04  8:04       ` Jie Hai
2023-07-04 14:11         ` Thomas Monjalon
2023-07-06  8:52  3%       ` David Marchand
2023-07-07  2:18  0%         ` Jie Hai
2023-02-28  9:39     [RFC 0/2] Add high-performance timer facility Mattias Rönnblom
2023-03-15 17:03     ` [RFC v2 " Mattias Rönnblom
2023-03-15 17:03       ` [RFC v2 2/2] eal: add " Mattias Rönnblom
2023-07-06 22:41  3%     ` Stephen Hemminger
2023-07-12  8:58  4%       ` Mattias Rönnblom
2023-03-09  8:56     [RFC 1/2] security: introduce out of place support for inline ingress Nithin Dabilpuram
2023-04-11 18:05     ` [PATCH 1/3] " Stephen Hemminger
2023-04-18  8:33       ` Jerin Jacob
2023-04-24 22:41         ` Thomas Monjalon
2023-05-19  8:07           ` Jerin Jacob
2023-05-30  9:23  0%         ` Jerin Jacob
2023-05-30 13:51  0%           ` Thomas Monjalon
2023-05-31  9:26  5%             ` Morten Brørup
2023-03-15 11:00     [PATCH 0/5] support setting and querying RSS algorithms Dongdong Liu
2023-03-15 11:00     ` [PATCH 1/5] ethdev: support setting and querying rss algorithm Dongdong Liu
2023-03-15 13:43       ` Thomas Monjalon
2023-03-16 13:16         ` Dongdong Liu
2023-06-02 20:19  0%       ` Ferruh Yigit
2023-06-05 12:34  0%         ` Dongdong Liu
2023-03-31  4:02     [PATCH v5 00/15] graph enhancement for multi-core dispatch Zhirun Yan
2023-05-09  6:03     ` [PATCH v6 " Zhirun Yan
2023-05-09  6:03       ` [PATCH v6 04/15] graph: add get/set graph worker model APIs Zhirun Yan
2023-05-24  6:08         ` Jerin Jacob
2023-05-26  9:58  0%       ` Yan, Zhirun
2023-04-03 21:52     [PATCH 0/9] msvc integration changes Tyler Retzlaff
2023-07-11 16:49     ` [PATCH v9 00/14] " Tyler Retzlaff
2023-07-11 16:49  5%   ` [PATCH v9 10/14] eal: expand most macros to empty when using MSVC Tyler Retzlaff
2023-07-11 16:49  3%   ` [PATCH v9 12/14] telemetry: avoid expanding versioned symbol macros on MSVC Tyler Retzlaff
2023-08-02 21:35     ` [PATCH v10 00/13] msvc integration changes Tyler Retzlaff
2023-08-02 21:35  5%   ` [PATCH v10 10/13] eal: expand most macros to empty when using MSVC Tyler Retzlaff
2023-04-17  4:31     [PATCH v3 1/4] doc: announce new cpu flag added to rte_cpu_flag_t Sivaprasad Tummala
2023-04-18  8:25     ` [PATCH v4 0/4] power: monitor support for AMD EPYC processors Sivaprasad Tummala
2023-04-18  8:25       ` [PATCH v4 1/4] doc: announce new cpu flag added to rte_cpu_flag_t Sivaprasad Tummala
2023-04-18  8:52         ` Ferruh Yigit
2023-04-18  9:22           ` Bruce Richardson
2023-06-01  9:23  0%         ` David Marchand
2023-07-05 11:32  0%     ` Konstantin Ananyev
2023-04-18 10:45     [PATCH] eventdev: fix alignment padding Sivaprasad Tummala
2023-04-18 12:30     ` Mattias Rönnblom
2023-04-18 14:07       ` Morten Brørup
2023-04-18 15:16         ` Mattias Rönnblom
2023-05-17 13:20           ` Jerin Jacob
2023-05-17 13:35             ` Morten Brørup
2023-05-23 15:15               ` Jerin Jacob
2023-08-02 16:19  0%             ` Jerin Jacob
2023-05-09  1:29     [PATCH v5 0/3] add telemetry cmds for ring Jie Hai
2023-05-09  9:24     ` [PATCH v6 " Jie Hai
2023-05-30  9:27  0%   ` Jie Hai
2023-07-04  9:04  3%   ` [PATCH v7 " Jie Hai
2023-07-04  9:04  3%     ` [PATCH v7 1/3] ring: fix unmatched type definition and usage Jie Hai
2023-05-17  9:08     [PATCH v3 0/4] vhost: add device op to offload the interrupt kick Eelco Chaudron
2023-06-01 20:00  0% ` Maxime Coquelin
2023-06-02  6:20  0%   ` Eelco Chaudron
2023-05-17 16:15     [PATCH 00/20] Replace use of term sanity-check Stephen Hemminger
2023-08-02 23:25     ` [PATCH v4 00/19] replace use of term "sanity check" Stephen Hemminger
2023-08-02 23:25  5%   ` [PATCH v4 01/19] mbuf: replace term sanity check Stephen Hemminger
2023-05-18  7:01     [PATCH v3] net/bonding: replace master/slave to main/member Chaoyong He
2023-05-18  8:44     ` [PATCH v4] " Chaoyong He
2023-05-18 15:39       ` Stephen Hemminger
2023-06-02 15:05  0%     ` Ferruh Yigit
2023-05-19 18:15     [PATCH] ptp: replace terms master/slave Stephen Hemminger
2023-07-05 17:27  3% ` Stephen Hemminger
2023-05-23 19:49     [PATCH 00/13] Add MACsec unit test cases Akhil Goyal
2023-06-07 15:19     ` [PATCH v2 " Akhil Goyal
2023-06-07 15:19  3%   ` [PATCH v2 01/13] security: add direction in SA/SC configuration Akhil Goyal
2023-06-07 19:49  3%     ` David Marchand
2023-06-08  6:58  0%       ` [EXT] " Akhil Goyal
2023-06-08  6:54       ` [PATCH v3 00/13] Add MACsec unit test cases Akhil Goyal
2023-06-08  6:54  3%     ` [PATCH v3 01/13] security: add direction in SA/SC configuration Akhil Goyal
2023-05-24  6:55     [PATCH v1 1/8] ethdev: add IPv6 extension push remove action Ori Kam
2023-05-24  7:39     ` [PATCH v1 0/2] add IPv6 extension push remove Rongwei Liu
2023-06-02 14:39       ` Ferruh Yigit
2023-07-10  2:32         ` Rongwei Liu
2023-07-10  8:55           ` Ferruh Yigit
2023-07-10 14:41  3%         ` Stephen Hemminger
2023-07-11  6:16  0%           ` Thomas Monjalon
2023-05-25 20:39     [PATCH] ethdev: validate reserved fields Stephen Hemminger
2023-05-26  8:15  0% ` Bruce Richardson
2023-06-06 15:24  3% ` Ferruh Yigit
2023-06-06 15:38  0%   ` Stephen Hemminger
2023-05-25 23:23  4% [PATCH v1 0/4] bbdev: API extension for 23.11 Nicolas Chautru
2023-05-26  1:18     [PATCH v3 1/2] cryptodev: support SM3_HMAC,SM4_CFB and SM4_OFB Sunyang Wu
2023-05-26  7:15  4% ` [EXT] " Akhil Goyal
2023-05-29  3:06  4%   ` 回复: " Sunyang Wu
2023-05-26  2:11     [PATCH v1 0/1] doc: accounce change in bbdev extension Nicolas Chautru
2023-05-26  2:11     ` [PATCH v1 1/1] doc: announce change in bbdev api related to operation extension Nicolas Chautru
2023-05-26  3:47       ` Stephen Hemminger
2023-06-05 19:07         ` Maxime Coquelin
2023-06-05 20:08  4%       ` Chautru, Nicolas
2023-06-06  9:20  4%         ` David Marchand
2023-06-06 21:01  0%           ` Chautru, Nicolas
2023-06-08  8:47  0%             ` Maxime Coquelin
2023-06-12 20:53  3%               ` Chautru, Nicolas
2023-06-13  8:14  4%                 ` Maxime Coquelin
2023-06-13 17:16  3%                   ` Chautru, Nicolas
2023-06-13 20:00  4%                     ` Maxime Coquelin
2023-06-13 21:22  3%                       ` Stephen Hemminger
2023-06-14 18:18  0%                       ` Chautru, Nicolas
2023-06-15  7:52  0%                         ` Maxime Coquelin
2023-06-15 19:30  5%                           ` Chautru, Nicolas
2023-06-16  7:36  4%                             ` Maxime Coquelin
2023-06-16 15:48  0%                               ` Chautru, Nicolas
     [not found]     <20220825024425.10534-1-lihuisong@huawei.com>
2023-05-27  2:11  3% ` [PATCH V6 0/5] app/testpmd: support multiple process attach and detach port Huisong Li
2023-05-27  2:11  2%   ` [PATCH V6 2/5] ethdev: fix skip valid port in probing callback Huisong Li
2023-06-06 16:26  0%   ` [PATCH V6 0/5] app/testpmd: support multiple process attach and detach port Ferruh Yigit
2023-06-07 10:14  0%     ` lihuisong (C)
2023-07-14  7:21  0%   ` lihuisong (C)
2023-08-02  3:15  3% ` [PATCH RESEND v6 " Huisong Li
2023-08-02  3:15  2%   ` [PATCH RESEND v6 2/5] ethdev: fix skip valid port in probing callback Huisong Li
2023-05-31  7:08  3% [PATCH] common/sfc_efx/base: update fields name for MARK and FLAG actions Artemii Morozov
2023-06-01 15:43  0% ` Ferruh Yigit
2023-06-02  2:04     [PATCH v1 0/1] bbdev: extend range for alloc function Nicolas Chautru
2023-06-02  2:04     ` [PATCH v1 1/1] bbdev: extend range of allocation function Nicolas Chautru
2023-06-02  7:56  3%   ` Maxime Coquelin
2023-06-02 14:17  3%     ` Chautru, Nicolas
2023-06-05 19:08  3%       ` Maxime Coquelin
2023-06-06 12:11     [PATCH] doc: deprecation notice to add RSS hash algorithm field Dongdong Liu
2023-06-06 15:39     ` Stephen Hemminger
2023-06-06 15:50  3%   ` Ferruh Yigit
2023-06-06 16:35  3%     ` Stephen Hemminger
2023-07-28 15:06  0%       ` Thomas Monjalon
2023-06-07  1:56     [PATCH 00/10] support rte_flow for flower firmware with NFDk Chaoyong He
2023-06-07  1:57 12% ` [PATCH 02/10] net/nfp: add a check function for the NFD version Chaoyong He
2023-06-09 10:51     [PATCH] doc: prefer installing using meson rather than ninja Bruce Richardson
2023-06-09 13:34  3% ` [PATCH v2] " Bruce Richardson
2023-06-09 14:51  3% ` [PATCH v3] " Bruce Richardson
2023-06-23 11:43  4% ` [PATCH v4] " Bruce Richardson
2023-06-09 17:42     [RFC] eventdev: remove single-event enqueue operation Mattias Rönnblom
2023-06-30  4:37  3% ` Jerin Jacob
2023-07-04 12:01  0%   ` Mattias Rönnblom
2023-07-04 11:53  4% ` [PATCH] " Mattias Rönnblom
2023-07-05  7:47  0%   ` Jerin Jacob
2023-07-05  8:41  0%     ` Mattias Rönnblom
2023-06-13  8:17     [PATCH 0/4] Test examples compilation externally David Marchand
2023-06-13  8:17 10% ` [PATCH 4/4] ci: build examples externally David Marchand
2023-06-13 14:06     ` [PATCH v2 0/4] Test examples compilation externally David Marchand
2023-06-13 14:06 10%   ` [PATCH v2 4/4] ci: build examples externally David Marchand
2023-06-20 14:07     ` [PATCH v3 0/4] Test examples compilation externally David Marchand
2023-06-20 14:07 10%   ` [PATCH v3 4/4] ci: build examples externally David Marchand
2023-06-13 15:40     [PATCH v2] bitmap: add scan from offset function Volodymyr Fialko
2023-06-23 12:40     ` [PATCH v3] " Dumitrescu, Cristian
2023-07-03 10:56       ` Volodymyr Fialko
2023-07-03 11:51         ` Thomas Monjalon
2023-07-03 12:02  4%       ` [EXT] " Volodymyr Fialko
2023-07-03 12:17  0%         ` Thomas Monjalon
2023-06-13 16:58  4% [PATCH v3] build: prevent accidentally building without NUMA support Bruce Richardson
2023-06-13 17:08  4% ` [PATCH v4] " Bruce Richardson
2023-06-15 14:38  4% ` [PATCH v5] " Bruce Richardson
2023-06-14 14:26     [PATCH 0/5] cleanup in library header files Thomas Monjalon
2023-06-14 14:26  1% ` [PATCH 1/5] lib: remove blank line ending comment blocks Thomas Monjalon
2023-06-15 16:48  5% [PATCH v2 0/5] bbdev: API extension for 23.11 Nicolas Chautru
2023-06-15 16:49  8% ` [PATCH v2 5/5] devtools: ignore changes into bbdev experimental API Nicolas Chautru
2023-07-17 22:28  0% ` [PATCH v2 0/5] bbdev: API extension for 23.11 Chautru, Nicolas
2023-07-18  9:18  0% ` Hemant Agrawal
2023-06-15 17:59  3% DPDK Release Status Meeting 2023-06-15 Mcnamara, John
2023-06-16  8:37  5% Minutes of Technical Board Meeting 2023-06-14 Richardson, Bruce
2023-06-20 13:29 10% [PATCH] ci: fix libabigail cache in GHA David Marchand
2023-06-20 14:21  0% ` Aaron Conole
2023-06-22 17:41  0%   ` Thomas Monjalon
2023-06-28  6:36     [PATCH 1/2] net/virtio: fix legacy device IO port map in secondary process Miao Li
2023-06-29  2:26     ` [PATCH v2 " Miao Li
2023-07-03  7:47       ` David Marchand
2023-07-03  8:54         ` Li, Miao
2023-07-03  8:57           ` David Marchand
2023-07-03  9:31             ` Xia, Chenbo
2023-07-07 17:03  3%           ` Gupta, Nipun
2023-07-04  8:10  3% [PATCH] doc: announce ethdev operation struct changes Feifei Wang
2023-07-04  8:17  0% ` Feifei Wang
2023-07-13  2:37  0%   ` Feifei Wang
2023-07-13 12:50  0%     ` Morten Brørup
2023-07-17  8:28  0%       ` Andrew Rybchenko
2023-07-05 11:32  0% ` Konstantin Ananyev
2023-07-13  7:52  0%   ` Ferruh Yigit
2023-07-28 14:56  3% ` Thomas Monjalon
2023-07-28 15:04  0%   ` Thomas Monjalon
2023-07-28 15:08  0%   ` Morten Brørup
2023-07-28 15:20  0%     ` Thomas Monjalon
2023-07-28 15:33  0%       ` Morten Brørup
2023-07-28 15:37  0%         ` Thomas Monjalon
2023-07-28 15:55  0%           ` Morten Brørup
2023-08-01  3:19  0%             ` Feifei Wang
2023-07-05  8:48 13% [PATCH] eventdev: announce single-event enqueue/dequeue ABI change Mattias Rönnblom
2023-07-05 11:12 13% ` [PATCH v2] doc: " Mattias Rönnblom
2023-07-05 13:00  4%   ` Jerin Jacob
2023-07-05 13:02  4%     ` [EXT] " Pavan Nikhilesh Bhagavatula
2023-07-28 15:51  4%       ` Thomas Monjalon
2023-07-26 12:04  4%     ` Jerin Jacob
2023-07-12 10:18  8% [PATCH] doc: announce deprecation of RTE_CPUFLAG_NUMFLAGS Sivaprasad Tummala
2023-07-12 10:21  0% ` Ferruh Yigit
2023-07-12 14:51  0%   ` Hemant Agrawal
2023-07-25  8:39  3% ` Ferruh Yigit
2023-07-25  8:40  0%   ` Bruce Richardson
2023-07-25  9:24  0%   ` Morten Brørup
2023-07-25  9:36  0%   ` Kevin Traynor
2023-07-25 14:18  0%   ` Tyler Retzlaff
2023-07-25 14:24  0%     ` Jerin Jacob
2023-07-25 16:45  0%       ` Hemant Agrawal
2023-07-28 10:11  0%         ` Thomas Monjalon
2023-07-12 17:30  5% [PATCH] doc: deprecation notice to add callback data to rte_event_fp_ops Sivaprasad Tummala
2023-07-13  8:51  0% ` Jerin Jacob
2023-07-13 10:38  0%   ` Tummala, Sivaprasad
2023-07-13 10:40  0%     ` Jerin Jacob
2023-07-14 11:32  0%       ` Tummala, Sivaprasad
2023-07-17 11:24  5% ` [PATCH v1] " Sivaprasad Tummala
2023-07-17 11:43  0%   ` Jerin Jacob
2023-07-17 12:42  0%     ` Ferruh Yigit
2023-07-25  8:40  0%   ` Ferruh Yigit
2023-07-25 16:46  0%     ` Hemant Agrawal
2023-07-25 18:44  0%       ` Pavan Nikhilesh Bhagavatula
2023-07-28 15:42  3%     ` Thomas Monjalon
2023-07-14  8:15     [PATCH 0/3] announce bonding macro and function change Chaoyong He
2023-07-14  8:15     ` [PATCH 2/3] doc: announce bonding data change Chaoyong He
2023-07-17 15:03  3%   ` Ferruh Yigit
2023-07-18  1:13  0%     ` Chaoyong He
2023-07-14  8:15     ` [PATCH 3/3] doc: announce bonding function change Chaoyong He
2023-07-17 15:13  3%   ` Ferruh Yigit
2023-07-18  1:15  0%     ` Chaoyong He
2023-07-16 21:25  1% [RFC] MAINTAINERS: add status information Stephen Hemminger
2023-07-19 16:07  1% ` [PATCH v2] " Stephen Hemminger
2023-07-20 17:21  1% ` [PATCH v3] " Stephen Hemminger
2023-07-20 17:45  5% ` [PATCH v2 ] tap: fix build of TAP BPF program Stephen Hemminger
2023-07-20 23:25  4% ` [PATCH v3] " Stephen Hemminger
2023-07-22 16:32  4% ` [PATCH v4] " Stephen Hemminger
2023-07-19 12:30  3% [PATCH 1/1] node: remove MAX macro from all nodes Rakesh Kudurumalla
2023-07-19 15:12     [PATCH] doc: postpone deprecation of pipeline legacy API Cristian Dumitrescu
2023-07-19 16:08  3% ` Bruce Richardson
2023-07-20 10:37  0%   ` Dumitrescu, Cristian
2023-07-28 16:02  0%     ` Thomas Monjalon
2023-07-25 23:04     [PATCH] doc: announce changes to event device structures pbhagavatula
2023-07-26 15:55     ` [PATCH v2] " pbhagavatula
2023-07-27  9:01       ` Jerin Jacob
2023-07-28 15:14  3%     ` Thomas Monjalon
2023-07-26  1:35     [PATCH v3] Add support for IBM Z s390x David Miller
2023-08-02 15:25     ` David Marchand
2023-08-02 15:34  3%   ` David Miller
2023-08-02 15:48  3%     ` David Miller
2023-07-28 14:29 27% [PATCH] doc: announce new major ABI version Thomas Monjalon
2023-07-28 15:18 27% ` [PATCH v2] " Thomas Monjalon
2023-07-28 15:23  4%   ` Bruce Richardson
2023-07-28 16:03  4%     ` Thomas Monjalon
2023-07-28 17:02  7%       ` Patrick Robb
2023-07-28 17:33  4%         ` Thomas Monjalon
2023-07-31  4:42  8%         ` [EXT] " Akhil Goyal
2023-07-28 15:25  4%   ` Morten Brørup
2023-07-28 20:37  3% DPDK 23.07 released Thomas Monjalon
2023-07-29 22:54  1% [PATCH] kni: remove deprecated kernel network interface Stephen Hemminger
2023-07-30  2:12  1% ` [PATCH v2] " Stephen Hemminger
2023-07-30 17:12       ` Stephen Hemminger
2023-07-31  8:40         ` Thomas Monjalon
2023-07-31 15:13  3%       ` Stephen Hemminger
2023-07-31 15:21  4%         ` David Marchand
2023-07-31  9:43  4% [PATCH 0/3] version: 23.11-rc0 David Marchand
2023-07-31  9:43 12% ` [PATCH 1/3] " David Marchand
2023-07-31 10:00  0%   ` Bruce Richardson
2023-07-31 19:03  0%   ` Aaron Conole
2023-07-31  9:43  8% ` [PATCH 2/3] telemetry: remove v23 ABI compatibility David Marchand
2023-07-31 10:01  4%   ` Bruce Richardson
2023-07-31  9:43  8% ` [PATCH 3/3] vhost: " David Marchand
2023-07-31 10:38  4% [PATCH] build: update DPDK to use C11 standard Bruce Richardson
2023-07-31 15:58  4% ` [PATCH v2] " Bruce Richardson
2023-07-31 16:42  0%   ` Tyler Retzlaff
2023-07-31 16:58  4% ` [PATCH v3] " Bruce Richardson
2023-08-01 13:15  4% ` [PATCH v4] " Bruce Richardson
2023-08-02 12:31  4% ` [PATCH v5] " Bruce Richardson
2023-07-31 15:41  3% cmdline programmer documentation Stephen Hemminger
2023-08-01 16:04     [PATCH v2 0/2] Remove disabled functionality Stephen Hemminger
2023-08-01 16:05  1% ` [PATCH v2 2/2] kni: remove deprecated kernel network interface Stephen Hemminger
2023-08-02 20:48     [PATCH] eal/windows: resolve conversion and truncation warnings Tyler Retzlaff
2023-08-02 22:29     ` Dmitry Kozlyuk
2023-08-02 22:41  3%   ` Tyler Retzlaff
2023-08-02 21:11  2% [PATCH 1/2] eal: remove RTE_CPUFLAG_NUMFLAGS Sivaprasad Tummala
2023-08-02 21:11  3% ` [PATCH 2/2] test/cpuflags: " Sivaprasad Tummala

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).