DPDK patches and discussions
 help / color / mirror / Atom feed
Search results ordered by [date|relevance]  view[summary|nested|Atom feed]
thread overview below | download: 
* Re: [dpdk-dev] [PATCH] eal: move DMA mapping from bus-specific to generic driver
  2021-03-31 22:53  4% ` Thomas Monjalon
  2021-04-01  8:40  0%   ` Kinsella, Ray
@ 2021-04-12 15:03  0%   ` Kinsella, Ray
  1 sibling, 0 replies; 200+ results
From: Kinsella, Ray @ 2021-04-12 15:03 UTC (permalink / raw)
  To: Thomas Monjalon
  Cc: dev, hemant.agrawal, rosen.xu, sthemmin, longli, jerinj,
	ferruh.yigit, andrew.rybchenko, Matan Azrad, Shahaf Shuler,
	Viacheslav Ovsiienko, Maxime Coquelin, Chenbo Xia, xuemingl,
	david.marchand

On 31/03/2021 23:53, Thomas Monjalon wrote:
> 01/04/2021 00:45, Thomas Monjalon:
>> The operations of DMA mapping and unmapping are controlled in some
>> bus drivers, following rte_bus specification.
>> If the device driver don't provide any specific mapping operation,
>> the bus driver may have a fallback (VFIO case for PCI).
>>
>> The DMA mapping done by the device drivers are called
>> from the bus drivers via function pointers in bus-specific structures:
>> rte_vdev_driver and rte_pci_driver.
>>
>> The device driver DMA mapping is not specific to the bus,
>> so it can be generalized to all device drivers, based on rte_device.
>> That's why the function pointers dma_map and dma_unmap
>> are moved to rte_driver, avoiding useless casts of device object.
>>
>> The function prototypes rte_dev_dma_map_t and rte_dev_dma_unmap_t
>> are removed from rte_bus.h because the definition in rte_dev.h is enough,
>> but they are still used in rte_bus for bus drivers,
>> while being added in rte_driver for device drivers,
>> and removed from rte_vdev_driver/rte_pci_driver.
>>
>> The impacted device drivers are mlx5 (PCI) and virtio_user (vdev).
>>
>> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
>> ---
>> Depends-on: series-16017 ("pci: add rte prefix")
>> ---
>>  drivers/bus/pci/pci_common.c            |  8 ++--
>>  drivers/bus/pci/rte_bus_pci.h           | 40 --------------------
>>  drivers/bus/vdev/rte_bus_vdev.h         | 40 --------------------
>>  drivers/bus/vdev/vdev.c                 | 32 +++++-----------
>>  drivers/common/mlx5/mlx5_common_pci.c   | 30 ++++++++-------
>>  drivers/net/mlx5/mlx5.c                 |  4 +-
>>  drivers/net/mlx5/mlx5_mr.c              | 50 +++++++++++++------------
>>  drivers/net/mlx5/mlx5_rxtx.h            |  4 +-
>>  drivers/net/virtio/virtio_user_ethdev.c | 22 +++++------
>>  lib/librte_eal/include/rte_bus.h        | 42 ---------------------
>>  lib/librte_eal/include/rte_dev.h        | 49 +++++++++++++++++++++++-
>>  11 files changed, 117 insertions(+), 204 deletions(-)
> 
> The ABI checker reports some issues on the driver interface.
> It needs to be carefully analyzed, because driver interface
> should not be part of the ABI compatibility contract.
> 

The depends-on series-16017 is marked as superseded. 
This patch doesn't apply cleanly, even when the depends-on series is applied before it.

Ray K

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH 2/3] stack: add lock-free support indication
  @ 2021-04-12  8:29  4% ` Stanislaw Kardach
  0 siblings, 0 replies; 200+ results
From: Stanislaw Kardach @ 2021-04-12  8:29 UTC (permalink / raw)
  To: Olivier Matz; +Cc: dev, Stanislaw Kardach, phil.yang, stable

Currently it is impossible to detect programatically whether lock-free
implementation of rte_stack is supported. One could check whether the
header guard for lock-free stubs is defined (_RTE_STACK_LF_STUBS_H_) but
that's an unstable implementation detail. Because of that currently all
lock-free ring creations silently succeed (as long as the stack header
is 16B long) which later leads to push and pop operations being NOPs.
The observable effect is that stack_lf_autotest fails on platforms not
supporting the lock-free. Instead it should just skip the lock-free test
altogether.

This commit adds a new errno value (ENOTSUP) that may be returned by
rte_stack_create() to indicate that a given combination of flags is not
supported on a current platform.
This is detected by checking a compile-time flag in the include logic in
rte_stack_lf.h which may be used by applications to check the lock-free
support at compile time.

Signed-off-by: Stanislaw Kardach <kda@semihalf.com>
Fixes: 7911ba0473e0 ("stack: enable lock-free implementation for aarch64")
Cc: phil.yang@arm.com
Cc: stable@dpdk.org
---
 doc/guides/rel_notes/release_21_05.rst | 4 ++++
 lib/librte_stack/rte_stack.c           | 4 +++-
 lib/librte_stack/rte_stack.h           | 1 +
 lib/librte_stack/rte_stack_lf.h        | 5 +++++
 4 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/doc/guides/rel_notes/release_21_05.rst b/doc/guides/rel_notes/release_21_05.rst
index 6f5858c8f..42ed60da8 100644
--- a/doc/guides/rel_notes/release_21_05.rst
+++ b/doc/guides/rel_notes/release_21_05.rst
@@ -166,6 +166,10 @@ API Changes
 * pci: The value ``PCI_ANY_ID`` is marked as deprecated
   and can be replaced with ``RTE_PCI_ANY_ID``.
 
+* Lock-free ``rte_stack`` no longer silently ignores push and pop when it's not
+  supported on the current platform. Instead ``rte_stack_create()`` fails and
+  ``rte_errno`` is set to ``ENOTSUP``.
+
 
 ABI Changes
 -----------
diff --git a/lib/librte_stack/rte_stack.c b/lib/librte_stack/rte_stack.c
index 8a51fba17..10d3b2eeb 100644
--- a/lib/librte_stack/rte_stack.c
+++ b/lib/librte_stack/rte_stack.c
@@ -64,9 +64,11 @@ rte_stack_create(const char *name, unsigned int count, int socket_id,
 
 #ifdef RTE_ARCH_64
 	RTE_BUILD_BUG_ON(sizeof(struct rte_stack_lf_head) != 16);
-#else
+#endif
+#if !defined(RTE_STACK_LF_SUPPORTED)
 	if (flags & RTE_STACK_F_LF) {
 		STACK_LOG_ERR("Lock-free stack is not supported on your platform\n");
+		rte_errno = ENOTSUP;
 		return NULL;
 	}
 #endif
diff --git a/lib/librte_stack/rte_stack.h b/lib/librte_stack/rte_stack.h
index b82c74e72..27640f87b 100644
--- a/lib/librte_stack/rte_stack.h
+++ b/lib/librte_stack/rte_stack.h
@@ -205,6 +205,7 @@ rte_stack_free_count(struct rte_stack *s)
  *    - EEXIST - a stack with the same name already exists
  *    - ENOMEM - insufficient memory to create the stack
  *    - ENAMETOOLONG - name size exceeds RTE_STACK_NAMESIZE
+ *    - ENOTSUP - platform does not support given flags combination.
  */
 struct rte_stack *
 rte_stack_create(const char *name, unsigned int count, int socket_id,
diff --git a/lib/librte_stack/rte_stack_lf.h b/lib/librte_stack/rte_stack_lf.h
index eb106e64e..f2b012cd0 100644
--- a/lib/librte_stack/rte_stack_lf.h
+++ b/lib/librte_stack/rte_stack_lf.h
@@ -13,6 +13,11 @@
 #else
 #include "rte_stack_lf_generic.h"
 #endif
+
+/**
+ * Indicates that RTE_STACK_F_LF is supported.
+ */
+#define RTE_STACK_LF_SUPPORTED
 #endif
 
 /**
-- 
2.27.0


^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v2 1/4] ethdev: introduce indirect action APIs
  @ 2021-04-10 14:03  4%     ` Bing Zhao
  0 siblings, 0 replies; 200+ results
From: Bing Zhao @ 2021-04-10 14:03 UTC (permalink / raw)
  To: orika, thomas, ferruh.yigit, andrew.rybchenko, matan, viacheslavo
  Cc: dev, ajit.khaparde, getelson, andreyv

Right now, rte_flow_shared_action_* APIs are used for some shared
actions, like RSS, count. The shared action should be created before
using it inside a flow. These shared actions sometimes are not
really shared but just some indirect actions decoupled from a flow.

The new functions rte_flow_action_handle_* are added to replace
the current shared functions rte_flow_shared_action_*.

There are two types of flow actions:
1. the direct (normal) actions that could be created and stored
   within a flow rule. Such action is tied to its flow rule and
   cannot be reused.
2. the indirect action, in the past, named shared_action. It is
   created from a direct actioni, like count or rss, and then used
   in the flow rules with an object handle. The PMD will take care
   of the retrieve from indirect action to the direct action
   when it is referenced.

The indirect action is accessed (update / query) w/o any flow rule,
just via the action object handle. For example, when querying or
resetting a counter, it could be done out of any flow using this
counter, but only the handle of the counter action object is
required.
The indirect action object could be shared by different flows or
used by a single flow, depending on the direct action type and
the real-life requirements.
The handle of an indirect action object is opaque and defined in
each driver and possibly different per direct action type.

The old name "shared" is improper in a sense and should be replaced.

All the command lines in testpmd application with "shared_action*"
are replaced with "indirect_action*".

The parameter of "update" interface is also changed. A general
pointer will replace the rte_flow_action struct pointer due to the
facts:
1. Some action may not support fields updating. In the example of a
   counter, the only "update" supported should be the reset. So
   passing a rte_flow_action struct pointer is meaningless and
   there is even no such corresponding action struct. What's more,
   if more than one operations should be supported, for some other
   action, such pointer parameter may not meet the need.
2. Some action may need conditional or partial update, the current
   parameter will not provide the ability to indicate which part(s)
   to update.
   For different types of indirect action objects, the pointer could
   either be the same of rte_flow_action* struct - in order not to
   break the current driver implementation, or some wrapper
   structures with bits as masks to indicate which part to be
   updated, depending on real needs of the corresponding direct
   action. For different direct actions, the structures of indirect
   action objects updating will be different.

All the underlayer PMD callbacks will be moved to these new APIs.

The RTE_FLOW_ACTION_TYPE_SHARED is kept for now in order not to
break the ABI. All the implementations are changed by using
RTE_FLOW_ACTION_TYPE_INDIRECT.

Signed-off-by: Bing Zhao <bingz@nvidia.com>
---
 doc/guides/rel_notes/release_21_05.rst |   3 +
 lib/librte_ethdev/rte_flow.c           |  56 ++++++++--------
 lib/librte_ethdev/rte_flow.h           | 118 +++++++++++++++++++--------------
 lib/librte_ethdev/rte_flow_driver.h    |  26 ++++----
 lib/librte_ethdev/version.map          |   8 +--
 5 files changed, 115 insertions(+), 96 deletions(-)

diff --git a/doc/guides/rel_notes/release_21_05.rst b/doc/guides/rel_notes/release_21_05.rst
index 374d6d9..6c0ac46 100644
--- a/doc/guides/rel_notes/release_21_05.rst
+++ b/doc/guides/rel_notes/release_21_05.rst
@@ -164,6 +164,9 @@ API Changes
   from ``rte_thread_tls_*`` to ``rte_thread_*`` to avoid naming redundancy
   and confusion with the transport layer security term.
 
+* ethdev: The experimental shared action APIs in ``rte_flow.h`` has been
+  replaced from ``rte_flow_shared_action_*`` to indirect action APIs named
+  ``rte_flow_action_handle_*``.
 
 ABI Changes
 -----------
diff --git a/lib/librte_ethdev/rte_flow.c b/lib/librte_ethdev/rte_flow.c
index e07e617..27a1615 100644
--- a/lib/librte_ethdev/rte_flow.c
+++ b/lib/librte_ethdev/rte_flow.c
@@ -180,12 +180,12 @@ struct rte_flow_desc_data {
 	MK_FLOW_ACTION(MODIFY_FIELD,
 		       sizeof(struct rte_flow_action_modify_field)),
 	/**
-	 * Shared action represented as handle of type
-	 * (struct rte_flow_shared action *) stored in conf field (see
+	 * Indirect action represented as handle of type
+	 * (struct rte_flow_action_handle *) stored in conf field (see
 	 * struct rte_flow_action); no need for additional structure to * store
-	 * shared action handle.
+	 * indirect action handle.
 	 */
-	MK_FLOW_ACTION(SHARED, 0),
+	MK_FLOW_ACTION(INDIRECT, 0),
 };
 
 int
@@ -1067,53 +1067,53 @@ enum rte_flow_conv_item_spec_type {
 				  NULL, rte_strerror(ENOTSUP));
 }
 
-struct rte_flow_shared_action *
-rte_flow_shared_action_create(uint16_t port_id,
-			      const struct rte_flow_shared_action_conf *conf,
+struct rte_flow_action_handle *
+rte_flow_action_handle_create(uint16_t port_id,
+			      const struct rte_flow_indir_action_conf *conf,
 			      const struct rte_flow_action *action,
 			      struct rte_flow_error *error)
 {
-	struct rte_flow_shared_action *shared_action;
+	struct rte_flow_action_handle *handle;
 	const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
 
 	if (unlikely(!ops))
 		return NULL;
-	if (unlikely(!ops->shared_action_create)) {
+	if (unlikely(!ops->action_handle_create)) {
 		rte_flow_error_set(error, ENOSYS,
 				   RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,
 				   rte_strerror(ENOSYS));
 		return NULL;
 	}
-	shared_action = ops->shared_action_create(&rte_eth_devices[port_id],
-						  conf, action, error);
-	if (shared_action == NULL)
+	handle = ops->action_handle_create(&rte_eth_devices[port_id],
+					   conf, action, error);
+	if (handle == NULL)
 		flow_err(port_id, -rte_errno, error);
-	return shared_action;
+	return handle;
 }
 
 int
-rte_flow_shared_action_destroy(uint16_t port_id,
-			      struct rte_flow_shared_action *action,
-			      struct rte_flow_error *error)
+rte_flow_action_handle_destroy(uint16_t port_id,
+			       struct rte_flow_action_handle *handle,
+			       struct rte_flow_error *error)
 {
 	int ret;
 	const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
 
 	if (unlikely(!ops))
 		return -rte_errno;
-	if (unlikely(!ops->shared_action_destroy))
+	if (unlikely(!ops->action_handle_destroy))
 		return rte_flow_error_set(error, ENOSYS,
 					  RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
 					  NULL, rte_strerror(ENOSYS));
-	ret = ops->shared_action_destroy(&rte_eth_devices[port_id], action,
-					 error);
+	ret = ops->action_handle_destroy(&rte_eth_devices[port_id],
+					 handle, error);
 	return flow_err(port_id, ret, error);
 }
 
 int
-rte_flow_shared_action_update(uint16_t port_id,
-			      struct rte_flow_shared_action *action,
-			      const struct rte_flow_action *update,
+rte_flow_action_handle_update(uint16_t port_id,
+			      struct rte_flow_action_handle *handle,
+			      const void *update,
 			      struct rte_flow_error *error)
 {
 	int ret;
@@ -1121,18 +1121,18 @@ struct rte_flow_shared_action *
 
 	if (unlikely(!ops))
 		return -rte_errno;
-	if (unlikely(!ops->shared_action_update))
+	if (unlikely(!ops->action_handle_update))
 		return rte_flow_error_set(error, ENOSYS,
 					  RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
 					  NULL, rte_strerror(ENOSYS));
-	ret = ops->shared_action_update(&rte_eth_devices[port_id], action,
+	ret = ops->action_handle_update(&rte_eth_devices[port_id], handle,
 					update, error);
 	return flow_err(port_id, ret, error);
 }
 
 int
-rte_flow_shared_action_query(uint16_t port_id,
-			     const struct rte_flow_shared_action *action,
+rte_flow_action_handle_query(uint16_t port_id,
+			     const struct rte_flow_action_handle *handle,
 			     void *data,
 			     struct rte_flow_error *error)
 {
@@ -1141,11 +1141,11 @@ struct rte_flow_shared_action *
 
 	if (unlikely(!ops))
 		return -rte_errno;
-	if (unlikely(!ops->shared_action_query))
+	if (unlikely(!ops->action_handle_query))
 		return rte_flow_error_set(error, ENOSYS,
 					  RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
 					  NULL, rte_strerror(ENOSYS));
-	ret = ops->shared_action_query(&rte_eth_devices[port_id], action,
+	ret = ops->action_handle_query(&rte_eth_devices[port_id], handle,
 				       data, error);
 	return flow_err(port_id, ret, error);
 }
diff --git a/lib/librte_ethdev/rte_flow.h b/lib/librte_ethdev/rte_flow.h
index 6cc5713..91ae25b 100644
--- a/lib/librte_ethdev/rte_flow.h
+++ b/lib/librte_ethdev/rte_flow.h
@@ -1821,7 +1821,7 @@ enum rte_flow_action_type {
 	 * Enables counters for this flow rule.
 	 *
 	 * These counters can be retrieved and reset through rte_flow_query() or
-	 * rte_flow_shared_action_query() if the action provided via handle,
+	 * rte_flow_action_handle_query() if the action provided via handle,
 	 * see struct rte_flow_query_count.
 	 *
 	 * See struct rte_flow_action_count.
@@ -2267,6 +2267,16 @@ enum rte_flow_action_type {
 	 * See struct rte_flow_action_modify_field.
 	 */
 	RTE_FLOW_ACTION_TYPE_MODIFY_FIELD,
+
+	/**
+	 * Describe indirect action that could be used by a single flow rule
+	 * or multiple flow rules.
+	 *
+	 * Allow flow rule(s) reference the same action by the indirect action
+	 * handle (see struct rte_flow_action_handle), rules could be on the
+	 * same port or across different ports.
+	 */
+	RTE_FLOW_ACTION_TYPE_INDIRECT,
 };
 
 /**
@@ -2357,7 +2367,7 @@ struct rte_flow_query_age {
  * ``struct rte_flow_query_count``.
  *
  * @deprecated Shared attribute is deprecated, use generic
- * RTE_FLOW_ACTION_TYPE_SHARED action.
+ * RTE_FLOW_ACTION_TYPE_INDIRECT action.
  *
  * The shared flag indicates whether the counter is unique to the flow rule the
  * action is specified with, or whether it is a shared counter.
@@ -2847,17 +2857,23 @@ struct rte_flow_action_set_dscp {
 };
 
 /**
- * RTE_FLOW_ACTION_TYPE_SHARED
+ * @warning
+ * @b EXPERIMENTAL: this structure may change without prior notice
+ *
+ * RTE_FLOW_ACTION_TYPE_INDIRECT
  *
- * Opaque type returned after successfully creating a shared action.
+ * Opaque type returned after successfully creating an indirect action object.
+ * The definition of the object handle will be different per driver or
+ * per immediate action type.
  *
- * This handle can be used to manage and query the related action:
- * - share it across multiple flow rules
- * - update action configuration
- * - query action data
- * - destroy action
+ * This handle can be used to manage and query the related immediate action:
+ * - referenced in single flow rule or across multiple flow rules
+ *   over multiple ports
+ * - update action object configuration
+ * - query action object data
+ * - destroy action object
  */
-struct rte_flow_shared_action;
+struct rte_flow_action_handle;
 
 /**
  * Field IDs for MODIFY_FIELD action.
@@ -3628,25 +3644,22 @@ struct rte_flow_desc {
 			uint32_t nb_contexts, struct rte_flow_error *error);
 
 /**
- * Specify shared action configuration
+ * Specify indirect action object configuration
  */
-struct rte_flow_shared_action_conf {
+struct rte_flow_indir_action_conf {
 	/**
-	 * Flow direction for shared action configuration.
+	 * Flow direction for the indirect action configuration.
 	 *
-	 * Shared action should be valid at least for one flow direction,
+	 * Action should be valid at least for one flow direction,
 	 * otherwise it is invalid for both ingress and egress rules.
 	 */
 	uint32_t ingress:1;
 	/**< Action valid for rules applied to ingress traffic. */
 	uint32_t egress:1;
 	/**< Action valid for rules applied to egress traffic. */
-
 	/**
 	 * When set to 1, indicates that the action is valid for
 	 * transfer traffic; otherwise, for non-transfer traffic.
-	 *
-	 * See struct rte_flow_attr.
 	 */
 	uint32_t transfer:1;
 };
@@ -3655,16 +3668,17 @@ struct rte_flow_shared_action_conf {
  * @warning
  * @b EXPERIMENTAL: this API may change without prior notice.
  *
- * Create shared action for reuse in multiple flow rules.
- * The created shared action has single state and configuration
- * across all flow rules using it.
+ * Create an indirect action object that can be used by flow create, and
+ * could also be shared by different flows.
+ * The created object handle has single state and configuration
+ * across all the flow rules using it.
  *
  * @param[in] port_id
  *    The port identifier of the Ethernet device.
  * @param[in] conf
- *   Shared action configuration.
+ *   Action configuration for the indirect action object creation.
  * @param[in] action
- *   Action configuration for shared action creation.
+ *   Specific configuration of the indirect action object.
  * @param[out] error
  *   Perform verbose error reporting if not NULL. PMDs initialize this
  *   structure in case of error only.
@@ -3678,9 +3692,9 @@ struct rte_flow_shared_action_conf {
  *   - (ENOTSUP) if *action* valid but unsupported.
  */
 __rte_experimental
-struct rte_flow_shared_action *
-rte_flow_shared_action_create(uint16_t port_id,
-			      const struct rte_flow_shared_action_conf *conf,
+struct rte_flow_action_handle *
+rte_flow_action_handle_create(uint16_t port_id,
+			      const struct rte_flow_indir_action_conf *conf,
 			      const struct rte_flow_action *action,
 			      struct rte_flow_error *error);
 
@@ -3688,12 +3702,12 @@ struct rte_flow_shared_action *
  * @warning
  * @b EXPERIMENTAL: this API may change without prior notice.
  *
- * Destroy the shared action by handle.
+ * Destroy indirect action by handle.
  *
  * @param[in] port_id
  *    The port identifier of the Ethernet device.
- * @param[in] action
- *   Handle for the shared action to be destroyed.
+ * @param[in] handle
+ *   Handle for the indirect action object to be destroyed.
  * @param[out] error
  *   Perform verbose error reporting if not NULL. PMDs initialize this
  *   structure in case of error only.
@@ -3708,27 +3722,30 @@ struct rte_flow_shared_action *
  */
 __rte_experimental
 int
-rte_flow_shared_action_destroy(uint16_t port_id,
-			       struct rte_flow_shared_action *action,
+rte_flow_action_handle_destroy(uint16_t port_id,
+			       struct rte_flow_action_handle *handle,
 			       struct rte_flow_error *error);
 
 /**
  * @warning
  * @b EXPERIMENTAL: this API may change without prior notice.
  *
- * Update in-place the shared action configuration pointed by *action* handle
- * with the configuration provided as *update* argument.
- * The update of the shared action configuration effects all flow rules reusing
- * the action via handle.
+ * Update in-place the action configuration and / or state pointed
+ * by action *handle* with the configuration provided as *update* argument.
+ * The update of the action configuration effects all flow rules reusing
+ * the action via *handle*.
+ * The update general pointer provides the ability of partial updating.
  *
  * @param[in] port_id
  *    The port identifier of the Ethernet device.
- * @param[in] action
- *   Handle for the shared action to be updated.
+ * @param[in] handle
+ *   Handle for the indirect action object to be updated.
  * @param[in] update
- *   Action specification used to modify the action pointed by handle.
- *   *update* should be of same type with the action pointed by the *action*
- *   handle argument, otherwise considered as invalid.
+ *   Update profile specification used to modify the action pointed by handle.
+ *   *update* could be with the same type of the immediate action corresponding
+ *   to the *handle* argument when creating, or a wrapper structure includes
+ *   action configuration to be updated and bit fields to indicate the member
+ *   of fields inside the action to update.
  * @param[out] error
  *   Perform verbose error reporting if not NULL. PMDs initialize this
  *   structure in case of error only.
@@ -3739,32 +3756,32 @@ struct rte_flow_shared_action *
  *   - (-EIO) if underlying device is removed.
  *   - (-EINVAL) if *update* invalid.
  *   - (-ENOTSUP) if *update* valid but unsupported.
- *   - (-ENOENT) if action pointed by *ctx* was not found.
+ *   - (-ENOENT) if indirect action object pointed by *handle* was not found.
  *   rte_errno is also set.
  */
 __rte_experimental
 int
-rte_flow_shared_action_update(uint16_t port_id,
-			      struct rte_flow_shared_action *action,
-			      const struct rte_flow_action *update,
+rte_flow_action_handle_update(uint16_t port_id,
+			      struct rte_flow_action_handle *handle,
+			      const void *update,
 			      struct rte_flow_error *error);
 
 /**
  * @warning
  * @b EXPERIMENTAL: this API may change without prior notice.
  *
- * Query the shared action by handle.
+ * Query the direct action by corresponding indirect action object handle.
  *
  * Retrieve action-specific data such as counters.
  * Data is gathered by special action which may be present/referenced in
  * more than one flow rule definition.
  *
- * \see RTE_FLOW_ACTION_TYPE_COUNT
+ * @see RTE_FLOW_ACTION_TYPE_COUNT
  *
  * @param port_id
  *   Port identifier of Ethernet device.
- * @param[in] action
- *   Handle for the shared action to query.
+ * @param[in] handle
+ *   Handle for the action object to query.
  * @param[in, out] data
  *   Pointer to storage for the associated query data type.
  * @param[out] error
@@ -3776,10 +3793,9 @@ struct rte_flow_shared_action *
  */
 __rte_experimental
 int
-rte_flow_shared_action_query(uint16_t port_id,
-			     const struct rte_flow_shared_action *action,
-			     void *data,
-			     struct rte_flow_error *error);
+rte_flow_action_handle_query(uint16_t port_id,
+			     const struct rte_flow_action_handle *handle,
+			     void *data, struct rte_flow_error *error);
 
 /* Tunnel has a type and the key information. */
 struct rte_flow_tunnel {
diff --git a/lib/librte_ethdev/rte_flow_driver.h b/lib/librte_ethdev/rte_flow_driver.h
index da594d9..8d825eb 100644
--- a/lib/librte_ethdev/rte_flow_driver.h
+++ b/lib/librte_ethdev/rte_flow_driver.h
@@ -83,27 +83,27 @@ struct rte_flow_ops {
 		 void **context,
 		 uint32_t nb_contexts,
 		 struct rte_flow_error *err);
-	/** See rte_flow_shared_action_create() */
-	struct rte_flow_shared_action *(*shared_action_create)
+	/** See rte_flow_action_handle_create() */
+	struct rte_flow_action_handle *(*action_handle_create)
 		(struct rte_eth_dev *dev,
-		 const struct rte_flow_shared_action_conf *conf,
+		 const struct rte_flow_indir_action_conf *conf,
 		 const struct rte_flow_action *action,
 		 struct rte_flow_error *error);
-	/** See rte_flow_shared_action_destroy() */
-	int (*shared_action_destroy)
+	/** See rte_flow_action_handle_destroy() */
+	int (*action_handle_destroy)
 		(struct rte_eth_dev *dev,
-		 struct rte_flow_shared_action *shared_action,
+		 struct rte_flow_action_handle *handle,
 		 struct rte_flow_error *error);
-	/** See rte_flow_shared_action_update() */
-	int (*shared_action_update)
+	/** See rte_flow_action_handle_update() */
+	int (*action_handle_update)
 		(struct rte_eth_dev *dev,
-		 struct rte_flow_shared_action *shared_action,
-		 const struct rte_flow_action *update,
+		 struct rte_flow_action_handle *handle,
+		 const void *update,
 		 struct rte_flow_error *error);
-	/** See rte_flow_shared_action_query() */
-	int (*shared_action_query)
+	/** See rte_flow_action_handle_query() */
+	int (*action_handle_query)
 		(struct rte_eth_dev *dev,
-		 const struct rte_flow_shared_action *shared_action,
+		 const struct rte_flow_action_handle *handle,
 		 void *data,
 		 struct rte_flow_error *error);
 	/** See rte_flow_tunnel_decap_set() */
diff --git a/lib/librte_ethdev/version.map b/lib/librte_ethdev/version.map
index 93ad388..4eb561a 100644
--- a/lib/librte_ethdev/version.map
+++ b/lib/librte_ethdev/version.map
@@ -231,10 +231,6 @@ EXPERIMENTAL {
 	rte_eth_fec_get_capability;
 	rte_eth_fec_get;
 	rte_eth_fec_set;
-	rte_flow_shared_action_create;
-	rte_flow_shared_action_destroy;
-	rte_flow_shared_action_query;
-	rte_flow_shared_action_update;
 	rte_flow_tunnel_decap_set;
 	rte_flow_tunnel_match;
 	rte_flow_get_restore_info;
@@ -246,6 +242,10 @@ EXPERIMENTAL {
 
 	# added in 21.05
 	rte_eth_representor_info_get;
+	rte_flow_action_handle_create;
+	rte_flow_action_handle_destroy;
+	rte_flow_action_handle_update;
+	rte_flow_action_handle_query;
 };
 
 INTERNAL {
-- 
1.8.3.1


^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH] ethdev: introduce indirect action APIs
       [not found]     <1615967952-228321-1-git-send-email-bingz@nvidia.com>
  2021-04-08 14:46  2% ` [dpdk-dev] [RFC PATCH v2] ethdev: introduce indirect action APIs Bing Zhao
@ 2021-04-09  3:54  4% ` Bing Zhao
    1 sibling, 1 reply; 200+ results
From: Bing Zhao @ 2021-04-09  3:54 UTC (permalink / raw)
  To: orika, thomas, ferruh.yigit, andrew.rybchenko; +Cc: dev, ajit.khaparde

Right now, rte_flow_shared_action_* APIs are used for some shared
actions, like RSS, count. The shared action shoule be created before
using it inside a flow. These shared actions sometimes are not
really shared but just some indirect actions decoupled from a flow.

The new functions rte_flow_action_handle_* are added to replace
the current shared functions rte_flow_shared_action_*.

There are two types of flow actions:
1. the direct (normal) actions that could be created and stored
   within a flow rule. Such action is tied to its flow rule and
   cannot be reused.
2. the indirect action, in the past, named shared_action. It is
   created from a direct actioni, like count or rss, and then used
   in the flow rules with an object handle. The PMD will take care
   of the retrieve from indirect action to the direct action
   when it is referenced.

The indirect action is accessed (update / query) w/o any flow rule,
just via the action object handle. For example, when querying or
resetting a counter, it could be done out of any flow using this
counter, but only the handle of the counter action object is
required.
The indirect action object could be shared by different flows or
used by a single flow, depending on the direct action type and
the real-life requirements.
The handle of an indirect action object is opaque and defined in
each driver and possibly different per direct action type.

The old name "shared" is improper in a sense and should be replaced.

All the command lines in testpmd application with "shared_action*"
are replaced with "indirect_action*".

The parameter of "update" interface is also changed. A general
pointer will replace the rte_flow_action struct pointer due to the
facts:
1. Some action may not support fields updating. In the example of a
   counter, the only "update" supported should be the reset. So
   passing a rte_flow_action struct pointer is meaningless and
   there is even no such corresponding action struct. What's more,
   if more than one operations should be supported, for some other
   action, such pointer paramter may not meet the need.
2. Some action may need conditional or partial update, the current
   parameter will not provide the ability to indicate which part(s)
   to update.
   For different types of indirect action objects, the pointer could
   either be the same of rte_flow_action* struct - in order not to
   break the current driver implementation, or some wrapper
   structures with bits as masks to indicate which part to be
   updated, depending on real needs of the corresponding direct
   action. For different direct actions, the structures of indirect
   action objects updating will be different.

All the underlayer PMD callbacks will be moved to these new APIs.

The RTE_FLOW_ACTION_TYPE_SHARED is kept for now in order not to
break the ABI. All the implementations are changed by using
RTE_FLOW_ACTION_TYPE_INDIRECT.

Signed-off-by: Bing Zhao <bingz@nvidia.com>
---
 doc/guides/rel_notes/release_21_05.rst |   3 +
 lib/librte_ethdev/rte_flow.c           |  48 +++++------
 lib/librte_ethdev/rte_flow.h           | 114 ++++++++++++++-----------
 lib/librte_ethdev/rte_flow_driver.h    |  26 +++---
 lib/librte_ethdev/version.map          |   8 +-
 5 files changed, 109 insertions(+), 90 deletions(-)

diff --git a/doc/guides/rel_notes/release_21_05.rst b/doc/guides/rel_notes/release_21_05.rst
index 6f5858c8f6..abdaf90b3f 100644
--- a/doc/guides/rel_notes/release_21_05.rst
+++ b/doc/guides/rel_notes/release_21_05.rst
@@ -166,6 +166,9 @@ API Changes
 * pci: The value ``PCI_ANY_ID`` is marked as deprecated
   and can be replaced with ``RTE_PCI_ANY_ID``.
 
+* ethdev: The experimental shared action APIs in ``rte_flow.h`` has been
+  replaced from ``rte_flow_shared_action_*`` to indirect action APIs named
+  ``rte_flow_action_handle_*``.
 
 ABI Changes
 -----------
diff --git a/lib/librte_ethdev/rte_flow.c b/lib/librte_ethdev/rte_flow.c
index e07e617d74..5ae9397440 100644
--- a/lib/librte_ethdev/rte_flow.c
+++ b/lib/librte_ethdev/rte_flow.c
@@ -1067,53 +1067,53 @@ rte_flow_get_aged_flows(uint16_t port_id, void **contexts,
 				  NULL, rte_strerror(ENOTSUP));
 }
 
-struct rte_flow_shared_action *
-rte_flow_shared_action_create(uint16_t port_id,
-			      const struct rte_flow_shared_action_conf *conf,
+struct rte_flow_action_handle *
+rte_flow_action_handle_create(uint16_t port_id,
+			      const struct rte_flow_indir_action_conf *conf,
 			      const struct rte_flow_action *action,
 			      struct rte_flow_error *error)
 {
-	struct rte_flow_shared_action *shared_action;
+	struct rte_flow_action_handle *handle;
 	const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
 
 	if (unlikely(!ops))
 		return NULL;
-	if (unlikely(!ops->shared_action_create)) {
+	if (unlikely(!ops->action_handle_create)) {
 		rte_flow_error_set(error, ENOSYS,
 				   RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,
 				   rte_strerror(ENOSYS));
 		return NULL;
 	}
-	shared_action = ops->shared_action_create(&rte_eth_devices[port_id],
-						  conf, action, error);
-	if (shared_action == NULL)
+	handle = ops->action_handle_create(&rte_eth_devices[port_id],
+					   conf, action, error);
+	if (handle == NULL)
 		flow_err(port_id, -rte_errno, error);
-	return shared_action;
+	return handle;
 }
 
 int
-rte_flow_shared_action_destroy(uint16_t port_id,
-			      struct rte_flow_shared_action *action,
-			      struct rte_flow_error *error)
+rte_flow_action_handle_destroy(uint16_t port_id,
+			       struct rte_flow_action_handle *handle,
+			       struct rte_flow_error *error)
 {
 	int ret;
 	const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
 
 	if (unlikely(!ops))
 		return -rte_errno;
-	if (unlikely(!ops->shared_action_destroy))
+	if (unlikely(!ops->action_handle_destroy))
 		return rte_flow_error_set(error, ENOSYS,
 					  RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
 					  NULL, rte_strerror(ENOSYS));
-	ret = ops->shared_action_destroy(&rte_eth_devices[port_id], action,
-					 error);
+	ret = ops->action_handle_destroy(&rte_eth_devices[port_id],
+					 handle, error);
 	return flow_err(port_id, ret, error);
 }
 
 int
-rte_flow_shared_action_update(uint16_t port_id,
-			      struct rte_flow_shared_action *action,
-			      const struct rte_flow_action *update,
+rte_flow_action_handle_update(uint16_t port_id,
+			      struct rte_flow_action_handle *handle,
+			      const void *update,
 			      struct rte_flow_error *error)
 {
 	int ret;
@@ -1121,18 +1121,18 @@ rte_flow_shared_action_update(uint16_t port_id,
 
 	if (unlikely(!ops))
 		return -rte_errno;
-	if (unlikely(!ops->shared_action_update))
+	if (unlikely(!ops->action_handle_update))
 		return rte_flow_error_set(error, ENOSYS,
 					  RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
 					  NULL, rte_strerror(ENOSYS));
-	ret = ops->shared_action_update(&rte_eth_devices[port_id], action,
+	ret = ops->action_handle_update(&rte_eth_devices[port_id], handle,
 					update, error);
 	return flow_err(port_id, ret, error);
 }
 
 int
-rte_flow_shared_action_query(uint16_t port_id,
-			     const struct rte_flow_shared_action *action,
+rte_flow_action_handle_query(uint16_t port_id,
+			     const struct rte_flow_action_handle *handle,
 			     void *data,
 			     struct rte_flow_error *error)
 {
@@ -1141,11 +1141,11 @@ rte_flow_shared_action_query(uint16_t port_id,
 
 	if (unlikely(!ops))
 		return -rte_errno;
-	if (unlikely(!ops->shared_action_query))
+	if (unlikely(!ops->action_handle_query))
 		return rte_flow_error_set(error, ENOSYS,
 					  RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
 					  NULL, rte_strerror(ENOSYS));
-	ret = ops->shared_action_query(&rte_eth_devices[port_id], action,
+	ret = ops->action_handle_query(&rte_eth_devices[port_id], handle,
 				       data, error);
 	return flow_err(port_id, ret, error);
 }
diff --git a/lib/librte_ethdev/rte_flow.h b/lib/librte_ethdev/rte_flow.h
index 6cc57136ac..880e0b50fb 100644
--- a/lib/librte_ethdev/rte_flow.h
+++ b/lib/librte_ethdev/rte_flow.h
@@ -2267,6 +2267,16 @@ enum rte_flow_action_type {
 	 * See struct rte_flow_action_modify_field.
 	 */
 	RTE_FLOW_ACTION_TYPE_MODIFY_FIELD,
+
+	/**
+	 * Describe indirect action that could be used by a single flow rule
+	 * or multiple flow rules.
+	 *
+	 * Allow flow rule(s) reference the same action by the indirect action
+	 * handle (see struct rte_flow_action_handle), rules could be on the
+	 * same port or across different ports.
+	 */
+	RTE_FLOW_ACTION_TYPE_INDIRECT,
 };
 
 /**
@@ -2847,17 +2857,23 @@ struct rte_flow_action_set_dscp {
 };
 
 /**
- * RTE_FLOW_ACTION_TYPE_SHARED
+ * @warning
+ * @b EXPERIMENTAL: this structure may change without prior notice
+ *
+ * RTE_FLOW_ACTION_TYPE_INDIRECT
  *
- * Opaque type returned after successfully creating a shared action.
+ * Opaque type returned after successfully creating an indirect action object.
+ * The definition of the object handle will be different per driver or
+ * per immediate action type.
  *
- * This handle can be used to manage and query the related action:
- * - share it across multiple flow rules
- * - update action configuration
- * - query action data
- * - destroy action
+ * This handle can be used to manage and query the related immediate action:
+ * - referenced in single flow rule or across multiple flow rules
+ *   over multiple ports
+ * - update action object configuration
+ * - query action object data
+ * - destroy action object
  */
-struct rte_flow_shared_action;
+struct rte_flow_action_handle;
 
 /**
  * Field IDs for MODIFY_FIELD action.
@@ -3628,25 +3644,22 @@ rte_flow_get_aged_flows(uint16_t port_id, void **contexts,
 			uint32_t nb_contexts, struct rte_flow_error *error);
 
 /**
- * Specify shared action configuration
+ * Specify indirect action object configuration
  */
-struct rte_flow_shared_action_conf {
+struct rte_flow_indir_action_conf {
 	/**
-	 * Flow direction for shared action configuration.
+	 * Flow direction for the indirect action configuration.
 	 *
-	 * Shared action should be valid at least for one flow direction,
+	 * Action should be valid at least for one flow direction,
 	 * otherwise it is invalid for both ingress and egress rules.
 	 */
 	uint32_t ingress:1;
 	/**< Action valid for rules applied to ingress traffic. */
 	uint32_t egress:1;
 	/**< Action valid for rules applied to egress traffic. */
-
 	/**
 	 * When set to 1, indicates that the action is valid for
 	 * transfer traffic; otherwise, for non-transfer traffic.
-	 *
-	 * See struct rte_flow_attr.
 	 */
 	uint32_t transfer:1;
 };
@@ -3655,16 +3668,17 @@ struct rte_flow_shared_action_conf {
  * @warning
  * @b EXPERIMENTAL: this API may change without prior notice.
  *
- * Create shared action for reuse in multiple flow rules.
- * The created shared action has single state and configuration
- * across all flow rules using it.
+ * Create an indirect action object that can be used by flow create, and
+ * could also be shared by different flows.
+ * The created object handle has single state and configuration
+ * across all the flow rules using it.
  *
  * @param[in] port_id
  *    The port identifier of the Ethernet device.
  * @param[in] conf
- *   Shared action configuration.
+ *   Action configuration for the indirect action object creation.
  * @param[in] action
- *   Action configuration for shared action creation.
+ *   Specific configuration of the indirect action object.
  * @param[out] error
  *   Perform verbose error reporting if not NULL. PMDs initialize this
  *   structure in case of error only.
@@ -3678,9 +3692,9 @@ struct rte_flow_shared_action_conf {
  *   - (ENOTSUP) if *action* valid but unsupported.
  */
 __rte_experimental
-struct rte_flow_shared_action *
-rte_flow_shared_action_create(uint16_t port_id,
-			      const struct rte_flow_shared_action_conf *conf,
+struct rte_flow_action_handle *
+rte_flow_action_handle_create(uint16_t port_id,
+			      const struct rte_flow_indir_action_conf *conf,
 			      const struct rte_flow_action *action,
 			      struct rte_flow_error *error);
 
@@ -3688,12 +3702,12 @@ rte_flow_shared_action_create(uint16_t port_id,
  * @warning
  * @b EXPERIMENTAL: this API may change without prior notice.
  *
- * Destroy the shared action by handle.
+ * Destroy indirect action by handle.
  *
  * @param[in] port_id
  *    The port identifier of the Ethernet device.
- * @param[in] action
- *   Handle for the shared action to be destroyed.
+ * @param[in] handle
+ *   Handle for the indirect action object to be destroyed.
  * @param[out] error
  *   Perform verbose error reporting if not NULL. PMDs initialize this
  *   structure in case of error only.
@@ -3708,27 +3722,30 @@ rte_flow_shared_action_create(uint16_t port_id,
  */
 __rte_experimental
 int
-rte_flow_shared_action_destroy(uint16_t port_id,
-			       struct rte_flow_shared_action *action,
+rte_flow_action_handle_destroy(uint16_t port_id,
+			       struct rte_flow_action_handle *handle,
 			       struct rte_flow_error *error);
 
 /**
  * @warning
  * @b EXPERIMENTAL: this API may change without prior notice.
  *
- * Update in-place the shared action configuration pointed by *action* handle
- * with the configuration provided as *update* argument.
- * The update of the shared action configuration effects all flow rules reusing
- * the action via handle.
+ * Update in-place the action configuration and / or state pointed
+ * by action *handle* with the configuration provided as *update* argument.
+ * The update of the action configuration effects all flow rules reusing
+ * the action via *handle*.
+ * The update general pointer provides the ability of partial updating.
  *
  * @param[in] port_id
  *    The port identifier of the Ethernet device.
- * @param[in] action
- *   Handle for the shared action to be updated.
+ * @param[in] handle
+ *   Handle for the indirect action object to be updated.
  * @param[in] update
- *   Action specification used to modify the action pointed by handle.
- *   *update* should be of same type with the action pointed by the *action*
- *   handle argument, otherwise considered as invalid.
+ *   Update profile specification used to modify the action pointed by handle.
+ *   *update* could be with the same type of the immediate action corresponding
+ *   to the *handle* argument when creating, or a wrapper structure includes
+ *   action configuration to be updated and bit fields to indicate the member
+ *   of fields inside the action to update.
  * @param[out] error
  *   Perform verbose error reporting if not NULL. PMDs initialize this
  *   structure in case of error only.
@@ -3739,32 +3756,32 @@ rte_flow_shared_action_destroy(uint16_t port_id,
  *   - (-EIO) if underlying device is removed.
  *   - (-EINVAL) if *update* invalid.
  *   - (-ENOTSUP) if *update* valid but unsupported.
- *   - (-ENOENT) if action pointed by *ctx* was not found.
+ *   - (-ENOENT) if indirect action object pointed by *handle* was not found.
  *   rte_errno is also set.
  */
 __rte_experimental
 int
-rte_flow_shared_action_update(uint16_t port_id,
-			      struct rte_flow_shared_action *action,
-			      const struct rte_flow_action *update,
+rte_flow_action_handle_update(uint16_t port_id,
+			      struct rte_flow_action_handle *handle,
+			      const void *update,
 			      struct rte_flow_error *error);
 
 /**
  * @warning
  * @b EXPERIMENTAL: this API may change without prior notice.
  *
- * Query the shared action by handle.
+ * Query the orginal action by corresponding indirect action object handle.
  *
  * Retrieve action-specific data such as counters.
  * Data is gathered by special action which may be present/referenced in
  * more than one flow rule definition.
  *
- * \see RTE_FLOW_ACTION_TYPE_COUNT
+ * @see RTE_FLOW_ACTION_TYPE_COUNT
  *
  * @param port_id
  *   Port identifier of Ethernet device.
- * @param[in] action
- *   Handle for the shared action to query.
+ * @param[in] handle
+ *   Handle for the action object to query.
  * @param[in, out] data
  *   Pointer to storage for the associated query data type.
  * @param[out] error
@@ -3776,10 +3793,9 @@ rte_flow_shared_action_update(uint16_t port_id,
  */
 __rte_experimental
 int
-rte_flow_shared_action_query(uint16_t port_id,
-			     const struct rte_flow_shared_action *action,
-			     void *data,
-			     struct rte_flow_error *error);
+rte_flow_action_handle_query(uint16_t port_id,
+			     const struct rte_flow_action_handle *handle,
+			     void *data, struct rte_flow_error *error);
 
 /* Tunnel has a type and the key information. */
 struct rte_flow_tunnel {
diff --git a/lib/librte_ethdev/rte_flow_driver.h b/lib/librte_ethdev/rte_flow_driver.h
index da594d9256..8d825eb245 100644
--- a/lib/librte_ethdev/rte_flow_driver.h
+++ b/lib/librte_ethdev/rte_flow_driver.h
@@ -83,27 +83,27 @@ struct rte_flow_ops {
 		 void **context,
 		 uint32_t nb_contexts,
 		 struct rte_flow_error *err);
-	/** See rte_flow_shared_action_create() */
-	struct rte_flow_shared_action *(*shared_action_create)
+	/** See rte_flow_action_handle_create() */
+	struct rte_flow_action_handle *(*action_handle_create)
 		(struct rte_eth_dev *dev,
-		 const struct rte_flow_shared_action_conf *conf,
+		 const struct rte_flow_indir_action_conf *conf,
 		 const struct rte_flow_action *action,
 		 struct rte_flow_error *error);
-	/** See rte_flow_shared_action_destroy() */
-	int (*shared_action_destroy)
+	/** See rte_flow_action_handle_destroy() */
+	int (*action_handle_destroy)
 		(struct rte_eth_dev *dev,
-		 struct rte_flow_shared_action *shared_action,
+		 struct rte_flow_action_handle *handle,
 		 struct rte_flow_error *error);
-	/** See rte_flow_shared_action_update() */
-	int (*shared_action_update)
+	/** See rte_flow_action_handle_update() */
+	int (*action_handle_update)
 		(struct rte_eth_dev *dev,
-		 struct rte_flow_shared_action *shared_action,
-		 const struct rte_flow_action *update,
+		 struct rte_flow_action_handle *handle,
+		 const void *update,
 		 struct rte_flow_error *error);
-	/** See rte_flow_shared_action_query() */
-	int (*shared_action_query)
+	/** See rte_flow_action_handle_query() */
+	int (*action_handle_query)
 		(struct rte_eth_dev *dev,
-		 const struct rte_flow_shared_action *shared_action,
+		 const struct rte_flow_action_handle *handle,
 		 void *data,
 		 struct rte_flow_error *error);
 	/** See rte_flow_tunnel_decap_set() */
diff --git a/lib/librte_ethdev/version.map b/lib/librte_ethdev/version.map
index 93ad388e96..4eb561a89a 100644
--- a/lib/librte_ethdev/version.map
+++ b/lib/librte_ethdev/version.map
@@ -231,10 +231,6 @@ EXPERIMENTAL {
 	rte_eth_fec_get_capability;
 	rte_eth_fec_get;
 	rte_eth_fec_set;
-	rte_flow_shared_action_create;
-	rte_flow_shared_action_destroy;
-	rte_flow_shared_action_query;
-	rte_flow_shared_action_update;
 	rte_flow_tunnel_decap_set;
 	rte_flow_tunnel_match;
 	rte_flow_get_restore_info;
@@ -246,6 +242,10 @@ EXPERIMENTAL {
 
 	# added in 21.05
 	rte_eth_representor_info_get;
+	rte_flow_action_handle_create;
+	rte_flow_action_handle_destroy;
+	rte_flow_action_handle_update;
+	rte_flow_action_handle_query;
 };
 
 INTERNAL {
-- 
2.30.0.windows.2


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] service: clean references to removed symbol
  2021-04-08 14:04  0%       ` David Marchand
@ 2021-04-08 14:54  3%         ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2021-04-08 14:54 UTC (permalink / raw)
  To: Van Haaren, Harry, David Marchand
  Cc: dev, stable, Ray Kinsella, Neil Horman, Dodji Seketeli

08/04/2021 16:04, David Marchand:
> On Thu, Apr 8, 2021 at 3:08 PM Van Haaren, Harry
> <harry.van.haaren@intel.com> wrote:
> > > > For rte_service.h doc changes I'm all fine.
> > > >
> > > > For ABI consistency, this removes a function from the DPDK_21 version map that
> > > didn't exist in
> > > > the shared object itself. I'm not sure if that's an ABI break or not... I see ABI
> > > experts on CC,
> > > > and will let them comment on that topic.
> > >
> > > The symbol is not in the API anymore.
> > > Applications can't have a reference to this symbol without a definition.
> >
> > Agreed, however I'm not familiar enough with linking/ABI stability to
> > know if removing a symbol (even when not available in the API) could
> > affect the resulting shared object's ABI.
> 
> After a discussion with Dodji and looking at binutils, I understand
> that the versioning is applied for each symbol found in an elf object.
> So at least with binutils, non-existent nodes in a version script are
> harmless and have no impact on the generated elf.

Yes I don't see how it could break ABI.

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



^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [RFC PATCH v2] ethdev: introduce indirect action APIs
       [not found]     <1615967952-228321-1-git-send-email-bingz@nvidia.com>
@ 2021-04-08 14:46  2% ` Bing Zhao
  2021-04-09  3:54  4% ` [dpdk-dev] [PATCH] " Bing Zhao
  1 sibling, 0 replies; 200+ results
From: Bing Zhao @ 2021-04-08 14:46 UTC (permalink / raw)
  To: orika, thomas, ferruh.yigit, andrew.rybchenko; +Cc: dev, ajit.khaparde

Right now, rte_flow_shared_action_* APIs are used for some shared
actions, like RSS, count. The shared action shoule be created before
using it inside a flow. These shared actions sometimes are not
really shared but just some indirect actions decoupled from a flow.

The new functions rte_flow_action_handle_* are added to replace
the current shared functions rte_flow_shared_action_*.

There are two types of flow actions:
1. the direct (normal) actions that could be created and stored
   within a flow rule. Such action is tied to its flow rule and
   cannot be reused.
2. the indirect action, in the past, named shared_action. It is
   created from a direct actioni, like count or rss, and then used
   in the flow rules with an object handle. The PMD will take care
   of the retrieve from indirect action to the direct action
   when it is referenced.

The indirect action is accessed (update / query) w/o any flow rule,
just via the action object handle. For example, when querying or
resetting a counter, it could be done out of any flow using this
counter, but only the handle of the counter action object is
required.
The indirect action object could be shared by different flows or
used by a single flow, depending on the direct action type and
the real-life requirements.
The handle of an indirect action object is opaque and defined in
each driver and possibly different per direct action type.

The old name "shared" is improper in a sense and should be replaced.

All the command lines in testpmd application with "shared_action*"
are replaced with "indirect_action*".

The parameter of "update" interface is also changed. A general
pointer will replace the rte_flow_action struct pointer due to the
facts:
1. Some action may not support fields updating. In the example of a
   counter, the only "update" supported should be the reset. So
   passing a rte_flow_action struct pointer is meaningless and
   there is even no such corresponding action struct. What's more,
   if more than one operations should be supported, for some other
   action, such pointer paramter may not meet the need.
2. Some action may need conditional or partial update, the current
   parameter will not provide the ability to indicate which part(s)
   to update.
   For different types of indirect action objects, the pointer could
   either be the same of rte_flow_action* struct - in order not to
   break the current driver implementation, or some wrapper
   structures with bits as masks to indicate which part to be
   updated, depending on real needs of the corresponding direct
   action. For different direct actions, the structures of indirect
   action objects updating will be different.

All the underlayer PMD callbacks will be moved to these new APIs.

The RTE_FLOW_ACTION_TYPE_SHARED is kept for now in order not to
break the ABI. All the implementations are changed by using
RTE_FLOW_ACTION_TYPE_INDIRECT.

Signed-off-by: Bing Zhao <bingz@nvidia.com>
---
 lib/librte_ethdev/rte_flow.h        | 114 ++++++++++++++++------------
 lib/librte_ethdev/rte_flow_driver.h |  26 +++----
 2 files changed, 78 insertions(+), 62 deletions(-)

diff --git a/lib/librte_ethdev/rte_flow.h b/lib/librte_ethdev/rte_flow.h
index 6cc57136ac..880e0b50fb 100644
--- a/lib/librte_ethdev/rte_flow.h
+++ b/lib/librte_ethdev/rte_flow.h
@@ -2267,6 +2267,16 @@ enum rte_flow_action_type {
 	 * See struct rte_flow_action_modify_field.
 	 */
 	RTE_FLOW_ACTION_TYPE_MODIFY_FIELD,
+
+	/**
+	 * Describe indirect action that could be used by a single flow rule
+	 * or multiple flow rules.
+	 *
+	 * Allow flow rule(s) reference the same action by the indirect action
+	 * handle (see struct rte_flow_action_handle), rules could be on the
+	 * same port or across different ports.
+	 */
+	RTE_FLOW_ACTION_TYPE_INDIRECT,
 };
 
 /**
@@ -2847,17 +2857,23 @@ struct rte_flow_action_set_dscp {
 };
 
 /**
- * RTE_FLOW_ACTION_TYPE_SHARED
+ * @warning
+ * @b EXPERIMENTAL: this structure may change without prior notice
+ *
+ * RTE_FLOW_ACTION_TYPE_INDIRECT
  *
- * Opaque type returned after successfully creating a shared action.
+ * Opaque type returned after successfully creating an indirect action object.
+ * The definition of the object handle will be different per driver or
+ * per immediate action type.
  *
- * This handle can be used to manage and query the related action:
- * - share it across multiple flow rules
- * - update action configuration
- * - query action data
- * - destroy action
+ * This handle can be used to manage and query the related immediate action:
+ * - referenced in single flow rule or across multiple flow rules
+ *   over multiple ports
+ * - update action object configuration
+ * - query action object data
+ * - destroy action object
  */
-struct rte_flow_shared_action;
+struct rte_flow_action_handle;
 
 /**
  * Field IDs for MODIFY_FIELD action.
@@ -3628,25 +3644,22 @@ rte_flow_get_aged_flows(uint16_t port_id, void **contexts,
 			uint32_t nb_contexts, struct rte_flow_error *error);
 
 /**
- * Specify shared action configuration
+ * Specify indirect action object configuration
  */
-struct rte_flow_shared_action_conf {
+struct rte_flow_indir_action_conf {
 	/**
-	 * Flow direction for shared action configuration.
+	 * Flow direction for the indirect action configuration.
 	 *
-	 * Shared action should be valid at least for one flow direction,
+	 * Action should be valid at least for one flow direction,
 	 * otherwise it is invalid for both ingress and egress rules.
 	 */
 	uint32_t ingress:1;
 	/**< Action valid for rules applied to ingress traffic. */
 	uint32_t egress:1;
 	/**< Action valid for rules applied to egress traffic. */
-
 	/**
 	 * When set to 1, indicates that the action is valid for
 	 * transfer traffic; otherwise, for non-transfer traffic.
-	 *
-	 * See struct rte_flow_attr.
 	 */
 	uint32_t transfer:1;
 };
@@ -3655,16 +3668,17 @@ struct rte_flow_shared_action_conf {
  * @warning
  * @b EXPERIMENTAL: this API may change without prior notice.
  *
- * Create shared action for reuse in multiple flow rules.
- * The created shared action has single state and configuration
- * across all flow rules using it.
+ * Create an indirect action object that can be used by flow create, and
+ * could also be shared by different flows.
+ * The created object handle has single state and configuration
+ * across all the flow rules using it.
  *
  * @param[in] port_id
  *    The port identifier of the Ethernet device.
  * @param[in] conf
- *   Shared action configuration.
+ *   Action configuration for the indirect action object creation.
  * @param[in] action
- *   Action configuration for shared action creation.
+ *   Specific configuration of the indirect action object.
  * @param[out] error
  *   Perform verbose error reporting if not NULL. PMDs initialize this
  *   structure in case of error only.
@@ -3678,9 +3692,9 @@ struct rte_flow_shared_action_conf {
  *   - (ENOTSUP) if *action* valid but unsupported.
  */
 __rte_experimental
-struct rte_flow_shared_action *
-rte_flow_shared_action_create(uint16_t port_id,
-			      const struct rte_flow_shared_action_conf *conf,
+struct rte_flow_action_handle *
+rte_flow_action_handle_create(uint16_t port_id,
+			      const struct rte_flow_indir_action_conf *conf,
 			      const struct rte_flow_action *action,
 			      struct rte_flow_error *error);
 
@@ -3688,12 +3702,12 @@ rte_flow_shared_action_create(uint16_t port_id,
  * @warning
  * @b EXPERIMENTAL: this API may change without prior notice.
  *
- * Destroy the shared action by handle.
+ * Destroy indirect action by handle.
  *
  * @param[in] port_id
  *    The port identifier of the Ethernet device.
- * @param[in] action
- *   Handle for the shared action to be destroyed.
+ * @param[in] handle
+ *   Handle for the indirect action object to be destroyed.
  * @param[out] error
  *   Perform verbose error reporting if not NULL. PMDs initialize this
  *   structure in case of error only.
@@ -3708,27 +3722,30 @@ rte_flow_shared_action_create(uint16_t port_id,
  */
 __rte_experimental
 int
-rte_flow_shared_action_destroy(uint16_t port_id,
-			       struct rte_flow_shared_action *action,
+rte_flow_action_handle_destroy(uint16_t port_id,
+			       struct rte_flow_action_handle *handle,
 			       struct rte_flow_error *error);
 
 /**
  * @warning
  * @b EXPERIMENTAL: this API may change without prior notice.
  *
- * Update in-place the shared action configuration pointed by *action* handle
- * with the configuration provided as *update* argument.
- * The update of the shared action configuration effects all flow rules reusing
- * the action via handle.
+ * Update in-place the action configuration and / or state pointed
+ * by action *handle* with the configuration provided as *update* argument.
+ * The update of the action configuration effects all flow rules reusing
+ * the action via *handle*.
+ * The update general pointer provides the ability of partial updating.
  *
  * @param[in] port_id
  *    The port identifier of the Ethernet device.
- * @param[in] action
- *   Handle for the shared action to be updated.
+ * @param[in] handle
+ *   Handle for the indirect action object to be updated.
  * @param[in] update
- *   Action specification used to modify the action pointed by handle.
- *   *update* should be of same type with the action pointed by the *action*
- *   handle argument, otherwise considered as invalid.
+ *   Update profile specification used to modify the action pointed by handle.
+ *   *update* could be with the same type of the immediate action corresponding
+ *   to the *handle* argument when creating, or a wrapper structure includes
+ *   action configuration to be updated and bit fields to indicate the member
+ *   of fields inside the action to update.
  * @param[out] error
  *   Perform verbose error reporting if not NULL. PMDs initialize this
  *   structure in case of error only.
@@ -3739,32 +3756,32 @@ rte_flow_shared_action_destroy(uint16_t port_id,
  *   - (-EIO) if underlying device is removed.
  *   - (-EINVAL) if *update* invalid.
  *   - (-ENOTSUP) if *update* valid but unsupported.
- *   - (-ENOENT) if action pointed by *ctx* was not found.
+ *   - (-ENOENT) if indirect action object pointed by *handle* was not found.
  *   rte_errno is also set.
  */
 __rte_experimental
 int
-rte_flow_shared_action_update(uint16_t port_id,
-			      struct rte_flow_shared_action *action,
-			      const struct rte_flow_action *update,
+rte_flow_action_handle_update(uint16_t port_id,
+			      struct rte_flow_action_handle *handle,
+			      const void *update,
 			      struct rte_flow_error *error);
 
 /**
  * @warning
  * @b EXPERIMENTAL: this API may change without prior notice.
  *
- * Query the shared action by handle.
+ * Query the orginal action by corresponding indirect action object handle.
  *
  * Retrieve action-specific data such as counters.
  * Data is gathered by special action which may be present/referenced in
  * more than one flow rule definition.
  *
- * \see RTE_FLOW_ACTION_TYPE_COUNT
+ * @see RTE_FLOW_ACTION_TYPE_COUNT
  *
  * @param port_id
  *   Port identifier of Ethernet device.
- * @param[in] action
- *   Handle for the shared action to query.
+ * @param[in] handle
+ *   Handle for the action object to query.
  * @param[in, out] data
  *   Pointer to storage for the associated query data type.
  * @param[out] error
@@ -3776,10 +3793,9 @@ rte_flow_shared_action_update(uint16_t port_id,
  */
 __rte_experimental
 int
-rte_flow_shared_action_query(uint16_t port_id,
-			     const struct rte_flow_shared_action *action,
-			     void *data,
-			     struct rte_flow_error *error);
+rte_flow_action_handle_query(uint16_t port_id,
+			     const struct rte_flow_action_handle *handle,
+			     void *data, struct rte_flow_error *error);
 
 /* Tunnel has a type and the key information. */
 struct rte_flow_tunnel {
diff --git a/lib/librte_ethdev/rte_flow_driver.h b/lib/librte_ethdev/rte_flow_driver.h
index da594d9256..8d825eb245 100644
--- a/lib/librte_ethdev/rte_flow_driver.h
+++ b/lib/librte_ethdev/rte_flow_driver.h
@@ -83,27 +83,27 @@ struct rte_flow_ops {
 		 void **context,
 		 uint32_t nb_contexts,
 		 struct rte_flow_error *err);
-	/** See rte_flow_shared_action_create() */
-	struct rte_flow_shared_action *(*shared_action_create)
+	/** See rte_flow_action_handle_create() */
+	struct rte_flow_action_handle *(*action_handle_create)
 		(struct rte_eth_dev *dev,
-		 const struct rte_flow_shared_action_conf *conf,
+		 const struct rte_flow_indir_action_conf *conf,
 		 const struct rte_flow_action *action,
 		 struct rte_flow_error *error);
-	/** See rte_flow_shared_action_destroy() */
-	int (*shared_action_destroy)
+	/** See rte_flow_action_handle_destroy() */
+	int (*action_handle_destroy)
 		(struct rte_eth_dev *dev,
-		 struct rte_flow_shared_action *shared_action,
+		 struct rte_flow_action_handle *handle,
 		 struct rte_flow_error *error);
-	/** See rte_flow_shared_action_update() */
-	int (*shared_action_update)
+	/** See rte_flow_action_handle_update() */
+	int (*action_handle_update)
 		(struct rte_eth_dev *dev,
-		 struct rte_flow_shared_action *shared_action,
-		 const struct rte_flow_action *update,
+		 struct rte_flow_action_handle *handle,
+		 const void *update,
 		 struct rte_flow_error *error);
-	/** See rte_flow_shared_action_query() */
-	int (*shared_action_query)
+	/** See rte_flow_action_handle_query() */
+	int (*action_handle_query)
 		(struct rte_eth_dev *dev,
-		 const struct rte_flow_shared_action *shared_action,
+		 const struct rte_flow_action_handle *handle,
 		 void *data,
 		 struct rte_flow_error *error);
 	/** See rte_flow_tunnel_decap_set() */
-- 
2.30.0.windows.2


^ permalink raw reply	[relevance 2%]

* Re: [dpdk-dev] [PATCH] service: clean references to removed symbol
  2021-04-08 13:06  4%     ` Van Haaren, Harry
@ 2021-04-08 14:04  0%       ` David Marchand
  2021-04-08 14:54  3%         ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: David Marchand @ 2021-04-08 14:04 UTC (permalink / raw)
  To: Van Haaren, Harry; +Cc: dev, stable, Ray Kinsella, Neil Horman, Dodji Seketeli

On Thu, Apr 8, 2021 at 3:08 PM Van Haaren, Harry
<harry.van.haaren@intel.com> wrote:
> > > For rte_service.h doc changes I'm all fine.
> > >
> > > For ABI consistency, this removes a function from the DPDK_21 version map that
> > didn't exist in
> > > the shared object itself. I'm not sure if that's an ABI break or not... I see ABI
> > experts on CC,
> > > and will let them comment on that topic.
> >
> > The symbol is not in the API anymore.
> > Applications can't have a reference to this symbol without a definition.
>
> Agreed, however I'm not familiar enough with linking/ABI stability to
> know if removing a symbol (even when not available in the API) could
> affect the resulting shared object's ABI.

After a discussion with Dodji and looking at binutils, I understand
that the versioning is applied for each symbol found in an elf object.
So at least with binutils, non-existent nodes in a version script are
harmless and have no impact on the generated elf.


-- 
David Marchand


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] service: clean references to removed symbol
  2021-04-08 12:58  0%   ` David Marchand
@ 2021-04-08 13:06  4%     ` Van Haaren, Harry
  2021-04-08 14:04  0%       ` David Marchand
  0 siblings, 1 reply; 200+ results
From: Van Haaren, Harry @ 2021-04-08 13:06 UTC (permalink / raw)
  To: David Marchand; +Cc: dev, stable, Ray Kinsella, Neil Horman

> -----Original Message-----
> From: David Marchand <david.marchand@redhat.com>
> Sent: Thursday, April 8, 2021 1:58 PM
> To: Van Haaren, Harry <harry.van.haaren@intel.com>
> Cc: dev@dpdk.org; stable@dpdk.org; Ray Kinsella <mdr@ashroe.eu>; Neil Horman
> <nhorman@tuxdriver.com>; Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
> Subject: Re: [PATCH] service: clean references to removed symbol
> 
> On Thu, Apr 8, 2021 at 2:54 PM Van Haaren, Harry
> <harry.van.haaren@intel.com> wrote:
> >
> > > -----Original Message-----
> > > From: David Marchand <david.marchand@redhat.com>
> > > Sent: Wednesday, April 7, 2021 10:07 AM
> > > To: dev@dpdk.org
> > > Cc: stable@dpdk.org; Van Haaren, Harry <harry.van.haaren@intel.com>; Ray
> > > Kinsella <mdr@ashroe.eu>; Neil Horman <nhorman@tuxdriver.com>; Pavan
> > > Nikhilesh <pbhagavatula@caviumnetworks.com>
> > > Subject: [PATCH] service: clean references to removed symbol
> > >
> > > rte_service_get_id() was removed in v17.11 but the API description
> > > still referenced it and a version node was still present in EAL map.
> > >
> > > Fixes: 8edc9aaaf217 ("service: use id in get by name function")
> > > Cc: stable@dpdk.org
> > >
> > > Signed-off-by: David Marchand <david.marchand@redhat.com>
> >
> > For rte_service.h doc changes I'm all fine.
> >
> > For ABI consistency, this removes a function from the DPDK_21 version map that
> didn't exist in
> > the shared object itself. I'm not sure if that's an ABI break or not... I see ABI
> experts on CC,
> > and will let them comment on that topic.
> 
> The symbol is not in the API anymore.
> Applications can't have a reference to this symbol without a definition.

Agreed, however I'm not familiar enough with linking/ABI stability to
know if removing a symbol (even when not available in the API) could
affect the resulting shared object's ABI.

If somebody says there's no risk in ABI break, go ahead and merge. -Harry

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] service: clean references to removed symbol
  2021-04-08 12:54  4% ` Van Haaren, Harry
@ 2021-04-08 12:58  0%   ` David Marchand
  2021-04-08 13:06  4%     ` Van Haaren, Harry
  0 siblings, 1 reply; 200+ results
From: David Marchand @ 2021-04-08 12:58 UTC (permalink / raw)
  To: Van Haaren, Harry; +Cc: dev, stable, Ray Kinsella, Neil Horman, Pavan Nikhilesh

On Thu, Apr 8, 2021 at 2:54 PM Van Haaren, Harry
<harry.van.haaren@intel.com> wrote:
>
> > -----Original Message-----
> > From: David Marchand <david.marchand@redhat.com>
> > Sent: Wednesday, April 7, 2021 10:07 AM
> > To: dev@dpdk.org
> > Cc: stable@dpdk.org; Van Haaren, Harry <harry.van.haaren@intel.com>; Ray
> > Kinsella <mdr@ashroe.eu>; Neil Horman <nhorman@tuxdriver.com>; Pavan
> > Nikhilesh <pbhagavatula@caviumnetworks.com>
> > Subject: [PATCH] service: clean references to removed symbol
> >
> > rte_service_get_id() was removed in v17.11 but the API description
> > still referenced it and a version node was still present in EAL map.
> >
> > Fixes: 8edc9aaaf217 ("service: use id in get by name function")
> > Cc: stable@dpdk.org
> >
> > Signed-off-by: David Marchand <david.marchand@redhat.com>
>
> For rte_service.h doc changes I'm all fine.
>
> For ABI consistency, this removes a function from the DPDK_21 version map that didn't exist in
> the shared object itself. I'm not sure if that's an ABI break or not... I see ABI experts on CC,
> and will let them comment on that topic.

The symbol is not in the API anymore.
Applications can't have a reference to this symbol without a definition.


-- 
David Marchand


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] service: clean references to removed symbol
  @ 2021-04-08 12:54  4% ` Van Haaren, Harry
  2021-04-08 12:58  0%   ` David Marchand
  0 siblings, 1 reply; 200+ results
From: Van Haaren, Harry @ 2021-04-08 12:54 UTC (permalink / raw)
  To: David Marchand, dev; +Cc: stable, Ray Kinsella, Neil Horman, Pavan Nikhilesh

> -----Original Message-----
> From: David Marchand <david.marchand@redhat.com>
> Sent: Wednesday, April 7, 2021 10:07 AM
> To: dev@dpdk.org
> Cc: stable@dpdk.org; Van Haaren, Harry <harry.van.haaren@intel.com>; Ray
> Kinsella <mdr@ashroe.eu>; Neil Horman <nhorman@tuxdriver.com>; Pavan
> Nikhilesh <pbhagavatula@caviumnetworks.com>
> Subject: [PATCH] service: clean references to removed symbol
> 
> rte_service_get_id() was removed in v17.11 but the API description
> still referenced it and a version node was still present in EAL map.
> 
> Fixes: 8edc9aaaf217 ("service: use id in get by name function")
> Cc: stable@dpdk.org
> 
> Signed-off-by: David Marchand <david.marchand@redhat.com>

For rte_service.h doc changes I'm all fine.

For ABI consistency, this removes a function from the DPDK_21 version map that didn't exist in
the shared object itself. I'm not sure if that's an ABI break or not... I see ABI experts on CC,
and will let them comment on that topic.

Reviewed-by: Harry van Haaren <harry.van.haaren@intel.com>

> ---
>  lib/librte_eal/include/rte_service.h | 5 +----
>  lib/librte_eal/version.map           | 1 -
>  2 files changed, 1 insertion(+), 5 deletions(-)
> 
> diff --git a/lib/librte_eal/include/rte_service.h
> b/lib/librte_eal/include/rte_service.h
> index ca9950d091..c7d037d862 100644
> --- a/lib/librte_eal/include/rte_service.h
> +++ b/lib/librte_eal/include/rte_service.h
> @@ -47,10 +47,7 @@ extern "C" {
>  #define RTE_SERVICE_CAP_MT_SAFE (1 << 0)
> 
>  /**
> - *  Return the number of services registered.
> - *
> - * The number of services registered can be passed to *rte_service_get_by_id*,
> - * enabling the application to retrieve the specification of each service.
> + * Return the number of services registered.
>   *
>   * @return The number of services registered.
>   */
> diff --git a/lib/librte_eal/version.map b/lib/librte_eal/version.map
> index e23745ae6e..0f2a9228b3 100644
> --- a/lib/librte_eal/version.map
> +++ b/lib/librte_eal/version.map
> @@ -159,7 +159,6 @@ DPDK_21 {
>  	rte_service_component_unregister;
>  	rte_service_dump;
>  	rte_service_finalize;
> -	rte_service_get_by_id;
>  	rte_service_get_by_name;
>  	rte_service_get_count;
>  	rte_service_get_name;
> --
> 2.23.0


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH 2/5] net/tap: do not touch Tx offload flags
  @ 2021-04-08 12:16  3%         ` Ananyev, Konstantin
  0 siblings, 0 replies; 200+ results
From: Ananyev, Konstantin @ 2021-04-08 12:16 UTC (permalink / raw)
  To: Flavio Leitner, Olivier Matz
  Cc: David Marchand, dev, maxime.coquelin, i.maximets, Wiles, Keith



> 
> On Thu, Apr 08, 2021 at 09:41:59AM +0200, Olivier Matz wrote:
> > On Wed, Apr 07, 2021 at 05:15:39PM -0300, Flavio Leitner wrote:
> > > On Thu, Apr 01, 2021 at 11:52:40AM +0200, David Marchand wrote:
> > > > Tx offload flags are of the application responsibility.
> > > > Leave the mbuf alone and check for TSO where needed.
> > > >
> > > > Signed-off-by: David Marchand <david.marchand@redhat.com>
> > > > ---
> > >
> > > The patch looks good, but maybe a better approach would be
> > > to change the documentation to require the TCP_CKSUM flag
> > > when TCP_SEG is used, otherwise this flag adjusting needs
> > > to be replicated every time TCP_SEG is used.
> > >
> > > The above could break existing applications, so perhaps doing
> > > something like below would be better and backwards compatible?
> > > Then we can remove those places tweaking the flags completely.
> >
> > As a first step, I suggest to document that:
> > - applications must set TCP_CKSUM when setting TCP_SEG
> 
> That's what I suggest above.
> 
> > - pmds must suppose that TCP_CKSUM is set when TCP_SEG is set
> 
> But that keeps the problem of implying the TCP_CKSUM flag in
> various places.
> 
> > This is clearer that what we have today, and I think it does not break
> > anything. This will guide apps in the correct direction, facilitating
> > an eventual future PMD change.
> >
> > > diff --git a/lib/librte_mbuf/rte_mbuf_core.h b/lib/librte_mbuf/rte_mbuf_core.h
> > > index c17dc95c5..6a0c2cdd9 100644
> > > --- a/lib/librte_mbuf/rte_mbuf_core.h
> > > +++ b/lib/librte_mbuf/rte_mbuf_core.h
> > > @@ -298,7 +298,7 @@ extern "C" {
> > >   *  - if it's IPv4, set the PKT_TX_IP_CKSUM flag
> > >   *  - fill the mbuf offload information: l2_len, l3_len, l4_len, tso_segsz
> > >   */
> > > -#define PKT_TX_TCP_SEG       (1ULL << 50)
> > > +#define PKT_TX_TCP_SEG       (1ULL << 50) | PKT_TX_TCP_CKSUM

I think that would be an ABI breakage.

> > >
> > >  /** TX IEEE1588 packet to timestamp. */
> > >  #define PKT_TX_IEEE1588_TMST (1ULL << 51)
> >
> > I'm afraid some applications or drivers use extended bit manipulations
> > to do the conversion from/to another domain (like hardware descriptors
> > or application-specific flags). They may expect this constant to be a
> > uniq flag.
> 
> Interesting, do you have an example? Because each flag still has an
> separate meaning.


 

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] Minutes of Technical Board Meeting, 2021-03-10
  2021-04-07  9:58  0%         ` Bruce Richardson
@ 2021-04-07 10:29  0%           ` Morten Brørup
  0 siblings, 0 replies; 200+ results
From: Morten Brørup @ 2021-04-07 10:29 UTC (permalink / raw)
  To: Bruce Richardson
  Cc: Honnappa Nagarahalli, Tom Barbette, dev, nd, Alireza Farshin,
	Van Haaren, Harry

> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Bruce Richardson
> Sent: Wednesday, April 7, 2021 11:59 AM
> 
> On Wed, Apr 07, 2021 at 09:11:23AM +0200, Morten Brørup wrote:
> > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Honnappa
> > > Nagarahalli
> > > Sent: Wednesday, April 7, 2021 2:48 AM
> > >
> > > <snip>
> > > >
> > > > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Tom
> Barbette
> > > > > Sent: Wednesday, March 31, 2021 10:53 AM
> > > > >
> > > > > Le 31-03-21 à 02:44, Honnappa Nagarahalli a écrit :
> > > > > > 	- Ability to tune the values of #defines
> > > > > >     * Few prominent points discussed
> > > > > > 	- This will result in #ifdefs in the code (for ex: in
> > > testpmd)
> > > > > > 	- One option is for all the PMDs to document their
> > > configurable
> > > > > #defines in PMD specific header files. Having these distributed
> is
> > > > > much easier to search.
> > > > > > 	- Can some of the existing #defines be converted to runtime
> > > > > configurations? For ex: RTE_MAX_LCORE? This might impact ABI.
> > > > > >     * Bruce to think about converting the doc to a blog or an
> > > email
> > > > > on the mailing list. But soliciting feedback is most important.
> > > > >
> > > > > One alternative path worth looking at is to encourage the use
> of
> > > LTO,
> > > > > and modify APIs so the configuration can be provided at linking
> > > time,
> > > > > and propagated by the compiler.
> > > > >
> > > > > E.g. one can define rte_max_lcore as a weak constant symbol,
> equal
> > > to
> > > > > 128. At linking time the user may provide a rte_max_lcore that
> is
> > > more
> > > > > tailored, and still, dynamic arrays[rte_max_lcore] will be
> > > allocatable
> > > > > on the .bss section, avoiding an indirection. The compiler will
> be
> > > > > able to optimize loops etc which is impossible with pure
> runtime
> > > > > configuration.
> > > > >
> > > > > In packetmill.io we actually pushed this to the next level
> where
> > > the
> > > > > driver can completely change its behavior without recompiling
> DPDK
> > > > > itself and spawning ifdefs everywhere.
> > > > >
> > > > > However the price is the slowiness of LTO...
> > > > >
> > > > > My 2 cents.
> > > > >
> > > > > Tom
> > > > >
> > > >
> > > > If we are moving away from Compile Time parameters, I certainly
> > > prefer Tom's
> > > > suggestion of Link Time parameters, rather than Run Time
> parameters.
> > > I think compile time constants are fine if they are not used in
> #ifdef.
> > > For ex: if they are used in 'if (...)', it will help eliminate code
> and
> > > branches.
> >
> > Yes!
> >
> > And "if (...)" is more flexible than #ifdef/#if because it allows the
> expression to be mixed with non-constants.
> >
> > Then perhaps Bruce's script to automatically make C constants out of
> #defines was not so silly anyway. :-)
> >
> > >
> > > >
> > > > This might also provide a middle ground for optimizations where
> > > Compile
> > > > Time parameters are considered unacceptable by the DPDK
> community.
> > > I'm
> > > > thinking about something along the lines of the "constant size"
> > > rte_event
> > > > array presented at the 2020 Userspace Summit by Harry
> > > >
> > >
> (https://static.sched.com/hosted_files/dpdkuserspace2020/d3/dpdk_usersp
> > > ac
> > > > e_20_api_performance_hvh.pdf). Taking this thinking even further
> out,
> > > a Link
> > > > Time parameter could perhaps replace the nb_pkts parameter in on
> > > > optimized rte_eth_rx_burst() function.
> > > >
> >
> > Optimally, I would like to see e.g. the RX burst size being so
> constant that the PMD's RX function knows it and can use vector
> functions and possibly loop unrolling, without having to implement a
> pre-check on nb_pkts and a trailing non-vector loop for receiving any
> remaining odd nb_pkts. All the DPDK examples use #define MAX_PKT_BURST
> 32 or similar, and I assume most DPDK applications do too.
> >
> > I do not trust the compiler to be clever enough to realize that the
> PMD's RX function is always called with a specific nb_pkts and optimize
> all this cruft away at compile time (or at link time), unless it is a
> #define or a compile time constant.
> >
> 
> It certainly is not possible to do at compile time, because the calls
> are
> in a different compilation unit from the functions themselves, not to
> mention that a link-time the RX functions are called via a function
> pointer.

Exactly. It would only work with a global #define or global compile time constant.

> Therefore the only way to do this that I am aware of, is to
> have a
> wrapper function use for the common values inside the drivers
> themselves.
> 
> For example, inside the i40e driver (which I'm using because it's the
> one
> I'm most familiar with), the main receive function is already a wrapper
> around a raw receive function, using constant-expansion by the compiler
> of
> the final parameter (NULL) to automatically remove the code for
> tracking
> scattered packets.
> 
> uint16_t
> i40e_recv_pkts_vec_avx2(void *rx_queue, struct rte_mbuf **rx_pkts,
>                    uint16_t nb_pkts)
> {
> 	return _recv_raw_pkts_vec_avx2(rx_queue, rx_pkts, nb_pkts, NULL);
> }
> 
> We can produce a version of this optimized for 32-element dequeues by
> special-casing where nb_pkts == 32:
> 
> uint16_t
> i40e_recv_pkts_vec_avx2(void *rx_queue, struct rte_mbuf **rx_pkts,
>                    uint16_t nb_pkts)
> {
> 	if (nb_pkts == 32)
> 		return _recv_raw_pkts_vec_avx2(rx_queue, rx_pkts, 32,
> NULL);
> 	return _recv_raw_pkts_vec_avx2(rx_queue, rx_pkts, nb_pkts, NULL);
> }
> 
> Now the compiler when inlining the _raw_ function, can see that it
> needs
> two copies, and for the first, that nb_pkts is compile-time constant of
> 32.

Great example! Now, consider this modification to your example, where rte_eth_rx_burst_size is a global constant variable that can be evaluated at compile time:

uint16_t
i40e_recv_pkts_vec_avx2(void *rx_queue, struct rte_mbuf **rx_pkts,
                   uint16_t nb_pkts)
{
-	if (nb_pkts == 32)
-		return _recv_raw_pkts_vec_avx2(rx_queue, rx_pkts, 32, NULL);
+	if (rte_eth_rx_burst_size)
+		return _recv_raw_pkts_vec_avx2(rx_queue, rx_pkts, rte_eth_rx_burst_size, NULL);
	return _recv_raw_pkts_vec_avx2(rx_queue, rx_pkts, nb_pkts, NULL);
}

> However, I'm not sure how useful an optimization like this is, and I'd
> be interested to see what benefits testing shows.

Yes, performance test results would be beneficial.

> Beyond the loop iteration
> count of 32, there is also the check after each burst of 8 dequeues in
> the
> driver to check that we have a full set of 8 - and abort the loop if
> not.

That loop could be optimized too, going from 8 to 32 - or going all the way to global_rx_burst_size.

> It's also the case that unless an app is already at maximum load (or
> overloaded), one would probably not expect to always get a full set of
> 32
> packets each time, as you have no additional headroom for more.
> 

Except if the application is designed to call rte_eth_rx_burst() less frequently to get a full burst as often as possible, using the NIC's many RX descriptors as burst buffer. Working with full bursts throughout the application provides higher total performance per clock cycle.

> /Bruce


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] Minutes of Technical Board Meeting, 2021-03-10
  2021-04-07  7:11  0%       ` Morten Brørup
@ 2021-04-07  9:58  0%         ` Bruce Richardson
  2021-04-07 10:29  0%           ` Morten Brørup
  0 siblings, 1 reply; 200+ results
From: Bruce Richardson @ 2021-04-07  9:58 UTC (permalink / raw)
  To: Morten Brørup
  Cc: Honnappa Nagarahalli, Tom Barbette, dev, nd, Alireza Farshin,
	Van Haaren, Harry

On Wed, Apr 07, 2021 at 09:11:23AM +0200, Morten Brørup wrote:
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Honnappa
> > Nagarahalli
> > Sent: Wednesday, April 7, 2021 2:48 AM
> > 
> > <snip>
> > >
> > > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Tom Barbette
> > > > Sent: Wednesday, March 31, 2021 10:53 AM
> > > >
> > > > Le 31-03-21 à 02:44, Honnappa Nagarahalli a écrit :
> > > > > 	- Ability to tune the values of #defines
> > > > >     * Few prominent points discussed
> > > > > 	- This will result in #ifdefs in the code (for ex: in
> > testpmd)
> > > > > 	- One option is for all the PMDs to document their
> > configurable
> > > > #defines in PMD specific header files. Having these distributed is
> > > > much easier to search.
> > > > > 	- Can some of the existing #defines be converted to runtime
> > > > configurations? For ex: RTE_MAX_LCORE? This might impact ABI.
> > > > >     * Bruce to think about converting the doc to a blog or an
> > email
> > > > on the mailing list. But soliciting feedback is most important.
> > > >
> > > > One alternative path worth looking at is to encourage the use of
> > LTO,
> > > > and modify APIs so the configuration can be provided at linking
> > time,
> > > > and propagated by the compiler.
> > > >
> > > > E.g. one can define rte_max_lcore as a weak constant symbol, equal
> > to
> > > > 128. At linking time the user may provide a rte_max_lcore that is
> > more
> > > > tailored, and still, dynamic arrays[rte_max_lcore] will be
> > allocatable
> > > > on the .bss section, avoiding an indirection. The compiler will be
> > > > able to optimize loops etc which is impossible with pure runtime
> > > > configuration.
> > > >
> > > > In packetmill.io we actually pushed this to the next level where
> > the
> > > > driver can completely change its behavior without recompiling DPDK
> > > > itself and spawning ifdefs everywhere.
> > > >
> > > > However the price is the slowiness of LTO...
> > > >
> > > > My 2 cents.
> > > >
> > > > Tom
> > > >
> > >
> > > If we are moving away from Compile Time parameters, I certainly
> > prefer Tom's
> > > suggestion of Link Time parameters, rather than Run Time parameters.
> > I think compile time constants are fine if they are not used in #ifdef.
> > For ex: if they are used in 'if (...)', it will help eliminate code and
> > branches.
> 
> Yes!
> 
> And "if (...)" is more flexible than #ifdef/#if because it allows the expression to be mixed with non-constants.
> 
> Then perhaps Bruce's script to automatically make C constants out of #defines was not so silly anyway. :-)
> 
> > 
> > >
> > > This might also provide a middle ground for optimizations where
> > Compile
> > > Time parameters are considered unacceptable by the DPDK community.
> > I'm
> > > thinking about something along the lines of the "constant size"
> > rte_event
> > > array presented at the 2020 Userspace Summit by Harry
> > >
> > (https://static.sched.com/hosted_files/dpdkuserspace2020/d3/dpdk_usersp
> > ac
> > > e_20_api_performance_hvh.pdf). Taking this thinking even further out,
> > a Link
> > > Time parameter could perhaps replace the nb_pkts parameter in on
> > > optimized rte_eth_rx_burst() function.
> > >
> 
> Optimally, I would like to see e.g. the RX burst size being so constant that the PMD's RX function knows it and can use vector functions and possibly loop unrolling, without having to implement a pre-check on nb_pkts and a trailing non-vector loop for receiving any remaining odd nb_pkts. All the DPDK examples use #define MAX_PKT_BURST 32 or similar, and I assume most DPDK applications do too.
> 
> I do not trust the compiler to be clever enough to realize that the PMD's RX function is always called with a specific nb_pkts and optimize all this cruft away at compile time (or at link time), unless it is a #define or a compile time constant.
> 

It certainly is not possible to do at compile time, because the calls are
in a different compilation unit from the functions themselves, not to
mention that a link-time the RX functions are called via a function
pointer. Therefore the only way to do this that I am aware of, is to have a
wrapper function use for the common values inside the drivers themselves.

For example, inside the i40e driver (which I'm using because it's the one
I'm most familiar with), the main receive function is already a wrapper
around a raw receive function, using constant-expansion by the compiler of
the final parameter (NULL) to automatically remove the code for tracking
scattered packets.

uint16_t
i40e_recv_pkts_vec_avx2(void *rx_queue, struct rte_mbuf **rx_pkts,
                   uint16_t nb_pkts)
{
	return _recv_raw_pkts_vec_avx2(rx_queue, rx_pkts, nb_pkts, NULL);
}

We can produce a version of this optimized for 32-element dequeues by
special-casing where nb_pkts == 32:

uint16_t
i40e_recv_pkts_vec_avx2(void *rx_queue, struct rte_mbuf **rx_pkts,
                   uint16_t nb_pkts)
{
	if (nb_pkts == 32)
		return _recv_raw_pkts_vec_avx2(rx_queue, rx_pkts, 32, NULL);
	return _recv_raw_pkts_vec_avx2(rx_queue, rx_pkts, nb_pkts, NULL);
}

Now the compiler when inlining the _raw_ function, can see that it needs
two copies, and for the first, that nb_pkts is compile-time constant of 32.

However, I'm not sure how useful an optimization like this is, and I'd be
interested to see what benefits testing shows. Beyond the loop iteration
count of 32, there is also the check after each burst of 8 dequeues in the
driver to check that we have a full set of 8 - and abort the loop if not.
It's also the case that unless an app is already at maximum load (or
overloaded), one would probably not expect to always get a full set of 32
packets each time, as you have no additional headroom for more.

/Bruce

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] Minutes of Technical Board Meeting, 2021-03-10
  2021-04-07  0:47  0%     ` Honnappa Nagarahalli
@ 2021-04-07  7:11  0%       ` Morten Brørup
  2021-04-07  9:58  0%         ` Bruce Richardson
  0 siblings, 1 reply; 200+ results
From: Morten Brørup @ 2021-04-07  7:11 UTC (permalink / raw)
  To: Honnappa Nagarahalli, Tom Barbette, dev
  Cc: nd, Alireza Farshin, Van Haaren, Harry, Bruce Richardson, nd

> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Honnappa
> Nagarahalli
> Sent: Wednesday, April 7, 2021 2:48 AM
> 
> <snip>
> >
> > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Tom Barbette
> > > Sent: Wednesday, March 31, 2021 10:53 AM
> > >
> > > Le 31-03-21 à 02:44, Honnappa Nagarahalli a écrit :
> > > > 	- Ability to tune the values of #defines
> > > >     * Few prominent points discussed
> > > > 	- This will result in #ifdefs in the code (for ex: in
> testpmd)
> > > > 	- One option is for all the PMDs to document their
> configurable
> > > #defines in PMD specific header files. Having these distributed is
> > > much easier to search.
> > > > 	- Can some of the existing #defines be converted to runtime
> > > configurations? For ex: RTE_MAX_LCORE? This might impact ABI.
> > > >     * Bruce to think about converting the doc to a blog or an
> email
> > > on the mailing list. But soliciting feedback is most important.
> > >
> > > One alternative path worth looking at is to encourage the use of
> LTO,
> > > and modify APIs so the configuration can be provided at linking
> time,
> > > and propagated by the compiler.
> > >
> > > E.g. one can define rte_max_lcore as a weak constant symbol, equal
> to
> > > 128. At linking time the user may provide a rte_max_lcore that is
> more
> > > tailored, and still, dynamic arrays[rte_max_lcore] will be
> allocatable
> > > on the .bss section, avoiding an indirection. The compiler will be
> > > able to optimize loops etc which is impossible with pure runtime
> > > configuration.
> > >
> > > In packetmill.io we actually pushed this to the next level where
> the
> > > driver can completely change its behavior without recompiling DPDK
> > > itself and spawning ifdefs everywhere.
> > >
> > > However the price is the slowiness of LTO...
> > >
> > > My 2 cents.
> > >
> > > Tom
> > >
> >
> > If we are moving away from Compile Time parameters, I certainly
> prefer Tom's
> > suggestion of Link Time parameters, rather than Run Time parameters.
> I think compile time constants are fine if they are not used in #ifdef.
> For ex: if they are used in 'if (...)', it will help eliminate code and
> branches.

Yes!

And "if (...)" is more flexible than #ifdef/#if because it allows the expression to be mixed with non-constants.

Then perhaps Bruce's script to automatically make C constants out of #defines was not so silly anyway. :-)

> 
> >
> > This might also provide a middle ground for optimizations where
> Compile
> > Time parameters are considered unacceptable by the DPDK community.
> I'm
> > thinking about something along the lines of the "constant size"
> rte_event
> > array presented at the 2020 Userspace Summit by Harry
> >
> (https://static.sched.com/hosted_files/dpdkuserspace2020/d3/dpdk_usersp
> ac
> > e_20_api_performance_hvh.pdf). Taking this thinking even further out,
> a Link
> > Time parameter could perhaps replace the nb_pkts parameter in on
> > optimized rte_eth_rx_burst() function.
> >

Optimally, I would like to see e.g. the RX burst size being so constant that the PMD's RX function knows it and can use vector functions and possibly loop unrolling, without having to implement a pre-check on nb_pkts and a trailing non-vector loop for receiving any remaining odd nb_pkts. All the DPDK examples use #define MAX_PKT_BURST 32 or similar, and I assume most DPDK applications do too.

I do not trust the compiler to be clever enough to realize that the PMD's RX function is always called with a specific nb_pkts and optimize all this cruft away at compile time (or at link time), unless it is a #define or a compile time constant.

> >
> > Med venlig hilsen / kind regards
> > - Morten Brørup
> >
> >


^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v2 5/5] doc: add single flow dump to guides
  @ 2021-04-07  6:09  4%   ` Haifei Luo
  0 siblings, 0 replies; 200+ results
From: Haifei Luo @ 2021-04-07  6:09 UTC (permalink / raw)
  To: dev
  Cc: orika, viacheslavo, rasland, xuemingl, haifeil, Ferruh Yigit,
	Matan Azrad, Shahaf Shuler

Add "Flow dump" in features/default.ini and features/mlx5.ini.
Add testpmd CLI and API changes in release_notes.

Signed-off-by: Haifei Luo <haifeil@nvidia.com>
---
 doc/guides/nics/features/default.ini   | 1 +
 doc/guides/nics/features/mlx5.ini      | 1 +
 doc/guides/rel_notes/release_21_05.rst | 5 ++++-
 3 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/doc/guides/nics/features/default.ini b/doc/guides/nics/features/default.ini
index 8046bd1..49aaf17 100644
--- a/doc/guides/nics/features/default.ini
+++ b/doc/guides/nics/features/default.ini
@@ -39,6 +39,7 @@ DCB                  =
 VLAN filter          =
 Flow control         =
 Flow API             =
+Flow dump            =
 Rate limitation      =
 Traffic mirroring    =
 Inline crypto        =
diff --git a/doc/guides/nics/features/mlx5.ini b/doc/guides/nics/features/mlx5.ini
index ddd131d..3c5fcff 100644
--- a/doc/guides/nics/features/mlx5.ini
+++ b/doc/guides/nics/features/mlx5.ini
@@ -29,6 +29,7 @@ SR-IOV               = Y
 VLAN filter          = Y
 Flow control         = Y
 Flow API             = Y
+Flow dump            = Y
 CRC offload          = Y
 VLAN offload         = Y
 L3 checksum offload  = Y
diff --git a/doc/guides/rel_notes/release_21_05.rst b/doc/guides/rel_notes/release_21_05.rst
index 873140b..f256324 100644
--- a/doc/guides/rel_notes/release_21_05.rst
+++ b/doc/guides/rel_notes/release_21_05.rst
@@ -125,7 +125,8 @@ New Features
     ``dpdk-testpmd -- --eth-link-speed N``
   * Added command to display Rx queue used descriptor count.
     ``show port (port_id) rxq (queue_id) desc used count``
-
+  * Added command to dump internal representation information of single flow.
+    ``flow dump (port_id) rule (rule_id)``
 
 Removed Items
 -------------
@@ -155,6 +156,8 @@ API Changes
    Also, make sure to start the actual text at the margin.
    =======================================================
 
+* ethdev: Added a rte_flow pointer parameter to the function
+  ``rte_flow_dev_dump()`` allowing dump for single flow.
 
 ABI Changes
 -----------
-- 
1.8.3.1


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] Minutes of Technical Board Meeting, 2021-03-10
  2021-04-06 13:13  0%   ` Morten Brørup
@ 2021-04-07  0:47  0%     ` Honnappa Nagarahalli
  2021-04-07  7:11  0%       ` Morten Brørup
  0 siblings, 1 reply; 200+ results
From: Honnappa Nagarahalli @ 2021-04-07  0:47 UTC (permalink / raw)
  To: Morten Brørup, Tom Barbette, dev
  Cc: nd, Alireza Farshin, Van Haaren, Harry, Bruce Richardson,
	Honnappa Nagarahalli, nd

<snip>
> 
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Tom Barbette
> > Sent: Wednesday, March 31, 2021 10:53 AM
> >
> > Le 31-03-21 à 02:44, Honnappa Nagarahalli a écrit :
> > > 	- Ability to tune the values of #defines
> > >     * Few prominent points discussed
> > > 	- This will result in #ifdefs in the code (for ex: in testpmd)
> > > 	- One option is for all the PMDs to document their configurable
> > #defines in PMD specific header files. Having these distributed is
> > much easier to search.
> > > 	- Can some of the existing #defines be converted to runtime
> > configurations? For ex: RTE_MAX_LCORE? This might impact ABI.
> > >     * Bruce to think about converting the doc to a blog or an email
> > on the mailing list. But soliciting feedback is most important.
> >
> > One alternative path worth looking at is to encourage the use of LTO,
> > and modify APIs so the configuration can be provided at linking time,
> > and propagated by the compiler.
> >
> > E.g. one can define rte_max_lcore as a weak constant symbol, equal to
> > 128. At linking time the user may provide a rte_max_lcore that is more
> > tailored, and still, dynamic arrays[rte_max_lcore] will be allocatable
> > on the .bss section, avoiding an indirection. The compiler will be
> > able to optimize loops etc which is impossible with pure runtime
> > configuration.
> >
> > In packetmill.io we actually pushed this to the next level where the
> > driver can completely change its behavior without recompiling DPDK
> > itself and spawning ifdefs everywhere.
> >
> > However the price is the slowiness of LTO...
> >
> > My 2 cents.
> >
> > Tom
> >
> 
> If we are moving away from Compile Time parameters, I certainly prefer Tom's
> suggestion of Link Time parameters, rather than Run Time parameters.
I think compile time constants are fine if they are not used in #ifdef. For ex: if they are used in 'if (...)', it will help eliminate code and branches.

> 
> This might also provide a middle ground for optimizations where Compile
> Time parameters are considered unacceptable by the DPDK community. I'm
> thinking about something along the lines of the "constant size" rte_event
> array presented at the 2020 Userspace Summit by Harry
> (https://static.sched.com/hosted_files/dpdkuserspace2020/d3/dpdk_userspac
> e_20_api_performance_hvh.pdf). Taking this thinking even further out, a Link
> Time parameter could perhaps replace the nb_pkts parameter in on
> optimized rte_eth_rx_burst() function.
> 
> 
> Med venlig hilsen / kind regards
> - Morten Brørup
> 
> 


^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v2] build: list symbols exports in a single file
  @ 2021-04-06 17:59  2% ` David Marchand
  0 siblings, 0 replies; 200+ results
From: David Marchand @ 2021-04-06 17:59 UTC (permalink / raw)
  To: dev
  Cc: thomas, bruce.richardson, Dmitry Kozlyuk,
	Narcisa Ana Maria Vasile, Dmitry Malloy, Pallavi Kadam,
	Ray Kinsella, Neil Horman, Matan Azrad, Shahaf Shuler,
	Viacheslav Ovsiienko

Rather than have two files that keeps getting out of sync, let's
annotate the version.map to generate the Windows export file.

Note: Existing version.map annotation achieved with:
$ for dir in lib/librte_eal drivers/common/mlx5; do
    ./buildtools/map-list-symbol.sh $dir/*.map |
    while read file version sym; do
      ! git grep -qw $sym $dir/*.def || continue;
      sed -i -e "s/$sym;/$sym; # WINDOWS_NO_EXPORT/" $dir/*.map;
    done;
  done

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
Changes since v1:
- removed unused python imports in map_to_win.py,
- fixed symbol map check to ignore comments,
- aligned common/mlx5 map with exports.def (all symbols exported by
  Windows are available in Linux too),
- annotated common/mlx5 map,
- updated SPDX check,
- updated ABI update tool,

---
 MAINTAINERS                                   |   1 -
 buildtools/map_to_win.py                      |   9 +-
 devtools/check-spdx-tag.sh                    |   2 +-
 devtools/check-symbol-maps.sh                 |  22 +-
 devtools/update_version_map_abi.py            |  12 +-
 .../common/mlx5/rte_common_mlx5_exports.def   |  75 ----
 drivers/common/mlx5/version.map               |  79 ++--
 lib/librte_eal/rte_eal_exports.def            | 336 ------------------
 lib/librte_eal/version.map                    | 136 +++----
 9 files changed, 123 insertions(+), 549 deletions(-)
 delete mode 100644 drivers/common/mlx5/rte_common_mlx5_exports.def
 delete mode 100644 lib/librte_eal/rte_eal_exports.def

diff --git a/MAINTAINERS b/MAINTAINERS
index 0ec5588540..f2d600d0cf 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -333,7 +333,6 @@ M: Narcisa Ana Maria Vasile <navasile@linux.microsoft.com>
 M: Dmitry Malloy <dmitrym@microsoft.com>
 M: Pallavi Kadam <pallavi.kadam@intel.com>
 F: lib/librte_eal/windows/
-F: lib/librte_eal/rte_eal_exports.def
 F: buildtools/map_to_win.py
 F: doc/guides/windows_gsg/
 
diff --git a/buildtools/map_to_win.py b/buildtools/map_to_win.py
index 2a6cb88605..aa1752cacd 100644
--- a/buildtools/map_to_win.py
+++ b/buildtools/map_to_win.py
@@ -3,11 +3,10 @@
 # Copyright(c) 2019 Intel Corporation
 
 import sys
-from os.path import dirname, basename, join, exists
 
 
 def is_function_line(ln):
-    return ln.startswith('\t') and ln.endswith(';\n') and ":" not in ln
+    return ln.startswith('\t') and ln.endswith(';\n') and ":" not in ln and "# WINDOWS_NO_EXPORT" not in ln
 
 # MinGW keeps the original .map file but replaces per_lcore* to __emutls_v.per_lcore*
 def create_mingw_map_file(input_map, output_map):
@@ -24,12 +23,6 @@ def main(args):
         create_mingw_map_file(args[1], args[2])
         return 0
 
-# special case, allow override if an def file already exists alongside map file
-    override_file = join(dirname(args[1]), basename(args[2]))
-    if exists(override_file):
-        with open(override_file) as f_in:
-            functions = f_in.readlines()
-
 # generate def file from map file.
 # This works taking indented lines only which end with a ";" and which don't
 # have a colon in them, i.e. the lines defining functions only.
diff --git a/devtools/check-spdx-tag.sh b/devtools/check-spdx-tag.sh
index a0ec1ed5b6..3f2912e922 100755
--- a/devtools/check-spdx-tag.sh
+++ b/devtools/check-spdx-tag.sh
@@ -25,7 +25,7 @@ check_spdx() {
 	':^*/Kbuild' ':^*/README' \
 	':^license/' ':^config/' ':^buildtools/' \
 	':^*.cocci' ':^*.abignore' \
-	':^*.def' ':^*.map' ':^*.ini' ':^*.data' ':^*.cfg' ':^*.txt' \
+	':^*.map' ':^*.ini' ':^*.data' ':^*.cfg' ':^*.txt' \
 	':^*.svg' ':^*.png'\
 	> $tmpfile
 
diff --git a/devtools/check-symbol-maps.sh b/devtools/check-symbol-maps.sh
index c3cbcaf720..f06353fc75 100755
--- a/devtools/check-symbol-maps.sh
+++ b/devtools/check-symbol-maps.sh
@@ -12,7 +12,7 @@ ret=0
 find_orphan_symbols ()
 {
     for map in $(find lib drivers -name '*.map') ; do
-        for sym in $(sed -rn 's,^([^}]*_.*);,\1,p' $map) ; do
+        for sym in $(sed -rn 's,^([^}]*_.*);.*$,\1,p' $map) ; do
             if echo $sym | grep -q '^per_lcore_' ; then
                 symsrc=${sym#per_lcore_}
             elif echo $sym | grep -q '^__rte_.*_trace_' ; then
@@ -35,24 +35,4 @@ if [ -n "$orphan_symbols" ] ; then
     ret=1
 fi
 
-find_orphan_windows_symbols ()
-{
-    for def in $(find lib drivers -name '*_exports.def') ; do
-        if echo $def | grep -q 'common_mlx5' ; then
-            continue # mlx5 exports different symbols per OS
-        fi
-        map=$(dirname $def)/version.map
-        for sym in $(grep -v ^EXPORTS $def); do
-            grep -q $sym $map || echo $sym
-        done
-    done
-}
-
-orphan_windows_symbols=$(find_orphan_windows_symbols)
-if [ -n "$orphan_windows_symbols" ] ; then
-    echo "Found only in Windows export file:"
-    echo "$orphan_windows_symbols" | sed 's,^,\t,'
-    ret=1
-fi
-
 exit $ret
diff --git a/devtools/update_version_map_abi.py b/devtools/update_version_map_abi.py
index d3068bbd2d..d17b02a327 100755
--- a/devtools/update_version_map_abi.py
+++ b/devtools/update_version_map_abi.py
@@ -15,13 +15,17 @@
 
 
 def __parse_map_file(f_in):
-    # match function name, followed by semicolon, followed by EOL, optionally
-    # with whitespace in between each item
+    # match function name, followed by semicolon, followed by EOL or comments,
+    # optionally with whitespace in between each item
     func_line_regex = re.compile(r"\s*"
+                                 r"(?P<line>"
                                  r"(?P<func>[a-zA-Z_0-9]+)"
                                  r"\s*"
                                  r";"
                                  r"\s*"
+                                 r"(?P<comment>#.+)?"
+                                 r")"
+                                 r"\s*"
                                  r"$")
     # match section name, followed by opening bracked, followed by EOL,
     # optionally with whitespace in between each item
@@ -99,7 +103,7 @@ def __parse_map_file(f_in):
         # is this a function?
         match = func_line_regex.match(line)
         if match:
-            stable_lines.add(match.group("func"))
+            stable_lines.add(match.group("line"))
 
     return has_stable, stable_lines, experimental_lines, internal_lines
 
@@ -116,7 +120,7 @@ def __generate_stable_abi(f_out, abi_major, lines):
 
         # print all stable lines, alphabetically sorted
         for line in sorted(lines):
-            print("\t{};".format(line), file=f_out)
+            print("\t{}".format(line), file=f_out)
 
         # another blank line
         print(file=f_out)
diff --git a/drivers/common/mlx5/rte_common_mlx5_exports.def b/drivers/common/mlx5/rte_common_mlx5_exports.def
deleted file mode 100644
index fd62b806ca..0000000000
--- a/drivers/common/mlx5/rte_common_mlx5_exports.def
+++ /dev/null
@@ -1,75 +0,0 @@
-EXPORTS
-	haswell_broadwell_cpu
-
-	mlx5_common_init
-
-	mlx5_create_mr_ext
-
-	mlx5_devx_cmd_alloc_pd
-	mlx5_devx_cmd_create_cq
-	mlx5_devx_cmd_create_flex_parser
-	mlx5_devx_cmd_create_qp
-	mlx5_devx_cmd_create_rq
-	mlx5_devx_cmd_create_rqt
-	mlx5_devx_cmd_create_sq
-	mlx5_devx_cmd_create_tir
-	mlx5_devx_cmd_create_td
-	mlx5_devx_cmd_create_tis
-	mlx5_devx_cmd_create_virtq
-	mlx5_devx_cmd_destroy
-	mlx5_devx_cmd_flow_counter_alloc
-	mlx5_devx_cmd_flow_counter_query
-	mlx5_devx_cmd_flow_dump
-	mlx5_devx_cmd_mkey_create
-	mlx5_devx_cmd_modify_qp_state
-	mlx5_devx_cmd_modify_rq
-	mlx5_devx_cmd_modify_rqt
-	mlx5_devx_cmd_modify_sq
-	mlx5_devx_cmd_modify_tir
-	mlx5_devx_cmd_modify_virtq
-	mlx5_devx_cmd_qp_query_tis_td
-	mlx5_devx_cmd_query_hca_attr
-	mlx5_devx_cmd_query_parse_samples
-	mlx5_devx_cmd_query_virtq
-	mlx5_devx_cmd_register_read
-	mlx5_devx_get_out_command_status
-	mlx5_devx_cmd_create_flow_hit_aso_obj
-	mlx5_devx_cmd_create_geneve_tlv_option
-
-	mlx5_devx_cq_create
-	mlx5_devx_cq_destroy
-	mlx5_devx_rq_create
-	mlx5_devx_rq_destroy
-	mlx5_devx_sq_create
-	mlx5_devx_sq_destroy
-
-	mlx5_glue
-
-	mlx5_malloc_mem_select
-	mlx5_mr_btree_init
-	mlx5_mr_btree_free
-	mlx5_mr_btree_dump
-	mlx5_mr_addr2mr_bh
-	mlx5_mr_release_cache
-	mlx5_mr_dump_cache
-	mlx5_mr_rebuild_cache
-	mlx5_mr_insert_cache
-	mlx5_mr_lookup_cache
-	mlx5_mr_lookup_list
-	mlx5_mr_create_primary
-	mlx5_mr_flush_local_cache
-	mlx5_mp_req_queue_state_modify
-	mlx5_mr_free
-
-	mlx5_pci_driver_register
-
-	mlx5_malloc
-	mlx5_realloc
-	mlx5_free
-
-	mlx5_os_alloc_pd
-	mlx5_os_dealloc_pd
-	mlx5_os_dereg_mr
-	mlx5_os_reg_mr
-	mlx5_os_umem_reg
-	mlx5_os_umem_dereg
diff --git a/drivers/common/mlx5/version.map b/drivers/common/mlx5/version.map
index 91f3fa5779..299c17cd26 100644
--- a/drivers/common/mlx5/version.map
+++ b/drivers/common/mlx5/version.map
@@ -3,12 +3,12 @@ INTERNAL {
 
 	mlx5_common_init;
 
-	mlx5_common_verbs_reg_mr;
-	mlx5_common_verbs_dereg_mr;
+	mlx5_common_verbs_reg_mr; # WINDOWS_NO_EXPORT
+	mlx5_common_verbs_dereg_mr; # WINDOWS_NO_EXPORT
 
 	mlx5_create_mr_ext;
 
-	mlx5_dev_to_pci_addr;
+	mlx5_dev_to_pci_addr; # WINDOWS_NO_EXPORT
 
 	mlx5_devx_cmd_alloc_pd;
 	mlx5_devx_cmd_create_cq;
@@ -20,7 +20,7 @@ INTERNAL {
 	mlx5_devx_cmd_create_tir;
 	mlx5_devx_cmd_create_td;
 	mlx5_devx_cmd_create_tis;
-	mlx5_devx_cmd_create_virtio_q_counters;
+	mlx5_devx_cmd_create_virtio_q_counters; # WINDOWS_NO_EXPORT
 	mlx5_devx_cmd_create_virtq;
 	mlx5_devx_cmd_create_flow_hit_aso_obj;
 	mlx5_devx_cmd_create_geneve_tlv_option;
@@ -38,14 +38,14 @@ INTERNAL {
 	mlx5_devx_cmd_qp_query_tis_td;
 	mlx5_devx_cmd_query_hca_attr;
 	mlx5_devx_cmd_query_parse_samples;
-	mlx5_devx_cmd_query_virtio_q_counters;
+	mlx5_devx_cmd_query_virtio_q_counters; # WINDOWS_NO_EXPORT
 	mlx5_devx_cmd_query_virtq;
-	mlx5_devx_cmd_queue_counter_alloc;
-	mlx5_devx_cmd_queue_counter_query;
+	mlx5_devx_cmd_queue_counter_alloc; # WINDOWS_NO_EXPORT
+	mlx5_devx_cmd_queue_counter_query; # WINDOWS_NO_EXPORT
 	mlx5_devx_cmd_register_read;
-	mlx5_devx_cmd_wq_query;
+	mlx5_devx_cmd_wq_query; # WINDOWS_NO_EXPORT
 	mlx5_devx_get_out_command_status;
-	mlx5_devx_alloc_uar;
+	mlx5_devx_alloc_uar; # WINDOWS_NO_EXPORT
 
 	mlx5_devx_cq_create;
 	mlx5_devx_cq_destroy;
@@ -54,15 +54,15 @@ INTERNAL {
 	mlx5_devx_sq_create;
 	mlx5_devx_sq_destroy;
 
-	mlx5_get_ifname_sysfs;
+	mlx5_get_ifname_sysfs; # WINDOWS_NO_EXPORT
 
-	mlx5_mp_init_primary;
-	mlx5_mp_uninit_primary;
-	mlx5_mp_init_secondary;
-	mlx5_mp_uninit_secondary;
-	mlx5_mp_req_mr_create;
+	mlx5_mp_init_primary; # WINDOWS_NO_EXPORT
+	mlx5_mp_uninit_primary; # WINDOWS_NO_EXPORT
+	mlx5_mp_init_secondary; # WINDOWS_NO_EXPORT
+	mlx5_mp_uninit_secondary; # WINDOWS_NO_EXPORT
+	mlx5_mp_req_mr_create; # WINDOWS_NO_EXPORT
 	mlx5_mp_req_queue_state_modify;
-	mlx5_mp_req_verbs_cmd_fd;
+	mlx5_mp_req_verbs_cmd_fd; # WINDOWS_NO_EXPORT
 
 	mlx5_mr_btree_init;
 	mlx5_mr_btree_free;
@@ -78,31 +78,40 @@ INTERNAL {
 	mlx5_mr_flush_local_cache;
 	mlx5_mr_free;
 
-	mlx5_nl_allmulti;
-	mlx5_nl_devlink_family_id_get;
-	mlx5_nl_driver_reload;
-	mlx5_nl_enable_roce_get;
-	mlx5_nl_enable_roce_set;
-	mlx5_nl_ifindex;
-	mlx5_nl_init;
-	mlx5_nl_mac_addr_add;
-	mlx5_nl_mac_addr_flush;
-	mlx5_nl_mac_addr_remove;
-	mlx5_nl_mac_addr_sync;
-	mlx5_nl_portnum;
-	mlx5_nl_promisc;
-	mlx5_nl_switch_info;
-	mlx5_nl_vf_mac_addr_modify;
-	mlx5_nl_vlan_vmwa_create;
-	mlx5_nl_vlan_vmwa_delete;
+	mlx5_nl_allmulti; # WINDOWS_NO_EXPORT
+	mlx5_nl_devlink_family_id_get; # WINDOWS_NO_EXPORT
+	mlx5_nl_driver_reload; # WINDOWS_NO_EXPORT
+	mlx5_nl_enable_roce_get; # WINDOWS_NO_EXPORT
+	mlx5_nl_enable_roce_set; # WINDOWS_NO_EXPORT
+	mlx5_nl_ifindex; # WINDOWS_NO_EXPORT
+	mlx5_nl_init; # WINDOWS_NO_EXPORT
+	mlx5_nl_mac_addr_add; # WINDOWS_NO_EXPORT
+	mlx5_nl_mac_addr_flush; # WINDOWS_NO_EXPORT
+	mlx5_nl_mac_addr_remove; # WINDOWS_NO_EXPORT
+	mlx5_nl_mac_addr_sync; # WINDOWS_NO_EXPORT
+	mlx5_nl_portnum; # WINDOWS_NO_EXPORT
+	mlx5_nl_promisc; # WINDOWS_NO_EXPORT
+	mlx5_nl_switch_info; # WINDOWS_NO_EXPORT
+	mlx5_nl_vf_mac_addr_modify; # WINDOWS_NO_EXPORT
+	mlx5_nl_vlan_vmwa_create; # WINDOWS_NO_EXPORT
+	mlx5_nl_vlan_vmwa_delete; # WINDOWS_NO_EXPORT
 
-	mlx5_translate_port_name;
+	mlx5_translate_port_name; # WINDOWS_NO_EXPORT
 
 	mlx5_malloc_mem_select;
-	mlx5_memory_stat_dump;
+	mlx5_memory_stat_dump; # WINDOWS_NO_EXPORT
 	mlx5_malloc;
 	mlx5_realloc;
 	mlx5_free;
 
 	mlx5_pci_driver_register;
+
+	haswell_broadwell_cpu;
+	mlx5_glue;
+	mlx5_os_alloc_pd;
+	mlx5_os_dealloc_pd;
+	mlx5_os_dereg_mr;
+	mlx5_os_reg_mr;
+	mlx5_os_umem_reg;
+	mlx5_os_umem_dereg;
 };
diff --git a/lib/librte_eal/rte_eal_exports.def b/lib/librte_eal/rte_eal_exports.def
deleted file mode 100644
index c320077547..0000000000
--- a/lib/librte_eal/rte_eal_exports.def
+++ /dev/null
@@ -1,336 +0,0 @@
-EXPORTS
-	__rte_panic
-	per_lcore__lcore_id
-	per_lcore__rte_errno
-	per_lcore__thread_id
-	rte_bus_dump
-	rte_bus_find
-	rte_bus_find_by_device
-	rte_bus_find_by_name
-	rte_bus_get_iommu_class
-	rte_bus_probe
-	rte_bus_register
-	rte_bus_scan
-	rte_bus_unregister
-	rte_calloc
-	rte_calloc_socket
-	rte_cpu_get_flag_enabled
-	rte_cpu_get_flag_name
-	rte_ctrl_thread_create
-	rte_delay_us
-	rte_delay_us_block
-	rte_delay_us_callback_register
-	rte_dev_is_probed
-	rte_dev_probe
-	rte_dev_remove
-	rte_devargs_add
-	rte_devargs_dump
-	rte_devargs_insert
-	rte_devargs_next
-	rte_devargs_parse
-	rte_devargs_parsef
-	rte_devargs_remove
-	rte_devargs_type_count
-	rte_dump_physmem_layout
-	rte_dump_stack
-	rte_dump_tailq
-	rte_eal_alarm_cancel
-	rte_eal_alarm_set
-	rte_eal_cleanup
-	rte_eal_get_lcore_state
-	rte_eal_get_physmem_size
-	rte_eal_get_runtime_dir
-	rte_eal_has_hugepages
-	rte_eal_has_pci
-	rte_eal_hotplug_add
-	rte_eal_hotplug_remove
-	rte_eal_init
-	rte_eal_iova_mode
-	rte_eal_lcore_role
-	rte_eal_mbuf_user_pool_ops
-	rte_eal_mp_remote_launch
-	rte_eal_mp_wait_lcore
-	rte_eal_process_type
-	rte_eal_remote_launch
-	rte_eal_tailq_lookup
-	rte_eal_tailq_register
-	rte_eal_using_phys_addrs
-	rte_eal_wait_lcore
-	rte_epoll_ctl
-	rte_epoll_wait
-	rte_exit
-	rte_free
-	rte_get_main_lcore
-	rte_get_next_lcore
-	rte_get_tsc_hz
-	rte_hexdump
-	rte_hypervisor_get
-	rte_intr_allow_others
-	rte_intr_callback_register
-	rte_intr_callback_unregister
-	rte_intr_cap_multiple
-	rte_intr_disable
-	rte_intr_dp_is_en
-	rte_intr_efd_disable
-	rte_intr_efd_enable
-	rte_intr_enable
-	rte_intr_free_epoll_fd
-	rte_intr_rx_ctl
-	rte_intr_tls_epfd
-	rte_lcore_count
-	rte_lcore_has_role
-	rte_lcore_index
-	rte_lcore_is_enabled
-	rte_lcore_to_socket_id
-	rte_log
-	rte_log_cur_msg_loglevel
-	rte_log_cur_msg_logtype
-	rte_log_dump
-	rte_log_get_global_level
-	rte_log_get_level
-	rte_log_get_stream
-	rte_log_register
-	rte_log_set_global_level
-	rte_log_set_level
-	rte_log_set_level_pattern
-	rte_log_set_level_regexp
-	rte_malloc
-	rte_malloc_dump_stats
-	rte_malloc_get_socket_stats
-	rte_malloc_set_limit
-	rte_malloc_socket
-	rte_malloc_validate
-	rte_malloc_virt2iova
-	rte_mcfg_mem_read_lock
-	rte_mcfg_mem_read_unlock
-	rte_mcfg_mem_write_lock
-	rte_mcfg_mem_write_unlock
-	rte_mcfg_mempool_read_lock
-	rte_mcfg_mempool_read_unlock
-	rte_mcfg_mempool_write_lock
-	rte_mcfg_mempool_write_unlock
-	rte_mcfg_tailq_read_lock
-	rte_mcfg_tailq_read_unlock
-	rte_mcfg_tailq_write_lock
-	rte_mcfg_tailq_write_unlock
-	rte_mem_lock_page
-	rte_mem_virt2iova
-	rte_mem_virt2phy
-	rte_memdump
-	rte_memory_get_nchannel
-	rte_memory_get_nrank
-	rte_memzone_dump
-	rte_memzone_free
-	rte_memzone_lookup
-	rte_memzone_reserve
-	rte_memzone_reserve_aligned
-	rte_memzone_reserve_bounded
-	rte_memzone_walk
-	rte_openlog_stream
-	rte_rand
-	rte_realloc
-	rte_reciprocal_value
-	rte_reciprocal_value_u64
-	rte_rtm_supported
-	rte_service_attr_get
-	rte_service_attr_reset_all
-	rte_service_component_register
-	rte_service_component_runstate_set
-	rte_service_component_unregister
-	rte_service_dump
-	rte_service_finalize
-	rte_service_get_by_name
-	rte_service_get_count
-	rte_service_get_name
-	rte_service_lcore_add
-	rte_service_lcore_attr_get
-	rte_service_lcore_attr_reset_all
-	rte_service_lcore_count
-	rte_service_lcore_count_services
-	rte_service_lcore_del
-	rte_service_lcore_list
-	rte_service_lcore_reset_all
-	rte_service_lcore_start
-	rte_service_lcore_stop
-	rte_service_map_lcore_get
-	rte_service_map_lcore_set
-	rte_service_may_be_active
-	rte_service_probe_capability
-	rte_service_run_iter_on_app_lcore
-	rte_service_runstate_get
-	rte_service_runstate_set
-	rte_service_set_runstate_mapped_check
-	rte_service_set_stats_enable
-	rte_service_start_with_defaults
-	rte_set_application_usage_hook
-	rte_socket_count
-	rte_socket_id
-	rte_socket_id_by_idx
-	rte_strerror
-	rte_strscpy
-	rte_strsplit
-	rte_sys_gettid
-	rte_thread_get_affinity
-	rte_thread_set_affinity
-	rte_thread_setname
-	rte_vfio_container_dma_map
-	rte_vfio_container_dma_unmap
-	rte_vlog
-	rte_zmalloc
-	rte_zmalloc_socket
-
-	rte_mp_action_register
-	rte_mp_action_unregister
-	rte_mp_reply
-	rte_mp_sendmsg
-
-	rte_dev_event_callback_register
-	rte_dev_event_callback_unregister
-	rte_fbarray_attach
-	rte_fbarray_destroy
-	rte_fbarray_detach
-	rte_fbarray_dump_metadata
-	rte_fbarray_find_contig_free
-	rte_fbarray_find_contig_used
-	rte_fbarray_find_idx
-	rte_fbarray_find_next_free
-	rte_fbarray_find_next_n_free
-	rte_fbarray_find_next_n_used
-	rte_fbarray_find_next_used
-	rte_fbarray_get
-	rte_fbarray_init
-	rte_fbarray_is_used
-	rte_fbarray_set_free
-	rte_fbarray_set_used
-	rte_log_register_type_and_pick_level
-	rte_malloc_dump_heaps
-	rte_mem_alloc_validator_register
-	rte_mem_alloc_validator_unregister
-	rte_mem_check_dma_mask
-	rte_mem_event_callback_register
-	rte_mem_event_callback_unregister
-	rte_mem_iova2virt
-	rte_mem_virt2memseg
-	rte_mem_virt2memseg_list
-	rte_memseg_contig_walk
-	rte_memseg_list_walk
-	rte_memseg_walk
-	rte_mp_request_async
-	rte_mp_request_sync
-
-	rte_class_find
-	rte_class_find_by_name
-	rte_class_register
-	rte_class_unregister
-	rte_dev_iterator_init
-	rte_dev_iterator_next
-	rte_fbarray_find_prev_free
-	rte_fbarray_find_prev_n_free
-	rte_fbarray_find_prev_n_used
-	rte_fbarray_find_prev_used
-	rte_fbarray_find_rev_contig_free
-	rte_fbarray_find_rev_contig_used
-	rte_memseg_contig_walk_thread_unsafe
-	rte_memseg_list_walk_thread_unsafe
-	rte_memseg_walk_thread_unsafe
-
-	rte_delay_us_sleep
-	rte_dev_event_callback_process
-	rte_malloc_heap_create
-	rte_malloc_heap_destroy
-	rte_malloc_heap_get_socket
-	rte_malloc_heap_memory_add
-	rte_malloc_heap_memory_attach
-	rte_malloc_heap_memory_detach
-	rte_malloc_heap_memory_remove
-	rte_malloc_heap_socket_is_external
-	rte_mem_check_dma_mask_thread_unsafe
-	rte_mem_set_dma_mask
-	rte_memseg_get_fd
-	rte_memseg_get_fd_offset
-	rte_memseg_get_fd_offset_thread_unsafe
-	rte_memseg_get_fd_thread_unsafe
-
-	rte_extmem_attach
-	rte_extmem_detach
-	rte_extmem_register
-	rte_extmem_unregister
-
-	rte_dev_dma_map
-	rte_dev_dma_unmap
-	rte_fbarray_find_biggest_free
-	rte_fbarray_find_biggest_used
-	rte_fbarray_find_rev_biggest_free
-	rte_fbarray_find_rev_biggest_used
-	rte_intr_callback_unregister_pending
-	rte_realloc_socket
-
-	rte_intr_ack
-	rte_lcore_cpuset
-	rte_lcore_to_cpu_id
-	rte_mcfg_timer_lock
-	rte_mcfg_timer_unlock
-	rte_mcfg_get_single_file_segments
-
-	rte_thread_is_intr
-
-	__rte_eal_trace_alarm_cancel
-	__rte_eal_trace_alarm_set
-	__rte_eal_trace_generic_double
-	__rte_eal_trace_generic_float
-	__rte_eal_trace_generic_func
-	__rte_eal_trace_generic_i16
-	__rte_eal_trace_generic_i32
-	__rte_eal_trace_generic_i64
-	__rte_eal_trace_generic_i8
-	__rte_eal_trace_generic_int
-	__rte_eal_trace_generic_long
-	__rte_eal_trace_generic_ptr
-	__rte_eal_trace_generic_str
-	__rte_eal_trace_generic_u16
-	__rte_eal_trace_generic_u32
-	__rte_eal_trace_generic_u64
-	__rte_eal_trace_generic_u8
-	__rte_eal_trace_generic_void
-	__rte_eal_trace_intr_callback_register
-	__rte_eal_trace_intr_callback_unregister
-	__rte_eal_trace_intr_enable
-	__rte_eal_trace_intr_disable
-	__rte_eal_trace_mem_free
-	__rte_eal_trace_mem_malloc
-	__rte_eal_trace_mem_realloc
-	__rte_eal_trace_mem_zmalloc
-	__rte_eal_trace_memzone_free
-	__rte_eal_trace_memzone_lookup
-	__rte_eal_trace_memzone_reserve
-	__rte_eal_trace_thread_lcore_ready
-	__rte_eal_trace_thread_remote_launch
-	__rte_trace_mem_per_thread_alloc
-	__rte_trace_point_emit_field
-	__rte_trace_point_register
-	per_lcore_trace_mem
-	per_lcore_trace_point_sz
-	rte_log_can_log
-
-	rte_lcore_callback_register
-	rte_lcore_callback_unregister
-	rte_lcore_dump
-	rte_lcore_iterate
-	rte_mp_disable
-	rte_service_lcore_may_be_active
-	rte_thread_register
-	rte_thread_unregister
-
-	rte_epoll_wait_interruptible
-	rte_vect_get_max_simd_bitwidth
-	rte_vect_set_max_simd_bitwidth
-
-	rte_thread_key_create
-	rte_thread_key_delete
-	rte_thread_value_get
-	rte_thread_value_set
-
-	rte_mem_lock
-	rte_mem_map
-	rte_mem_page_size
-	rte_mem_unmap
diff --git a/lib/librte_eal/version.map b/lib/librte_eal/version.map
index e23745ae6e..151330b1b5 100644
--- a/lib/librte_eal/version.map
+++ b/lib/librte_eal/version.map
@@ -2,8 +2,8 @@ DPDK_21 {
 	global:
 
 	__rte_panic;
-	eal_parse_sysfs_value;
-	eal_timer_source;
+	eal_parse_sysfs_value; # WINDOWS_NO_EXPORT
+	eal_timer_source; # WINDOWS_NO_EXPORT
 	per_lcore__lcore_id;
 	per_lcore__rte_errno;
 	per_lcore__thread_id;
@@ -20,9 +20,9 @@ DPDK_21 {
 	rte_calloc_socket;
 	rte_cpu_get_flag_enabled;
 	rte_cpu_get_flag_name;
-	rte_cpu_is_supported;
+	rte_cpu_is_supported; # WINDOWS_NO_EXPORT
 	rte_ctrl_thread_create;
-	rte_cycles_vmware_tsc_map;
+	rte_cycles_vmware_tsc_map; # WINDOWS_NO_EXPORT
 	rte_delay_us;
 	rte_delay_us_block;
 	rte_delay_us_callback_register;
@@ -43,7 +43,7 @@ DPDK_21 {
 	rte_eal_alarm_cancel;
 	rte_eal_alarm_set;
 	rte_eal_cleanup;
-	rte_eal_create_uio_dev;
+	rte_eal_create_uio_dev; # WINDOWS_NO_EXPORT
 	rte_eal_get_lcore_state;
 	rte_eal_get_physmem_size;
 	rte_eal_get_runtime_dir;
@@ -51,34 +51,34 @@ DPDK_21 {
 	rte_eal_has_pci;
 	rte_eal_hotplug_add;
 	rte_eal_hotplug_remove;
-	rte_eal_hpet_init;
+	rte_eal_hpet_init; # WINDOWS_NO_EXPORT
 	rte_eal_init;
-	rte_eal_iopl_init;
+	rte_eal_iopl_init; # WINDOWS_NO_EXPORT
 	rte_eal_iova_mode;
 	rte_eal_lcore_role;
 	rte_eal_mbuf_user_pool_ops;
 	rte_eal_mp_remote_launch;
 	rte_eal_mp_wait_lcore;
-	rte_eal_primary_proc_alive;
+	rte_eal_primary_proc_alive; # WINDOWS_NO_EXPORT
 	rte_eal_process_type;
 	rte_eal_remote_launch;
 	rte_eal_tailq_lookup;
 	rte_eal_tailq_register;
 	rte_eal_using_phys_addrs;
-	rte_eal_vfio_intr_mode;
+	rte_eal_vfio_intr_mode; # WINDOWS_NO_EXPORT
 	rte_eal_wait_lcore;
 	rte_epoll_ctl;
 	rte_epoll_wait;
 	rte_exit;
 	rte_free;
-	rte_get_hpet_cycles;
-	rte_get_hpet_hz;
+	rte_get_hpet_cycles; # WINDOWS_NO_EXPORT
+	rte_get_hpet_hz; # WINDOWS_NO_EXPORT
 	rte_get_main_lcore;
 	rte_get_next_lcore;
 	rte_get_tsc_hz;
 	rte_hexdump;
 	rte_hypervisor_get;
-	rte_hypervisor_get_name;
+	rte_hypervisor_get_name; # WINDOWS_NO_EXPORT
 	rte_intr_allow_others;
 	rte_intr_callback_register;
 	rte_intr_callback_unregister;
@@ -91,12 +91,12 @@ DPDK_21 {
 	rte_intr_free_epoll_fd;
 	rte_intr_rx_ctl;
 	rte_intr_tls_epfd;
-	rte_keepalive_create;
-	rte_keepalive_dispatch_pings;
-	rte_keepalive_mark_alive;
-	rte_keepalive_mark_sleep;
-	rte_keepalive_register_core;
-	rte_keepalive_register_relay_callback;
+	rte_keepalive_create; # WINDOWS_NO_EXPORT
+	rte_keepalive_dispatch_pings; # WINDOWS_NO_EXPORT
+	rte_keepalive_mark_alive; # WINDOWS_NO_EXPORT
+	rte_keepalive_mark_sleep; # WINDOWS_NO_EXPORT
+	rte_keepalive_register_core; # WINDOWS_NO_EXPORT
+	rte_keepalive_register_relay_callback; # WINDOWS_NO_EXPORT
 	rte_lcore_count;
 	rte_lcore_has_role;
 	rte_lcore_index;
@@ -159,7 +159,7 @@ DPDK_21 {
 	rte_service_component_unregister;
 	rte_service_dump;
 	rte_service_finalize;
-	rte_service_get_by_id;
+	rte_service_get_by_id; # WINDOWS_NO_EXPORT
 	rte_service_get_by_name;
 	rte_service_get_count;
 	rte_service_get_name;
@@ -187,7 +187,7 @@ DPDK_21 {
 	rte_socket_count;
 	rte_socket_id;
 	rte_socket_id_by_idx;
-	rte_srand;
+	rte_srand; # WINDOWS_NO_EXPORT
 	rte_strerror;
 	rte_strscpy;
 	rte_strsplit;
@@ -195,26 +195,26 @@ DPDK_21 {
 	rte_thread_get_affinity;
 	rte_thread_set_affinity;
 	rte_thread_setname;
-	rte_uuid_compare;
-	rte_uuid_is_null;
-	rte_uuid_parse;
-	rte_uuid_unparse;
-	rte_version;
-	rte_vfio_clear_group;
-	rte_vfio_container_create;
-	rte_vfio_container_destroy;
+	rte_uuid_compare; # WINDOWS_NO_EXPORT
+	rte_uuid_is_null; # WINDOWS_NO_EXPORT
+	rte_uuid_parse; # WINDOWS_NO_EXPORT
+	rte_uuid_unparse; # WINDOWS_NO_EXPORT
+	rte_version; # WINDOWS_NO_EXPORT
+	rte_vfio_clear_group; # WINDOWS_NO_EXPORT
+	rte_vfio_container_create; # WINDOWS_NO_EXPORT
+	rte_vfio_container_destroy; # WINDOWS_NO_EXPORT
 	rte_vfio_container_dma_map;
 	rte_vfio_container_dma_unmap;
-	rte_vfio_container_group_bind;
-	rte_vfio_container_group_unbind;
-	rte_vfio_enable;
-	rte_vfio_get_container_fd;
-	rte_vfio_get_group_fd;
-	rte_vfio_get_group_num;
-	rte_vfio_is_enabled;
-	rte_vfio_noiommu_is_enabled;
-	rte_vfio_release_device;
-	rte_vfio_setup_device;
+	rte_vfio_container_group_bind; # WINDOWS_NO_EXPORT
+	rte_vfio_container_group_unbind; # WINDOWS_NO_EXPORT
+	rte_vfio_enable; # WINDOWS_NO_EXPORT
+	rte_vfio_get_container_fd; # WINDOWS_NO_EXPORT
+	rte_vfio_get_group_fd; # WINDOWS_NO_EXPORT
+	rte_vfio_get_group_num; # WINDOWS_NO_EXPORT
+	rte_vfio_is_enabled; # WINDOWS_NO_EXPORT
+	rte_vfio_noiommu_is_enabled; # WINDOWS_NO_EXPORT
+	rte_vfio_release_device; # WINDOWS_NO_EXPORT
+	rte_vfio_setup_device; # WINDOWS_NO_EXPORT
 	rte_vlog;
 	rte_zmalloc;
 	rte_zmalloc_socket;
@@ -234,8 +234,8 @@ EXPERIMENTAL {
 	# added in 18.05
 	rte_dev_event_callback_register;
 	rte_dev_event_callback_unregister;
-	rte_dev_event_monitor_start;
-	rte_dev_event_monitor_stop;
+	rte_dev_event_monitor_start; # WINDOWS_NO_EXPORT
+	rte_dev_event_monitor_stop; # WINDOWS_NO_EXPORT
 	rte_fbarray_attach;
 	rte_fbarray_destroy;
 	rte_fbarray_detach;
@@ -288,8 +288,8 @@ EXPERIMENTAL {
 	# added in 18.11
 	rte_delay_us_sleep;
 	rte_dev_event_callback_process;
-	rte_dev_hotplug_handle_disable;
-	rte_dev_hotplug_handle_enable;
+	rte_dev_hotplug_handle_disable; # WINDOWS_NO_EXPORT
+	rte_dev_hotplug_handle_enable; # WINDOWS_NO_EXPORT
 	rte_malloc_heap_create;
 	rte_malloc_heap_destroy;
 	rte_malloc_heap_get_socket;
@@ -327,7 +327,7 @@ EXPERIMENTAL {
 	rte_lcore_to_cpu_id;
 	rte_mcfg_timer_lock;
 	rte_mcfg_timer_unlock;
-	rte_rand_max;
+	rte_rand_max; # WINDOWS_NO_EXPORT
 
 	# added in 19.11
 	rte_mcfg_get_single_file_segments;
@@ -373,22 +373,22 @@ EXPERIMENTAL {
 	per_lcore_trace_mem;
 	per_lcore_trace_point_sz;
 	rte_log_can_log;
-	rte_thread_getname;
-	rte_trace_dump;
-	rte_trace_is_enabled;
-	rte_trace_metadata_dump;
-	rte_trace_mode_get;
-	rte_trace_mode_set;
-	rte_trace_pattern;
-	rte_trace_point_disable;
-	rte_trace_point_enable;
-	rte_trace_point_is_enabled;
-	rte_trace_point_lookup;
-	rte_trace_regexp;
-	rte_trace_save;
+	rte_thread_getname; # WINDOWS_NO_EXPORT
+	rte_trace_dump; # WINDOWS_NO_EXPORT
+	rte_trace_is_enabled; # WINDOWS_NO_EXPORT
+	rte_trace_metadata_dump; # WINDOWS_NO_EXPORT
+	rte_trace_mode_get; # WINDOWS_NO_EXPORT
+	rte_trace_mode_set; # WINDOWS_NO_EXPORT
+	rte_trace_pattern; # WINDOWS_NO_EXPORT
+	rte_trace_point_disable; # WINDOWS_NO_EXPORT
+	rte_trace_point_enable; # WINDOWS_NO_EXPORT
+	rte_trace_point_is_enabled; # WINDOWS_NO_EXPORT
+	rte_trace_point_lookup; # WINDOWS_NO_EXPORT
+	rte_trace_regexp; # WINDOWS_NO_EXPORT
+	rte_trace_save; # WINDOWS_NO_EXPORT
 
 	# added in 20.08
-	rte_eal_vfio_get_vf_token;
+	rte_eal_vfio_get_vf_token; # WINDOWS_NO_EXPORT
 	rte_lcore_callback_register;
 	rte_lcore_callback_unregister;
 	rte_lcore_dump;
@@ -398,29 +398,29 @@ EXPERIMENTAL {
 	rte_thread_unregister;
 
 	# added in 20.11
-	__rte_eal_trace_generic_size_t;
-	rte_cpu_get_intrinsics_support;
+	__rte_eal_trace_generic_size_t; # WINDOWS_NO_EXPORT
+	rte_cpu_get_intrinsics_support; # WINDOWS_NO_EXPORT
 	rte_epoll_wait_interruptible;
 	rte_service_lcore_may_be_active;
 	rte_vect_get_max_simd_bitwidth;
 	rte_vect_set_max_simd_bitwidth;
 
 	# added in 21.02
-	rte_power_monitor;
-	rte_power_monitor_wakeup;
-	rte_power_pause;
+	rte_power_monitor; # WINDOWS_NO_EXPORT
+	rte_power_monitor_wakeup; # WINDOWS_NO_EXPORT
+	rte_power_pause; # WINDOWS_NO_EXPORT
 
 	# added in 21.05
 	rte_thread_key_create;
 	rte_thread_key_delete;
 	rte_thread_value_get;
 	rte_thread_value_set;
-	rte_version_minor;
-	rte_version_month;
-	rte_version_prefix;
-	rte_version_release;
-	rte_version_suffix;
-	rte_version_year;
+	rte_version_minor; # WINDOWS_NO_EXPORT
+	rte_version_month; # WINDOWS_NO_EXPORT
+	rte_version_prefix; # WINDOWS_NO_EXPORT
+	rte_version_release; # WINDOWS_NO_EXPORT
+	rte_version_suffix; # WINDOWS_NO_EXPORT
+	rte_version_year; # WINDOWS_NO_EXPORT
 };
 
 INTERNAL {
-- 
2.23.0


^ permalink raw reply	[relevance 2%]

* Re: [dpdk-dev] [PATCH V2] ethdev: add queue state when retrieve queue information
  2021-03-25 11:09 13% ` [dpdk-dev] [PATCH V2] " Lijun Ou
  2021-04-06  0:49  0%   ` oulijun
@ 2021-04-06 14:02  0%   ` Ananyev, Konstantin
  1 sibling, 0 replies; 200+ results
From: Ananyev, Konstantin @ 2021-04-06 14:02 UTC (permalink / raw)
  To: Lijun Ou, thomas, Yigit, Ferruh; +Cc: dev, linuxarm

Hi,

> Currently, upper-layer application could get queue state only
> through pointers such as dev->data->tx_queue_state[queue_id],
> this is not the recommended way to access it. So this patch
> add get queue state when call rte_eth_rx_queue_info_get and
> rte_eth_tx_queue_info_get API.
> 
> Note: The hairpin queue is not supported with above
> rte_eth_*x_queue_info_get, so the queue state could be
> RTE_ETH_QUEUE_STATE_STARTED or RTE_ETH_QUEUE_STATE_STOPPED.

I wonder why RTE_ETH_QUEUE_STATE_HAIRPIN Is not supported?
Obviously what we do - copy internal queue state to the user provided buffer.

> Note: After add queue_state field, the 'struct rte_eth_rxq_info' size
> remains 128B, and the 'struct rte_eth_txq_info' size remains 64B, so
> it could be ABI compatible.
> 
> Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
> Signed-off-by: Lijun Ou <oulijun@huawei.com>
> ---
> V1->V2:
> - move queue state defines to public file
> ---
>  doc/guides/rel_notes/release_21_05.rst |  6 ++++++
>  lib/librte_ethdev/ethdev_driver.h      |  7 -------
>  lib/librte_ethdev/rte_ethdev.c         |  3 +++
>  lib/librte_ethdev/rte_ethdev.h         | 11 +++++++++++
>  4 files changed, 20 insertions(+), 7 deletions(-)
> 
> diff --git a/doc/guides/rel_notes/release_21_05.rst b/doc/guides/rel_notes/release_21_05.rst
> index 22aa80a..503daf9 100644
> --- a/doc/guides/rel_notes/release_21_05.rst
> +++ b/doc/guides/rel_notes/release_21_05.rst
> @@ -164,6 +164,12 @@ ABI Changes
> 
>  * No ABI change that would break compatibility with 20.11.
> 
> +* Added new field ``queue_state`` to ``rte_eth_rxq_info`` structure
> +  to provide indicated rxq queue state.
> +
> +* Added new field ``queue_state`` to ``rte_eth_txq_info`` structure
> +  to provide indicated txq queue state.
> +
> 
>  Known Issues
>  ------------
> diff --git a/lib/librte_ethdev/ethdev_driver.h b/lib/librte_ethdev/ethdev_driver.h
> index cdd4b43..ec5a17d 100644
> --- a/lib/librte_ethdev/ethdev_driver.h
> +++ b/lib/librte_ethdev/ethdev_driver.h
> @@ -970,13 +970,6 @@ struct eth_dev_ops {
>  };
> 
>  /**
> - * RX/TX queue states
> - */
> -#define RTE_ETH_QUEUE_STATE_STOPPED 0
> -#define RTE_ETH_QUEUE_STATE_STARTED 1
> -#define RTE_ETH_QUEUE_STATE_HAIRPIN 2
> -
> -/**
>   * @internal
>   * Check if the selected Rx queue is hairpin queue.
>   *
> diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
> index 3059aa5..fbd10b2 100644
> --- a/lib/librte_ethdev/rte_ethdev.c
> +++ b/lib/librte_ethdev/rte_ethdev.c
> @@ -5042,6 +5042,8 @@ rte_eth_rx_queue_info_get(uint16_t port_id, uint16_t queue_id,
> 
>  	memset(qinfo, 0, sizeof(*qinfo));
>  	dev->dev_ops->rxq_info_get(dev, queue_id, qinfo);
> +	qinfo->queue_state = dev->data->rx_queue_state[queue_id];
> +
>  	return 0;
>  }
> 
> @@ -5082,6 +5084,7 @@ rte_eth_tx_queue_info_get(uint16_t port_id, uint16_t queue_id,
> 
>  	memset(qinfo, 0, sizeof(*qinfo));
>  	dev->dev_ops->txq_info_get(dev, queue_id, qinfo);
> +	qinfo->queue_state = dev->data->tx_queue_state[queue_id];
> 
>  	return 0;
>  }
> diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
> index efda313..4f0b1b2 100644
> --- a/lib/librte_ethdev/rte_ethdev.h
> +++ b/lib/librte_ethdev/rte_ethdev.h
> @@ -1582,6 +1582,13 @@ struct rte_eth_dev_info {
>  };
> 
>  /**
> + * RX/TX queue states
> + */
> +#define RTE_ETH_QUEUE_STATE_STOPPED 0
> +#define RTE_ETH_QUEUE_STATE_STARTED 1
> +#define RTE_ETH_QUEUE_STATE_HAIRPIN 2
> +
> +/**
>   * Ethernet device RX queue information structure.
>   * Used to retrieve information about configured queue.
>   */
> @@ -1591,6 +1598,8 @@ struct rte_eth_rxq_info {
>  	uint8_t scattered_rx;       /**< scattered packets RX supported. */
>  	uint16_t nb_desc;           /**< configured number of RXDs. */
>  	uint16_t rx_buf_size;       /**< hardware receive buffer size. */
> +	/**< Queues state: STARTED(1) / STOPPED(0). */

I think comment has to state that possible values are one of
RTE_ETH_QUEUE_STATE_*.
About previous discussion about new field in this struct vs new API function,
I still think new function will be a bit cleaner, but could live with both.

> +	uint8_t queue_state;

If we'll go with new 1B field, then as Stephen pointed,
it is probably worth to fill the hole between scattered_rx
and nb_desc with this new filed.

>  } __rte_cache_min_aligned;
> 
>  /**
> @@ -1600,6 +1609,8 @@ struct rte_eth_rxq_info {
>  struct rte_eth_txq_info {
>  	struct rte_eth_txconf conf; /**< queue config parameters. */
>  	uint16_t nb_desc;           /**< configured number of TXDs. */
> +	/**< Queues state: STARTED(1) / STOPPED(0). */

Same about comment here.

> +	uint8_t queue_state;
>  } __rte_cache_min_aligned;
> 
>  /* Generic Burst mode flag definition, values can be ORed. */
> --
> 2.7.4


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] Minutes of Technical Board Meeting, 2021-03-10
  2021-03-31  8:52  0% ` Tom Barbette
@ 2021-04-06 13:13  0%   ` Morten Brørup
  2021-04-07  0:47  0%     ` Honnappa Nagarahalli
  0 siblings, 1 reply; 200+ results
From: Morten Brørup @ 2021-04-06 13:13 UTC (permalink / raw)
  To: Tom Barbette, Honnappa Nagarahalli, dev
  Cc: nd, Alireza Farshin, Van Haaren, Harry, Bruce Richardson

> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Tom Barbette
> Sent: Wednesday, March 31, 2021 10:53 AM
> 
> Le 31-03-21 à 02:44, Honnappa Nagarahalli a écrit :
> > 	- Ability to tune the values of #defines
> >     * Few prominent points discussed
> > 	- This will result in #ifdefs in the code (for ex: in testpmd)
> > 	- One option is for all the PMDs to document their configurable
> #defines in PMD specific header files. Having these distributed is much
> easier to search.
> > 	- Can some of the existing #defines be converted to runtime
> configurations? For ex: RTE_MAX_LCORE? This might impact ABI.
> >     * Bruce to think about converting the doc to a blog or an email
> on the mailing list. But soliciting feedback is most important.
> 
> One alternative path worth looking at is to encourage the use of LTO,
> and modify APIs so the configuration can be provided at linking time,
> and propagated by the compiler.
> 
> E.g. one can define rte_max_lcore as a weak constant symbol, equal to
> 128. At linking time the user may provide a rte_max_lcore that is more
> tailored, and still, dynamic arrays[rte_max_lcore] will be allocatable
> on the .bss section, avoiding an indirection. The compiler will be able
> to optimize loops etc which is impossible with pure runtime
> configuration.
> 
> In packetmill.io we actually pushed this to the next level where the
> driver can completely change its behavior without recompiling DPDK
> itself and spawning ifdefs everywhere.
> 
> However the price is the slowiness of LTO...
> 
> My 2 cents.
> 
> Tom
> 

If we are moving away from Compile Time parameters, I certainly prefer Tom's suggestion of Link Time parameters, rather than Run Time parameters.

This might also provide a middle ground for optimizations where Compile Time parameters are considered unacceptable by the DPDK community. I'm thinking about something along the lines of the "constant size" rte_event array presented at the 2020 Userspace Summit by Harry (https://static.sched.com/hosted_files/dpdkuserspace2020/d3/dpdk_userspace_20_api_performance_hvh.pdf). Taking this thinking even further out, a Link Time parameter could perhaps replace the nb_pkts parameter in on optimized rte_eth_rx_burst() function.


Med venlig hilsen / kind regards
- Morten Brørup




^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v3 1/2] pci: rename catch-all ID
  @ 2021-04-06 10:28  4%   ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2021-04-06 10:28 UTC (permalink / raw)
  To: dev
  Cc: Parav Pandit, David Marchand, Matan Azrad, Shahaf Shuler,
	Viacheslav Ovsiienko, Gaetan Rivet

The name of the constant PCI_ANY_ID was missing RTE_ prefix.
It is renamed, and the old name becomes a deprecated alias.

While renaming, the duplicate definitions in rte_bus_pci.h
are removed to keep only those in rte_pci.h.
Note: rte_pci.h is included in rte_bus_pci.h

Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
Reviewed-by: Parav Pandit <parav@nvidia.com>
Reviewed-by: David Marchand <david.marchand@redhat.com>
---
 doc/guides/rel_notes/release_21_05.rst |  3 +++
 drivers/bus/pci/pci_common.c           |  8 ++++----
 drivers/bus/pci/rte_bus_pci.h          | 12 ++++--------
 drivers/common/mlx5/mlx5_common_pci.c  |  8 ++++----
 lib/librte_pci/rte_pci.h               | 12 +++++++-----
 5 files changed, 22 insertions(+), 21 deletions(-)

diff --git a/doc/guides/rel_notes/release_21_05.rst b/doc/guides/rel_notes/release_21_05.rst
index 19cec62c73..61b6575949 100644
--- a/doc/guides/rel_notes/release_21_05.rst
+++ b/doc/guides/rel_notes/release_21_05.rst
@@ -159,6 +159,9 @@ API Changes
   from ``rte_thread_tls_*`` to ``rte_thread_*`` to avoid naming redundancy
   and confusion with the transport layer security term.
 
+* pci: The value ``PCI_ANY_ID`` is marked as deprecated,
+  and can be replaced with ``RTE_PCI_ANY_ID``.
+
 
 ABI Changes
 -----------
diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c
index 9b8d769287..ee7f966358 100644
--- a/drivers/bus/pci/pci_common.c
+++ b/drivers/bus/pci/pci_common.c
@@ -133,18 +133,18 @@ rte_pci_match(const struct rte_pci_driver *pci_drv,
 	     id_table++) {
 		/* check if device's identifiers match the driver's ones */
 		if (id_table->vendor_id != pci_dev->id.vendor_id &&
-				id_table->vendor_id != PCI_ANY_ID)
+				id_table->vendor_id != RTE_PCI_ANY_ID)
 			continue;
 		if (id_table->device_id != pci_dev->id.device_id &&
-				id_table->device_id != PCI_ANY_ID)
+				id_table->device_id != RTE_PCI_ANY_ID)
 			continue;
 		if (id_table->subsystem_vendor_id !=
 		    pci_dev->id.subsystem_vendor_id &&
-		    id_table->subsystem_vendor_id != PCI_ANY_ID)
+		    id_table->subsystem_vendor_id != RTE_PCI_ANY_ID)
 			continue;
 		if (id_table->subsystem_device_id !=
 		    pci_dev->id.subsystem_device_id &&
-		    id_table->subsystem_device_id != PCI_ANY_ID)
+		    id_table->subsystem_device_id != RTE_PCI_ANY_ID)
 			continue;
 		if (id_table->class_id != pci_dev->id.class_id &&
 				id_table->class_id != RTE_CLASS_ANY_ID)
diff --git a/drivers/bus/pci/rte_bus_pci.h b/drivers/bus/pci/rte_bus_pci.h
index 876abddefb..3a092bc6d5 100644
--- a/drivers/bus/pci/rte_bus_pci.h
+++ b/drivers/bus/pci/rte_bus_pci.h
@@ -91,26 +91,22 @@ struct rte_pci_device {
 
 #define RTE_ETH_DEV_TO_PCI(eth_dev)	RTE_DEV_TO_PCI((eth_dev)->device)
 
-/** Any PCI device identifier (vendor, device, ...) */
-#define PCI_ANY_ID (0xffff)
-#define RTE_CLASS_ANY_ID (0xffffff)
-
 #ifdef __cplusplus
 /** C++ macro used to help building up tables of device IDs */
 #define RTE_PCI_DEVICE(vend, dev) \
 	RTE_CLASS_ANY_ID,         \
 	(vend),                   \
 	(dev),                    \
-	PCI_ANY_ID,               \
-	PCI_ANY_ID
+	RTE_PCI_ANY_ID,           \
+	RTE_PCI_ANY_ID
 #else
 /** Macro used to help building up tables of device IDs */
 #define RTE_PCI_DEVICE(vend, dev)          \
 	.class_id = RTE_CLASS_ANY_ID,      \
 	.vendor_id = (vend),               \
 	.device_id = (dev),                \
-	.subsystem_vendor_id = PCI_ANY_ID, \
-	.subsystem_device_id = PCI_ANY_ID
+	.subsystem_vendor_id = RTE_PCI_ANY_ID, \
+	.subsystem_device_id = RTE_PCI_ANY_ID
 #endif
 
 /**
diff --git a/drivers/common/mlx5/mlx5_common_pci.c b/drivers/common/mlx5/mlx5_common_pci.c
index a7f541a90c..9689ca86fc 100644
--- a/drivers/common/mlx5/mlx5_common_pci.c
+++ b/drivers/common/mlx5/mlx5_common_pci.c
@@ -142,18 +142,18 @@ mlx5_bus_match(const struct mlx5_pci_driver *drv,
 	     id_table++) {
 		/* Check if device's ids match the class driver's ids. */
 		if (id_table->vendor_id != pci_dev->id.vendor_id &&
-		    id_table->vendor_id != PCI_ANY_ID)
+		    id_table->vendor_id != RTE_PCI_ANY_ID)
 			continue;
 		if (id_table->device_id != pci_dev->id.device_id &&
-		    id_table->device_id != PCI_ANY_ID)
+		    id_table->device_id != RTE_PCI_ANY_ID)
 			continue;
 		if (id_table->subsystem_vendor_id !=
 		    pci_dev->id.subsystem_vendor_id &&
-		    id_table->subsystem_vendor_id != PCI_ANY_ID)
+		    id_table->subsystem_vendor_id != RTE_PCI_ANY_ID)
 			continue;
 		if (id_table->subsystem_device_id !=
 		    pci_dev->id.subsystem_device_id &&
-		    id_table->subsystem_device_id != PCI_ANY_ID)
+		    id_table->subsystem_device_id != RTE_PCI_ANY_ID)
 			continue;
 		if (id_table->class_id != pci_dev->id.class_id &&
 		    id_table->class_id != RTE_CLASS_ANY_ID)
diff --git a/lib/librte_pci/rte_pci.h b/lib/librte_pci/rte_pci.h
index f89c7dbbea..a8f8e404a9 100644
--- a/lib/librte_pci/rte_pci.h
+++ b/lib/librte_pci/rte_pci.h
@@ -78,10 +78,10 @@ extern "C" {
  */
 struct rte_pci_id {
 	uint32_t class_id;            /**< Class ID or RTE_CLASS_ANY_ID. */
-	uint16_t vendor_id;           /**< Vendor ID or PCI_ANY_ID. */
-	uint16_t device_id;           /**< Device ID or PCI_ANY_ID. */
-	uint16_t subsystem_vendor_id; /**< Subsystem vendor ID or PCI_ANY_ID. */
-	uint16_t subsystem_device_id; /**< Subsystem device ID or PCI_ANY_ID. */
+	uint16_t vendor_id;           /**< Vendor ID or RTE_PCI_ANY_ID. */
+	uint16_t device_id;           /**< Device ID or RTE_PCI_ANY_ID. */
+	uint16_t subsystem_vendor_id; /**< Subsystem vendor ID or RTE_PCI_ANY_ID. */
+	uint16_t subsystem_device_id; /**< Subsystem device ID or RTE_PCI_ANY_ID. */
 };
 
 /**
@@ -95,7 +95,9 @@ struct rte_pci_addr {
 };
 
 /** Any PCI device identifier (vendor, device, ...) */
-#define PCI_ANY_ID (0xffff)
+#define RTE_PCI_ANY_ID (0xffff)
+/** @deprecated Replaced with RTE_PCI_ANY_ID */
+#define PCI_ANY_ID RTE_DEPRECATED(PCI_ANY_ID) RTE_PCI_ANY_ID
 #define RTE_CLASS_ANY_ID (0xffffff)
 
 /**
-- 
2.31.1


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH V2] ethdev: add queue state when retrieve queue information
  2021-03-25 11:09 13% ` [dpdk-dev] [PATCH V2] " Lijun Ou
@ 2021-04-06  0:49  0%   ` oulijun
  2021-04-06 14:02  0%   ` Ananyev, Konstantin
  1 sibling, 0 replies; 200+ results
From: oulijun @ 2021-04-06  0:49 UTC (permalink / raw)
  To: dev, Thomas Monjalon, Ferruh Yigit

Hi, all,
     any comments for this patch?
     Hope for your reply.

Thanks

在 2021/3/25 19:09, Lijun Ou 写道:
> Currently, upper-layer application could get queue state only
> through pointers such as dev->data->tx_queue_state[queue_id],
> this is not the recommended way to access it. So this patch
> add get queue state when call rte_eth_rx_queue_info_get and
> rte_eth_tx_queue_info_get API.
> 
> Note: The hairpin queue is not supported with above
> rte_eth_*x_queue_info_get, so the queue state could be
> RTE_ETH_QUEUE_STATE_STARTED or RTE_ETH_QUEUE_STATE_STOPPED.
> Note: After add queue_state field, the 'struct rte_eth_rxq_info' size
> remains 128B, and the 'struct rte_eth_txq_info' size remains 64B, so
> it could be ABI compatible.
> 
> Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
> Signed-off-by: Lijun Ou <oulijun@huawei.com>
> ---
> V1->V2:
> - move queue state defines to public file
> ---
>   doc/guides/rel_notes/release_21_05.rst |  6 ++++++
>   lib/librte_ethdev/ethdev_driver.h      |  7 -------
>   lib/librte_ethdev/rte_ethdev.c         |  3 +++
>   lib/librte_ethdev/rte_ethdev.h         | 11 +++++++++++
>   4 files changed, 20 insertions(+), 7 deletions(-)
> 
> diff --git a/doc/guides/rel_notes/release_21_05.rst b/doc/guides/rel_notes/release_21_05.rst
> index 22aa80a..503daf9 100644
> --- a/doc/guides/rel_notes/release_21_05.rst
> +++ b/doc/guides/rel_notes/release_21_05.rst
> @@ -164,6 +164,12 @@ ABI Changes
>   
>   * No ABI change that would break compatibility with 20.11.
>   
> +* Added new field ``queue_state`` to ``rte_eth_rxq_info`` structure
> +  to provide indicated rxq queue state.
> +
> +* Added new field ``queue_state`` to ``rte_eth_txq_info`` structure
> +  to provide indicated txq queue state.
> +
>   
>   Known Issues
>   ------------
> diff --git a/lib/librte_ethdev/ethdev_driver.h b/lib/librte_ethdev/ethdev_driver.h
> index cdd4b43..ec5a17d 100644
> --- a/lib/librte_ethdev/ethdev_driver.h
> +++ b/lib/librte_ethdev/ethdev_driver.h
> @@ -970,13 +970,6 @@ struct eth_dev_ops {
>   };
>   
>   /**
> - * RX/TX queue states
> - */
> -#define RTE_ETH_QUEUE_STATE_STOPPED 0
> -#define RTE_ETH_QUEUE_STATE_STARTED 1
> -#define RTE_ETH_QUEUE_STATE_HAIRPIN 2
> -
> -/**
>    * @internal
>    * Check if the selected Rx queue is hairpin queue.
>    *
> diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
> index 3059aa5..fbd10b2 100644
> --- a/lib/librte_ethdev/rte_ethdev.c
> +++ b/lib/librte_ethdev/rte_ethdev.c
> @@ -5042,6 +5042,8 @@ rte_eth_rx_queue_info_get(uint16_t port_id, uint16_t queue_id,
>   
>   	memset(qinfo, 0, sizeof(*qinfo));
>   	dev->dev_ops->rxq_info_get(dev, queue_id, qinfo);
> +	qinfo->queue_state = dev->data->rx_queue_state[queue_id];
> +
>   	return 0;
>   }
>   
> @@ -5082,6 +5084,7 @@ rte_eth_tx_queue_info_get(uint16_t port_id, uint16_t queue_id,
>   
>   	memset(qinfo, 0, sizeof(*qinfo));
>   	dev->dev_ops->txq_info_get(dev, queue_id, qinfo);
> +	qinfo->queue_state = dev->data->tx_queue_state[queue_id];
>   
>   	return 0;
>   }
> diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
> index efda313..4f0b1b2 100644
> --- a/lib/librte_ethdev/rte_ethdev.h
> +++ b/lib/librte_ethdev/rte_ethdev.h
> @@ -1582,6 +1582,13 @@ struct rte_eth_dev_info {
>   };
>   
>   /**
> + * RX/TX queue states
> + */
> +#define RTE_ETH_QUEUE_STATE_STOPPED 0
> +#define RTE_ETH_QUEUE_STATE_STARTED 1
> +#define RTE_ETH_QUEUE_STATE_HAIRPIN 2
> +
> +/**
>    * Ethernet device RX queue information structure.
>    * Used to retrieve information about configured queue.
>    */
> @@ -1591,6 +1598,8 @@ struct rte_eth_rxq_info {
>   	uint8_t scattered_rx;       /**< scattered packets RX supported. */
>   	uint16_t nb_desc;           /**< configured number of RXDs. */
>   	uint16_t rx_buf_size;       /**< hardware receive buffer size. */
> +	/**< Queues state: STARTED(1) / STOPPED(0). */
> +	uint8_t queue_state;
>   } __rte_cache_min_aligned;
>   
>   /**
> @@ -1600,6 +1609,8 @@ struct rte_eth_rxq_info {
>   struct rte_eth_txq_info {
>   	struct rte_eth_txconf conf; /**< queue config parameters. */
>   	uint16_t nb_desc;           /**< configured number of TXDs. */
> +	/**< Queues state: STARTED(1) / STOPPED(0). */
> +	uint8_t queue_state;
>   } __rte_cache_min_aligned;
>   
>   /* Generic Burst mode flag definition, values can be ORed. */
> 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v10 0/8] Introduce event vectorization
  2021-03-31  9:29  4%                 ` [dpdk-dev] [PATCH v10 " pbhagavatula
@ 2021-04-03  9:44  0%                   ` Jerin Jacob
  0 siblings, 0 replies; 200+ results
From: Jerin Jacob @ 2021-04-03  9:44 UTC (permalink / raw)
  To: Pavan Nikhilesh
  Cc: Jerin Jacob, Jayatheerthan, Jay, Erik Gabriel Carrillo, Gujjar,
	Abhinandan S, McDaniel, Timothy, Hemant Agrawal, Van Haaren,
	Harry, Mattias Rönnblom, Liang Ma, dpdk-dev

On Wed, Mar 31, 2021 at 3:00 PM <pbhagavatula@marvell.com> wrote:
>
> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
>
> In traditional event programming model, events are identified by a
> flow-id and a uintptr_t. The flow-id uniquely identifies a given event
> and determines the order of scheduling based on schedule type, the
> uintptr_t holds a single object.
>
> Event devices also support burst mode with configurable dequeue depth,
> i.e. each dequeue call would return multiple events and each event
> might be at a different stage of the pipeline.
> Having a burst of events belonging to different stages in a dequeue
> burst is not only difficult to vectorize but also increases the scheduler
> overhead and application overhead of pipelining events further.
> Using event vectors we see a performance gain of ~742.3% as shown in [1].
>
> By introducing event vectorization, each event will be capable of holding
> multiple uintptr_t of the same flow thereby allowing applications
> to vectorize their pipeline and reduce the complexity of pipelining
> events across multiple stages. This also reduces the complexity of handling
> enqueue and dequeue on an event device.
>
> Since event devices are transparent to the events they are scheduling
> so the event producers such as eth_rx_adapter, crypto_adapter , etc..
> are responsible for vectorizing the buffers of the same flow into a single
> event.
>
> The series also breaks ABI in the patch [8/8] which is targetted to the
> v21.11 release.
>
> The dpdk-test-eventdev application has been updated with options to test
> multiple vector sizes and timeouts.
>
> [1]
> As for performance improvement, with a ARM Cortex-A72 equivalent processer,
> software event device (--vdev=event_sw0), single worker core, single stage
> and using one service core for Rx adapter, Tx adapter, Scheduling.
>
> Without this patchset applied:
>     ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
>          --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
>          --stlist=a --wlcores=20
>     Port[0] using Rx adapter[0] configured
>     Port[0] using Tx adapter[0] Configured
>     5.071 mpps
>
> With the patchset applied and Without event vectorization:
>     ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
>          --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
>          --stlist=a --wlcores=20
>     Port[0] using Rx adapter[0] configured
>     Port[0] using Tx adapter[0] Configured
>     5.123 mpps
>
> With event vectorization:
>     ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
>         --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
>         --stlist=a --wlcores=20 --enable_vector --nb_eth_queues 1
>         --vector_size 256
>     Port[0] using Rx adapter[0] configured
>     Port[0] using Tx adapter[0] Configured
>     42.715 mpps
>
> Having dedicated service cores for each Rx queues and tweaking the vector,
> dequeue burst size would further improve performance.
>
> API usage is shown below:
>
> Configuration:
>
>         struct rte_event_eth_rx_adapter_event_vector_config vec_conf;
>
>         vector_pool = rte_event_vector_pool_create("vector_pool",
>                         nb_elem, 0, vector_size, socket_id);
>
>         rte_event_eth_rx_adapter_create(id, event_id, &adptr_conf);
>         rte_event_eth_rx_adapter_queue_add(id, eth_id, -1, &queue_conf);
>         if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR) {
>                 vec_conf.vector_sz = vector_size;
>                 vec_conf.vector_timeout_ns = vector_tmo_nsec;
>                 vec_conf.vector_mp = vector_pool;
>                 rte_event_eth_rx_adapter_queue_event_vector_config(id,
>                                 eth_id, -1, &vec_conf);
>         }
>
> Fastpath:
>
>         num = rte_event_dequeue_burst(event_id, port_id, &ev, 1, 0);
>         if (!num)
>                 continue;
>
>         if (ev.event_type & RTE_EVENT_TYPE_VECTOR) {
>                 switch (ev.event_type) {
>                 case RTE_EVENT_TYPE_ETHDEV_VECTOR:
>                 case RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR:
>                         struct rte_mbuf **mbufs;
>
>                         mbufs = ev.vector_ev->mbufs;
>                         for (i = 0; i < ev.vector_ev->nb_elem; i++)
>                                 //Process mbufs.
>                         break;
>                 case ...
>                 }
>         }
>         ...
>




Series applied to dpdk-next-net-eventdev/for-main. Thanks



> v10 Changes:
> - Update Rx adapter documentation with flow identifier bitfield format. (Jay)
>
> v9 Changes:
> - Update Rx adapter documentation w.r.t SW event vectorizations. (Jay)
> - Push partial vectors to event device on queue delete. (Jay)
>
> v8 Changes:
> - Fix incorrect shift for vector timeout interval.(Jay)
> - Code reallocation.(Jay)
>
> v7 Changes:
> - More doxygen fixes.(Jay)
> - Reduce code duplication in 4/8.(Jay)
>
> v6 Changes:
> - Make rte_errno sign consistant.(Jay)
> - Gramatical and doxygen fixes. (Jay)
>
> v5 Changes:
> - Make `rte_event_vector_pool_create non-inline` to ease ABI stability.(Ray)
> - Move `rte_event_eth_rx_adapter_queue_event_vector_config` and
>   `rte_event_eth_rx_adapter_vector_limits_get` implementation to the patch
>   where they are initially defined.(Ray)
> - Multiple gramatical and style fixes.(Jerin)
> - Add missing release notes.(Jerin)
>
> v4 Changes:
> - Fix missing event vector structure in event structure.(Jay)
>
> v3 Changes:
> - Fix unintended formatting changes.
>
> v2 Changes:
> - Multiple gramatical and style fixes.(Jerin)
> - Add parameter to define vector size in power of 2. (Jerin)
> - Redo patch series w/o breaking ABI till the last patch.(David)
> - Add deprication notice to announce ABI break in 21.11.(David)
> - Add vector limits validation to app/test-eventdev.
>
> Pavan Nikhilesh (8):
>   eventdev: introduce event vector capability
>   eventdev: introduce event vector Rx capability
>   eventdev: introduce event vector Tx capability
>   eventdev: add Rx adapter event vector support
>   eventdev: add Tx adapter event vector support
>   app/eventdev: add event vector mode in pipeline test
>   doc: announce event Rx adapter config changes
>   eventdev: simplify Rx adapter event vector config
>
>  app/test-eventdev/evt_common.h                |   4 +
>  app/test-eventdev/evt_options.c               |  52 +++
>  app/test-eventdev/evt_options.h               |   4 +
>  app/test-eventdev/test_pipeline_atq.c         | 310 +++++++++++++++--
>  app/test-eventdev/test_pipeline_common.c      | 105 +++++-
>  app/test-eventdev/test_pipeline_common.h      |  18 +
>  app/test-eventdev/test_pipeline_queue.c       | 320 +++++++++++++++--
>  .../prog_guide/event_ethernet_rx_adapter.rst  |  57 +++
>  .../prog_guide/event_ethernet_tx_adapter.rst  |  12 +
>  doc/guides/prog_guide/eventdev.rst            |  36 +-
>  doc/guides/rel_notes/deprecation.rst          |   9 +
>  doc/guides/rel_notes/release_21_05.rst        |   8 +
>  doc/guides/tools/testeventdev.rst             |  45 ++-
>  lib/librte_eventdev/eventdev_pmd.h            |  31 +-
>  .../rte_event_eth_rx_adapter.c                | 327 +++++++++++++++++-
>  .../rte_event_eth_rx_adapter.h                |  78 +++++
>  .../rte_event_eth_tx_adapter.c                |  66 +++-
>  lib/librte_eventdev/rte_eventdev.c            |  53 ++-
>  lib/librte_eventdev/rte_eventdev.h            | 114 +++++-
>  lib/librte_eventdev/version.map               |   4 +
>  20 files changed, 1562 insertions(+), 91 deletions(-)
>
> --
> 2.17.1
>

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v6 00/10] eal: Add new API for threading
  @ 2021-04-03  1:38  2% ` Narcisa Ana Maria Vasile
  0 siblings, 0 replies; 200+ results
From: Narcisa Ana Maria Vasile @ 2021-04-03  1:38 UTC (permalink / raw)
  To: dev, thomas, dmitry.kozliuk, khot, navasile, dmitrym, roretzla,
	talshn, ocardona
  Cc: bruce.richardson, david.marchand, pallavi.kadam

From: Narcisa Vasile <navasile@microsoft.com>

EAL thread API

**Problem Statement**
DPDK currently uses the pthread interface to create and manage threads.
Windows does not support the POSIX thread programming model, so it currently
relies on a header file that hides the Windows calls under
pthread matched interfaces. Given that EAL should isolate the environment
specifics from the applications and libraries and mediate
all the communication with the operating systems, a new EAL interface
is needed for thread management.

**Goals**
* Introduce a generic EAL API for threading support that will remove
  the current Windows pthread.h shim.
* Replace references to pthread_* across the DPDK codebase with the new
  RTE_THREAD_* API.
* Allow users to choose between using the RTE_THREAD_* API or a
  3rd party thread library through a configuration option.

**Design plan**
New API main files:
* rte_thread.h (librte_eal/include)
* rte_thread_types.h (librte_eal/include)
* rte_thread_windows_types.h (librte_eal/windows/include)
* rte_thread.c (librte_eal/windows)
* rte_thread.c (librte_eal/common)

For flexibility, the user is offered the option of either using the RTE_THREAD_* API or
a 3rd party thread library, through a meson flag “use_external_thread_lib”.
By default, this flag is set to FALSE, which means Windows libraries and applications
will use the RTE_THREAD_* API for managing threads.

If compiling on Windows and the “use_external_thread_lib” is *not* set,
the following files will be parsed: 
* include/rte_thread.h
* windows/include/rte_thread_windows_types.h
* windows/rte_thread.c
In all other cases, the compilation/parsing includes the following files:
* include/rte_thread.h 
* include/rte_thread_types.h
* common/rte_thread.c

**A schematic example of the design**
--------------------------------------------------
lib/librte_eal/include/rte_thread.h
int rte_thread_create();

lib/librte_eal/common/rte_thread.c
int rte_thread_create() 
{
	return pthread_create();
}

lib/librte_eal/windows/rte_thread.c
int rte_thread_create() 
{
	return CreateThread();
}

lib/librte_eal/windows/meson.build
if get_option('use_external_thread_lib')
	sources += 'librte_eal/common/rte_thread.c'
else
	sources += 'librte_eal/windows/rte_thread.c'
endif
-----------------------------------------------------

**Thread attributes**

When or after a thread is created, specific characteristics of the thread
can be adjusted. Given that the thread characteristics that are of interest
for DPDK applications are affinity and priority, the following structure
that represents thread attributes has been defined:

typedef struct
{
	enum rte_thread_priority priority;
	rte_cpuset_t cpuset;
} rte_thread_attr_t;

The *rte_thread_create()* function can optionally receive an rte_thread_attr_t
object that will cause the thread to be created with the affinity and priority
described by the attributes object. If no rte_thread_attr_t is passed
(parameter is NULL), the default affinity and priority are used.
An rte_thread_attr_t object can also be set to the default values
by calling *rte_thread_attr_init()*.

*Priority* is represented through an enum that currently advertises
two values for priority:
	- RTE_THREAD_PRIORITY_NORMAL
	- RTE_THREAD_PRIORITY_REALTIME_CRITICAL
The enum can be extended to allow for multiple priority levels.
rte_thread_set_priority      - sets the priority of a thread
rte_thread_attr_set_priority - updates an rte_thread_attr_t object
                               with a new value for priority

The user can choose thread priority through an EAL parameter,
when starting an application.  If EAL parameter is not used,
the per-platform default value for thread priority is used.
Otherwise administrator has an option to set one of available options:
 --thread-prio normal
 --thread-prio realtime

Example:
./dpdk-l2fwd -l 0-3 -n 4 –thread-prio normal -- -q 8 -p ffff

*Affinity* is described by the already known “rte_cpuset_t” type.
rte_thread_attr_set/get_affinity - sets/gets the affinity field in a
                                   rte_thread_attr_t object
rte_thread_set/get_affinity      – sets/gets the affinity of a thread

**Errors**
A translation function that maps Windows error codes to errno-style
error codes is provided. 

**Future work**
Note that this patchset was focused on introducing new API that will
remove the Windows pthread.h shim. In DPDK, there are still a few references
to pthread_* that were not implemented in the shim.
The long term plan is for EAL to provide full threading support:
* Adding support for conditional variables
* Additional functionality offered by pthread_* (such as pthread_setname_np, etc.)
* Static mutex initializers are not used on Windows. If we must continue
  using them, they need to be platform dependent and an implementation will
  need to be provided for Windows.

v6:
- improve error-translation function
- call the error translation function in rte_thread_value_get()

v5:
- update cover letter with more details on the priority argument

v4:
- fix function description
- rebase

v3:
- rebase

v2:
- revert changes that break ABI 
- break up changes into smaller patches
- fix coding style issues
- fix issues with errors
- fix parameter type in examples/kni.c

Narcisa Vasile (10):
  eal: add thread id and simple thread functions
  eal: add thread attributes
  windows/eal: translate Windows errors to errno-style errors
  eal: implement functions for thread affinity management
  eal: implement thread priority management functions
  eal: add thread lifetime management
  eal: implement functions for mutex management
  eal: implement functions for thread barrier management
  eal: add EAL argument for setting thread priority
  Enable the new EAL thread API

 app/test/process.h                            |   6 +-
 app/test/test_lcores.c                        |  16 +-
 app/test/test_link_bonding.c                  |  10 +-
 app/test/test_lpm_perf.c                      |  12 +-
 config/meson.build                            |   4 +
 drivers/bus/dpaa/base/qbman/bman_driver.c     |   6 +-
 drivers/bus/dpaa/base/qbman/dpaa_sys.c        |  14 +-
 drivers/bus/dpaa/base/qbman/process.c         |   6 +-
 drivers/bus/fslmc/portal/dpaa2_hw_dpio.c      |   6 +-
 drivers/compress/mlx5/mlx5_compress.c         |  10 +-
 drivers/event/dlb/pf/base/dlb_osdep.h         |   2 +-
 drivers/event/dlb2/pf/base/dlb2_osdep.h       |   2 +-
 drivers/net/af_xdp/rte_eth_af_xdp.c           |  18 +-
 drivers/net/ark/ark_ethdev.c                  |   4 +-
 drivers/net/atlantic/atl_ethdev.c             |   4 +-
 drivers/net/atlantic/atl_types.h              |   5 +-
 .../net/atlantic/hw_atl/hw_atl_utils_fw2x.c   |  24 +-
 drivers/net/axgbe/axgbe_dev.c                 |   8 +-
 drivers/net/axgbe/axgbe_ethdev.c              |   8 +-
 drivers/net/axgbe/axgbe_ethdev.h              |   8 +-
 drivers/net/axgbe/axgbe_i2c.c                 |   4 +-
 drivers/net/axgbe/axgbe_mdio.c                |   8 +-
 drivers/net/axgbe/axgbe_phy_impl.c            |   6 +-
 drivers/net/bnxt/bnxt.h                       |  16 +-
 drivers/net/bnxt/bnxt_cpr.c                   |   4 +-
 drivers/net/bnxt/bnxt_ethdev.c                |  52 +-
 drivers/net/bnxt/bnxt_irq.c                   |   8 +-
 drivers/net/bnxt/bnxt_reps.c                  |  10 +-
 drivers/net/bnxt/tf_ulp/bnxt_ulp.c            |  34 +-
 drivers/net/bnxt/tf_ulp/bnxt_ulp.h            |   4 +-
 drivers/net/bnxt/tf_ulp/ulp_fc_mgr.c          |  24 +-
 drivers/net/bnxt/tf_ulp/ulp_fc_mgr.h          |   2 +-
 drivers/net/ena/base/ena_plat_dpdk.h          |   8 +-
 drivers/net/enic/enic.h                       |   2 +-
 drivers/net/hns3/hns3_ethdev.h                |   2 +-
 drivers/net/hns3/hns3_ethdev_vf.c             |   2 +-
 drivers/net/hns3/hns3_mbx.c                   |   2 +-
 drivers/net/ice/ice_dcf_parent.c              |   4 +-
 drivers/net/ipn3ke/ipn3ke_representor.c       |   6 +-
 drivers/net/ixgbe/ixgbe_ethdev.c              |   2 +-
 drivers/net/ixgbe/ixgbe_ethdev.h              |   2 +-
 drivers/net/kni/rte_eth_kni.c                 |   6 +-
 drivers/net/mlx5/linux/mlx5_os.c              |   2 +-
 drivers/net/mlx5/mlx5.c                       |  20 +-
 drivers/net/mlx5/mlx5.h                       |   2 +-
 drivers/net/mlx5/mlx5_txpp.c                  |   8 +-
 drivers/net/mlx5/windows/mlx5_flow_os.c       |  10 +-
 drivers/net/mlx5/windows/mlx5_os.c            |   2 +-
 drivers/net/qede/base/bcm_osal.h              |   8 +-
 drivers/net/vhost/rte_eth_vhost.c             |  22 +-
 .../net/virtio/virtio_user/virtio_user_dev.c  |  30 +-
 .../net/virtio/virtio_user/virtio_user_dev.h  |   2 +-
 drivers/raw/ifpga/ifpga_rawdev.c              |   8 +-
 drivers/vdpa/ifc/ifcvf_vdpa.c                 |  36 +-
 drivers/vdpa/mlx5/mlx5_vdpa.c                 |  24 +-
 drivers/vdpa/mlx5/mlx5_vdpa.h                 |   6 +-
 drivers/vdpa/mlx5/mlx5_vdpa_event.c           |  67 +--
 examples/kni/main.c                           |   6 +-
 examples/vhost/main.c                         |   2 +-
 examples/vhost_blk/vhost_blk.c                |  10 +-
 lib/librte_eal/common/eal_common_options.c    |  36 +-
 lib/librte_eal/common/eal_common_proc.c       |  48 +-
 lib/librte_eal/common/eal_common_thread.c     |  43 +-
 lib/librte_eal/common/eal_common_trace.c      |   2 +-
 lib/librte_eal/common/eal_internal_cfg.h      |   2 +
 lib/librte_eal/common/eal_options.h           |   2 +
 lib/librte_eal/common/eal_private.h           |   2 +-
 lib/librte_eal/common/malloc_mp.c             |  32 +-
 lib/librte_eal/common/meson.build             |   1 +
 lib/librte_eal/common/rte_thread.c            | 342 +++++++++++
 lib/librte_eal/freebsd/eal.c                  |  37 +-
 lib/librte_eal/freebsd/eal_alarm.c            |  12 +-
 lib/librte_eal/freebsd/eal_interrupts.c       |   4 +-
 lib/librte_eal/freebsd/eal_thread.c           |   8 +-
 lib/librte_eal/include/meson.build            |   1 +
 lib/librte_eal/include/rte_lcore.h            |   8 +-
 lib/librte_eal/include/rte_per_lcore.h        |   2 -
 lib/librte_eal/include/rte_thread.h           | 342 ++++++++++-
 lib/librte_eal/include/rte_thread_types.h     |  20 +
 lib/librte_eal/linux/eal.c                    |  42 +-
 lib/librte_eal/linux/eal_alarm.c              |  10 +-
 lib/librte_eal/linux/eal_interrupts.c         |   4 +-
 lib/librte_eal/linux/eal_thread.c             |   8 +-
 lib/librte_eal/linux/eal_timer.c              |   2 +-
 lib/librte_eal/rte_eal_exports.def            |  20 +
 lib/librte_eal/unix/meson.build               |   1 -
 lib/librte_eal/unix/rte_thread.c              |  92 ---
 lib/librte_eal/version.map                    |  21 +
 lib/librte_eal/windows/eal.c                  |  26 +-
 lib/librte_eal/windows/eal_interrupts.c       |   6 +-
 lib/librte_eal/windows/eal_lcore.c            | 170 ++++--
 lib/librte_eal/windows/eal_thread.c           |  24 +-
 lib/librte_eal/windows/eal_windows.h          |  20 +-
 lib/librte_eal/windows/include/meson.build    |   1 +
 lib/librte_eal/windows/include/pthread.h      | 186 ------
 .../include/rte_windows_thread_types.h        |  19 +
 lib/librte_eal/windows/include/sched.h        |   2 +-
 lib/librte_eal/windows/meson.build            |   7 +-
 lib/librte_eal/windows/rte_thread.c           | 532 +++++++++++++++++-
 lib/librte_ethdev/rte_ethdev.c                |   4 +-
 lib/librte_ethdev/rte_ethdev_core.h           |   3 +-
 lib/librte_ethdev/rte_flow.c                  |   4 +-
 .../rte_event_eth_rx_adapter.c                |   6 +-
 lib/librte_vhost/fd_man.c                     |  40 +-
 lib/librte_vhost/fd_man.h                     |   6 +-
 lib/librte_vhost/socket.c                     | 124 ++--
 lib/librte_vhost/vhost.c                      |  10 +-
 meson_options.txt                             |   2 +
 108 files changed, 2048 insertions(+), 934 deletions(-)
 create mode 100644 lib/librte_eal/common/rte_thread.c
 create mode 100644 lib/librte_eal/include/rte_thread_types.h
 delete mode 100644 lib/librte_eal/unix/rte_thread.c
 delete mode 100644 lib/librte_eal/windows/include/pthread.h
 create mode 100644 lib/librte_eal/windows/include/rte_windows_thread_types.h

-- 
2.30.0.vfs.0.2


^ permalink raw reply	[relevance 2%]

* [dpdk-dev] [RFC PATCH 13/14] lib: remove librte_ prefix from directory names
  @ 2021-04-01 11:50  1% ` Bruce Richardson
  0 siblings, 0 replies; 200+ results
From: Bruce Richardson @ 2021-04-01 11:50 UTC (permalink / raw)
  To: dev; +Cc: thomas, david.marchand, bluca, Bruce Richardson

There is no reason for the DPDK libraries to all have 'librte_' prefix on
the directory names. This prefix makes the directory names longer and also
makes it awkward to add features referring to individual libraries in the
build - should the lib names be specified with or without the prefix.
Therefore, we can just remove the library prefix and use the library's
unique name as the directory name, i.e. 'eal' rather than 'librte_eal'

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
 MAINTAINERS                                   | 212 +++++++++---------
 app/test/test_eal_fs.c                        |   2 +-
 app/test/test_memzone.c                       |   2 +-
 app/test/test_telemetry_json.c                |   2 +-
 config/arm/meson.build                        |   2 +-
 devtools/build-tags.sh                        |  14 +-
 doc/api/doxy-api.conf.in                      | 104 ++++-----
 doc/guides/contributing/abi_versioning.rst    |  12 +-
 doc/guides/contributing/coding_style.rst      |   4 +-
 doc/guides/contributing/documentation.rst     |  10 +-
 doc/guides/prog_guide/event_timer_adapter.rst |   2 +-
 doc/guides/prog_guide/qos_framework.rst       |   4 +-
 doc/guides/prog_guide/rawdev.rst              |   2 +-
 doc/guides/rel_notes/known_issues.rst         |   2 +-
 drivers/common/mlx5/linux/meson.build         |   2 +-
 drivers/crypto/virtio/meson.build             |   2 +-
 kernel/linux/kni/meson.build                  |   4 +-
 lib/{librte_acl => acl}/acl.h                 |   0
 lib/{librte_acl => acl}/acl_bld.c             |   0
 lib/{librte_acl => acl}/acl_gen.c             |   0
 lib/{librte_acl => acl}/acl_run.h             |   0
 lib/{librte_acl => acl}/acl_run_altivec.c     |   0
 lib/{librte_acl => acl}/acl_run_altivec.h     |   0
 lib/{librte_acl => acl}/acl_run_avx2.c        |   0
 lib/{librte_acl => acl}/acl_run_avx2.h        |   0
 lib/{librte_acl => acl}/acl_run_avx512.c      |   0
 .../acl_run_avx512_common.h                   |   0
 lib/{librte_acl => acl}/acl_run_avx512x16.h   |   0
 lib/{librte_acl => acl}/acl_run_avx512x8.h    |   0
 lib/{librte_acl => acl}/acl_run_neon.c        |   0
 lib/{librte_acl => acl}/acl_run_neon.h        |   0
 lib/{librte_acl => acl}/acl_run_scalar.c      |   0
 lib/{librte_acl => acl}/acl_run_sse.c         |   0
 lib/{librte_acl => acl}/acl_run_sse.h         |   0
 lib/{librte_acl => acl}/acl_vect.h            |   0
 lib/{librte_acl => acl}/meson.build           |   0
 lib/{librte_acl => acl}/rte_acl.c             |   0
 lib/{librte_acl => acl}/rte_acl.h             |   0
 lib/{librte_acl => acl}/rte_acl_osdep.h       |   0
 lib/{librte_acl => acl}/tb_mem.c              |   0
 lib/{librte_acl => acl}/tb_mem.h              |   0
 lib/{librte_acl => acl}/version.map           |   0
 lib/{librte_bbdev => bbdev}/meson.build       |   0
 lib/{librte_bbdev => bbdev}/rte_bbdev.c       |   0
 lib/{librte_bbdev => bbdev}/rte_bbdev.h       |   0
 lib/{librte_bbdev => bbdev}/rte_bbdev_op.h    |   0
 lib/{librte_bbdev => bbdev}/rte_bbdev_pmd.h   |   0
 lib/{librte_bbdev => bbdev}/version.map       |   0
 .../meson.build                               |   0
 .../rte_bitrate.c                             |   0
 .../rte_bitrate.h                             |   0
 .../version.map                               |   0
 lib/{librte_bpf => bpf}/bpf.c                 |   0
 lib/{librte_bpf => bpf}/bpf_def.h             |   0
 lib/{librte_bpf => bpf}/bpf_exec.c            |   0
 lib/{librte_bpf => bpf}/bpf_impl.h            |   0
 lib/{librte_bpf => bpf}/bpf_jit_arm64.c       |   0
 lib/{librte_bpf => bpf}/bpf_jit_x86.c         |   0
 lib/{librte_bpf => bpf}/bpf_load.c            |   0
 lib/{librte_bpf => bpf}/bpf_load_elf.c        |   0
 lib/{librte_bpf => bpf}/bpf_pkt.c             |   0
 lib/{librte_bpf => bpf}/bpf_validate.c        |   0
 lib/{librte_bpf => bpf}/meson.build           |   0
 lib/{librte_bpf => bpf}/rte_bpf.h             |   0
 lib/{librte_bpf => bpf}/rte_bpf_ethdev.h      |   0
 lib/{librte_bpf => bpf}/version.map           |   0
 lib/{librte_cfgfile => cfgfile}/meson.build   |   0
 lib/{librte_cfgfile => cfgfile}/rte_cfgfile.c |   0
 lib/{librte_cfgfile => cfgfile}/rte_cfgfile.h |   0
 lib/{librte_cfgfile => cfgfile}/version.map   |   0
 lib/{librte_cmdline => cmdline}/cmdline.c     |   0
 lib/{librte_cmdline => cmdline}/cmdline.h     |   0
 .../cmdline_cirbuf.c                          |   0
 .../cmdline_cirbuf.h                          |   0
 .../cmdline_os_unix.c                         |   0
 .../cmdline_os_windows.c                      |   0
 .../cmdline_parse.c                           |   0
 .../cmdline_parse.h                           |   0
 .../cmdline_parse_etheraddr.c                 |   0
 .../cmdline_parse_etheraddr.h                 |   0
 .../cmdline_parse_ipaddr.c                    |   0
 .../cmdline_parse_ipaddr.h                    |   0
 .../cmdline_parse_num.c                       |   0
 .../cmdline_parse_num.h                       |   0
 .../cmdline_parse_portlist.c                  |   0
 .../cmdline_parse_portlist.h                  |   0
 .../cmdline_parse_string.c                    |   0
 .../cmdline_parse_string.h                    |   0
 .../cmdline_private.h                         |   0
 .../cmdline_rdline.c                          |   0
 .../cmdline_rdline.h                          |   0
 .../cmdline_socket.c                          |   0
 .../cmdline_socket.h                          |   0
 .../cmdline_vt100.c                           |   0
 .../cmdline_vt100.h                           |   0
 lib/{librte_cmdline => cmdline}/meson.build   |   0
 lib/{librte_cmdline => cmdline}/version.map   |   0
 .../meson.build                               |   0
 .../rte_comp.c                                |   0
 .../rte_comp.h                                |   0
 .../rte_compressdev.c                         |   0
 .../rte_compressdev.h                         |   0
 .../rte_compressdev_internal.h                |   0
 .../rte_compressdev_pmd.c                     |   0
 .../rte_compressdev_pmd.h                     |   0
 .../version.map                               |   0
 .../cryptodev_trace_points.c                  |   0
 .../meson.build                               |   0
 .../rte_crypto.h                              |   0
 .../rte_crypto_asym.h                         |   0
 .../rte_crypto_sym.h                          |   0
 .../rte_cryptodev.c                           |   0
 .../rte_cryptodev.h                           |   0
 .../rte_cryptodev_pmd.c                       |   0
 .../rte_cryptodev_pmd.h                       |   0
 .../rte_cryptodev_trace.h                     |   0
 .../rte_cryptodev_trace_fp.h                  |   0
 .../version.map                               |   0
 .../distributor_private.h                     |   0
 .../meson.build                               |   0
 .../rte_distributor.c                         |   0
 .../rte_distributor.h                         |   0
 .../rte_distributor_match_generic.c           |   0
 .../rte_distributor_match_sse.c               |   0
 .../rte_distributor_single.c                  |   0
 .../rte_distributor_single.h                  |   0
 .../version.map                               |   0
 .../arm/include/meson.build                   |   0
 .../arm/include/rte_atomic.h                  |   0
 .../arm/include/rte_atomic_32.h               |   0
 .../arm/include/rte_atomic_64.h               |   0
 .../arm/include/rte_byteorder.h               |   0
 .../arm/include/rte_cpuflags.h                |   0
 .../arm/include/rte_cpuflags_32.h             |   0
 .../arm/include/rte_cpuflags_64.h             |   0
 .../arm/include/rte_cycles.h                  |   0
 .../arm/include/rte_cycles_32.h               |   0
 .../arm/include/rte_cycles_64.h               |   0
 lib/{librte_eal => eal}/arm/include/rte_io.h  |   0
 .../arm/include/rte_io_64.h                   |   0
 .../arm/include/rte_mcslock.h                 |   0
 .../arm/include/rte_memcpy.h                  |   0
 .../arm/include/rte_memcpy_32.h               |   0
 .../arm/include/rte_memcpy_64.h               |   0
 .../arm/include/rte_pause.h                   |   0
 .../arm/include/rte_pause_32.h                |   0
 .../arm/include/rte_pause_64.h                |   0
 .../arm/include/rte_power_intrinsics.h        |   0
 .../arm/include/rte_prefetch.h                |   0
 .../arm/include/rte_prefetch_32.h             |   0
 .../arm/include/rte_prefetch_64.h             |   0
 .../arm/include/rte_rwlock.h                  |   0
 .../arm/include/rte_spinlock.h                |   0
 .../arm/include/rte_ticketlock.h              |   0
 .../arm/include/rte_vect.h                    |   0
 lib/{librte_eal => eal}/arm/meson.build       |   0
 lib/{librte_eal => eal}/arm/rte_cpuflags.c    |   0
 lib/{librte_eal => eal}/arm/rte_cycles.c      |   0
 lib/{librte_eal => eal}/arm/rte_hypervisor.c  |   0
 .../arm/rte_power_intrinsics.c                |   0
 .../common/eal_common_bus.c                   |   0
 .../common/eal_common_class.c                 |   0
 .../common/eal_common_config.c                |   0
 .../common/eal_common_cpuflags.c              |   0
 .../common/eal_common_debug.c                 |   0
 .../common/eal_common_dev.c                   |   0
 .../common/eal_common_devargs.c               |   0
 .../common/eal_common_dynmem.c                |   0
 .../common/eal_common_errno.c                 |   0
 .../common/eal_common_fbarray.c               |   0
 .../common/eal_common_hexdump.c               |   0
 .../common/eal_common_hypervisor.c            |   0
 .../common/eal_common_launch.c                |   0
 .../common/eal_common_lcore.c                 |   0
 .../common/eal_common_log.c                   |   0
 .../common/eal_common_mcfg.c                  |   0
 .../common/eal_common_memalloc.c              |   0
 .../common/eal_common_memory.c                |   0
 .../common/eal_common_memzone.c               |   0
 .../common/eal_common_options.c               |   0
 .../common/eal_common_proc.c                  |   0
 .../common/eal_common_string_fns.c            |   0
 .../common/eal_common_tailqs.c                |   0
 .../common/eal_common_thread.c                |   0
 .../common/eal_common_timer.c                 |   0
 .../common/eal_common_trace.c                 |   0
 .../common/eal_common_trace_ctf.c             |   0
 .../common/eal_common_trace_points.c          |   0
 .../common/eal_common_trace_utils.c           |   0
 .../common/eal_common_uuid.c                  |   0
 .../common/eal_filesystem.h                   |   0
 .../common/eal_hugepages.h                    |   0
 .../common/eal_internal_cfg.h                 |   0
 lib/{librte_eal => eal}/common/eal_memalloc.h |   0
 lib/{librte_eal => eal}/common/eal_memcfg.h   |   0
 lib/{librte_eal => eal}/common/eal_options.h  |   0
 lib/{librte_eal => eal}/common/eal_private.h  |   0
 lib/{librte_eal => eal}/common/eal_thread.h   |   0
 lib/{librte_eal => eal}/common/eal_trace.h    |   0
 lib/{librte_eal => eal}/common/hotplug_mp.c   |   0
 lib/{librte_eal => eal}/common/hotplug_mp.h   |   0
 lib/{librte_eal => eal}/common/malloc_elem.c  |   0
 lib/{librte_eal => eal}/common/malloc_elem.h  |   0
 lib/{librte_eal => eal}/common/malloc_heap.c  |   0
 lib/{librte_eal => eal}/common/malloc_heap.h  |   0
 lib/{librte_eal => eal}/common/malloc_mp.c    |   0
 lib/{librte_eal => eal}/common/malloc_mp.h    |   0
 lib/{librte_eal => eal}/common/meson.build    |   0
 .../common/rte_keepalive.c                    |   0
 lib/{librte_eal => eal}/common/rte_malloc.c   |   0
 lib/{librte_eal => eal}/common/rte_random.c   |   0
 .../common/rte_reciprocal.c                   |   0
 lib/{librte_eal => eal}/common/rte_service.c  |   0
 lib/{librte_eal => eal}/common/rte_version.c  |   0
 lib/{librte_eal => eal}/freebsd/eal.c         |   0
 lib/{librte_eal => eal}/freebsd/eal_alarm.c   |   0
 .../freebsd/eal_alarm_private.h               |   0
 .../freebsd/eal_cpuflags.c                    |   0
 lib/{librte_eal => eal}/freebsd/eal_debug.c   |   0
 lib/{librte_eal => eal}/freebsd/eal_dev.c     |   0
 .../freebsd/eal_hugepage_info.c               |   0
 .../freebsd/eal_interrupts.c                  |   0
 lib/{librte_eal => eal}/freebsd/eal_lcore.c   |   0
 .../freebsd/eal_memalloc.c                    |   0
 lib/{librte_eal => eal}/freebsd/eal_memory.c  |   0
 lib/{librte_eal => eal}/freebsd/eal_thread.c  |   0
 lib/{librte_eal => eal}/freebsd/eal_timer.c   |   0
 .../freebsd/include/meson.build               |   0
 .../freebsd/include/rte_os.h                  |   0
 lib/{librte_eal => eal}/freebsd/meson.build   |   0
 .../include/generic/rte_atomic.h              |   0
 .../include/generic/rte_byteorder.h           |   0
 .../include/generic/rte_cpuflags.h            |   0
 .../include/generic/rte_cycles.h              |   0
 .../include/generic/rte_io.h                  |   0
 .../include/generic/rte_mcslock.h             |   0
 .../include/generic/rte_memcpy.h              |   0
 .../include/generic/rte_pause.h               |   0
 .../include/generic/rte_power_intrinsics.h    |   0
 .../include/generic/rte_prefetch.h            |   0
 .../include/generic/rte_rwlock.h              |   0
 .../include/generic/rte_spinlock.h            |   0
 .../include/generic/rte_ticketlock.h          |   0
 .../include/generic/rte_vect.h                |   0
 lib/{librte_eal => eal}/include/meson.build   |   0
 lib/{librte_eal => eal}/include/rte_alarm.h   |   0
 lib/{librte_eal => eal}/include/rte_bitmap.h  |   0
 lib/{librte_eal => eal}/include/rte_bitops.h  |   0
 .../include/rte_branch_prediction.h           |   0
 lib/{librte_eal => eal}/include/rte_bus.h     |   0
 lib/{librte_eal => eal}/include/rte_class.h   |   0
 lib/{librte_eal => eal}/include/rte_common.h  |   0
 lib/{librte_eal => eal}/include/rte_compat.h  |   0
 lib/{librte_eal => eal}/include/rte_debug.h   |   0
 lib/{librte_eal => eal}/include/rte_dev.h     |   0
 lib/{librte_eal => eal}/include/rte_devargs.h |   0
 lib/{librte_eal => eal}/include/rte_eal.h     |   0
 .../include/rte_eal_interrupts.h              |   0
 .../include/rte_eal_memconfig.h               |   0
 .../include/rte_eal_paging.h                  |   0
 .../include/rte_eal_trace.h                   |   0
 lib/{librte_eal => eal}/include/rte_errno.h   |   0
 lib/{librte_eal => eal}/include/rte_fbarray.h |   0
 .../include/rte_function_versioning.h         |   0
 lib/{librte_eal => eal}/include/rte_hexdump.h |   0
 .../include/rte_hypervisor.h                  |   0
 .../include/rte_interrupts.h                  |   0
 .../include/rte_keepalive.h                   |   0
 lib/{librte_eal => eal}/include/rte_launch.h  |   0
 lib/{librte_eal => eal}/include/rte_lcore.h   |   0
 lib/{librte_eal => eal}/include/rte_log.h     |   0
 lib/{librte_eal => eal}/include/rte_malloc.h  |   0
 lib/{librte_eal => eal}/include/rte_memory.h  |   0
 lib/{librte_eal => eal}/include/rte_memzone.h |   0
 .../include/rte_pci_dev_feature_defs.h        |   0
 .../include/rte_pci_dev_features.h            |   0
 .../include/rte_per_lcore.h                   |   0
 lib/{librte_eal => eal}/include/rte_random.h  |   0
 .../include/rte_reciprocal.h                  |   0
 lib/{librte_eal => eal}/include/rte_service.h |   0
 .../include/rte_service_component.h           |   0
 .../include/rte_string_fns.h                  |   0
 lib/{librte_eal => eal}/include/rte_tailq.h   |   0
 lib/{librte_eal => eal}/include/rte_test.h    |   0
 lib/{librte_eal => eal}/include/rte_thread.h  |   0
 lib/{librte_eal => eal}/include/rte_time.h    |   0
 lib/{librte_eal => eal}/include/rte_trace.h   |   0
 .../include/rte_trace_point.h                 |   0
 .../include/rte_trace_point_register.h        |   0
 lib/{librte_eal => eal}/include/rte_uuid.h    |   0
 lib/{librte_eal => eal}/include/rte_version.h |   0
 lib/{librte_eal => eal}/include/rte_vfio.h    |   0
 lib/{librte_eal => eal}/linux/eal.c           |   0
 lib/{librte_eal => eal}/linux/eal_alarm.c     |   0
 lib/{librte_eal => eal}/linux/eal_cpuflags.c  |   0
 lib/{librte_eal => eal}/linux/eal_debug.c     |   0
 lib/{librte_eal => eal}/linux/eal_dev.c       |   0
 .../linux/eal_hugepage_info.c                 |   0
 .../linux/eal_interrupts.c                    |   0
 lib/{librte_eal => eal}/linux/eal_lcore.c     |   0
 lib/{librte_eal => eal}/linux/eal_log.c       |   0
 lib/{librte_eal => eal}/linux/eal_memalloc.c  |   0
 lib/{librte_eal => eal}/linux/eal_memory.c    |   0
 lib/{librte_eal => eal}/linux/eal_thread.c    |   0
 lib/{librte_eal => eal}/linux/eal_timer.c     |   0
 lib/{librte_eal => eal}/linux/eal_vfio.c      |   0
 lib/{librte_eal => eal}/linux/eal_vfio.h      |   0
 .../linux/eal_vfio_mp_sync.c                  |   0
 .../linux/include/meson.build                 |   0
 .../linux/include/rte_os.h                    |   0
 lib/{librte_eal => eal}/linux/meson.build     |   0
 lib/{librte_eal => eal}/meson.build           |   0
 .../ppc/include/meson.build                   |   0
 .../ppc/include/rte_altivec.h                 |   0
 .../ppc/include/rte_atomic.h                  |   0
 .../ppc/include/rte_byteorder.h               |   0
 .../ppc/include/rte_cpuflags.h                |   0
 .../ppc/include/rte_cycles.h                  |   0
 lib/{librte_eal => eal}/ppc/include/rte_io.h  |   0
 .../ppc/include/rte_mcslock.h                 |   0
 .../ppc/include/rte_memcpy.h                  |   0
 .../ppc/include/rte_pause.h                   |   0
 .../ppc/include/rte_power_intrinsics.h        |   0
 .../ppc/include/rte_prefetch.h                |   0
 .../ppc/include/rte_rwlock.h                  |   0
 .../ppc/include/rte_spinlock.h                |   0
 .../ppc/include/rte_ticketlock.h              |   0
 .../ppc/include/rte_vect.h                    |   0
 lib/{librte_eal => eal}/ppc/meson.build       |   0
 lib/{librte_eal => eal}/ppc/rte_cpuflags.c    |   0
 lib/{librte_eal => eal}/ppc/rte_cycles.c      |   0
 lib/{librte_eal => eal}/ppc/rte_hypervisor.c  |   0
 .../ppc/rte_power_intrinsics.c                |   0
 lib/{librte_eal => eal}/rte_eal_exports.def   |   0
 lib/{librte_eal => eal}/unix/eal_file.c       |   0
 .../unix/eal_unix_memory.c                    |   0
 lib/{librte_eal => eal}/unix/eal_unix_timer.c |   0
 lib/{librte_eal => eal}/unix/meson.build      |   0
 lib/{librte_eal => eal}/unix/rte_thread.c     |   0
 lib/{librte_eal => eal}/version.map           |   0
 lib/{librte_eal => eal}/windows/eal.c         |   0
 lib/{librte_eal => eal}/windows/eal_alarm.c   |   0
 lib/{librte_eal => eal}/windows/eal_debug.c   |   0
 lib/{librte_eal => eal}/windows/eal_file.c    |   0
 .../windows/eal_hugepages.c                   |   0
 .../windows/eal_interrupts.c                  |   0
 lib/{librte_eal => eal}/windows/eal_lcore.c   |   0
 lib/{librte_eal => eal}/windows/eal_log.c     |   0
 .../windows/eal_memalloc.c                    |   0
 lib/{librte_eal => eal}/windows/eal_memory.c  |   0
 lib/{librte_eal => eal}/windows/eal_mp.c      |   0
 lib/{librte_eal => eal}/windows/eal_thread.c  |   0
 lib/{librte_eal => eal}/windows/eal_timer.c   |   0
 lib/{librte_eal => eal}/windows/eal_windows.h |   0
 lib/{librte_eal => eal}/windows/fnmatch.c     |   0
 lib/{librte_eal => eal}/windows/getopt.c      |   0
 .../windows/include/arpa/inet.h               |   0
 .../windows/include/dirent.h                  |   0
 .../windows/include/fnmatch.h                 |   0
 .../windows/include/getopt.h                  |   0
 .../windows/include/meson.build               |   0
 .../windows/include/netinet/in.h              |   0
 .../windows/include/netinet/ip.h              |   0
 .../windows/include/pthread.h                 |   0
 .../windows/include/regex.h                   |   0
 .../windows/include/rte_os.h                  |   0
 .../windows/include/rte_virt2phys.h           |   0
 .../windows/include/rte_windows.h             |   0
 .../windows/include/sched.h                   |   0
 .../windows/include/sys/queue.h               |   0
 .../windows/include/sys/socket.h              |   0
 .../windows/include/unistd.h                  |   0
 lib/{librte_eal => eal}/windows/meson.build   |   0
 lib/{librte_eal => eal}/windows/rte_thread.c  |   0
 .../x86/include/meson.build                   |   0
 .../x86/include/rte_atomic.h                  |   0
 .../x86/include/rte_atomic_32.h               |   0
 .../x86/include/rte_atomic_64.h               |   0
 .../x86/include/rte_byteorder.h               |   0
 .../x86/include/rte_byteorder_32.h            |   0
 .../x86/include/rte_byteorder_64.h            |   0
 .../x86/include/rte_cpuflags.h                |   0
 .../x86/include/rte_cycles.h                  |   0
 lib/{librte_eal => eal}/x86/include/rte_io.h  |   0
 .../x86/include/rte_mcslock.h                 |   0
 .../x86/include/rte_memcpy.h                  |   0
 .../x86/include/rte_pause.h                   |   0
 .../x86/include/rte_power_intrinsics.h        |   0
 .../x86/include/rte_prefetch.h                |   0
 lib/{librte_eal => eal}/x86/include/rte_rtm.h |   0
 .../x86/include/rte_rwlock.h                  |   0
 .../x86/include/rte_spinlock.h                |   0
 .../x86/include/rte_ticketlock.h              |   0
 .../x86/include/rte_vect.h                    |   0
 lib/{librte_eal => eal}/x86/meson.build       |   0
 lib/{librte_eal => eal}/x86/rte_cpuflags.c    |   0
 lib/{librte_eal => eal}/x86/rte_cpuid.h       |   0
 lib/{librte_eal => eal}/x86/rte_cycles.c      |   0
 lib/{librte_eal => eal}/x86/rte_hypervisor.c  |   0
 .../x86/rte_power_intrinsics.c                |   0
 lib/{librte_eal => eal}/x86/rte_spinlock.c    |   0
 lib/{librte_efd => efd}/meson.build           |   0
 lib/{librte_efd => efd}/rte_efd.c             |   0
 lib/{librte_efd => efd}/rte_efd.h             |   0
 lib/{librte_efd => efd}/rte_efd_arm64.h       |   0
 lib/{librte_efd => efd}/rte_efd_x86.h         |   0
 lib/{librte_efd => efd}/version.map           |   0
 lib/{librte_ethdev => ethdev}/ethdev_driver.h |   0
 lib/{librte_ethdev => ethdev}/ethdev_pci.h    |   0
 .../ethdev_private.c                          |   0
 .../ethdev_private.h                          |   0
 .../ethdev_profile.c                          |   0
 .../ethdev_profile.h                          |   0
 .../ethdev_trace_points.c                     |   0
 lib/{librte_ethdev => ethdev}/ethdev_vdev.h   |   0
 lib/{librte_ethdev => ethdev}/meson.build     |   0
 lib/{librte_ethdev => ethdev}/rte_class_eth.c |   0
 lib/{librte_ethdev => ethdev}/rte_dev_info.h  |   0
 lib/{librte_ethdev => ethdev}/rte_eth_ctrl.h  |   0
 lib/{librte_ethdev => ethdev}/rte_ethdev.c    |   0
 lib/{librte_ethdev => ethdev}/rte_ethdev.h    |   0
 .../rte_ethdev_core.h                         |   0
 .../rte_ethdev_trace.h                        |   0
 .../rte_ethdev_trace_fp.h                     |   0
 lib/{librte_ethdev => ethdev}/rte_flow.c      |   0
 lib/{librte_ethdev => ethdev}/rte_flow.h      |   0
 .../rte_flow_driver.h                         |   0
 lib/{librte_ethdev => ethdev}/rte_mtr.c       |   0
 lib/{librte_ethdev => ethdev}/rte_mtr.h       |   0
 .../rte_mtr_driver.h                          |   0
 lib/{librte_ethdev => ethdev}/rte_tm.c        |   0
 lib/{librte_ethdev => ethdev}/rte_tm.h        |   0
 lib/{librte_ethdev => ethdev}/rte_tm_driver.h |   0
 lib/{librte_ethdev => ethdev}/version.map     |   0
 .../eventdev_pmd.h                            |   0
 .../eventdev_pmd_pci.h                        |   0
 .../eventdev_pmd_vdev.h                       |   0
 .../eventdev_trace_points.c                   |   0
 lib/{librte_eventdev => eventdev}/meson.build |   0
 .../rte_event_crypto_adapter.c                |   0
 .../rte_event_crypto_adapter.h                |   0
 .../rte_event_eth_rx_adapter.c                |   0
 .../rte_event_eth_rx_adapter.h                |   0
 .../rte_event_eth_tx_adapter.c                |   0
 .../rte_event_eth_tx_adapter.h                |   0
 .../rte_event_ring.c                          |   0
 .../rte_event_ring.h                          |   0
 .../rte_event_timer_adapter.c                 |   0
 .../rte_event_timer_adapter.h                 |   0
 .../rte_event_timer_adapter_pmd.h             |   0
 .../rte_eventdev.c                            |   0
 .../rte_eventdev.h                            |   0
 .../rte_eventdev_trace.h                      |   0
 .../rte_eventdev_trace_fp.h                   |   0
 lib/{librte_eventdev => eventdev}/version.map |   0
 lib/{librte_fib => fib}/dir24_8.c             |   0
 lib/{librte_fib => fib}/dir24_8.h             |   0
 lib/{librte_fib => fib}/dir24_8_avx512.c      |   0
 lib/{librte_fib => fib}/dir24_8_avx512.h      |   0
 lib/{librte_fib => fib}/meson.build           |   0
 lib/{librte_fib => fib}/rte_fib.c             |   0
 lib/{librte_fib => fib}/rte_fib.h             |   0
 lib/{librte_fib => fib}/rte_fib6.c            |   0
 lib/{librte_fib => fib}/rte_fib6.h            |   0
 lib/{librte_fib => fib}/trie.c                |   0
 lib/{librte_fib => fib}/trie.h                |   0
 lib/{librte_fib => fib}/trie_avx512.c         |   0
 lib/{librte_fib => fib}/trie_avx512.h         |   0
 lib/{librte_fib => fib}/version.map           |   0
 .../meson.build                               |   0
 .../rte_flow_classify.c                       |   0
 .../rte_flow_classify.h                       |   0
 .../rte_flow_classify_parse.c                 |   0
 .../rte_flow_classify_parse.h                 |   0
 .../version.map                               |   0
 lib/{librte_graph => graph}/graph.c           |   0
 lib/{librte_graph => graph}/graph_debug.c     |   0
 lib/{librte_graph => graph}/graph_ops.c       |   0
 lib/{librte_graph => graph}/graph_populate.c  |   0
 lib/{librte_graph => graph}/graph_private.h   |   0
 lib/{librte_graph => graph}/graph_stats.c     |   0
 lib/{librte_graph => graph}/meson.build       |   0
 lib/{librte_graph => graph}/node.c            |   0
 lib/{librte_graph => graph}/rte_graph.h       |   0
 .../rte_graph_worker.h                        |   0
 lib/{librte_graph => graph}/version.map       |   0
 lib/{librte_gro => gro}/gro_tcp4.c            |   0
 lib/{librte_gro => gro}/gro_tcp4.h            |   0
 lib/{librte_gro => gro}/gro_udp4.c            |   0
 lib/{librte_gro => gro}/gro_udp4.h            |   0
 lib/{librte_gro => gro}/gro_vxlan_tcp4.c      |   0
 lib/{librte_gro => gro}/gro_vxlan_tcp4.h      |   0
 lib/{librte_gro => gro}/gro_vxlan_udp4.c      |   0
 lib/{librte_gro => gro}/gro_vxlan_udp4.h      |   0
 lib/{librte_gro => gro}/meson.build           |   0
 lib/{librte_gro => gro}/rte_gro.c             |   0
 lib/{librte_gro => gro}/rte_gro.h             |   0
 lib/{librte_gro => gro}/version.map           |   0
 lib/{librte_gso => gso}/gso_common.c          |   0
 lib/{librte_gso => gso}/gso_common.h          |   0
 lib/{librte_gso => gso}/gso_tcp4.c            |   0
 lib/{librte_gso => gso}/gso_tcp4.h            |   0
 lib/{librte_gso => gso}/gso_tunnel_tcp4.c     |   0
 lib/{librte_gso => gso}/gso_tunnel_tcp4.h     |   0
 lib/{librte_gso => gso}/gso_tunnel_udp4.c     |   0
 lib/{librte_gso => gso}/gso_tunnel_udp4.h     |   0
 lib/{librte_gso => gso}/gso_udp4.c            |   0
 lib/{librte_gso => gso}/gso_udp4.h            |   0
 lib/{librte_gso => gso}/meson.build           |   0
 lib/{librte_gso => gso}/rte_gso.c             |   0
 lib/{librte_gso => gso}/rte_gso.h             |   0
 lib/{librte_gso => gso}/version.map           |   0
 lib/{librte_hash => hash}/meson.build         |   0
 lib/{librte_hash => hash}/rte_cmp_arm64.h     |   0
 lib/{librte_hash => hash}/rte_cmp_x86.h       |   0
 lib/{librte_hash => hash}/rte_crc_arm64.h     |   0
 lib/{librte_hash => hash}/rte_cuckoo_hash.c   |   0
 lib/{librte_hash => hash}/rte_cuckoo_hash.h   |   0
 lib/{librte_hash => hash}/rte_fbk_hash.c      |   0
 lib/{librte_hash => hash}/rte_fbk_hash.h      |   0
 lib/{librte_hash => hash}/rte_hash.h          |   0
 lib/{librte_hash => hash}/rte_hash_crc.h      |   0
 lib/{librte_hash => hash}/rte_jhash.h         |   0
 lib/{librte_hash => hash}/rte_thash.h         |   0
 lib/{librte_hash => hash}/version.map         |   0
 .../ip_frag_common.h                          |   0
 .../ip_frag_internal.c                        |   0
 lib/{librte_ip_frag => ip_frag}/meson.build   |   0
 lib/{librte_ip_frag => ip_frag}/rte_ip_frag.h |   0
 .../rte_ip_frag_common.c                      |   0
 .../rte_ipv4_fragmentation.c                  |   0
 .../rte_ipv4_reassembly.c                     |   0
 .../rte_ipv6_fragmentation.c                  |   0
 .../rte_ipv6_reassembly.c                     |   0
 lib/{librte_ip_frag => ip_frag}/version.map   |   0
 lib/{librte_ipsec => ipsec}/crypto.h          |   0
 lib/{librte_ipsec => ipsec}/esp_inb.c         |   0
 lib/{librte_ipsec => ipsec}/esp_outb.c        |   0
 lib/{librte_ipsec => ipsec}/iph.h             |   0
 lib/{librte_ipsec => ipsec}/ipsec_sad.c       |   0
 lib/{librte_ipsec => ipsec}/ipsec_sqn.h       |   0
 lib/{librte_ipsec => ipsec}/meson.build       |   0
 lib/{librte_ipsec => ipsec}/misc.h            |   0
 lib/{librte_ipsec => ipsec}/pad.h             |   0
 lib/{librte_ipsec => ipsec}/rte_ipsec.h       |   0
 lib/{librte_ipsec => ipsec}/rte_ipsec_group.h |   0
 lib/{librte_ipsec => ipsec}/rte_ipsec_sa.h    |   0
 lib/{librte_ipsec => ipsec}/rte_ipsec_sad.h   |   0
 lib/{librte_ipsec => ipsec}/sa.c              |   0
 lib/{librte_ipsec => ipsec}/sa.h              |   0
 lib/{librte_ipsec => ipsec}/ses.c             |   0
 lib/{librte_ipsec => ipsec}/version.map       |   0
 lib/{librte_jobstats => jobstats}/meson.build |   0
 .../rte_jobstats.c                            |   0
 .../rte_jobstats.h                            |   0
 lib/{librte_jobstats => jobstats}/version.map |   0
 lib/{librte_kni => kni}/meson.build           |   0
 lib/{librte_kni => kni}/rte_kni.c             |   0
 lib/{librte_kni => kni}/rte_kni.h             |   0
 lib/{librte_kni => kni}/rte_kni_common.h      |   0
 lib/{librte_kni => kni}/rte_kni_fifo.h        |   0
 lib/{librte_kni => kni}/version.map           |   0
 lib/{librte_kvargs => kvargs}/meson.build     |   0
 lib/{librte_kvargs => kvargs}/rte_kvargs.c    |   0
 lib/{librte_kvargs => kvargs}/rte_kvargs.h    |   0
 lib/{librte_kvargs => kvargs}/version.map     |   0
 .../meson.build                               |   0
 .../rte_latencystats.c                        |   0
 .../rte_latencystats.h                        |   0
 .../version.map                               |   0
 lib/{librte_lpm => lpm}/meson.build           |   0
 lib/{librte_lpm => lpm}/rte_lpm.c             |   0
 lib/{librte_lpm => lpm}/rte_lpm.h             |   0
 lib/{librte_lpm => lpm}/rte_lpm6.c            |   0
 lib/{librte_lpm => lpm}/rte_lpm6.h            |   0
 lib/{librte_lpm => lpm}/rte_lpm_altivec.h     |   0
 lib/{librte_lpm => lpm}/rte_lpm_neon.h        |   0
 lib/{librte_lpm => lpm}/rte_lpm_sse.h         |   0
 lib/{librte_lpm => lpm}/rte_lpm_sve.h         |   0
 lib/{librte_lpm => lpm}/version.map           |   0
 lib/{librte_mbuf => mbuf}/meson.build         |   0
 lib/{librte_mbuf => mbuf}/rte_mbuf.c          |   0
 lib/{librte_mbuf => mbuf}/rte_mbuf.h          |   0
 lib/{librte_mbuf => mbuf}/rte_mbuf_core.h     |   0
 lib/{librte_mbuf => mbuf}/rte_mbuf_dyn.c      |   0
 lib/{librte_mbuf => mbuf}/rte_mbuf_dyn.h      |   0
 lib/{librte_mbuf => mbuf}/rte_mbuf_pool_ops.c |   0
 lib/{librte_mbuf => mbuf}/rte_mbuf_pool_ops.h |   0
 lib/{librte_mbuf => mbuf}/rte_mbuf_ptype.c    |   0
 lib/{librte_mbuf => mbuf}/rte_mbuf_ptype.h    |   0
 lib/{librte_mbuf => mbuf}/version.map         |   0
 lib/{librte_member => member}/meson.build     |   0
 lib/{librte_member => member}/rte_member.c    |   0
 lib/{librte_member => member}/rte_member.h    |   0
 lib/{librte_member => member}/rte_member_ht.c |   0
 lib/{librte_member => member}/rte_member_ht.h |   0
 .../rte_member_vbf.c                          |   0
 .../rte_member_vbf.h                          |   0
 .../rte_member_x86.h                          |   0
 lib/{librte_member => member}/version.map     |   0
 .../mempool_trace_points.c                    |   0
 lib/{librte_mempool => mempool}/meson.build   |   0
 lib/{librte_mempool => mempool}/rte_mempool.c |   0
 lib/{librte_mempool => mempool}/rte_mempool.h |   0
 .../rte_mempool_ops.c                         |   0
 .../rte_mempool_ops_default.c                 |   0
 .../rte_mempool_trace.h                       |   0
 .../rte_mempool_trace_fp.h                    |   0
 lib/{librte_mempool => mempool}/version.map   |   0
 lib/meson.build                               |  16 +-
 lib/{librte_meter => meter}/meson.build       |   0
 lib/{librte_meter => meter}/rte_meter.c       |   0
 lib/{librte_meter => meter}/rte_meter.h       |   0
 lib/{librte_meter => meter}/version.map       |   0
 lib/{librte_metrics => metrics}/meson.build   |   0
 lib/{librte_metrics => metrics}/rte_metrics.c |   0
 lib/{librte_metrics => metrics}/rte_metrics.h |   0
 .../rte_metrics_telemetry.c                   |   0
 .../rte_metrics_telemetry.h                   |   0
 lib/{librte_metrics => metrics}/version.map   |   0
 lib/{librte_net => net}/meson.build           |   0
 lib/{librte_net => net}/net_crc.h             |   0
 lib/{librte_net => net}/net_crc_avx512.c      |   0
 lib/{librte_net => net}/net_crc_neon.c        |   0
 lib/{librte_net => net}/net_crc_sse.c         |   0
 lib/{librte_net => net}/rte_arp.c             |   0
 lib/{librte_net => net}/rte_arp.h             |   0
 lib/{librte_net => net}/rte_ecpri.h           |   0
 lib/{librte_net => net}/rte_esp.h             |   0
 lib/{librte_net => net}/rte_ether.c           |   0
 lib/{librte_net => net}/rte_ether.h           |   0
 lib/{librte_net => net}/rte_geneve.h          |   0
 lib/{librte_net => net}/rte_gre.h             |   0
 lib/{librte_net => net}/rte_gtp.h             |   0
 lib/{librte_net => net}/rte_higig.h           |   0
 lib/{librte_net => net}/rte_icmp.h            |   0
 lib/{librte_net => net}/rte_ip.h              |   0
 lib/{librte_net => net}/rte_mpls.h            |   0
 lib/{librte_net => net}/rte_net.c             |   0
 lib/{librte_net => net}/rte_net.h             |   0
 lib/{librte_net => net}/rte_net_crc.c         |   0
 lib/{librte_net => net}/rte_net_crc.h         |   0
 lib/{librte_net => net}/rte_sctp.h            |   0
 lib/{librte_net => net}/rte_tcp.h             |   0
 lib/{librte_net => net}/rte_udp.h             |   0
 lib/{librte_net => net}/rte_vxlan.h           |   0
 lib/{librte_net => net}/version.map           |   0
 lib/{librte_node => node}/ethdev_ctrl.c       |   0
 lib/{librte_node => node}/ethdev_rx.c         |   0
 lib/{librte_node => node}/ethdev_rx_priv.h    |   0
 lib/{librte_node => node}/ethdev_tx.c         |   0
 lib/{librte_node => node}/ethdev_tx_priv.h    |   0
 lib/{librte_node => node}/ip4_lookup.c        |   0
 lib/{librte_node => node}/ip4_lookup_neon.h   |   0
 lib/{librte_node => node}/ip4_lookup_sse.h    |   0
 lib/{librte_node => node}/ip4_rewrite.c       |   0
 lib/{librte_node => node}/ip4_rewrite_priv.h  |   0
 lib/{librte_node => node}/log.c               |   0
 lib/{librte_node => node}/meson.build         |   0
 lib/{librte_node => node}/node_private.h      |   0
 lib/{librte_node => node}/null.c              |   0
 lib/{librte_node => node}/pkt_cls.c           |   0
 lib/{librte_node => node}/pkt_cls_priv.h      |   0
 lib/{librte_node => node}/pkt_drop.c          |   0
 lib/{librte_node => node}/rte_node_eth_api.h  |   0
 lib/{librte_node => node}/rte_node_ip4_api.h  |   0
 lib/{librte_node => node}/version.map         |   0
 lib/{librte_pci => pci}/meson.build           |   0
 lib/{librte_pci => pci}/rte_pci.c             |   0
 lib/{librte_pci => pci}/rte_pci.h             |   0
 lib/{librte_pci => pci}/version.map           |   0
 lib/{librte_pdump => pdump}/meson.build       |   0
 lib/{librte_pdump => pdump}/rte_pdump.c       |   0
 lib/{librte_pdump => pdump}/rte_pdump.h       |   0
 lib/{librte_pdump => pdump}/version.map       |   0
 lib/{librte_pipeline => pipeline}/meson.build |   0
 .../rte_pipeline.c                            |   0
 .../rte_pipeline.h                            |   0
 .../rte_port_in_action.c                      |   0
 .../rte_port_in_action.h                      |   0
 .../rte_swx_ctl.c                             |   0
 .../rte_swx_ctl.h                             |   0
 .../rte_swx_extern.h                          |   0
 .../rte_swx_pipeline.c                        |   0
 .../rte_swx_pipeline.h                        |   0
 .../rte_swx_pipeline_spec.c                   |   0
 .../rte_table_action.c                        |   0
 .../rte_table_action.h                        |   0
 lib/{librte_pipeline => pipeline}/version.map |   0
 lib/{librte_port => port}/meson.build         |   0
 lib/{librte_port => port}/rte_port.h          |   0
 lib/{librte_port => port}/rte_port_ethdev.c   |   0
 lib/{librte_port => port}/rte_port_ethdev.h   |   0
 lib/{librte_port => port}/rte_port_eventdev.c |   0
 lib/{librte_port => port}/rte_port_eventdev.h |   0
 lib/{librte_port => port}/rte_port_fd.c       |   0
 lib/{librte_port => port}/rte_port_fd.h       |   0
 lib/{librte_port => port}/rte_port_frag.c     |   0
 lib/{librte_port => port}/rte_port_frag.h     |   0
 lib/{librte_port => port}/rte_port_kni.c      |   0
 lib/{librte_port => port}/rte_port_kni.h      |   0
 lib/{librte_port => port}/rte_port_ras.c      |   0
 lib/{librte_port => port}/rte_port_ras.h      |   0
 lib/{librte_port => port}/rte_port_ring.c     |   0
 lib/{librte_port => port}/rte_port_ring.h     |   0
 lib/{librte_port => port}/rte_port_sched.c    |   0
 lib/{librte_port => port}/rte_port_sched.h    |   0
 .../rte_port_source_sink.c                    |   0
 .../rte_port_source_sink.h                    |   0
 .../rte_port_sym_crypto.c                     |   0
 .../rte_port_sym_crypto.h                     |   0
 lib/{librte_port => port}/rte_swx_port.h      |   0
 .../rte_swx_port_ethdev.c                     |   0
 .../rte_swx_port_ethdev.h                     |   0
 lib/{librte_port => port}/rte_swx_port_fd.c   |   0
 lib/{librte_port => port}/rte_swx_port_fd.h   |   0
 lib/{librte_port => port}/rte_swx_port_ring.c |   0
 lib/{librte_port => port}/rte_swx_port_ring.h |   0
 .../rte_swx_port_source_sink.c                |   0
 .../rte_swx_port_source_sink.h                |   0
 lib/{librte_port => port}/version.map         |   0
 lib/{librte_power => power}/guest_channel.c   |   0
 lib/{librte_power => power}/guest_channel.h   |   0
 lib/{librte_power => power}/meson.build       |   0
 .../power_acpi_cpufreq.c                      |   0
 .../power_acpi_cpufreq.h                      |   0
 lib/{librte_power => power}/power_common.c    |   0
 lib/{librte_power => power}/power_common.h    |   0
 lib/{librte_power => power}/power_kvm_vm.c    |   0
 lib/{librte_power => power}/power_kvm_vm.h    |   0
 .../power_pstate_cpufreq.c                    |   0
 .../power_pstate_cpufreq.h                    |   0
 lib/{librte_power => power}/rte_power.c       |   0
 lib/{librte_power => power}/rte_power.h       |   0
 .../rte_power_empty_poll.c                    |   0
 .../rte_power_empty_poll.h                    |   0
 .../rte_power_guest_channel.h                 |   0
 .../rte_power_pmd_mgmt.c                      |   0
 .../rte_power_pmd_mgmt.h                      |   0
 lib/{librte_power => power}/version.map       |   0
 lib/{librte_rawdev => rawdev}/meson.build     |   0
 lib/{librte_rawdev => rawdev}/rte_rawdev.c    |   0
 lib/{librte_rawdev => rawdev}/rte_rawdev.h    |   0
 .../rte_rawdev_pmd.h                          |   0
 lib/{librte_rawdev => rawdev}/version.map     |   0
 lib/{librte_rcu => rcu}/meson.build           |   0
 lib/{librte_rcu => rcu}/rcu_qsbr_pvt.h        |   0
 lib/{librte_rcu => rcu}/rte_rcu_qsbr.c        |   0
 lib/{librte_rcu => rcu}/rte_rcu_qsbr.h        |   0
 lib/{librte_rcu => rcu}/version.map           |   0
 lib/{librte_regexdev => regexdev}/meson.build |   0
 .../rte_regexdev.c                            |   0
 .../rte_regexdev.h                            |   0
 .../rte_regexdev_core.h                       |   0
 .../rte_regexdev_driver.h                     |   0
 lib/{librte_regexdev => regexdev}/version.map |   0
 lib/{librte_reorder => reorder}/meson.build   |   0
 lib/{librte_reorder => reorder}/rte_reorder.c |   0
 lib/{librte_reorder => reorder}/rte_reorder.h |   0
 lib/{librte_reorder => reorder}/version.map   |   0
 lib/{librte_rib => rib}/meson.build           |   0
 lib/{librte_rib => rib}/rte_rib.c             |   0
 lib/{librte_rib => rib}/rte_rib.h             |   0
 lib/{librte_rib => rib}/rte_rib6.c            |   0
 lib/{librte_rib => rib}/rte_rib6.h            |   0
 lib/{librte_rib => rib}/version.map           |   0
 lib/{librte_ring => ring}/meson.build         |   0
 lib/{librte_ring => ring}/rte_ring.c          |   0
 lib/{librte_ring => ring}/rte_ring.h          |   0
 lib/{librte_ring => ring}/rte_ring_c11_pvt.h  |   0
 lib/{librte_ring => ring}/rte_ring_core.h     |   0
 lib/{librte_ring => ring}/rte_ring_elem.h     |   0
 lib/{librte_ring => ring}/rte_ring_elem_pvt.h |   0
 .../rte_ring_generic_pvt.h                    |   0
 lib/{librte_ring => ring}/rte_ring_hts.h      |   0
 .../rte_ring_hts_elem_pvt.h                   |   0
 lib/{librte_ring => ring}/rte_ring_peek.h     |   0
 .../rte_ring_peek_elem_pvt.h                  |   0
 lib/{librte_ring => ring}/rte_ring_peek_zc.h  |   0
 lib/{librte_ring => ring}/rte_ring_rts.h      |   0
 .../rte_ring_rts_elem_pvt.h                   |   0
 lib/{librte_ring => ring}/version.map         |   0
 lib/{librte_sched => sched}/meson.build       |   0
 lib/{librte_sched => sched}/rte_approx.c      |   0
 lib/{librte_sched => sched}/rte_approx.h      |   0
 lib/{librte_sched => sched}/rte_red.c         |   0
 lib/{librte_sched => sched}/rte_red.h         |   0
 lib/{librte_sched => sched}/rte_sched.c       |   0
 lib/{librte_sched => sched}/rte_sched.h       |   0
 .../rte_sched_common.h                        |   0
 lib/{librte_sched => sched}/version.map       |   0
 lib/{librte_security => security}/meson.build |   0
 .../rte_security.c                            |   0
 .../rte_security.h                            |   0
 .../rte_security_driver.h                     |   0
 lib/{librte_security => security}/version.map |   0
 lib/{librte_stack => stack}/meson.build       |   0
 lib/{librte_stack => stack}/rte_stack.c       |   0
 lib/{librte_stack => stack}/rte_stack.h       |   0
 lib/{librte_stack => stack}/rte_stack_lf.c    |   0
 lib/{librte_stack => stack}/rte_stack_lf.h    |   0
 .../rte_stack_lf_c11.h                        |   0
 .../rte_stack_lf_generic.h                    |   0
 .../rte_stack_lf_stubs.h                      |   0
 lib/{librte_stack => stack}/rte_stack_std.c   |   0
 lib/{librte_stack => stack}/rte_stack_std.h   |   0
 lib/{librte_stack => stack}/stack_pvt.h       |   0
 lib/{librte_stack => stack}/version.map       |   0
 lib/{librte_table => table}/meson.build       |   0
 lib/{librte_table => table}/rte_lru.h         |   0
 lib/{librte_table => table}/rte_lru_arm64.h   |   0
 lib/{librte_table => table}/rte_lru_x86.h     |   0
 lib/{librte_table => table}/rte_swx_table.h   |   0
 .../rte_swx_table_em.c                        |   0
 .../rte_swx_table_em.h                        |   0
 .../rte_swx_table_wm.c                        |   0
 .../rte_swx_table_wm.h                        |   0
 lib/{librte_table => table}/rte_table.h       |   0
 lib/{librte_table => table}/rte_table_acl.c   |   0
 lib/{librte_table => table}/rte_table_acl.h   |   0
 lib/{librte_table => table}/rte_table_array.c |   0
 lib/{librte_table => table}/rte_table_array.h |   0
 lib/{librte_table => table}/rte_table_hash.h  |   0
 .../rte_table_hash_cuckoo.c                   |   0
 .../rte_table_hash_cuckoo.h                   |   0
 .../rte_table_hash_ext.c                      |   0
 .../rte_table_hash_func.h                     |   0
 .../rte_table_hash_func_arm64.h               |   0
 .../rte_table_hash_key16.c                    |   0
 .../rte_table_hash_key32.c                    |   0
 .../rte_table_hash_key8.c                     |   0
 .../rte_table_hash_lru.c                      |   0
 lib/{librte_table => table}/rte_table_lpm.c   |   0
 lib/{librte_table => table}/rte_table_lpm.h   |   0
 .../rte_table_lpm_ipv6.c                      |   0
 .../rte_table_lpm_ipv6.h                      |   0
 lib/{librte_table => table}/rte_table_stub.c  |   0
 lib/{librte_table => table}/rte_table_stub.h  |   0
 lib/{librte_table => table}/version.map       |   0
 .../meson.build                               |   2 +-
 .../rte_telemetry.h                           |   0
 .../telemetry.c                               |   0
 .../telemetry_data.c                          |   0
 .../telemetry_data.h                          |   0
 .../telemetry_internal.h                      |   0
 .../telemetry_json.h                          |   0
 .../telemetry_legacy.c                        |   0
 .../version.map                               |   0
 lib/{librte_timer => timer}/meson.build       |   0
 lib/{librte_timer => timer}/rte_timer.c       |   0
 lib/{librte_timer => timer}/rte_timer.h       |   0
 lib/{librte_timer => timer}/version.map       |   0
 lib/{librte_vhost => vhost}/fd_man.c          |   0
 lib/{librte_vhost => vhost}/fd_man.h          |   0
 lib/{librte_vhost => vhost}/iotlb.c           |   0
 lib/{librte_vhost => vhost}/iotlb.h           |   0
 lib/{librte_vhost => vhost}/meson.build       |   0
 lib/{librte_vhost => vhost}/rte_vdpa.h        |   0
 lib/{librte_vhost => vhost}/rte_vdpa_dev.h    |   0
 lib/{librte_vhost => vhost}/rte_vhost.h       |   0
 lib/{librte_vhost => vhost}/rte_vhost_async.h |   0
 .../rte_vhost_crypto.h                        |   0
 lib/{librte_vhost => vhost}/socket.c          |   0
 lib/{librte_vhost => vhost}/vdpa.c            |   0
 lib/{librte_vhost => vhost}/version.map       |   0
 lib/{librte_vhost => vhost}/vhost.c           |   0
 lib/{librte_vhost => vhost}/vhost.h           |   0
 lib/{librte_vhost => vhost}/vhost_crypto.c    |   0
 lib/{librte_vhost => vhost}/vhost_user.c      |   0
 lib/{librte_vhost => vhost}/vhost_user.h      |   0
 lib/{librte_vhost => vhost}/virtio_crypto.h   |   0
 lib/{librte_vhost => vhost}/virtio_net.c      |   0
 license/exceptions.txt                        |   6 +-
 meson.build                                   |   6 +-
 874 files changed, 207 insertions(+), 205 deletions(-)
 rename lib/{librte_acl => acl}/acl.h (100%)
 rename lib/{librte_acl => acl}/acl_bld.c (100%)
 rename lib/{librte_acl => acl}/acl_gen.c (100%)
 rename lib/{librte_acl => acl}/acl_run.h (100%)
 rename lib/{librte_acl => acl}/acl_run_altivec.c (100%)
 rename lib/{librte_acl => acl}/acl_run_altivec.h (100%)
 rename lib/{librte_acl => acl}/acl_run_avx2.c (100%)
 rename lib/{librte_acl => acl}/acl_run_avx2.h (100%)
 rename lib/{librte_acl => acl}/acl_run_avx512.c (100%)
 rename lib/{librte_acl => acl}/acl_run_avx512_common.h (100%)
 rename lib/{librte_acl => acl}/acl_run_avx512x16.h (100%)
 rename lib/{librte_acl => acl}/acl_run_avx512x8.h (100%)
 rename lib/{librte_acl => acl}/acl_run_neon.c (100%)
 rename lib/{librte_acl => acl}/acl_run_neon.h (100%)
 rename lib/{librte_acl => acl}/acl_run_scalar.c (100%)
 rename lib/{librte_acl => acl}/acl_run_sse.c (100%)
 rename lib/{librte_acl => acl}/acl_run_sse.h (100%)
 rename lib/{librte_acl => acl}/acl_vect.h (100%)
 rename lib/{librte_acl => acl}/meson.build (100%)
 rename lib/{librte_acl => acl}/rte_acl.c (100%)
 rename lib/{librte_acl => acl}/rte_acl.h (100%)
 rename lib/{librte_acl => acl}/rte_acl_osdep.h (100%)
 rename lib/{librte_acl => acl}/tb_mem.c (100%)
 rename lib/{librte_acl => acl}/tb_mem.h (100%)
 rename lib/{librte_acl => acl}/version.map (100%)
 rename lib/{librte_bbdev => bbdev}/meson.build (100%)
 rename lib/{librte_bbdev => bbdev}/rte_bbdev.c (100%)
 rename lib/{librte_bbdev => bbdev}/rte_bbdev.h (100%)
 rename lib/{librte_bbdev => bbdev}/rte_bbdev_op.h (100%)
 rename lib/{librte_bbdev => bbdev}/rte_bbdev_pmd.h (100%)
 rename lib/{librte_bbdev => bbdev}/version.map (100%)
 rename lib/{librte_bitratestats => bitratestats}/meson.build (100%)
 rename lib/{librte_bitratestats => bitratestats}/rte_bitrate.c (100%)
 rename lib/{librte_bitratestats => bitratestats}/rte_bitrate.h (100%)
 rename lib/{librte_bitratestats => bitratestats}/version.map (100%)
 rename lib/{librte_bpf => bpf}/bpf.c (100%)
 rename lib/{librte_bpf => bpf}/bpf_def.h (100%)
 rename lib/{librte_bpf => bpf}/bpf_exec.c (100%)
 rename lib/{librte_bpf => bpf}/bpf_impl.h (100%)
 rename lib/{librte_bpf => bpf}/bpf_jit_arm64.c (100%)
 rename lib/{librte_bpf => bpf}/bpf_jit_x86.c (100%)
 rename lib/{librte_bpf => bpf}/bpf_load.c (100%)
 rename lib/{librte_bpf => bpf}/bpf_load_elf.c (100%)
 rename lib/{librte_bpf => bpf}/bpf_pkt.c (100%)
 rename lib/{librte_bpf => bpf}/bpf_validate.c (100%)
 rename lib/{librte_bpf => bpf}/meson.build (100%)
 rename lib/{librte_bpf => bpf}/rte_bpf.h (100%)
 rename lib/{librte_bpf => bpf}/rte_bpf_ethdev.h (100%)
 rename lib/{librte_bpf => bpf}/version.map (100%)
 rename lib/{librte_cfgfile => cfgfile}/meson.build (100%)
 rename lib/{librte_cfgfile => cfgfile}/rte_cfgfile.c (100%)
 rename lib/{librte_cfgfile => cfgfile}/rte_cfgfile.h (100%)
 rename lib/{librte_cfgfile => cfgfile}/version.map (100%)
 rename lib/{librte_cmdline => cmdline}/cmdline.c (100%)
 rename lib/{librte_cmdline => cmdline}/cmdline.h (100%)
 rename lib/{librte_cmdline => cmdline}/cmdline_cirbuf.c (100%)
 rename lib/{librte_cmdline => cmdline}/cmdline_cirbuf.h (100%)
 rename lib/{librte_cmdline => cmdline}/cmdline_os_unix.c (100%)
 rename lib/{librte_cmdline => cmdline}/cmdline_os_windows.c (100%)
 rename lib/{librte_cmdline => cmdline}/cmdline_parse.c (100%)
 rename lib/{librte_cmdline => cmdline}/cmdline_parse.h (100%)
 rename lib/{librte_cmdline => cmdline}/cmdline_parse_etheraddr.c (100%)
 rename lib/{librte_cmdline => cmdline}/cmdline_parse_etheraddr.h (100%)
 rename lib/{librte_cmdline => cmdline}/cmdline_parse_ipaddr.c (100%)
 rename lib/{librte_cmdline => cmdline}/cmdline_parse_ipaddr.h (100%)
 rename lib/{librte_cmdline => cmdline}/cmdline_parse_num.c (100%)
 rename lib/{librte_cmdline => cmdline}/cmdline_parse_num.h (100%)
 rename lib/{librte_cmdline => cmdline}/cmdline_parse_portlist.c (100%)
 rename lib/{librte_cmdline => cmdline}/cmdline_parse_portlist.h (100%)
 rename lib/{librte_cmdline => cmdline}/cmdline_parse_string.c (100%)
 rename lib/{librte_cmdline => cmdline}/cmdline_parse_string.h (100%)
 rename lib/{librte_cmdline => cmdline}/cmdline_private.h (100%)
 rename lib/{librte_cmdline => cmdline}/cmdline_rdline.c (100%)
 rename lib/{librte_cmdline => cmdline}/cmdline_rdline.h (100%)
 rename lib/{librte_cmdline => cmdline}/cmdline_socket.c (100%)
 rename lib/{librte_cmdline => cmdline}/cmdline_socket.h (100%)
 rename lib/{librte_cmdline => cmdline}/cmdline_vt100.c (100%)
 rename lib/{librte_cmdline => cmdline}/cmdline_vt100.h (100%)
 rename lib/{librte_cmdline => cmdline}/meson.build (100%)
 rename lib/{librte_cmdline => cmdline}/version.map (100%)
 rename lib/{librte_compressdev => compressdev}/meson.build (100%)
 rename lib/{librte_compressdev => compressdev}/rte_comp.c (100%)
 rename lib/{librte_compressdev => compressdev}/rte_comp.h (100%)
 rename lib/{librte_compressdev => compressdev}/rte_compressdev.c (100%)
 rename lib/{librte_compressdev => compressdev}/rte_compressdev.h (100%)
 rename lib/{librte_compressdev => compressdev}/rte_compressdev_internal.h (100%)
 rename lib/{librte_compressdev => compressdev}/rte_compressdev_pmd.c (100%)
 rename lib/{librte_compressdev => compressdev}/rte_compressdev_pmd.h (100%)
 rename lib/{librte_compressdev => compressdev}/version.map (100%)
 rename lib/{librte_cryptodev => cryptodev}/cryptodev_trace_points.c (100%)
 rename lib/{librte_cryptodev => cryptodev}/meson.build (100%)
 rename lib/{librte_cryptodev => cryptodev}/rte_crypto.h (100%)
 rename lib/{librte_cryptodev => cryptodev}/rte_crypto_asym.h (100%)
 rename lib/{librte_cryptodev => cryptodev}/rte_crypto_sym.h (100%)
 rename lib/{librte_cryptodev => cryptodev}/rte_cryptodev.c (100%)
 rename lib/{librte_cryptodev => cryptodev}/rte_cryptodev.h (100%)
 rename lib/{librte_cryptodev => cryptodev}/rte_cryptodev_pmd.c (100%)
 rename lib/{librte_cryptodev => cryptodev}/rte_cryptodev_pmd.h (100%)
 rename lib/{librte_cryptodev => cryptodev}/rte_cryptodev_trace.h (100%)
 rename lib/{librte_cryptodev => cryptodev}/rte_cryptodev_trace_fp.h (100%)
 rename lib/{librte_cryptodev => cryptodev}/version.map (100%)
 rename lib/{librte_distributor => distributor}/distributor_private.h (100%)
 rename lib/{librte_distributor => distributor}/meson.build (100%)
 rename lib/{librte_distributor => distributor}/rte_distributor.c (100%)
 rename lib/{librte_distributor => distributor}/rte_distributor.h (100%)
 rename lib/{librte_distributor => distributor}/rte_distributor_match_generic.c (100%)
 rename lib/{librte_distributor => distributor}/rte_distributor_match_sse.c (100%)
 rename lib/{librte_distributor => distributor}/rte_distributor_single.c (100%)
 rename lib/{librte_distributor => distributor}/rte_distributor_single.h (100%)
 rename lib/{librte_distributor => distributor}/version.map (100%)
 rename lib/{librte_eal => eal}/arm/include/meson.build (100%)
 rename lib/{librte_eal => eal}/arm/include/rte_atomic.h (100%)
 rename lib/{librte_eal => eal}/arm/include/rte_atomic_32.h (100%)
 rename lib/{librte_eal => eal}/arm/include/rte_atomic_64.h (100%)
 rename lib/{librte_eal => eal}/arm/include/rte_byteorder.h (100%)
 rename lib/{librte_eal => eal}/arm/include/rte_cpuflags.h (100%)
 rename lib/{librte_eal => eal}/arm/include/rte_cpuflags_32.h (100%)
 rename lib/{librte_eal => eal}/arm/include/rte_cpuflags_64.h (100%)
 rename lib/{librte_eal => eal}/arm/include/rte_cycles.h (100%)
 rename lib/{librte_eal => eal}/arm/include/rte_cycles_32.h (100%)
 rename lib/{librte_eal => eal}/arm/include/rte_cycles_64.h (100%)
 rename lib/{librte_eal => eal}/arm/include/rte_io.h (100%)
 rename lib/{librte_eal => eal}/arm/include/rte_io_64.h (100%)
 rename lib/{librte_eal => eal}/arm/include/rte_mcslock.h (100%)
 rename lib/{librte_eal => eal}/arm/include/rte_memcpy.h (100%)
 rename lib/{librte_eal => eal}/arm/include/rte_memcpy_32.h (100%)
 rename lib/{librte_eal => eal}/arm/include/rte_memcpy_64.h (100%)
 rename lib/{librte_eal => eal}/arm/include/rte_pause.h (100%)
 rename lib/{librte_eal => eal}/arm/include/rte_pause_32.h (100%)
 rename lib/{librte_eal => eal}/arm/include/rte_pause_64.h (100%)
 rename lib/{librte_eal => eal}/arm/include/rte_power_intrinsics.h (100%)
 rename lib/{librte_eal => eal}/arm/include/rte_prefetch.h (100%)
 rename lib/{librte_eal => eal}/arm/include/rte_prefetch_32.h (100%)
 rename lib/{librte_eal => eal}/arm/include/rte_prefetch_64.h (100%)
 rename lib/{librte_eal => eal}/arm/include/rte_rwlock.h (100%)
 rename lib/{librte_eal => eal}/arm/include/rte_spinlock.h (100%)
 rename lib/{librte_eal => eal}/arm/include/rte_ticketlock.h (100%)
 rename lib/{librte_eal => eal}/arm/include/rte_vect.h (100%)
 rename lib/{librte_eal => eal}/arm/meson.build (100%)
 rename lib/{librte_eal => eal}/arm/rte_cpuflags.c (100%)
 rename lib/{librte_eal => eal}/arm/rte_cycles.c (100%)
 rename lib/{librte_eal => eal}/arm/rte_hypervisor.c (100%)
 rename lib/{librte_eal => eal}/arm/rte_power_intrinsics.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_bus.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_class.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_config.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_cpuflags.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_debug.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_dev.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_devargs.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_dynmem.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_errno.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_fbarray.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_hexdump.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_hypervisor.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_launch.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_lcore.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_log.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_mcfg.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_memalloc.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_memory.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_memzone.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_options.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_proc.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_string_fns.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_tailqs.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_thread.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_timer.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_trace.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_trace_ctf.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_trace_points.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_trace_utils.c (100%)
 rename lib/{librte_eal => eal}/common/eal_common_uuid.c (100%)
 rename lib/{librte_eal => eal}/common/eal_filesystem.h (100%)
 rename lib/{librte_eal => eal}/common/eal_hugepages.h (100%)
 rename lib/{librte_eal => eal}/common/eal_internal_cfg.h (100%)
 rename lib/{librte_eal => eal}/common/eal_memalloc.h (100%)
 rename lib/{librte_eal => eal}/common/eal_memcfg.h (100%)
 rename lib/{librte_eal => eal}/common/eal_options.h (100%)
 rename lib/{librte_eal => eal}/common/eal_private.h (100%)
 rename lib/{librte_eal => eal}/common/eal_thread.h (100%)
 rename lib/{librte_eal => eal}/common/eal_trace.h (100%)
 rename lib/{librte_eal => eal}/common/hotplug_mp.c (100%)
 rename lib/{librte_eal => eal}/common/hotplug_mp.h (100%)
 rename lib/{librte_eal => eal}/common/malloc_elem.c (100%)
 rename lib/{librte_eal => eal}/common/malloc_elem.h (100%)
 rename lib/{librte_eal => eal}/common/malloc_heap.c (100%)
 rename lib/{librte_eal => eal}/common/malloc_heap.h (100%)
 rename lib/{librte_eal => eal}/common/malloc_mp.c (100%)
 rename lib/{librte_eal => eal}/common/malloc_mp.h (100%)
 rename lib/{librte_eal => eal}/common/meson.build (100%)
 rename lib/{librte_eal => eal}/common/rte_keepalive.c (100%)
 rename lib/{librte_eal => eal}/common/rte_malloc.c (100%)
 rename lib/{librte_eal => eal}/common/rte_random.c (100%)
 rename lib/{librte_eal => eal}/common/rte_reciprocal.c (100%)
 rename lib/{librte_eal => eal}/common/rte_service.c (100%)
 rename lib/{librte_eal => eal}/common/rte_version.c (100%)
 rename lib/{librte_eal => eal}/freebsd/eal.c (100%)
 rename lib/{librte_eal => eal}/freebsd/eal_alarm.c (100%)
 rename lib/{librte_eal => eal}/freebsd/eal_alarm_private.h (100%)
 rename lib/{librte_eal => eal}/freebsd/eal_cpuflags.c (100%)
 rename lib/{librte_eal => eal}/freebsd/eal_debug.c (100%)
 rename lib/{librte_eal => eal}/freebsd/eal_dev.c (100%)
 rename lib/{librte_eal => eal}/freebsd/eal_hugepage_info.c (100%)
 rename lib/{librte_eal => eal}/freebsd/eal_interrupts.c (100%)
 rename lib/{librte_eal => eal}/freebsd/eal_lcore.c (100%)
 rename lib/{librte_eal => eal}/freebsd/eal_memalloc.c (100%)
 rename lib/{librte_eal => eal}/freebsd/eal_memory.c (100%)
 rename lib/{librte_eal => eal}/freebsd/eal_thread.c (100%)
 rename lib/{librte_eal => eal}/freebsd/eal_timer.c (100%)
 rename lib/{librte_eal => eal}/freebsd/include/meson.build (100%)
 rename lib/{librte_eal => eal}/freebsd/include/rte_os.h (100%)
 rename lib/{librte_eal => eal}/freebsd/meson.build (100%)
 rename lib/{librte_eal => eal}/include/generic/rte_atomic.h (100%)
 rename lib/{librte_eal => eal}/include/generic/rte_byteorder.h (100%)
 rename lib/{librte_eal => eal}/include/generic/rte_cpuflags.h (100%)
 rename lib/{librte_eal => eal}/include/generic/rte_cycles.h (100%)
 rename lib/{librte_eal => eal}/include/generic/rte_io.h (100%)
 rename lib/{librte_eal => eal}/include/generic/rte_mcslock.h (100%)
 rename lib/{librte_eal => eal}/include/generic/rte_memcpy.h (100%)
 rename lib/{librte_eal => eal}/include/generic/rte_pause.h (100%)
 rename lib/{librte_eal => eal}/include/generic/rte_power_intrinsics.h (100%)
 rename lib/{librte_eal => eal}/include/generic/rte_prefetch.h (100%)
 rename lib/{librte_eal => eal}/include/generic/rte_rwlock.h (100%)
 rename lib/{librte_eal => eal}/include/generic/rte_spinlock.h (100%)
 rename lib/{librte_eal => eal}/include/generic/rte_ticketlock.h (100%)
 rename lib/{librte_eal => eal}/include/generic/rte_vect.h (100%)
 rename lib/{librte_eal => eal}/include/meson.build (100%)
 rename lib/{librte_eal => eal}/include/rte_alarm.h (100%)
 rename lib/{librte_eal => eal}/include/rte_bitmap.h (100%)
 rename lib/{librte_eal => eal}/include/rte_bitops.h (100%)
 rename lib/{librte_eal => eal}/include/rte_branch_prediction.h (100%)
 rename lib/{librte_eal => eal}/include/rte_bus.h (100%)
 rename lib/{librte_eal => eal}/include/rte_class.h (100%)
 rename lib/{librte_eal => eal}/include/rte_common.h (100%)
 rename lib/{librte_eal => eal}/include/rte_compat.h (100%)
 rename lib/{librte_eal => eal}/include/rte_debug.h (100%)
 rename lib/{librte_eal => eal}/include/rte_dev.h (100%)
 rename lib/{librte_eal => eal}/include/rte_devargs.h (100%)
 rename lib/{librte_eal => eal}/include/rte_eal.h (100%)
 rename lib/{librte_eal => eal}/include/rte_eal_interrupts.h (100%)
 rename lib/{librte_eal => eal}/include/rte_eal_memconfig.h (100%)
 rename lib/{librte_eal => eal}/include/rte_eal_paging.h (100%)
 rename lib/{librte_eal => eal}/include/rte_eal_trace.h (100%)
 rename lib/{librte_eal => eal}/include/rte_errno.h (100%)
 rename lib/{librte_eal => eal}/include/rte_fbarray.h (100%)
 rename lib/{librte_eal => eal}/include/rte_function_versioning.h (100%)
 rename lib/{librte_eal => eal}/include/rte_hexdump.h (100%)
 rename lib/{librte_eal => eal}/include/rte_hypervisor.h (100%)
 rename lib/{librte_eal => eal}/include/rte_interrupts.h (100%)
 rename lib/{librte_eal => eal}/include/rte_keepalive.h (100%)
 rename lib/{librte_eal => eal}/include/rte_launch.h (100%)
 rename lib/{librte_eal => eal}/include/rte_lcore.h (100%)
 rename lib/{librte_eal => eal}/include/rte_log.h (100%)
 rename lib/{librte_eal => eal}/include/rte_malloc.h (100%)
 rename lib/{librte_eal => eal}/include/rte_memory.h (100%)
 rename lib/{librte_eal => eal}/include/rte_memzone.h (100%)
 rename lib/{librte_eal => eal}/include/rte_pci_dev_feature_defs.h (100%)
 rename lib/{librte_eal => eal}/include/rte_pci_dev_features.h (100%)
 rename lib/{librte_eal => eal}/include/rte_per_lcore.h (100%)
 rename lib/{librte_eal => eal}/include/rte_random.h (100%)
 rename lib/{librte_eal => eal}/include/rte_reciprocal.h (100%)
 rename lib/{librte_eal => eal}/include/rte_service.h (100%)
 rename lib/{librte_eal => eal}/include/rte_service_component.h (100%)
 rename lib/{librte_eal => eal}/include/rte_string_fns.h (100%)
 rename lib/{librte_eal => eal}/include/rte_tailq.h (100%)
 rename lib/{librte_eal => eal}/include/rte_test.h (100%)
 rename lib/{librte_eal => eal}/include/rte_thread.h (100%)
 rename lib/{librte_eal => eal}/include/rte_time.h (100%)
 rename lib/{librte_eal => eal}/include/rte_trace.h (100%)
 rename lib/{librte_eal => eal}/include/rte_trace_point.h (100%)
 rename lib/{librte_eal => eal}/include/rte_trace_point_register.h (100%)
 rename lib/{librte_eal => eal}/include/rte_uuid.h (100%)
 rename lib/{librte_eal => eal}/include/rte_version.h (100%)
 rename lib/{librte_eal => eal}/include/rte_vfio.h (100%)
 rename lib/{librte_eal => eal}/linux/eal.c (100%)
 rename lib/{librte_eal => eal}/linux/eal_alarm.c (100%)
 rename lib/{librte_eal => eal}/linux/eal_cpuflags.c (100%)
 rename lib/{librte_eal => eal}/linux/eal_debug.c (100%)
 rename lib/{librte_eal => eal}/linux/eal_dev.c (100%)
 rename lib/{librte_eal => eal}/linux/eal_hugepage_info.c (100%)
 rename lib/{librte_eal => eal}/linux/eal_interrupts.c (100%)
 rename lib/{librte_eal => eal}/linux/eal_lcore.c (100%)
 rename lib/{librte_eal => eal}/linux/eal_log.c (100%)
 rename lib/{librte_eal => eal}/linux/eal_memalloc.c (100%)
 rename lib/{librte_eal => eal}/linux/eal_memory.c (100%)
 rename lib/{librte_eal => eal}/linux/eal_thread.c (100%)
 rename lib/{librte_eal => eal}/linux/eal_timer.c (100%)
 rename lib/{librte_eal => eal}/linux/eal_vfio.c (100%)
 rename lib/{librte_eal => eal}/linux/eal_vfio.h (100%)
 rename lib/{librte_eal => eal}/linux/eal_vfio_mp_sync.c (100%)
 rename lib/{librte_eal => eal}/linux/include/meson.build (100%)
 rename lib/{librte_eal => eal}/linux/include/rte_os.h (100%)
 rename lib/{librte_eal => eal}/linux/meson.build (100%)
 rename lib/{librte_eal => eal}/meson.build (100%)
 rename lib/{librte_eal => eal}/ppc/include/meson.build (100%)
 rename lib/{librte_eal => eal}/ppc/include/rte_altivec.h (100%)
 rename lib/{librte_eal => eal}/ppc/include/rte_atomic.h (100%)
 rename lib/{librte_eal => eal}/ppc/include/rte_byteorder.h (100%)
 rename lib/{librte_eal => eal}/ppc/include/rte_cpuflags.h (100%)
 rename lib/{librte_eal => eal}/ppc/include/rte_cycles.h (100%)
 rename lib/{librte_eal => eal}/ppc/include/rte_io.h (100%)
 rename lib/{librte_eal => eal}/ppc/include/rte_mcslock.h (100%)
 rename lib/{librte_eal => eal}/ppc/include/rte_memcpy.h (100%)
 rename lib/{librte_eal => eal}/ppc/include/rte_pause.h (100%)
 rename lib/{librte_eal => eal}/ppc/include/rte_power_intrinsics.h (100%)
 rename lib/{librte_eal => eal}/ppc/include/rte_prefetch.h (100%)
 rename lib/{librte_eal => eal}/ppc/include/rte_rwlock.h (100%)
 rename lib/{librte_eal => eal}/ppc/include/rte_spinlock.h (100%)
 rename lib/{librte_eal => eal}/ppc/include/rte_ticketlock.h (100%)
 rename lib/{librte_eal => eal}/ppc/include/rte_vect.h (100%)
 rename lib/{librte_eal => eal}/ppc/meson.build (100%)
 rename lib/{librte_eal => eal}/ppc/rte_cpuflags.c (100%)
 rename lib/{librte_eal => eal}/ppc/rte_cycles.c (100%)
 rename lib/{librte_eal => eal}/ppc/rte_hypervisor.c (100%)
 rename lib/{librte_eal => eal}/ppc/rte_power_intrinsics.c (100%)
 rename lib/{librte_eal => eal}/rte_eal_exports.def (100%)
 rename lib/{librte_eal => eal}/unix/eal_file.c (100%)
 rename lib/{librte_eal => eal}/unix/eal_unix_memory.c (100%)
 rename lib/{librte_eal => eal}/unix/eal_unix_timer.c (100%)
 rename lib/{librte_eal => eal}/unix/meson.build (100%)
 rename lib/{librte_eal => eal}/unix/rte_thread.c (100%)
 rename lib/{librte_eal => eal}/version.map (100%)
 rename lib/{librte_eal => eal}/windows/eal.c (100%)
 rename lib/{librte_eal => eal}/windows/eal_alarm.c (100%)
 rename lib/{librte_eal => eal}/windows/eal_debug.c (100%)
 rename lib/{librte_eal => eal}/windows/eal_file.c (100%)
 rename lib/{librte_eal => eal}/windows/eal_hugepages.c (100%)
 rename lib/{librte_eal => eal}/windows/eal_interrupts.c (100%)
 rename lib/{librte_eal => eal}/windows/eal_lcore.c (100%)
 rename lib/{librte_eal => eal}/windows/eal_log.c (100%)
 rename lib/{librte_eal => eal}/windows/eal_memalloc.c (100%)
 rename lib/{librte_eal => eal}/windows/eal_memory.c (100%)
 rename lib/{librte_eal => eal}/windows/eal_mp.c (100%)
 rename lib/{librte_eal => eal}/windows/eal_thread.c (100%)
 rename lib/{librte_eal => eal}/windows/eal_timer.c (100%)
 rename lib/{librte_eal => eal}/windows/eal_windows.h (100%)
 rename lib/{librte_eal => eal}/windows/fnmatch.c (100%)
 rename lib/{librte_eal => eal}/windows/getopt.c (100%)
 rename lib/{librte_eal => eal}/windows/include/arpa/inet.h (100%)
 rename lib/{librte_eal => eal}/windows/include/dirent.h (100%)
 rename lib/{librte_eal => eal}/windows/include/fnmatch.h (100%)
 rename lib/{librte_eal => eal}/windows/include/getopt.h (100%)
 rename lib/{librte_eal => eal}/windows/include/meson.build (100%)
 rename lib/{librte_eal => eal}/windows/include/netinet/in.h (100%)
 rename lib/{librte_eal => eal}/windows/include/netinet/ip.h (100%)
 rename lib/{librte_eal => eal}/windows/include/pthread.h (100%)
 rename lib/{librte_eal => eal}/windows/include/regex.h (100%)
 rename lib/{librte_eal => eal}/windows/include/rte_os.h (100%)
 rename lib/{librte_eal => eal}/windows/include/rte_virt2phys.h (100%)
 rename lib/{librte_eal => eal}/windows/include/rte_windows.h (100%)
 rename lib/{librte_eal => eal}/windows/include/sched.h (100%)
 rename lib/{librte_eal => eal}/windows/include/sys/queue.h (100%)
 rename lib/{librte_eal => eal}/windows/include/sys/socket.h (100%)
 rename lib/{librte_eal => eal}/windows/include/unistd.h (100%)
 rename lib/{librte_eal => eal}/windows/meson.build (100%)
 rename lib/{librte_eal => eal}/windows/rte_thread.c (100%)
 rename lib/{librte_eal => eal}/x86/include/meson.build (100%)
 rename lib/{librte_eal => eal}/x86/include/rte_atomic.h (100%)
 rename lib/{librte_eal => eal}/x86/include/rte_atomic_32.h (100%)
 rename lib/{librte_eal => eal}/x86/include/rte_atomic_64.h (100%)
 rename lib/{librte_eal => eal}/x86/include/rte_byteorder.h (100%)
 rename lib/{librte_eal => eal}/x86/include/rte_byteorder_32.h (100%)
 rename lib/{librte_eal => eal}/x86/include/rte_byteorder_64.h (100%)
 rename lib/{librte_eal => eal}/x86/include/rte_cpuflags.h (100%)
 rename lib/{librte_eal => eal}/x86/include/rte_cycles.h (100%)
 rename lib/{librte_eal => eal}/x86/include/rte_io.h (100%)
 rename lib/{librte_eal => eal}/x86/include/rte_mcslock.h (100%)
 rename lib/{librte_eal => eal}/x86/include/rte_memcpy.h (100%)
 rename lib/{librte_eal => eal}/x86/include/rte_pause.h (100%)
 rename lib/{librte_eal => eal}/x86/include/rte_power_intrinsics.h (100%)
 rename lib/{librte_eal => eal}/x86/include/rte_prefetch.h (100%)
 rename lib/{librte_eal => eal}/x86/include/rte_rtm.h (100%)
 rename lib/{librte_eal => eal}/x86/include/rte_rwlock.h (100%)
 rename lib/{librte_eal => eal}/x86/include/rte_spinlock.h (100%)
 rename lib/{librte_eal => eal}/x86/include/rte_ticketlock.h (100%)
 rename lib/{librte_eal => eal}/x86/include/rte_vect.h (100%)
 rename lib/{librte_eal => eal}/x86/meson.build (100%)
 rename lib/{librte_eal => eal}/x86/rte_cpuflags.c (100%)
 rename lib/{librte_eal => eal}/x86/rte_cpuid.h (100%)
 rename lib/{librte_eal => eal}/x86/rte_cycles.c (100%)
 rename lib/{librte_eal => eal}/x86/rte_hypervisor.c (100%)
 rename lib/{librte_eal => eal}/x86/rte_power_intrinsics.c (100%)
 rename lib/{librte_eal => eal}/x86/rte_spinlock.c (100%)
 rename lib/{librte_efd => efd}/meson.build (100%)
 rename lib/{librte_efd => efd}/rte_efd.c (100%)
 rename lib/{librte_efd => efd}/rte_efd.h (100%)
 rename lib/{librte_efd => efd}/rte_efd_arm64.h (100%)
 rename lib/{librte_efd => efd}/rte_efd_x86.h (100%)
 rename lib/{librte_efd => efd}/version.map (100%)
 rename lib/{librte_ethdev => ethdev}/ethdev_driver.h (100%)
 rename lib/{librte_ethdev => ethdev}/ethdev_pci.h (100%)
 rename lib/{librte_ethdev => ethdev}/ethdev_private.c (100%)
 rename lib/{librte_ethdev => ethdev}/ethdev_private.h (100%)
 rename lib/{librte_ethdev => ethdev}/ethdev_profile.c (100%)
 rename lib/{librte_ethdev => ethdev}/ethdev_profile.h (100%)
 rename lib/{librte_ethdev => ethdev}/ethdev_trace_points.c (100%)
 rename lib/{librte_ethdev => ethdev}/ethdev_vdev.h (100%)
 rename lib/{librte_ethdev => ethdev}/meson.build (100%)
 rename lib/{librte_ethdev => ethdev}/rte_class_eth.c (100%)
 rename lib/{librte_ethdev => ethdev}/rte_dev_info.h (100%)
 rename lib/{librte_ethdev => ethdev}/rte_eth_ctrl.h (100%)
 rename lib/{librte_ethdev => ethdev}/rte_ethdev.c (100%)
 rename lib/{librte_ethdev => ethdev}/rte_ethdev.h (100%)
 rename lib/{librte_ethdev => ethdev}/rte_ethdev_core.h (100%)
 rename lib/{librte_ethdev => ethdev}/rte_ethdev_trace.h (100%)
 rename lib/{librte_ethdev => ethdev}/rte_ethdev_trace_fp.h (100%)
 rename lib/{librte_ethdev => ethdev}/rte_flow.c (100%)
 rename lib/{librte_ethdev => ethdev}/rte_flow.h (100%)
 rename lib/{librte_ethdev => ethdev}/rte_flow_driver.h (100%)
 rename lib/{librte_ethdev => ethdev}/rte_mtr.c (100%)
 rename lib/{librte_ethdev => ethdev}/rte_mtr.h (100%)
 rename lib/{librte_ethdev => ethdev}/rte_mtr_driver.h (100%)
 rename lib/{librte_ethdev => ethdev}/rte_tm.c (100%)
 rename lib/{librte_ethdev => ethdev}/rte_tm.h (100%)
 rename lib/{librte_ethdev => ethdev}/rte_tm_driver.h (100%)
 rename lib/{librte_ethdev => ethdev}/version.map (100%)
 rename lib/{librte_eventdev => eventdev}/eventdev_pmd.h (100%)
 rename lib/{librte_eventdev => eventdev}/eventdev_pmd_pci.h (100%)
 rename lib/{librte_eventdev => eventdev}/eventdev_pmd_vdev.h (100%)
 rename lib/{librte_eventdev => eventdev}/eventdev_trace_points.c (100%)
 rename lib/{librte_eventdev => eventdev}/meson.build (100%)
 rename lib/{librte_eventdev => eventdev}/rte_event_crypto_adapter.c (100%)
 rename lib/{librte_eventdev => eventdev}/rte_event_crypto_adapter.h (100%)
 rename lib/{librte_eventdev => eventdev}/rte_event_eth_rx_adapter.c (100%)
 rename lib/{librte_eventdev => eventdev}/rte_event_eth_rx_adapter.h (100%)
 rename lib/{librte_eventdev => eventdev}/rte_event_eth_tx_adapter.c (100%)
 rename lib/{librte_eventdev => eventdev}/rte_event_eth_tx_adapter.h (100%)
 rename lib/{librte_eventdev => eventdev}/rte_event_ring.c (100%)
 rename lib/{librte_eventdev => eventdev}/rte_event_ring.h (100%)
 rename lib/{librte_eventdev => eventdev}/rte_event_timer_adapter.c (100%)
 rename lib/{librte_eventdev => eventdev}/rte_event_timer_adapter.h (100%)
 rename lib/{librte_eventdev => eventdev}/rte_event_timer_adapter_pmd.h (100%)
 rename lib/{librte_eventdev => eventdev}/rte_eventdev.c (100%)
 rename lib/{librte_eventdev => eventdev}/rte_eventdev.h (100%)
 rename lib/{librte_eventdev => eventdev}/rte_eventdev_trace.h (100%)
 rename lib/{librte_eventdev => eventdev}/rte_eventdev_trace_fp.h (100%)
 rename lib/{librte_eventdev => eventdev}/version.map (100%)
 rename lib/{librte_fib => fib}/dir24_8.c (100%)
 rename lib/{librte_fib => fib}/dir24_8.h (100%)
 rename lib/{librte_fib => fib}/dir24_8_avx512.c (100%)
 rename lib/{librte_fib => fib}/dir24_8_avx512.h (100%)
 rename lib/{librte_fib => fib}/meson.build (100%)
 rename lib/{librte_fib => fib}/rte_fib.c (100%)
 rename lib/{librte_fib => fib}/rte_fib.h (100%)
 rename lib/{librte_fib => fib}/rte_fib6.c (100%)
 rename lib/{librte_fib => fib}/rte_fib6.h (100%)
 rename lib/{librte_fib => fib}/trie.c (100%)
 rename lib/{librte_fib => fib}/trie.h (100%)
 rename lib/{librte_fib => fib}/trie_avx512.c (100%)
 rename lib/{librte_fib => fib}/trie_avx512.h (100%)
 rename lib/{librte_fib => fib}/version.map (100%)
 rename lib/{librte_flow_classify => flow_classify}/meson.build (100%)
 rename lib/{librte_flow_classify => flow_classify}/rte_flow_classify.c (100%)
 rename lib/{librte_flow_classify => flow_classify}/rte_flow_classify.h (100%)
 rename lib/{librte_flow_classify => flow_classify}/rte_flow_classify_parse.c (100%)
 rename lib/{librte_flow_classify => flow_classify}/rte_flow_classify_parse.h (100%)
 rename lib/{librte_flow_classify => flow_classify}/version.map (100%)
 rename lib/{librte_graph => graph}/graph.c (100%)
 rename lib/{librte_graph => graph}/graph_debug.c (100%)
 rename lib/{librte_graph => graph}/graph_ops.c (100%)
 rename lib/{librte_graph => graph}/graph_populate.c (100%)
 rename lib/{librte_graph => graph}/graph_private.h (100%)
 rename lib/{librte_graph => graph}/graph_stats.c (100%)
 rename lib/{librte_graph => graph}/meson.build (100%)
 rename lib/{librte_graph => graph}/node.c (100%)
 rename lib/{librte_graph => graph}/rte_graph.h (100%)
 rename lib/{librte_graph => graph}/rte_graph_worker.h (100%)
 rename lib/{librte_graph => graph}/version.map (100%)
 rename lib/{librte_gro => gro}/gro_tcp4.c (100%)
 rename lib/{librte_gro => gro}/gro_tcp4.h (100%)
 rename lib/{librte_gro => gro}/gro_udp4.c (100%)
 rename lib/{librte_gro => gro}/gro_udp4.h (100%)
 rename lib/{librte_gro => gro}/gro_vxlan_tcp4.c (100%)
 rename lib/{librte_gro => gro}/gro_vxlan_tcp4.h (100%)
 rename lib/{librte_gro => gro}/gro_vxlan_udp4.c (100%)
 rename lib/{librte_gro => gro}/gro_vxlan_udp4.h (100%)
 rename lib/{librte_gro => gro}/meson.build (100%)
 rename lib/{librte_gro => gro}/rte_gro.c (100%)
 rename lib/{librte_gro => gro}/rte_gro.h (100%)
 rename lib/{librte_gro => gro}/version.map (100%)
 rename lib/{librte_gso => gso}/gso_common.c (100%)
 rename lib/{librte_gso => gso}/gso_common.h (100%)
 rename lib/{librte_gso => gso}/gso_tcp4.c (100%)
 rename lib/{librte_gso => gso}/gso_tcp4.h (100%)
 rename lib/{librte_gso => gso}/gso_tunnel_tcp4.c (100%)
 rename lib/{librte_gso => gso}/gso_tunnel_tcp4.h (100%)
 rename lib/{librte_gso => gso}/gso_tunnel_udp4.c (100%)
 rename lib/{librte_gso => gso}/gso_tunnel_udp4.h (100%)
 rename lib/{librte_gso => gso}/gso_udp4.c (100%)
 rename lib/{librte_gso => gso}/gso_udp4.h (100%)
 rename lib/{librte_gso => gso}/meson.build (100%)
 rename lib/{librte_gso => gso}/rte_gso.c (100%)
 rename lib/{librte_gso => gso}/rte_gso.h (100%)
 rename lib/{librte_gso => gso}/version.map (100%)
 rename lib/{librte_hash => hash}/meson.build (100%)
 rename lib/{librte_hash => hash}/rte_cmp_arm64.h (100%)
 rename lib/{librte_hash => hash}/rte_cmp_x86.h (100%)
 rename lib/{librte_hash => hash}/rte_crc_arm64.h (100%)
 rename lib/{librte_hash => hash}/rte_cuckoo_hash.c (100%)
 rename lib/{librte_hash => hash}/rte_cuckoo_hash.h (100%)
 rename lib/{librte_hash => hash}/rte_fbk_hash.c (100%)
 rename lib/{librte_hash => hash}/rte_fbk_hash.h (100%)
 rename lib/{librte_hash => hash}/rte_hash.h (100%)
 rename lib/{librte_hash => hash}/rte_hash_crc.h (100%)
 rename lib/{librte_hash => hash}/rte_jhash.h (100%)
 rename lib/{librte_hash => hash}/rte_thash.h (100%)
 rename lib/{librte_hash => hash}/version.map (100%)
 rename lib/{librte_ip_frag => ip_frag}/ip_frag_common.h (100%)
 rename lib/{librte_ip_frag => ip_frag}/ip_frag_internal.c (100%)
 rename lib/{librte_ip_frag => ip_frag}/meson.build (100%)
 rename lib/{librte_ip_frag => ip_frag}/rte_ip_frag.h (100%)
 rename lib/{librte_ip_frag => ip_frag}/rte_ip_frag_common.c (100%)
 rename lib/{librte_ip_frag => ip_frag}/rte_ipv4_fragmentation.c (100%)
 rename lib/{librte_ip_frag => ip_frag}/rte_ipv4_reassembly.c (100%)
 rename lib/{librte_ip_frag => ip_frag}/rte_ipv6_fragmentation.c (100%)
 rename lib/{librte_ip_frag => ip_frag}/rte_ipv6_reassembly.c (100%)
 rename lib/{librte_ip_frag => ip_frag}/version.map (100%)
 rename lib/{librte_ipsec => ipsec}/crypto.h (100%)
 rename lib/{librte_ipsec => ipsec}/esp_inb.c (100%)
 rename lib/{librte_ipsec => ipsec}/esp_outb.c (100%)
 rename lib/{librte_ipsec => ipsec}/iph.h (100%)
 rename lib/{librte_ipsec => ipsec}/ipsec_sad.c (100%)
 rename lib/{librte_ipsec => ipsec}/ipsec_sqn.h (100%)
 rename lib/{librte_ipsec => ipsec}/meson.build (100%)
 rename lib/{librte_ipsec => ipsec}/misc.h (100%)
 rename lib/{librte_ipsec => ipsec}/pad.h (100%)
 rename lib/{librte_ipsec => ipsec}/rte_ipsec.h (100%)
 rename lib/{librte_ipsec => ipsec}/rte_ipsec_group.h (100%)
 rename lib/{librte_ipsec => ipsec}/rte_ipsec_sa.h (100%)
 rename lib/{librte_ipsec => ipsec}/rte_ipsec_sad.h (100%)
 rename lib/{librte_ipsec => ipsec}/sa.c (100%)
 rename lib/{librte_ipsec => ipsec}/sa.h (100%)
 rename lib/{librte_ipsec => ipsec}/ses.c (100%)
 rename lib/{librte_ipsec => ipsec}/version.map (100%)
 rename lib/{librte_jobstats => jobstats}/meson.build (100%)
 rename lib/{librte_jobstats => jobstats}/rte_jobstats.c (100%)
 rename lib/{librte_jobstats => jobstats}/rte_jobstats.h (100%)
 rename lib/{librte_jobstats => jobstats}/version.map (100%)
 rename lib/{librte_kni => kni}/meson.build (100%)
 rename lib/{librte_kni => kni}/rte_kni.c (100%)
 rename lib/{librte_kni => kni}/rte_kni.h (100%)
 rename lib/{librte_kni => kni}/rte_kni_common.h (100%)
 rename lib/{librte_kni => kni}/rte_kni_fifo.h (100%)
 rename lib/{librte_kni => kni}/version.map (100%)
 rename lib/{librte_kvargs => kvargs}/meson.build (100%)
 rename lib/{librte_kvargs => kvargs}/rte_kvargs.c (100%)
 rename lib/{librte_kvargs => kvargs}/rte_kvargs.h (100%)
 rename lib/{librte_kvargs => kvargs}/version.map (100%)
 rename lib/{librte_latencystats => latencystats}/meson.build (100%)
 rename lib/{librte_latencystats => latencystats}/rte_latencystats.c (100%)
 rename lib/{librte_latencystats => latencystats}/rte_latencystats.h (100%)
 rename lib/{librte_latencystats => latencystats}/version.map (100%)
 rename lib/{librte_lpm => lpm}/meson.build (100%)
 rename lib/{librte_lpm => lpm}/rte_lpm.c (100%)
 rename lib/{librte_lpm => lpm}/rte_lpm.h (100%)
 rename lib/{librte_lpm => lpm}/rte_lpm6.c (100%)
 rename lib/{librte_lpm => lpm}/rte_lpm6.h (100%)
 rename lib/{librte_lpm => lpm}/rte_lpm_altivec.h (100%)
 rename lib/{librte_lpm => lpm}/rte_lpm_neon.h (100%)
 rename lib/{librte_lpm => lpm}/rte_lpm_sse.h (100%)
 rename lib/{librte_lpm => lpm}/rte_lpm_sve.h (100%)
 rename lib/{librte_lpm => lpm}/version.map (100%)
 rename lib/{librte_mbuf => mbuf}/meson.build (100%)
 rename lib/{librte_mbuf => mbuf}/rte_mbuf.c (100%)
 rename lib/{librte_mbuf => mbuf}/rte_mbuf.h (100%)
 rename lib/{librte_mbuf => mbuf}/rte_mbuf_core.h (100%)
 rename lib/{librte_mbuf => mbuf}/rte_mbuf_dyn.c (100%)
 rename lib/{librte_mbuf => mbuf}/rte_mbuf_dyn.h (100%)
 rename lib/{librte_mbuf => mbuf}/rte_mbuf_pool_ops.c (100%)
 rename lib/{librte_mbuf => mbuf}/rte_mbuf_pool_ops.h (100%)
 rename lib/{librte_mbuf => mbuf}/rte_mbuf_ptype.c (100%)
 rename lib/{librte_mbuf => mbuf}/rte_mbuf_ptype.h (100%)
 rename lib/{librte_mbuf => mbuf}/version.map (100%)
 rename lib/{librte_member => member}/meson.build (100%)
 rename lib/{librte_member => member}/rte_member.c (100%)
 rename lib/{librte_member => member}/rte_member.h (100%)
 rename lib/{librte_member => member}/rte_member_ht.c (100%)
 rename lib/{librte_member => member}/rte_member_ht.h (100%)
 rename lib/{librte_member => member}/rte_member_vbf.c (100%)
 rename lib/{librte_member => member}/rte_member_vbf.h (100%)
 rename lib/{librte_member => member}/rte_member_x86.h (100%)
 rename lib/{librte_member => member}/version.map (100%)
 rename lib/{librte_mempool => mempool}/mempool_trace_points.c (100%)
 rename lib/{librte_mempool => mempool}/meson.build (100%)
 rename lib/{librte_mempool => mempool}/rte_mempool.c (100%)
 rename lib/{librte_mempool => mempool}/rte_mempool.h (100%)
 rename lib/{librte_mempool => mempool}/rte_mempool_ops.c (100%)
 rename lib/{librte_mempool => mempool}/rte_mempool_ops_default.c (100%)
 rename lib/{librte_mempool => mempool}/rte_mempool_trace.h (100%)
 rename lib/{librte_mempool => mempool}/rte_mempool_trace_fp.h (100%)
 rename lib/{librte_mempool => mempool}/version.map (100%)
 rename lib/{librte_meter => meter}/meson.build (100%)
 rename lib/{librte_meter => meter}/rte_meter.c (100%)
 rename lib/{librte_meter => meter}/rte_meter.h (100%)
 rename lib/{librte_meter => meter}/version.map (100%)
 rename lib/{librte_metrics => metrics}/meson.build (100%)
 rename lib/{librte_metrics => metrics}/rte_metrics.c (100%)
 rename lib/{librte_metrics => metrics}/rte_metrics.h (100%)
 rename lib/{librte_metrics => metrics}/rte_metrics_telemetry.c (100%)
 rename lib/{librte_metrics => metrics}/rte_metrics_telemetry.h (100%)
 rename lib/{librte_metrics => metrics}/version.map (100%)
 rename lib/{librte_net => net}/meson.build (100%)
 rename lib/{librte_net => net}/net_crc.h (100%)
 rename lib/{librte_net => net}/net_crc_avx512.c (100%)
 rename lib/{librte_net => net}/net_crc_neon.c (100%)
 rename lib/{librte_net => net}/net_crc_sse.c (100%)
 rename lib/{librte_net => net}/rte_arp.c (100%)
 rename lib/{librte_net => net}/rte_arp.h (100%)
 rename lib/{librte_net => net}/rte_ecpri.h (100%)
 rename lib/{librte_net => net}/rte_esp.h (100%)
 rename lib/{librte_net => net}/rte_ether.c (100%)
 rename lib/{librte_net => net}/rte_ether.h (100%)
 rename lib/{librte_net => net}/rte_geneve.h (100%)
 rename lib/{librte_net => net}/rte_gre.h (100%)
 rename lib/{librte_net => net}/rte_gtp.h (100%)
 rename lib/{librte_net => net}/rte_higig.h (100%)
 rename lib/{librte_net => net}/rte_icmp.h (100%)
 rename lib/{librte_net => net}/rte_ip.h (100%)
 rename lib/{librte_net => net}/rte_mpls.h (100%)
 rename lib/{librte_net => net}/rte_net.c (100%)
 rename lib/{librte_net => net}/rte_net.h (100%)
 rename lib/{librte_net => net}/rte_net_crc.c (100%)
 rename lib/{librte_net => net}/rte_net_crc.h (100%)
 rename lib/{librte_net => net}/rte_sctp.h (100%)
 rename lib/{librte_net => net}/rte_tcp.h (100%)
 rename lib/{librte_net => net}/rte_udp.h (100%)
 rename lib/{librte_net => net}/rte_vxlan.h (100%)
 rename lib/{librte_net => net}/version.map (100%)
 rename lib/{librte_node => node}/ethdev_ctrl.c (100%)
 rename lib/{librte_node => node}/ethdev_rx.c (100%)
 rename lib/{librte_node => node}/ethdev_rx_priv.h (100%)
 rename lib/{librte_node => node}/ethdev_tx.c (100%)
 rename lib/{librte_node => node}/ethdev_tx_priv.h (100%)
 rename lib/{librte_node => node}/ip4_lookup.c (100%)
 rename lib/{librte_node => node}/ip4_lookup_neon.h (100%)
 rename lib/{librte_node => node}/ip4_lookup_sse.h (100%)
 rename lib/{librte_node => node}/ip4_rewrite.c (100%)
 rename lib/{librte_node => node}/ip4_rewrite_priv.h (100%)
 rename lib/{librte_node => node}/log.c (100%)
 rename lib/{librte_node => node}/meson.build (100%)
 rename lib/{librte_node => node}/node_private.h (100%)
 rename lib/{librte_node => node}/null.c (100%)
 rename lib/{librte_node => node}/pkt_cls.c (100%)
 rename lib/{librte_node => node}/pkt_cls_priv.h (100%)
 rename lib/{librte_node => node}/pkt_drop.c (100%)
 rename lib/{librte_node => node}/rte_node_eth_api.h (100%)
 rename lib/{librte_node => node}/rte_node_ip4_api.h (100%)
 rename lib/{librte_node => node}/version.map (100%)
 rename lib/{librte_pci => pci}/meson.build (100%)
 rename lib/{librte_pci => pci}/rte_pci.c (100%)
 rename lib/{librte_pci => pci}/rte_pci.h (100%)
 rename lib/{librte_pci => pci}/version.map (100%)
 rename lib/{librte_pdump => pdump}/meson.build (100%)
 rename lib/{librte_pdump => pdump}/rte_pdump.c (100%)
 rename lib/{librte_pdump => pdump}/rte_pdump.h (100%)
 rename lib/{librte_pdump => pdump}/version.map (100%)
 rename lib/{librte_pipeline => pipeline}/meson.build (100%)
 rename lib/{librte_pipeline => pipeline}/rte_pipeline.c (100%)
 rename lib/{librte_pipeline => pipeline}/rte_pipeline.h (100%)
 rename lib/{librte_pipeline => pipeline}/rte_port_in_action.c (100%)
 rename lib/{librte_pipeline => pipeline}/rte_port_in_action.h (100%)
 rename lib/{librte_pipeline => pipeline}/rte_swx_ctl.c (100%)
 rename lib/{librte_pipeline => pipeline}/rte_swx_ctl.h (100%)
 rename lib/{librte_pipeline => pipeline}/rte_swx_extern.h (100%)
 rename lib/{librte_pipeline => pipeline}/rte_swx_pipeline.c (100%)
 rename lib/{librte_pipeline => pipeline}/rte_swx_pipeline.h (100%)
 rename lib/{librte_pipeline => pipeline}/rte_swx_pipeline_spec.c (100%)
 rename lib/{librte_pipeline => pipeline}/rte_table_action.c (100%)
 rename lib/{librte_pipeline => pipeline}/rte_table_action.h (100%)
 rename lib/{librte_pipeline => pipeline}/version.map (100%)
 rename lib/{librte_port => port}/meson.build (100%)
 rename lib/{librte_port => port}/rte_port.h (100%)
 rename lib/{librte_port => port}/rte_port_ethdev.c (100%)
 rename lib/{librte_port => port}/rte_port_ethdev.h (100%)
 rename lib/{librte_port => port}/rte_port_eventdev.c (100%)
 rename lib/{librte_port => port}/rte_port_eventdev.h (100%)
 rename lib/{librte_port => port}/rte_port_fd.c (100%)
 rename lib/{librte_port => port}/rte_port_fd.h (100%)
 rename lib/{librte_port => port}/rte_port_frag.c (100%)
 rename lib/{librte_port => port}/rte_port_frag.h (100%)
 rename lib/{librte_port => port}/rte_port_kni.c (100%)
 rename lib/{librte_port => port}/rte_port_kni.h (100%)
 rename lib/{librte_port => port}/rte_port_ras.c (100%)
 rename lib/{librte_port => port}/rte_port_ras.h (100%)
 rename lib/{librte_port => port}/rte_port_ring.c (100%)
 rename lib/{librte_port => port}/rte_port_ring.h (100%)
 rename lib/{librte_port => port}/rte_port_sched.c (100%)
 rename lib/{librte_port => port}/rte_port_sched.h (100%)
 rename lib/{librte_port => port}/rte_port_source_sink.c (100%)
 rename lib/{librte_port => port}/rte_port_source_sink.h (100%)
 rename lib/{librte_port => port}/rte_port_sym_crypto.c (100%)
 rename lib/{librte_port => port}/rte_port_sym_crypto.h (100%)
 rename lib/{librte_port => port}/rte_swx_port.h (100%)
 rename lib/{librte_port => port}/rte_swx_port_ethdev.c (100%)
 rename lib/{librte_port => port}/rte_swx_port_ethdev.h (100%)
 rename lib/{librte_port => port}/rte_swx_port_fd.c (100%)
 rename lib/{librte_port => port}/rte_swx_port_fd.h (100%)
 rename lib/{librte_port => port}/rte_swx_port_ring.c (100%)
 rename lib/{librte_port => port}/rte_swx_port_ring.h (100%)
 rename lib/{librte_port => port}/rte_swx_port_source_sink.c (100%)
 rename lib/{librte_port => port}/rte_swx_port_source_sink.h (100%)
 rename lib/{librte_port => port}/version.map (100%)
 rename lib/{librte_power => power}/guest_channel.c (100%)
 rename lib/{librte_power => power}/guest_channel.h (100%)
 rename lib/{librte_power => power}/meson.build (100%)
 rename lib/{librte_power => power}/power_acpi_cpufreq.c (100%)
 rename lib/{librte_power => power}/power_acpi_cpufreq.h (100%)
 rename lib/{librte_power => power}/power_common.c (100%)
 rename lib/{librte_power => power}/power_common.h (100%)
 rename lib/{librte_power => power}/power_kvm_vm.c (100%)
 rename lib/{librte_power => power}/power_kvm_vm.h (100%)
 rename lib/{librte_power => power}/power_pstate_cpufreq.c (100%)
 rename lib/{librte_power => power}/power_pstate_cpufreq.h (100%)
 rename lib/{librte_power => power}/rte_power.c (100%)
 rename lib/{librte_power => power}/rte_power.h (100%)
 rename lib/{librte_power => power}/rte_power_empty_poll.c (100%)
 rename lib/{librte_power => power}/rte_power_empty_poll.h (100%)
 rename lib/{librte_power => power}/rte_power_guest_channel.h (100%)
 rename lib/{librte_power => power}/rte_power_pmd_mgmt.c (100%)
 rename lib/{librte_power => power}/rte_power_pmd_mgmt.h (100%)
 rename lib/{librte_power => power}/version.map (100%)
 rename lib/{librte_rawdev => rawdev}/meson.build (100%)
 rename lib/{librte_rawdev => rawdev}/rte_rawdev.c (100%)
 rename lib/{librte_rawdev => rawdev}/rte_rawdev.h (100%)
 rename lib/{librte_rawdev => rawdev}/rte_rawdev_pmd.h (100%)
 rename lib/{librte_rawdev => rawdev}/version.map (100%)
 rename lib/{librte_rcu => rcu}/meson.build (100%)
 rename lib/{librte_rcu => rcu}/rcu_qsbr_pvt.h (100%)
 rename lib/{librte_rcu => rcu}/rte_rcu_qsbr.c (100%)
 rename lib/{librte_rcu => rcu}/rte_rcu_qsbr.h (100%)
 rename lib/{librte_rcu => rcu}/version.map (100%)
 rename lib/{librte_regexdev => regexdev}/meson.build (100%)
 rename lib/{librte_regexdev => regexdev}/rte_regexdev.c (100%)
 rename lib/{librte_regexdev => regexdev}/rte_regexdev.h (100%)
 rename lib/{librte_regexdev => regexdev}/rte_regexdev_core.h (100%)
 rename lib/{librte_regexdev => regexdev}/rte_regexdev_driver.h (100%)
 rename lib/{librte_regexdev => regexdev}/version.map (100%)
 rename lib/{librte_reorder => reorder}/meson.build (100%)
 rename lib/{librte_reorder => reorder}/rte_reorder.c (100%)
 rename lib/{librte_reorder => reorder}/rte_reorder.h (100%)
 rename lib/{librte_reorder => reorder}/version.map (100%)
 rename lib/{librte_rib => rib}/meson.build (100%)
 rename lib/{librte_rib => rib}/rte_rib.c (100%)
 rename lib/{librte_rib => rib}/rte_rib.h (100%)
 rename lib/{librte_rib => rib}/rte_rib6.c (100%)
 rename lib/{librte_rib => rib}/rte_rib6.h (100%)
 rename lib/{librte_rib => rib}/version.map (100%)
 rename lib/{librte_ring => ring}/meson.build (100%)
 rename lib/{librte_ring => ring}/rte_ring.c (100%)
 rename lib/{librte_ring => ring}/rte_ring.h (100%)
 rename lib/{librte_ring => ring}/rte_ring_c11_pvt.h (100%)
 rename lib/{librte_ring => ring}/rte_ring_core.h (100%)
 rename lib/{librte_ring => ring}/rte_ring_elem.h (100%)
 rename lib/{librte_ring => ring}/rte_ring_elem_pvt.h (100%)
 rename lib/{librte_ring => ring}/rte_ring_generic_pvt.h (100%)
 rename lib/{librte_ring => ring}/rte_ring_hts.h (100%)
 rename lib/{librte_ring => ring}/rte_ring_hts_elem_pvt.h (100%)
 rename lib/{librte_ring => ring}/rte_ring_peek.h (100%)
 rename lib/{librte_ring => ring}/rte_ring_peek_elem_pvt.h (100%)
 rename lib/{librte_ring => ring}/rte_ring_peek_zc.h (100%)
 rename lib/{librte_ring => ring}/rte_ring_rts.h (100%)
 rename lib/{librte_ring => ring}/rte_ring_rts_elem_pvt.h (100%)
 rename lib/{librte_ring => ring}/version.map (100%)
 rename lib/{librte_sched => sched}/meson.build (100%)
 rename lib/{librte_sched => sched}/rte_approx.c (100%)
 rename lib/{librte_sched => sched}/rte_approx.h (100%)
 rename lib/{librte_sched => sched}/rte_red.c (100%)
 rename lib/{librte_sched => sched}/rte_red.h (100%)
 rename lib/{librte_sched => sched}/rte_sched.c (100%)
 rename lib/{librte_sched => sched}/rte_sched.h (100%)
 rename lib/{librte_sched => sched}/rte_sched_common.h (100%)
 rename lib/{librte_sched => sched}/version.map (100%)
 rename lib/{librte_security => security}/meson.build (100%)
 rename lib/{librte_security => security}/rte_security.c (100%)
 rename lib/{librte_security => security}/rte_security.h (100%)
 rename lib/{librte_security => security}/rte_security_driver.h (100%)
 rename lib/{librte_security => security}/version.map (100%)
 rename lib/{librte_stack => stack}/meson.build (100%)
 rename lib/{librte_stack => stack}/rte_stack.c (100%)
 rename lib/{librte_stack => stack}/rte_stack.h (100%)
 rename lib/{librte_stack => stack}/rte_stack_lf.c (100%)
 rename lib/{librte_stack => stack}/rte_stack_lf.h (100%)
 rename lib/{librte_stack => stack}/rte_stack_lf_c11.h (100%)
 rename lib/{librte_stack => stack}/rte_stack_lf_generic.h (100%)
 rename lib/{librte_stack => stack}/rte_stack_lf_stubs.h (100%)
 rename lib/{librte_stack => stack}/rte_stack_std.c (100%)
 rename lib/{librte_stack => stack}/rte_stack_std.h (100%)
 rename lib/{librte_stack => stack}/stack_pvt.h (100%)
 rename lib/{librte_stack => stack}/version.map (100%)
 rename lib/{librte_table => table}/meson.build (100%)
 rename lib/{librte_table => table}/rte_lru.h (100%)
 rename lib/{librte_table => table}/rte_lru_arm64.h (100%)
 rename lib/{librte_table => table}/rte_lru_x86.h (100%)
 rename lib/{librte_table => table}/rte_swx_table.h (100%)
 rename lib/{librte_table => table}/rte_swx_table_em.c (100%)
 rename lib/{librte_table => table}/rte_swx_table_em.h (100%)
 rename lib/{librte_table => table}/rte_swx_table_wm.c (100%)
 rename lib/{librte_table => table}/rte_swx_table_wm.h (100%)
 rename lib/{librte_table => table}/rte_table.h (100%)
 rename lib/{librte_table => table}/rte_table_acl.c (100%)
 rename lib/{librte_table => table}/rte_table_acl.h (100%)
 rename lib/{librte_table => table}/rte_table_array.c (100%)
 rename lib/{librte_table => table}/rte_table_array.h (100%)
 rename lib/{librte_table => table}/rte_table_hash.h (100%)
 rename lib/{librte_table => table}/rte_table_hash_cuckoo.c (100%)
 rename lib/{librte_table => table}/rte_table_hash_cuckoo.h (100%)
 rename lib/{librte_table => table}/rte_table_hash_ext.c (100%)
 rename lib/{librte_table => table}/rte_table_hash_func.h (100%)
 rename lib/{librte_table => table}/rte_table_hash_func_arm64.h (100%)
 rename lib/{librte_table => table}/rte_table_hash_key16.c (100%)
 rename lib/{librte_table => table}/rte_table_hash_key32.c (100%)
 rename lib/{librte_table => table}/rte_table_hash_key8.c (100%)
 rename lib/{librte_table => table}/rte_table_hash_lru.c (100%)
 rename lib/{librte_table => table}/rte_table_lpm.c (100%)
 rename lib/{librte_table => table}/rte_table_lpm.h (100%)
 rename lib/{librte_table => table}/rte_table_lpm_ipv6.c (100%)
 rename lib/{librte_table => table}/rte_table_lpm_ipv6.h (100%)
 rename lib/{librte_table => table}/rte_table_stub.c (100%)
 rename lib/{librte_table => table}/rte_table_stub.h (100%)
 rename lib/{librte_table => table}/version.map (100%)
 rename lib/{librte_telemetry => telemetry}/meson.build (80%)
 rename lib/{librte_telemetry => telemetry}/rte_telemetry.h (100%)
 rename lib/{librte_telemetry => telemetry}/telemetry.c (100%)
 rename lib/{librte_telemetry => telemetry}/telemetry_data.c (100%)
 rename lib/{librte_telemetry => telemetry}/telemetry_data.h (100%)
 rename lib/{librte_telemetry => telemetry}/telemetry_internal.h (100%)
 rename lib/{librte_telemetry => telemetry}/telemetry_json.h (100%)
 rename lib/{librte_telemetry => telemetry}/telemetry_legacy.c (100%)
 rename lib/{librte_telemetry => telemetry}/version.map (100%)
 rename lib/{librte_timer => timer}/meson.build (100%)
 rename lib/{librte_timer => timer}/rte_timer.c (100%)
 rename lib/{librte_timer => timer}/rte_timer.h (100%)
 rename lib/{librte_timer => timer}/version.map (100%)
 rename lib/{librte_vhost => vhost}/fd_man.c (100%)
 rename lib/{librte_vhost => vhost}/fd_man.h (100%)
 rename lib/{librte_vhost => vhost}/iotlb.c (100%)
 rename lib/{librte_vhost => vhost}/iotlb.h (100%)
 rename lib/{librte_vhost => vhost}/meson.build (100%)
 rename lib/{librte_vhost => vhost}/rte_vdpa.h (100%)
 rename lib/{librte_vhost => vhost}/rte_vdpa_dev.h (100%)
 rename lib/{librte_vhost => vhost}/rte_vhost.h (100%)
 rename lib/{librte_vhost => vhost}/rte_vhost_async.h (100%)
 rename lib/{librte_vhost => vhost}/rte_vhost_crypto.h (100%)
 rename lib/{librte_vhost => vhost}/socket.c (100%)
 rename lib/{librte_vhost => vhost}/vdpa.c (100%)
 rename lib/{librte_vhost => vhost}/version.map (100%)
 rename lib/{librte_vhost => vhost}/vhost.c (100%)
 rename lib/{librte_vhost => vhost}/vhost.h (100%)
 rename lib/{librte_vhost => vhost}/vhost_crypto.c (100%)
 rename lib/{librte_vhost => vhost}/vhost_user.c (100%)
 rename lib/{librte_vhost => vhost}/vhost_user.h (100%)
 rename lib/{librte_vhost => vhost}/virtio_crypto.h (100%)
 rename lib/{librte_vhost => vhost}/virtio_net.c (100%)

diff --git a/MAINTAINERS b/MAINTAINERS
index 0ec5588540..857cc724fb 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -114,8 +114,8 @@ F: .ci/
 ABI Policy & Versioning
 M: Ray Kinsella <mdr@ashroe.eu>
 M: Neil Horman <nhorman@tuxdriver.com>
-F: lib/librte_eal/include/rte_compat.h
-F: lib/librte_eal/include/rte_function_versioning.h
+F: lib/eal/include/rte_compat.h
+F: lib/eal/include/rte_function_versioning.h
 F: doc/guides/contributing/abi_*.rst
 F: doc/guides/rel_notes/deprecation.rst
 F: devtools/check-abi.sh
@@ -145,10 +145,10 @@ Environment Abstraction Layer
 T: git://dpdk.org/dpdk
 
 EAL API and common code
-F: lib/librte_eal/common/
-F: lib/librte_eal/unix/
-F: lib/librte_eal/include/
-F: lib/librte_eal/version.map
+F: lib/eal/common/
+F: lib/eal/unix/
+F: lib/eal/include/
+F: lib/eal/version.map
 F: doc/guides/prog_guide/env_abstraction_layer.rst
 F: app/test/test_alarm.c
 F: app/test/test_atomic.c
@@ -175,24 +175,24 @@ F: app/test/test_version.c
 Trace - EXPERIMENTAL
 M: Jerin Jacob <jerinj@marvell.com>
 M: Sunil Kumar Kori <skori@marvell.com>
-F: lib/librte_eal/include/rte_trace*.h
-F: lib/librte_eal/common/eal_common_trace*.c
-F: lib/librte_eal/common/eal_trace.h
+F: lib/eal/include/rte_trace*.h
+F: lib/eal/common/eal_common_trace*.c
+F: lib/eal/common/eal_trace.h
 F: doc/guides/prog_guide/trace_lib.rst
 F: app/test/test_trace*
 
 Memory Allocation
 M: Anatoly Burakov <anatoly.burakov@intel.com>
-F: lib/librte_eal/include/rte_fbarray.h
-F: lib/librte_eal/include/rte_mem*
-F: lib/librte_eal/include/rte_malloc.h
-F: lib/librte_eal/common/*malloc*
-F: lib/librte_eal/common/eal_common_dynmem.c
-F: lib/librte_eal/common/eal_common_fbarray.c
-F: lib/librte_eal/common/eal_common_mem*
-F: lib/librte_eal/common/eal_hugepages.h
-F: lib/librte_eal/linux/eal_mem*
-F: lib/librte_eal/freebsd/eal_mem*
+F: lib/eal/include/rte_fbarray.h
+F: lib/eal/include/rte_mem*
+F: lib/eal/include/rte_malloc.h
+F: lib/eal/common/*malloc*
+F: lib/eal/common/eal_common_dynmem.c
+F: lib/eal/common/eal_common_fbarray.c
+F: lib/eal/common/eal_common_mem*
+F: lib/eal/common/eal_hugepages.h
+F: lib/eal/linux/eal_mem*
+F: lib/eal/freebsd/eal_mem*
 F: doc/guides/prog_guide/env_abstraction_layer.rst
 F: app/test/test_external_mem.c
 F: app/test/test_func_reentrancy.c
@@ -203,19 +203,19 @@ F: app/test/test_memzone.c
 
 Interrupt Subsystem
 M: Harman Kalra <hkalra@marvell.com>
-F: lib/librte_eal/*/*interrupts.*
+F: lib/eal/*/*interrupts.*
 F: app/test/test_interrupts.c
 
 Keep alive
-F: lib/librte_eal/include/rte_keepalive.h
-F: lib/librte_eal/common/rte_keepalive.c
+F: lib/eal/include/rte_keepalive.h
+F: lib/eal/common/rte_keepalive.c
 F: examples/l2fwd-keepalive/
 F: doc/guides/sample_app_ug/keep_alive.rst
 
 Secondary process
 M: Anatoly Burakov <anatoly.burakov@intel.com>
 K: RTE_PROC_
-F: lib/librte_eal/common/eal_common_proc.c
+F: lib/eal/common/eal_common_proc.c
 F: doc/guides/prog_guide/multi_proc_support.rst
 F: app/test/test_mp_secondary.c
 F: examples/multi_process/
@@ -223,52 +223,52 @@ F: doc/guides/sample_app_ug/multi_process.rst
 
 Service Cores
 M: Harry van Haaren <harry.van.haaren@intel.com>
-F: lib/librte_eal/include/rte_service.h
-F: lib/librte_eal/include/rte_service_component.h
-F: lib/librte_eal/common/rte_service.c
+F: lib/eal/include/rte_service.h
+F: lib/eal/include/rte_service_component.h
+F: lib/eal/common/rte_service.c
 F: doc/guides/prog_guide/service_cores.rst
 F: app/test/test_service_cores.c
 
 Bitops
 M: Joyce Kong <joyce.kong@arm.com>
-F: lib/librte_eal/include/rte_bitops.h
+F: lib/eal/include/rte_bitops.h
 F: app/test/test_bitops.c
 
 Bitmap
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
-F: lib/librte_eal/include/rte_bitmap.h
+F: lib/eal/include/rte_bitmap.h
 F: app/test/test_bitmap.c
 
 MCSlock
 M: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
-F: lib/librte_eal/include/generic/rte_mcslock.h
+F: lib/eal/include/generic/rte_mcslock.h
 F: app/test/test_mcslock.c
 
 Ticketlock
 M: Joyce Kong <joyce.kong@arm.com>
-F: lib/librte_eal/include/generic/rte_ticketlock.h
+F: lib/eal/include/generic/rte_ticketlock.h
 F: app/test/test_ticketlock.c
 
 Pseudo-random Number Generation
 M: Mattias Rönnblom <mattias.ronnblom@ericsson.com>
-F: lib/librte_eal/include/rte_random.h
-F: lib/librte_eal/common/rte_random.c
+F: lib/eal/include/rte_random.h
+F: lib/eal/common/rte_random.c
 F: app/test/test_rand_perf.c
 
 ARM v7
 M: Jan Viktorin <viktorin@rehivetech.com>
 M: Ruifeng Wang <ruifeng.wang@arm.com>
 F: config/arm/
-F: lib/librte_eal/arm/
-X: lib/librte_eal/arm/include/*_64.h
+F: lib/eal/arm/
+X: lib/eal/arm/include/*_64.h
 
 ARM v8
 M: Jerin Jacob <jerinj@marvell.com>
 M: Ruifeng Wang <ruifeng.wang@arm.com>
 F: config/arm/
 F: doc/guides/linux_gsg/cross_build_dpdk_for_arm64.rst
-F: lib/librte_eal/arm/
-X: lib/librte_eal/arm/include/*_32.h
+F: lib/eal/arm/
+X: lib/eal/arm/include/*_32.h
 F: lib/*/*_arm64.*
 F: lib/*/*_neon.*
 F: drivers/*/*/*_neon.*
@@ -278,7 +278,7 @@ F: examples/*/*_neon.*
 IBM POWER (alpha)
 M: David Christensen <drc@linux.vnet.ibm.com>
 F: config/ppc/
-F: lib/librte_eal/ppc/
+F: lib/eal/ppc/
 F: lib/*/*_altivec*
 F: drivers/*/*/*_altivec.*
 F: app/*/*_altivec.*
@@ -291,7 +291,7 @@ F: config/x86/
 F: doc/guides/linux_gsg/nic_perf_intel_platform.rst
 F: buildtools/binutils-avx512-check.sh
 F: doc/guides/howto/avx512.rst
-F: lib/librte_eal/x86/
+F: lib/eal/x86/
 F: lib/*/*_sse*
 F: lib/*/*_avx*
 F: drivers/*/*/*_sse*
@@ -302,7 +302,7 @@ F: examples/*/*_sse*
 F: examples/*/*_avx*
 
 Linux EAL (with overlaps)
-F: lib/librte_eal/linux/
+F: lib/eal/linux/
 F: doc/guides/linux_gsg/
 
 Linux UIO
@@ -311,12 +311,12 @@ F: drivers/bus/pci/linux/*uio*
 
 Linux VFIO
 M: Anatoly Burakov <anatoly.burakov@intel.com>
-F: lib/librte_eal/linux/*vfio*
+F: lib/eal/linux/*vfio*
 F: drivers/bus/pci/linux/*vfio*
 
 FreeBSD EAL (with overlaps)
 M: Bruce Richardson <bruce.richardson@intel.com>
-F: lib/librte_eal/freebsd/
+F: lib/eal/freebsd/
 F: doc/guides/freebsd_gsg/
 
 FreeBSD contigmem
@@ -332,15 +332,15 @@ 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>
-F: lib/librte_eal/windows/
-F: lib/librte_eal/rte_eal_exports.def
+F: lib/eal/windows/
+F: lib/eal/rte_eal_exports.def
 F: buildtools/map_to_win.py
 F: doc/guides/windows_gsg/
 
 Windows memory allocation
 M: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
-F: lib/librte_eal/windows/eal_hugepages.c
-F: lib/librte_eal/windows/eal_mem*
+F: lib/eal/windows/eal_hugepages.c
+F: lib/eal/windows/eal_mem*
 
 
 Core Libraries
@@ -350,7 +350,7 @@ T: git://dpdk.org/dpdk
 Memory pool
 M: Olivier Matz <olivier.matz@6wind.com>
 M: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
-F: lib/librte_mempool/
+F: lib/mempool/
 F: drivers/mempool/ring/
 F: doc/guides/prog_guide/mempool_lib.rst
 F: app/test/test_mempool*
@@ -359,21 +359,21 @@ F: app/test/test_func_reentrancy.c
 Ring queue
 M: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
 M: Konstantin Ananyev <konstantin.ananyev@intel.com>
-F: lib/librte_ring/
+F: lib/ring/
 F: doc/guides/prog_guide/ring_lib.rst
 F: app/test/test_ring*
 F: app/test/test_func_reentrancy.c
 
 Stack
 M: Olivier Matz <olivier.matz@6wind.com>
-F: lib/librte_stack/
+F: lib/stack/
 F: drivers/mempool/stack/
 F: app/test/test_stack*
 F: doc/guides/prog_guide/stack_lib.rst
 
 Packet buffer
 M: Olivier Matz <olivier.matz@6wind.com>
-F: lib/librte_mbuf/
+F: lib/mbuf/
 F: doc/guides/prog_guide/mbuf_lib.rst
 F: app/test/test_mbuf.c
 
@@ -382,7 +382,7 @@ M: Thomas Monjalon <thomas@monjalon.net>
 M: Ferruh Yigit <ferruh.yigit@intel.com>
 M: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
 T: git://dpdk.org/next/dpdk-next-net
-F: lib/librte_ethdev/
+F: lib/ethdev/
 F: app/test/test_ethdev*
 F: devtools/test-null.sh
 F: doc/guides/prog_guide/switch_representation.rst
@@ -392,22 +392,22 @@ M: Ori Kam <orika@nvidia.com>
 T: git://dpdk.org/next/dpdk-next-net
 F: app/test-pmd/cmdline_flow.c
 F: doc/guides/prog_guide/rte_flow.rst
-F: lib/librte_ethdev/rte_flow*
+F: lib/ethdev/rte_flow*
 
 Traffic Management API - EXPERIMENTAL
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
 T: git://dpdk.org/next/dpdk-next-net
-F: lib/librte_ethdev/rte_tm*
+F: lib/ethdev/rte_tm*
 
 Traffic Metering and Policing API - EXPERIMENTAL
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
 T: git://dpdk.org/next/dpdk-next-net
-F: lib/librte_ethdev/rte_mtr*
+F: lib/ethdev/rte_mtr*
 
 Baseband API - EXPERIMENTAL
 M: Nicolas Chautru <nicolas.chautru@intel.com>
 T: git://dpdk.org/next/dpdk-next-crypto
-F: lib/librte_bbdev/
+F: lib/bbdev/
 F: doc/guides/prog_guide/bbdev.rst
 F: drivers/baseband/
 F: doc/guides/bbdevs/
@@ -419,7 +419,7 @@ F: doc/guides/sample_app_ug/bbdev_app.rst
 Crypto API
 M: Declan Doherty <declan.doherty@intel.com>
 T: git://dpdk.org/next/dpdk-next-crypto
-F: lib/librte_cryptodev/
+F: lib/cryptodev/
 F: app/test/test_cryptodev*
 F: examples/l2fwd-crypto/
 
@@ -427,7 +427,7 @@ Security API
 M: Akhil Goyal <gakhil@marvell.com>
 M: Declan Doherty <declan.doherty@intel.com>
 T: git://dpdk.org/next/dpdk-next-crypto
-F: lib/librte_security/
+F: lib/security/
 F: doc/guides/prog_guide/rte_security.rst
 F: app/test/test_security.c
 
@@ -435,7 +435,7 @@ Compression API - EXPERIMENTAL
 M: Fiona Trahe <fiona.trahe@intel.com>
 M: Ashish Gupta <ashish.gupta@marvell.com>
 T: git://dpdk.org/next/dpdk-next-crypto
-F: lib/librte_compressdev/
+F: lib/compressdev/
 F: drivers/compress/
 F: app/test/test_compressdev*
 F: doc/guides/prog_guide/compressdev.rst
@@ -443,7 +443,7 @@ F: doc/guides/compressdevs/features/default.ini
 
 RegEx API - EXPERIMENTAL
 M: Ori Kam <orika@nvidia.com>
-F: lib/librte_regexdev/
+F: lib/regexdev/
 F: app/test-regex/
 F: doc/guides/prog_guide/regexdev.rst
 F: doc/guides/regexdevs/features/default.ini
@@ -451,7 +451,7 @@ F: doc/guides/regexdevs/features/default.ini
 Eventdev API
 M: Jerin Jacob <jerinj@marvell.com>
 T: git://dpdk.org/next/dpdk-next-eventdev
-F: lib/librte_eventdev/
+F: lib/eventdev/
 F: drivers/event/skeleton/
 F: app/test/test_eventdev.c
 F: examples/l3fwd/l3fwd_event*
@@ -459,35 +459,35 @@ F: examples/l3fwd/l3fwd_event*
 Eventdev Ethdev Rx Adapter API
 M: Jay Jayatheerthan <jay.jayatheerthan@intel.com>
 T: git://dpdk.org/next/dpdk-next-eventdev
-F: lib/librte_eventdev/*eth_rx_adapter*
+F: lib/eventdev/*eth_rx_adapter*
 F: app/test/test_event_eth_rx_adapter.c
 F: doc/guides/prog_guide/event_ethernet_rx_adapter.rst
 
 Eventdev Ethdev Tx Adapter API
 M: Jay Jayatheerthan <jay.jayatheerthan@intel.com>
 T: git://dpdk.org/next/dpdk-next-eventdev
-F: lib/librte_eventdev/*eth_tx_adapter*
+F: lib/eventdev/*eth_tx_adapter*
 F: app/test/test_event_eth_tx_adapter.c
 F: doc/guides/prog_guide/event_ethernet_tx_adapter.rst
 
 Eventdev Timer Adapter API
 M: Erik Gabriel Carrillo <erik.g.carrillo@intel.com>
 T: git://dpdk.org/next/dpdk-next-eventdev
-F: lib/librte_eventdev/*timer_adapter*
+F: lib/eventdev/*timer_adapter*
 F: app/test/test_event_timer_adapter.c
 F: doc/guides/prog_guide/event_timer_adapter.rst
 
 Eventdev Crypto Adapter API
 M: Abhinandan Gujjar <abhinandan.gujjar@intel.com>
 T: git://dpdk.org/next/dpdk-next-eventdev
-F: lib/librte_eventdev/*crypto_adapter*
+F: lib/eventdev/*crypto_adapter*
 F: app/test/test_event_crypto_adapter.c
 F: doc/guides/prog_guide/event_crypto_adapter.rst
 
 Raw device API
 M: Nipun Gupta <nipun.gupta@nxp.com>
 M: Hemant Agrawal <hemant.agrawal@nxp.com>
-F: lib/librte_rawdev/
+F: lib/rawdev/
 F: drivers/raw/skeleton/
 F: app/test/test_rawdev.c
 F: doc/guides/prog_guide/rawdev.rst
@@ -554,7 +554,7 @@ F: examples/bond/
 Linux KNI
 M: Ferruh Yigit <ferruh.yigit@intel.com>
 F: kernel/linux/kni/
-F: lib/librte_kni/
+F: lib/kni/
 F: doc/guides/prog_guide/kernel_nic_interface.rst
 F: app/test/test_kni.c
 F: examples/kni/
@@ -897,7 +897,7 @@ Vhost-user
 M: Maxime Coquelin <maxime.coquelin@redhat.com>
 M: Chenbo Xia <chenbo.xia@intel.com>
 T: git://dpdk.org/next/dpdk-next-virtio
-F: lib/librte_vhost/
+F: lib/vhost/
 F: doc/guides/prog_guide/vhost_lib.rst
 F: examples/vhost/
 F: doc/guides/sample_app_ug/vhost.rst
@@ -1296,19 +1296,19 @@ Packet processing
 
 Network headers
 M: Olivier Matz <olivier.matz@6wind.com>
-F: lib/librte_net/
+F: lib/net/
 
 Packet CRC
 M: Jasvinder Singh <jasvinder.singh@intel.com>
-F: lib/librte_net/net_crc.h
-F: lib/librte_net/rte_net_crc*
-F: lib/librte_net/net_crc_avx512.c
-F: lib/librte_net/net_crc_sse.c
+F: lib/net/net_crc.h
+F: lib/net/rte_net_crc*
+F: lib/net/net_crc_avx512.c
+F: lib/net/net_crc_sse.c
 F: app/test/test_crc.c
 
 IP fragmentation & reassembly
 M: Konstantin Ananyev <konstantin.ananyev@intel.com>
-F: lib/librte_ip_frag/
+F: lib/ip_frag/
 F: doc/guides/prog_guide/ip_fragment_reassembly_lib.rst
 F: app/test/test_ipfrag.c
 F: examples/ip_fragmentation/
@@ -1318,18 +1318,18 @@ F: doc/guides/sample_app_ug/ip_reassembly.rst
 
 Generic Receive Offload - EXPERIMENTAL
 M: Jiayu Hu <jiayu.hu@intel.com>
-F: lib/librte_gro/
+F: lib/gro/
 F: doc/guides/prog_guide/generic_receive_offload_lib.rst
 
 Generic Segmentation Offload
 M: Jiayu Hu <jiayu.hu@intel.com>
-F: lib/librte_gso/
+F: lib/gso/
 F: doc/guides/prog_guide/generic_segmentation_offload_lib.rst
 
 IPsec
 M: Konstantin Ananyev <konstantin.ananyev@intel.com>
 T: git://dpdk.org/next/dpdk-next-crypto
-F: lib/librte_ipsec/
+F: lib/ipsec/
 M: Bernard Iremonger <bernard.iremonger@intel.com>
 F: app/test/test_ipsec*
 F: doc/guides/prog_guide/ipsec_lib.rst
@@ -1338,7 +1338,7 @@ F: app/test-sad/
 
 Flow Classify - EXPERIMENTAL
 M: Bernard Iremonger <bernard.iremonger@intel.com>
-F: lib/librte_flow_classify/
+F: lib/flow_classify/
 F: app/test/test_flow_classify*
 F: doc/guides/prog_guide/flow_classify_lib.rst
 F: examples/flow_classify/
@@ -1346,7 +1346,7 @@ F: doc/guides/sample_app_ug/flow_classify.rst
 
 Distributor
 M: David Hunt <david.hunt@intel.com>
-F: lib/librte_distributor/
+F: lib/distributor/
 F: doc/guides/prog_guide/packet_distrib_lib.rst
 F: app/test/test_distributor*
 F: examples/distributor/
@@ -1354,7 +1354,7 @@ F: doc/guides/sample_app_ug/dist_app.rst
 
 Reorder
 M: Reshma Pattan <reshma.pattan@intel.com>
-F: lib/librte_reorder/
+F: lib/reorder/
 F: doc/guides/prog_guide/reorder_lib.rst
 F: app/test/test_reorder*
 F: examples/packet_ordering/
@@ -1363,7 +1363,7 @@ F: doc/guides/sample_app_ug/packet_ordering.rst
 Hierarchical scheduler
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
 M: Jasvinder Singh <jasvinder.singh@intel.com>
-F: lib/librte_sched/
+F: lib/sched/
 F: doc/guides/prog_guide/qos_framework.rst
 F: app/test/test_red.c
 F: app/test/test_sched.c
@@ -1372,7 +1372,7 @@ F: doc/guides/sample_app_ug/qos_scheduler.rst
 
 Packet capture
 M: Reshma Pattan <reshma.pattan@intel.com>
-F: lib/librte_pdump/
+F: lib/pdump/
 F: doc/guides/prog_guide/pdump_lib.rst
 F: app/test/test_pdump.*
 F: app/pdump/
@@ -1382,9 +1382,9 @@ F: doc/guides/tools/pdump.rst
 Packet Framework
 ----------------
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
-F: lib/librte_pipeline/
-F: lib/librte_port/
-F: lib/librte_table/
+F: lib/pipeline/
+F: lib/port/
+F: lib/table/
 F: doc/guides/prog_guide/packet_framework.rst
 F: app/test/test_table*
 F: app/test-pipeline/
@@ -1399,7 +1399,7 @@ Algorithms
 
 ACL
 M: Konstantin Ananyev <konstantin.ananyev@intel.com>
-F: lib/librte_acl/
+F: lib/acl/
 F: doc/guides/prog_guide/packet_classif_access_ctrl.rst
 F: app/test-acl/
 F: app/test/test_acl.*
@@ -1409,7 +1409,7 @@ F: doc/guides/sample_app_ug/l3_forward_access_ctrl.rst
 EFD
 M: Byron Marohn <byron.marohn@intel.com>
 M: Yipeng Wang <yipeng1.wang@intel.com>
-F: lib/librte_efd/
+F: lib/efd/
 F: doc/guides/prog_guide/efd_lib.rst
 F: app/test/test_efd*
 F: examples/server_node_efd/
@@ -1419,7 +1419,7 @@ Hashes
 M: Yipeng Wang <yipeng1.wang@intel.com>
 M: Sameh Gobriel <sameh.gobriel@intel.com>
 M: Bruce Richardson <bruce.richardson@intel.com>
-F: lib/librte_hash/
+F: lib/hash/
 F: doc/guides/prog_guide/hash_lib.rst
 F: app/test/test_*hash*
 F: app/test/test_func_reentrancy.c
@@ -1427,7 +1427,7 @@ F: app/test/test_func_reentrancy.c
 LPM
 M: Bruce Richardson <bruce.richardson@intel.com>
 M: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
-F: lib/librte_lpm/
+F: lib/lpm/
 F: doc/guides/prog_guide/lpm*
 F: app/test/test_lpm*
 F: app/test/test_func_reentrancy.c
@@ -1436,21 +1436,21 @@ F: app/test/test_xmmt_ops.h
 Membership - EXPERIMENTAL
 M: Yipeng Wang <yipeng1.wang@intel.com>
 M: Sameh Gobriel <sameh.gobriel@intel.com>
-F: lib/librte_member/
+F: lib/member/
 F: doc/guides/prog_guide/member_lib.rst
 F: app/test/test_member*
 
 RIB/FIB - EXPERIMENTAL
 M: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
-F: lib/librte_rib/
+F: lib/rib/
 F: app/test/test_rib*
-F: lib/librte_fib/
+F: lib/fib/
 F: app/test/test_fib*
 F: app/test-fib/
 
 Traffic metering
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
-F: lib/librte_meter/
+F: lib/meter/
 F: doc/guides/sample_app_ug/qos_scheduler.rst
 F: app/test/test_meter.c
 F: examples/qos_meter/
@@ -1462,13 +1462,13 @@ Other libraries
 
 Configuration file
 M: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
-F: lib/librte_cfgfile/
+F: lib/cfgfile/
 F: app/test/test_cfgfile.c
 F: app/test/test_cfgfiles/
 
 Interactive command line
 M: Olivier Matz <olivier.matz@6wind.com>
-F: lib/librte_cmdline/
+F: lib/cmdline/
 F: app/test-cmdline/
 F: app/test/test_cmdline*
 F: examples/cmdline/
@@ -1476,22 +1476,22 @@ F: doc/guides/sample_app_ug/cmd_line.rst
 
 Key/Value parsing
 M: Olivier Matz <olivier.matz@6wind.com>
-F: lib/librte_kvargs/
+F: lib/kvargs/
 F: app/test/test_kvargs.c
 
 RCU
 M: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
-F: lib/librte_rcu/
+F: lib/rcu/
 F: app/test/test_rcu*
 F: doc/guides/prog_guide/rcu_lib.rst
 
 PCI
 M: Gaetan Rivet <grive@u256.net>
-F: lib/librte_pci/
+F: lib/pci/
 
 Power management
 M: David Hunt <david.hunt@intel.com>
-F: lib/librte_power/
+F: lib/power/
 F: doc/guides/prog_guide/power_man.rst
 F: app/test/test_power*
 F: examples/l3fwd-power/
@@ -1502,40 +1502,40 @@ F: doc/guides/sample_app_ug/vm_power_management.rst
 Timers
 M: Robert Sanford <rsanford@akamai.com>
 M: Erik Gabriel Carrillo <erik.g.carrillo@intel.com>
-F: lib/librte_timer/
+F: lib/timer/
 F: doc/guides/prog_guide/timer_lib.rst
 F: app/test/test_timer*
 F: examples/timer/
 F: doc/guides/sample_app_ug/timer.rst
 
 Job statistics
-F: lib/librte_jobstats/
+F: lib/jobstats/
 F: examples/l2fwd-jobstats/
 F: doc/guides/sample_app_ug/l2_forward_job_stats.rst
 
 Metrics
-F: lib/librte_metrics/
+F: lib/metrics/
 F: app/test/test_metrics.c
 
 Bit-rate statistics
-F: lib/librte_bitratestats/
+F: lib/bitratestats/
 F: app/test/test_bitratestats.c
 
 Latency statistics
 M: Reshma Pattan <reshma.pattan@intel.com>
-F: lib/librte_latencystats/
+F: lib/latencystats/
 F: app/test/test_latencystats.c
 
 Telemetry - EXPERIMENTAL
 M: Ciara Power <ciara.power@intel.com>
-F: lib/librte_telemetry/
+F: lib/telemetry/
 F: app/test/test_telemetry*
 F: usertools/dpdk-telemetry*
 F: doc/guides/howto/telemetry.rst
 
 BPF
 M: Konstantin Ananyev <konstantin.ananyev@intel.com>
-F: lib/librte_bpf/
+F: lib/bpf/
 F: examples/bpf/
 F: app/test/test_bpf.c
 F: doc/guides/prog_guide/bpf_lib.rst
@@ -1543,7 +1543,7 @@ F: doc/guides/prog_guide/bpf_lib.rst
 Graph - EXPERIMENTAL
 M: Jerin Jacob <jerinj@marvell.com>
 M: Kiran Kumar K <kirankumark@marvell.com>
-F: lib/librte_graph/
+F: lib/graph/
 F: doc/guides/prog_guide/graph_lib.rst
 F: app/test/test_graph*
 M: Nithin Dabilpuram <ndabilpuram@marvell.com>
@@ -1553,7 +1553,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>
-F: lib/librte_node/
+F: lib/node/
 
 
 Test Applications
diff --git a/app/test/test_eal_fs.c b/app/test/test_eal_fs.c
index cae624f82a..bb93b82a43 100644
--- a/app/test/test_eal_fs.c
+++ b/app/test/test_eal_fs.c
@@ -9,7 +9,7 @@
 #include <errno.h>
 
 /* eal_filesystem.h is not a public header file, so use relative path */
-#include "../../lib/librte_eal/common/eal_filesystem.h"
+#include "../../lib/eal/common/eal_filesystem.h"
 
 static int
 test_parse_sysfs_value(void)
diff --git a/app/test/test_memzone.c b/app/test/test_memzone.c
index 0343b0326e..03a9d1d3bb 100644
--- a/app/test/test_memzone.c
+++ b/app/test/test_memzone.c
@@ -18,7 +18,7 @@
 #include <rte_string_fns.h>
 #include <rte_errno.h>
 #include <rte_malloc.h>
-#include "../../lib/librte_eal/common/malloc_elem.h"
+#include "../../lib/eal/common/malloc_elem.h"
 
 #include "test.h"
 
diff --git a/app/test/test_telemetry_json.c b/app/test/test_telemetry_json.c
index 7a91490f4c..3171ab12ec 100644
--- a/app/test/test_telemetry_json.c
+++ b/app/test/test_telemetry_json.c
@@ -4,7 +4,7 @@
 
 #include <string.h>
 
-#include "../../lib/librte_telemetry/telemetry_json.h"
+#include "../../lib/telemetry/telemetry_json.h"
 #include "test.h"
 
 static int
diff --git a/config/arm/meson.build b/config/arm/meson.build
index 39f79b5f86..809df11379 100644
--- a/config/arm/meson.build
+++ b/config/arm/meson.build
@@ -6,7 +6,7 @@
 flags_common = [
     # Accelerate rte_memcpy. Be sure to run unit test (memcpy_perf_autotest)
     # to determine the best threshold in code. Refer to notes in source file
-    # (lib/librte_eal/arm/include/rte_memcpy_64.h) for more info.
+    # (lib/eal/arm/include/rte_memcpy_64.h) for more info.
     ['RTE_ARCH_ARM64_MEMCPY', false],
     #    ['RTE_ARM64_MEMCPY_ALIGNED_THRESHOLD', 2048],
     #    ['RTE_ARM64_MEMCPY_UNALIGNED_THRESHOLD', 512],
diff --git a/devtools/build-tags.sh b/devtools/build-tags.sh
index 8fa01ad177..0361135d6e 100755
--- a/devtools/build-tags.sh
+++ b/devtools/build-tags.sh
@@ -67,13 +67,13 @@ common_sources()
 
 linux_sources()
 {
-	find_sources "lib/librte_eal/linux" '*.[chS]'
+	find_sources "lib/eal/linux" '*.[chS]'
 	find_sources "kernel/linux" '*.[chS]'
 }
 
 bsd_sources()
 {
-	find_sources "lib/librte_eal/freebsd" '*.[chS]'
+	find_sources "lib/eal/freebsd" '*.[chS]'
 	find_sources "kernel/freebsd" '*.[chS]'
 }
 
@@ -85,14 +85,14 @@ arm_common()
 arm_32_sources()
 {
 	arm_common
-	find_sources "lib/librte_eal/arm" '*.[chS]' \
+	find_sources "lib/eal/arm" '*.[chS]' \
 					"$skip_64b_files"
 }
 
 arm_64_sources()
 {
 	arm_common
-	find_sources "lib/librte_eal/arm" '*.[chS]' \
+	find_sources "lib/eal/arm" '*.[chS]' \
 					 "$skip_32b_files"
 	find_sources "$source_dirs" '*arm64.[chS]'
 }
@@ -108,20 +108,20 @@ x86_common()
 x86_32_sources()
 {
 	x86_common
-	find_sources "lib/librte_eal/x86" '*.[chS]' \
+	find_sources "lib/eal/x86" '*.[chS]' \
 					"$skip_64b_files"
 }
 
 x86_64_sources()
 {
 	x86_common
-	find_sources "lib/librte_eal/x86" '*.[chS]' \
+	find_sources "lib/eal/x86" '*.[chS]' \
 					"$skip_32b_files"
 }
 
 ppc_64_sources()
 {
-	find_sources "lib/librte_eal/ppc" '*.[chS]'
+	find_sources "lib/eal/ppc" '*.[chS]'
 	find_sources "$source_dirs" '*altivec*.[chS]'
 }
 
diff --git a/doc/api/doxy-api.conf.in b/doc/api/doxy-api.conf.in
index b3c5cdfeca..bd521a3e73 100644
--- a/doc/api/doxy-api.conf.in
+++ b/doc/api/doxy-api.conf.in
@@ -25,58 +25,58 @@ INPUT                   = @TOPDIR@/doc/api/doxy-api-index.md \
                           @TOPDIR@/drivers/raw/dpaa2_qdma \
                           @TOPDIR@/drivers/raw/ifpga \
                           @TOPDIR@/drivers/raw/ioat \
-                          @TOPDIR@/lib/librte_eal/include \
-                          @TOPDIR@/lib/librte_eal/include/generic \
-                          @TOPDIR@/lib/librte_acl \
-                          @TOPDIR@/lib/librte_bbdev \
-                          @TOPDIR@/lib/librte_bitratestats \
-                          @TOPDIR@/lib/librte_bpf \
-                          @TOPDIR@/lib/librte_cfgfile \
-                          @TOPDIR@/lib/librte_cmdline \
-                          @TOPDIR@/lib/librte_compressdev \
-                          @TOPDIR@/lib/librte_cryptodev \
-                          @TOPDIR@/lib/librte_distributor \
-                          @TOPDIR@/lib/librte_efd \
-                          @TOPDIR@/lib/librte_ethdev \
-                          @TOPDIR@/lib/librte_eventdev \
-                          @TOPDIR@/lib/librte_fib \
-                          @TOPDIR@/lib/librte_flow_classify \
-                          @TOPDIR@/lib/librte_graph \
-                          @TOPDIR@/lib/librte_gro \
-                          @TOPDIR@/lib/librte_gso \
-                          @TOPDIR@/lib/librte_hash \
-                          @TOPDIR@/lib/librte_ip_frag \
-                          @TOPDIR@/lib/librte_ipsec \
-                          @TOPDIR@/lib/librte_jobstats \
-                          @TOPDIR@/lib/librte_kni \
-                          @TOPDIR@/lib/librte_kvargs \
-                          @TOPDIR@/lib/librte_latencystats \
-                          @TOPDIR@/lib/librte_lpm \
-                          @TOPDIR@/lib/librte_mbuf \
-                          @TOPDIR@/lib/librte_member \
-                          @TOPDIR@/lib/librte_mempool \
-                          @TOPDIR@/lib/librte_meter \
-                          @TOPDIR@/lib/librte_metrics \
-                          @TOPDIR@/lib/librte_node \
-                          @TOPDIR@/lib/librte_net \
-                          @TOPDIR@/lib/librte_pci \
-                          @TOPDIR@/lib/librte_pdump \
-                          @TOPDIR@/lib/librte_pipeline \
-                          @TOPDIR@/lib/librte_port \
-                          @TOPDIR@/lib/librte_power \
-                          @TOPDIR@/lib/librte_rawdev \
-                          @TOPDIR@/lib/librte_rcu \
-                          @TOPDIR@/lib/librte_regexdev \
-                          @TOPDIR@/lib/librte_reorder \
-                          @TOPDIR@/lib/librte_rib \
-                          @TOPDIR@/lib/librte_ring \
-                          @TOPDIR@/lib/librte_sched \
-                          @TOPDIR@/lib/librte_security \
-                          @TOPDIR@/lib/librte_stack \
-                          @TOPDIR@/lib/librte_table \
-                          @TOPDIR@/lib/librte_telemetry \
-                          @TOPDIR@/lib/librte_timer \
-                          @TOPDIR@/lib/librte_vhost
+                          @TOPDIR@/lib/eal/include \
+                          @TOPDIR@/lib/eal/include/generic \
+                          @TOPDIR@/lib/acl \
+                          @TOPDIR@/lib/bbdev \
+                          @TOPDIR@/lib/bitratestats \
+                          @TOPDIR@/lib/bpf \
+                          @TOPDIR@/lib/cfgfile \
+                          @TOPDIR@/lib/cmdline \
+                          @TOPDIR@/lib/compressdev \
+                          @TOPDIR@/lib/cryptodev \
+                          @TOPDIR@/lib/distributor \
+                          @TOPDIR@/lib/efd \
+                          @TOPDIR@/lib/ethdev \
+                          @TOPDIR@/lib/eventdev \
+                          @TOPDIR@/lib/fib \
+                          @TOPDIR@/lib/flow_classify \
+                          @TOPDIR@/lib/graph \
+                          @TOPDIR@/lib/gro \
+                          @TOPDIR@/lib/gso \
+                          @TOPDIR@/lib/hash \
+                          @TOPDIR@/lib/ip_frag \
+                          @TOPDIR@/lib/ipsec \
+                          @TOPDIR@/lib/jobstats \
+                          @TOPDIR@/lib/kni \
+                          @TOPDIR@/lib/kvargs \
+                          @TOPDIR@/lib/latencystats \
+                          @TOPDIR@/lib/lpm \
+                          @TOPDIR@/lib/mbuf \
+                          @TOPDIR@/lib/member \
+                          @TOPDIR@/lib/mempool \
+                          @TOPDIR@/lib/meter \
+                          @TOPDIR@/lib/metrics \
+                          @TOPDIR@/lib/node \
+                          @TOPDIR@/lib/net \
+                          @TOPDIR@/lib/pci \
+                          @TOPDIR@/lib/pdump \
+                          @TOPDIR@/lib/pipeline \
+                          @TOPDIR@/lib/port \
+                          @TOPDIR@/lib/power \
+                          @TOPDIR@/lib/rawdev \
+                          @TOPDIR@/lib/rcu \
+                          @TOPDIR@/lib/regexdev \
+                          @TOPDIR@/lib/reorder \
+                          @TOPDIR@/lib/rib \
+                          @TOPDIR@/lib/ring \
+                          @TOPDIR@/lib/sched \
+                          @TOPDIR@/lib/security \
+                          @TOPDIR@/lib/stack \
+                          @TOPDIR@/lib/table \
+                          @TOPDIR@/lib/telemetry \
+                          @TOPDIR@/lib/timer \
+                          @TOPDIR@/lib/vhost
 INPUT                   += @API_EXAMPLES@
 FILE_PATTERNS           = rte_*.h \
                           cmdline.h
diff --git a/doc/guides/contributing/abi_versioning.rst b/doc/guides/contributing/abi_versioning.rst
index 91ada18dd7..7ff18f4f74 100644
--- a/doc/guides/contributing/abi_versioning.rst
+++ b/doc/guides/contributing/abi_versioning.rst
@@ -58,12 +58,12 @@ persists over multiple releases.
 
 .. code-block:: none
 
- $ head ./lib/librte_acl/version.map
+ $ head ./lib/acl/version.map
  DPDK_21 {
         global:
  ...
 
- $ head ./lib/librte_eal/version.map
+ $ head ./lib/eal/version.map
  DPDK_21 {
         global:
  ...
@@ -77,7 +77,7 @@ that library.
 
 .. code-block:: none
 
- $ head ./lib/librte_acl/version.map
+ $ head ./lib/acl/version.map
  DPDK_21 {
         global:
  ...
@@ -88,7 +88,7 @@ that library.
  } DPDK_21;
  ...
 
- $ head ./lib/librte_eal/version.map
+ $ head ./lib/eal/version.map
  DPDK_21 {
         global:
  ...
@@ -100,12 +100,12 @@ how this may be done.
 
 .. code-block:: none
 
- $ head ./lib/librte_acl/version.map
+ $ head ./lib/acl/version.map
  DPDK_22 {
         global:
  ...
 
- $ head ./lib/librte_eal/version.map
+ $ head ./lib/eal/version.map
  DPDK_22 {
         global:
  ...
diff --git a/doc/guides/contributing/coding_style.rst b/doc/guides/contributing/coding_style.rst
index 734d1901b2..45f9565128 100644
--- a/doc/guides/contributing/coding_style.rst
+++ b/doc/guides/contributing/coding_style.rst
@@ -759,7 +759,7 @@ Examples:
  * The virtio network PMD in ``drivers/net/virtio`` uses ``pmd.net.virtio``
  * The eventdev software poll mode driver in ``drivers/event/sw`` uses ``pmd.event.sw``
  * The octeontx mempool driver in ``drivers/mempool/octeontx`` uses ``pmd.mempool.octeontx``
- * The DPDK hash library in ``lib/librte_hash`` uses ``lib.hash``
+ * The DPDK hash library in ``lib/hash`` uses ``lib.hash``
 
 Specializations
 ~~~~~~~~~~~~~~~
@@ -918,7 +918,7 @@ name
 	If a library's .so or .a file differs from that given in the directory
 	name, the name should be specified using this variable. In practice,
 	since the convention is that for a library called ``librte_xyz.so``, the
-	sources are stored in a directory ``lib/librte_xyz``, this value should
+	sources are stored in a directory ``lib/xyz``, this value should
 	never be needed for new libraries.
 
 .. note::
diff --git a/doc/guides/contributing/documentation.rst b/doc/guides/contributing/documentation.rst
index a4e6be6aca..842549a4c8 100644
--- a/doc/guides/contributing/documentation.rst
+++ b/doc/guides/contributing/documentation.rst
@@ -19,10 +19,10 @@ The DPDK source code repository contains input files to build the API documentat
 The main directories that contain files related to documentation are shown below::
 
    lib
-   |-- librte_acl
-   |-- librte_cfgfile
-   |-- librte_cmdline
-   |-- librte_eal
+   |-- acl
+   |-- cfgfile
+   |-- cmdline
+   |-- eal
    |   |-- ...
    ...
    doc
@@ -40,7 +40,7 @@ The main directories that contain files related to documentation are shown below
 
 
 The API documentation is built from `Doxygen <http://www.doxygen.nl>`_ comments in the header files.
-These files are mainly in the ``lib/librte_*`` directories although some of the Poll Mode Drivers in ``drivers/net``
+These files are mainly in the ``lib/*`` directories although some of the Poll Mode Drivers in ``drivers/net``
 are also documented with Doxygen.
 
 The configuration files that are used to control the Doxygen output are in the ``doc/api`` directory.
diff --git a/doc/guides/prog_guide/event_timer_adapter.rst b/doc/guides/prog_guide/event_timer_adapter.rst
index a95efbe0d8..277b0e7d54 100644
--- a/doc/guides/prog_guide/event_timer_adapter.rst
+++ b/doc/guides/prog_guide/event_timer_adapter.rst
@@ -35,7 +35,7 @@ device upon timer expiration.
 
 The Event Timer Adapter API represents each event timer with a generic struct,
 which contains an event and user metadata.  The ``rte_event_timer`` struct is
-defined in ``lib/librte_event/librte_event_timer_adapter.h``.
+defined in ``lib/event/librte_event_timer_adapter.h``.
 
 .. _timer_expiry_event:
 
diff --git a/doc/guides/prog_guide/qos_framework.rst b/doc/guides/prog_guide/qos_framework.rst
index 4e4ea33ccb..7d410d3cc6 100644
--- a/doc/guides/prog_guide/qos_framework.rst
+++ b/doc/guides/prog_guide/qos_framework.rst
@@ -1517,9 +1517,9 @@ Source Files Location
 
 The source files for the DPDK dropper are located at:
 
-*   DPDK/lib/librte_sched/rte_red.h
+*   DPDK/lib/sched/rte_red.h
 
-*   DPDK/lib/librte_sched/rte_red.c
+*   DPDK/lib/sched/rte_red.c
 
 Integration with the DPDK QoS Scheduler
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/doc/guides/prog_guide/rawdev.rst b/doc/guides/prog_guide/rawdev.rst
index a712c7fa99..488e0a7ef6 100644
--- a/doc/guides/prog_guide/rawdev.rst
+++ b/doc/guides/prog_guide/rawdev.rst
@@ -13,7 +13,7 @@ In terms of device flavor (type) support, DPDK currently has ethernet
 
 For a new type of device, for example an accelerator, there are not many
 options except:
-1. create another lib/librte_MySpecialDev, driver/MySpecialDrv and use it
+1. create another lib/MySpecialDev, driver/MySpecialDrv and use it
 through Bus/PMD model.
 2. Or, create a vdev and implement necessary custom APIs which are directly
 exposed from driver layer. However this may still require changes in bus code
diff --git a/doc/guides/rel_notes/known_issues.rst b/doc/guides/rel_notes/known_issues.rst
index ee3ed1e658..43323e1a43 100644
--- a/doc/guides/rel_notes/known_issues.rst
+++ b/doc/guides/rel_notes/known_issues.rst
@@ -127,7 +127,7 @@ HPET timers do not work on the Osage customer reference platform
    work correctly, provided the BIOS supports HPET.
 
 **Driver/Module**:
-   ``lib/librte_eal/include/rte_cycles.h``
+   ``lib/eal/include/rte_cycles.h``
 
 
 Not all variants of supported NIC types have been used in testing
diff --git a/drivers/common/mlx5/linux/meson.build b/drivers/common/mlx5/linux/meson.build
index a2b07fd23c..94ce447261 100644
--- a/drivers/common/mlx5/linux/meson.build
+++ b/drivers/common/mlx5/linux/meson.build
@@ -208,7 +208,7 @@ if dlopen_ibverbs
     dlopen_install_dir = [ eal_pmd_path + '-glue' ]
     dlopen_includes = [global_inc]
     dlopen_includes += include_directories(
-        '../../../../lib/librte_eal/include/generic',
+        '../../../../lib/eal/include/generic',
     )
     shared_lib = shared_library(
         dlopen_lib_name,
diff --git a/drivers/crypto/virtio/meson.build b/drivers/crypto/virtio/meson.build
index 950f411327..7ecf3aa33d 100644
--- a/drivers/crypto/virtio/meson.build
+++ b/drivers/crypto/virtio/meson.build
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2018 HUAWEI TECHNOLOGIES CO., LTD.
 
-includes += include_directories('../../../lib/librte_vhost')
+includes += include_directories('../../../lib/vhost')
 deps += 'bus_pci'
 sources = files('virtio_cryptodev.c', 'virtio_pci.c',
         'virtio_rxtx.c', 'virtqueue.c')
diff --git a/kernel/linux/kni/meson.build b/kernel/linux/kni/meson.build
index 15d848b28d..05d28e781a 100644
--- a/kernel/linux/kni/meson.build
+++ b/kernel/linux/kni/meson.build
@@ -17,8 +17,8 @@ custom_target('rte_kni',
         'M=' + meson.current_build_dir(),
         'src=' + meson.current_source_dir(),
         'MODULE_CFLAGS=-include ' + meson.source_root() + '/config/rte_config.h' +
-        ' -I' + meson.source_root() + '/lib/librte_eal/include' +
-        ' -I' + meson.source_root() + '/lib/librte_kni' +
+        ' -I' + meson.source_root() + '/lib/eal/include' +
+        ' -I' + meson.source_root() + '/lib/kni' +
         ' -I' + meson.build_root() +
         ' -I' + meson.current_source_dir(),
         'modules'] + cross_args,
diff --git a/lib/librte_acl/acl.h b/lib/acl/acl.h
similarity index 100%
rename from lib/librte_acl/acl.h
rename to lib/acl/acl.h
diff --git a/lib/librte_acl/acl_bld.c b/lib/acl/acl_bld.c
similarity index 100%
rename from lib/librte_acl/acl_bld.c
rename to lib/acl/acl_bld.c
diff --git a/lib/librte_acl/acl_gen.c b/lib/acl/acl_gen.c
similarity index 100%
rename from lib/librte_acl/acl_gen.c
rename to lib/acl/acl_gen.c
diff --git a/lib/librte_acl/acl_run.h b/lib/acl/acl_run.h
similarity index 100%
rename from lib/librte_acl/acl_run.h
rename to lib/acl/acl_run.h
diff --git a/lib/librte_acl/acl_run_altivec.c b/lib/acl/acl_run_altivec.c
similarity index 100%
rename from lib/librte_acl/acl_run_altivec.c
rename to lib/acl/acl_run_altivec.c
diff --git a/lib/librte_acl/acl_run_altivec.h b/lib/acl/acl_run_altivec.h
similarity index 100%
rename from lib/librte_acl/acl_run_altivec.h
rename to lib/acl/acl_run_altivec.h
diff --git a/lib/librte_acl/acl_run_avx2.c b/lib/acl/acl_run_avx2.c
similarity index 100%
rename from lib/librte_acl/acl_run_avx2.c
rename to lib/acl/acl_run_avx2.c
diff --git a/lib/librte_acl/acl_run_avx2.h b/lib/acl/acl_run_avx2.h
similarity index 100%
rename from lib/librte_acl/acl_run_avx2.h
rename to lib/acl/acl_run_avx2.h
diff --git a/lib/librte_acl/acl_run_avx512.c b/lib/acl/acl_run_avx512.c
similarity index 100%
rename from lib/librte_acl/acl_run_avx512.c
rename to lib/acl/acl_run_avx512.c
diff --git a/lib/librte_acl/acl_run_avx512_common.h b/lib/acl/acl_run_avx512_common.h
similarity index 100%
rename from lib/librte_acl/acl_run_avx512_common.h
rename to lib/acl/acl_run_avx512_common.h
diff --git a/lib/librte_acl/acl_run_avx512x16.h b/lib/acl/acl_run_avx512x16.h
similarity index 100%
rename from lib/librte_acl/acl_run_avx512x16.h
rename to lib/acl/acl_run_avx512x16.h
diff --git a/lib/librte_acl/acl_run_avx512x8.h b/lib/acl/acl_run_avx512x8.h
similarity index 100%
rename from lib/librte_acl/acl_run_avx512x8.h
rename to lib/acl/acl_run_avx512x8.h
diff --git a/lib/librte_acl/acl_run_neon.c b/lib/acl/acl_run_neon.c
similarity index 100%
rename from lib/librte_acl/acl_run_neon.c
rename to lib/acl/acl_run_neon.c
diff --git a/lib/librte_acl/acl_run_neon.h b/lib/acl/acl_run_neon.h
similarity index 100%
rename from lib/librte_acl/acl_run_neon.h
rename to lib/acl/acl_run_neon.h
diff --git a/lib/librte_acl/acl_run_scalar.c b/lib/acl/acl_run_scalar.c
similarity index 100%
rename from lib/librte_acl/acl_run_scalar.c
rename to lib/acl/acl_run_scalar.c
diff --git a/lib/librte_acl/acl_run_sse.c b/lib/acl/acl_run_sse.c
similarity index 100%
rename from lib/librte_acl/acl_run_sse.c
rename to lib/acl/acl_run_sse.c
diff --git a/lib/librte_acl/acl_run_sse.h b/lib/acl/acl_run_sse.h
similarity index 100%
rename from lib/librte_acl/acl_run_sse.h
rename to lib/acl/acl_run_sse.h
diff --git a/lib/librte_acl/acl_vect.h b/lib/acl/acl_vect.h
similarity index 100%
rename from lib/librte_acl/acl_vect.h
rename to lib/acl/acl_vect.h
diff --git a/lib/librte_acl/meson.build b/lib/acl/meson.build
similarity index 100%
rename from lib/librte_acl/meson.build
rename to lib/acl/meson.build
diff --git a/lib/librte_acl/rte_acl.c b/lib/acl/rte_acl.c
similarity index 100%
rename from lib/librte_acl/rte_acl.c
rename to lib/acl/rte_acl.c
diff --git a/lib/librte_acl/rte_acl.h b/lib/acl/rte_acl.h
similarity index 100%
rename from lib/librte_acl/rte_acl.h
rename to lib/acl/rte_acl.h
diff --git a/lib/librte_acl/rte_acl_osdep.h b/lib/acl/rte_acl_osdep.h
similarity index 100%
rename from lib/librte_acl/rte_acl_osdep.h
rename to lib/acl/rte_acl_osdep.h
diff --git a/lib/librte_acl/tb_mem.c b/lib/acl/tb_mem.c
similarity index 100%
rename from lib/librte_acl/tb_mem.c
rename to lib/acl/tb_mem.c
diff --git a/lib/librte_acl/tb_mem.h b/lib/acl/tb_mem.h
similarity index 100%
rename from lib/librte_acl/tb_mem.h
rename to lib/acl/tb_mem.h
diff --git a/lib/librte_acl/version.map b/lib/acl/version.map
similarity index 100%
rename from lib/librte_acl/version.map
rename to lib/acl/version.map
diff --git a/lib/librte_bbdev/meson.build b/lib/bbdev/meson.build
similarity index 100%
rename from lib/librte_bbdev/meson.build
rename to lib/bbdev/meson.build
diff --git a/lib/librte_bbdev/rte_bbdev.c b/lib/bbdev/rte_bbdev.c
similarity index 100%
rename from lib/librte_bbdev/rte_bbdev.c
rename to lib/bbdev/rte_bbdev.c
diff --git a/lib/librte_bbdev/rte_bbdev.h b/lib/bbdev/rte_bbdev.h
similarity index 100%
rename from lib/librte_bbdev/rte_bbdev.h
rename to lib/bbdev/rte_bbdev.h
diff --git a/lib/librte_bbdev/rte_bbdev_op.h b/lib/bbdev/rte_bbdev_op.h
similarity index 100%
rename from lib/librte_bbdev/rte_bbdev_op.h
rename to lib/bbdev/rte_bbdev_op.h
diff --git a/lib/librte_bbdev/rte_bbdev_pmd.h b/lib/bbdev/rte_bbdev_pmd.h
similarity index 100%
rename from lib/librte_bbdev/rte_bbdev_pmd.h
rename to lib/bbdev/rte_bbdev_pmd.h
diff --git a/lib/librte_bbdev/version.map b/lib/bbdev/version.map
similarity index 100%
rename from lib/librte_bbdev/version.map
rename to lib/bbdev/version.map
diff --git a/lib/librte_bitratestats/meson.build b/lib/bitratestats/meson.build
similarity index 100%
rename from lib/librte_bitratestats/meson.build
rename to lib/bitratestats/meson.build
diff --git a/lib/librte_bitratestats/rte_bitrate.c b/lib/bitratestats/rte_bitrate.c
similarity index 100%
rename from lib/librte_bitratestats/rte_bitrate.c
rename to lib/bitratestats/rte_bitrate.c
diff --git a/lib/librte_bitratestats/rte_bitrate.h b/lib/bitratestats/rte_bitrate.h
similarity index 100%
rename from lib/librte_bitratestats/rte_bitrate.h
rename to lib/bitratestats/rte_bitrate.h
diff --git a/lib/librte_bitratestats/version.map b/lib/bitratestats/version.map
similarity index 100%
rename from lib/librte_bitratestats/version.map
rename to lib/bitratestats/version.map
diff --git a/lib/librte_bpf/bpf.c b/lib/bpf/bpf.c
similarity index 100%
rename from lib/librte_bpf/bpf.c
rename to lib/bpf/bpf.c
diff --git a/lib/librte_bpf/bpf_def.h b/lib/bpf/bpf_def.h
similarity index 100%
rename from lib/librte_bpf/bpf_def.h
rename to lib/bpf/bpf_def.h
diff --git a/lib/librte_bpf/bpf_exec.c b/lib/bpf/bpf_exec.c
similarity index 100%
rename from lib/librte_bpf/bpf_exec.c
rename to lib/bpf/bpf_exec.c
diff --git a/lib/librte_bpf/bpf_impl.h b/lib/bpf/bpf_impl.h
similarity index 100%
rename from lib/librte_bpf/bpf_impl.h
rename to lib/bpf/bpf_impl.h
diff --git a/lib/librte_bpf/bpf_jit_arm64.c b/lib/bpf/bpf_jit_arm64.c
similarity index 100%
rename from lib/librte_bpf/bpf_jit_arm64.c
rename to lib/bpf/bpf_jit_arm64.c
diff --git a/lib/librte_bpf/bpf_jit_x86.c b/lib/bpf/bpf_jit_x86.c
similarity index 100%
rename from lib/librte_bpf/bpf_jit_x86.c
rename to lib/bpf/bpf_jit_x86.c
diff --git a/lib/librte_bpf/bpf_load.c b/lib/bpf/bpf_load.c
similarity index 100%
rename from lib/librte_bpf/bpf_load.c
rename to lib/bpf/bpf_load.c
diff --git a/lib/librte_bpf/bpf_load_elf.c b/lib/bpf/bpf_load_elf.c
similarity index 100%
rename from lib/librte_bpf/bpf_load_elf.c
rename to lib/bpf/bpf_load_elf.c
diff --git a/lib/librte_bpf/bpf_pkt.c b/lib/bpf/bpf_pkt.c
similarity index 100%
rename from lib/librte_bpf/bpf_pkt.c
rename to lib/bpf/bpf_pkt.c
diff --git a/lib/librte_bpf/bpf_validate.c b/lib/bpf/bpf_validate.c
similarity index 100%
rename from lib/librte_bpf/bpf_validate.c
rename to lib/bpf/bpf_validate.c
diff --git a/lib/librte_bpf/meson.build b/lib/bpf/meson.build
similarity index 100%
rename from lib/librte_bpf/meson.build
rename to lib/bpf/meson.build
diff --git a/lib/librte_bpf/rte_bpf.h b/lib/bpf/rte_bpf.h
similarity index 100%
rename from lib/librte_bpf/rte_bpf.h
rename to lib/bpf/rte_bpf.h
diff --git a/lib/librte_bpf/rte_bpf_ethdev.h b/lib/bpf/rte_bpf_ethdev.h
similarity index 100%
rename from lib/librte_bpf/rte_bpf_ethdev.h
rename to lib/bpf/rte_bpf_ethdev.h
diff --git a/lib/librte_bpf/version.map b/lib/bpf/version.map
similarity index 100%
rename from lib/librte_bpf/version.map
rename to lib/bpf/version.map
diff --git a/lib/librte_cfgfile/meson.build b/lib/cfgfile/meson.build
similarity index 100%
rename from lib/librte_cfgfile/meson.build
rename to lib/cfgfile/meson.build
diff --git a/lib/librte_cfgfile/rte_cfgfile.c b/lib/cfgfile/rte_cfgfile.c
similarity index 100%
rename from lib/librte_cfgfile/rte_cfgfile.c
rename to lib/cfgfile/rte_cfgfile.c
diff --git a/lib/librte_cfgfile/rte_cfgfile.h b/lib/cfgfile/rte_cfgfile.h
similarity index 100%
rename from lib/librte_cfgfile/rte_cfgfile.h
rename to lib/cfgfile/rte_cfgfile.h
diff --git a/lib/librte_cfgfile/version.map b/lib/cfgfile/version.map
similarity index 100%
rename from lib/librte_cfgfile/version.map
rename to lib/cfgfile/version.map
diff --git a/lib/librte_cmdline/cmdline.c b/lib/cmdline/cmdline.c
similarity index 100%
rename from lib/librte_cmdline/cmdline.c
rename to lib/cmdline/cmdline.c
diff --git a/lib/librte_cmdline/cmdline.h b/lib/cmdline/cmdline.h
similarity index 100%
rename from lib/librte_cmdline/cmdline.h
rename to lib/cmdline/cmdline.h
diff --git a/lib/librte_cmdline/cmdline_cirbuf.c b/lib/cmdline/cmdline_cirbuf.c
similarity index 100%
rename from lib/librte_cmdline/cmdline_cirbuf.c
rename to lib/cmdline/cmdline_cirbuf.c
diff --git a/lib/librte_cmdline/cmdline_cirbuf.h b/lib/cmdline/cmdline_cirbuf.h
similarity index 100%
rename from lib/librte_cmdline/cmdline_cirbuf.h
rename to lib/cmdline/cmdline_cirbuf.h
diff --git a/lib/librte_cmdline/cmdline_os_unix.c b/lib/cmdline/cmdline_os_unix.c
similarity index 100%
rename from lib/librte_cmdline/cmdline_os_unix.c
rename to lib/cmdline/cmdline_os_unix.c
diff --git a/lib/librte_cmdline/cmdline_os_windows.c b/lib/cmdline/cmdline_os_windows.c
similarity index 100%
rename from lib/librte_cmdline/cmdline_os_windows.c
rename to lib/cmdline/cmdline_os_windows.c
diff --git a/lib/librte_cmdline/cmdline_parse.c b/lib/cmdline/cmdline_parse.c
similarity index 100%
rename from lib/librte_cmdline/cmdline_parse.c
rename to lib/cmdline/cmdline_parse.c
diff --git a/lib/librte_cmdline/cmdline_parse.h b/lib/cmdline/cmdline_parse.h
similarity index 100%
rename from lib/librte_cmdline/cmdline_parse.h
rename to lib/cmdline/cmdline_parse.h
diff --git a/lib/librte_cmdline/cmdline_parse_etheraddr.c b/lib/cmdline/cmdline_parse_etheraddr.c
similarity index 100%
rename from lib/librte_cmdline/cmdline_parse_etheraddr.c
rename to lib/cmdline/cmdline_parse_etheraddr.c
diff --git a/lib/librte_cmdline/cmdline_parse_etheraddr.h b/lib/cmdline/cmdline_parse_etheraddr.h
similarity index 100%
rename from lib/librte_cmdline/cmdline_parse_etheraddr.h
rename to lib/cmdline/cmdline_parse_etheraddr.h
diff --git a/lib/librte_cmdline/cmdline_parse_ipaddr.c b/lib/cmdline/cmdline_parse_ipaddr.c
similarity index 100%
rename from lib/librte_cmdline/cmdline_parse_ipaddr.c
rename to lib/cmdline/cmdline_parse_ipaddr.c
diff --git a/lib/librte_cmdline/cmdline_parse_ipaddr.h b/lib/cmdline/cmdline_parse_ipaddr.h
similarity index 100%
rename from lib/librte_cmdline/cmdline_parse_ipaddr.h
rename to lib/cmdline/cmdline_parse_ipaddr.h
diff --git a/lib/librte_cmdline/cmdline_parse_num.c b/lib/cmdline/cmdline_parse_num.c
similarity index 100%
rename from lib/librte_cmdline/cmdline_parse_num.c
rename to lib/cmdline/cmdline_parse_num.c
diff --git a/lib/librte_cmdline/cmdline_parse_num.h b/lib/cmdline/cmdline_parse_num.h
similarity index 100%
rename from lib/librte_cmdline/cmdline_parse_num.h
rename to lib/cmdline/cmdline_parse_num.h
diff --git a/lib/librte_cmdline/cmdline_parse_portlist.c b/lib/cmdline/cmdline_parse_portlist.c
similarity index 100%
rename from lib/librte_cmdline/cmdline_parse_portlist.c
rename to lib/cmdline/cmdline_parse_portlist.c
diff --git a/lib/librte_cmdline/cmdline_parse_portlist.h b/lib/cmdline/cmdline_parse_portlist.h
similarity index 100%
rename from lib/librte_cmdline/cmdline_parse_portlist.h
rename to lib/cmdline/cmdline_parse_portlist.h
diff --git a/lib/librte_cmdline/cmdline_parse_string.c b/lib/cmdline/cmdline_parse_string.c
similarity index 100%
rename from lib/librte_cmdline/cmdline_parse_string.c
rename to lib/cmdline/cmdline_parse_string.c
diff --git a/lib/librte_cmdline/cmdline_parse_string.h b/lib/cmdline/cmdline_parse_string.h
similarity index 100%
rename from lib/librte_cmdline/cmdline_parse_string.h
rename to lib/cmdline/cmdline_parse_string.h
diff --git a/lib/librte_cmdline/cmdline_private.h b/lib/cmdline/cmdline_private.h
similarity index 100%
rename from lib/librte_cmdline/cmdline_private.h
rename to lib/cmdline/cmdline_private.h
diff --git a/lib/librte_cmdline/cmdline_rdline.c b/lib/cmdline/cmdline_rdline.c
similarity index 100%
rename from lib/librte_cmdline/cmdline_rdline.c
rename to lib/cmdline/cmdline_rdline.c
diff --git a/lib/librte_cmdline/cmdline_rdline.h b/lib/cmdline/cmdline_rdline.h
similarity index 100%
rename from lib/librte_cmdline/cmdline_rdline.h
rename to lib/cmdline/cmdline_rdline.h
diff --git a/lib/librte_cmdline/cmdline_socket.c b/lib/cmdline/cmdline_socket.c
similarity index 100%
rename from lib/librte_cmdline/cmdline_socket.c
rename to lib/cmdline/cmdline_socket.c
diff --git a/lib/librte_cmdline/cmdline_socket.h b/lib/cmdline/cmdline_socket.h
similarity index 100%
rename from lib/librte_cmdline/cmdline_socket.h
rename to lib/cmdline/cmdline_socket.h
diff --git a/lib/librte_cmdline/cmdline_vt100.c b/lib/cmdline/cmdline_vt100.c
similarity index 100%
rename from lib/librte_cmdline/cmdline_vt100.c
rename to lib/cmdline/cmdline_vt100.c
diff --git a/lib/librte_cmdline/cmdline_vt100.h b/lib/cmdline/cmdline_vt100.h
similarity index 100%
rename from lib/librte_cmdline/cmdline_vt100.h
rename to lib/cmdline/cmdline_vt100.h
diff --git a/lib/librte_cmdline/meson.build b/lib/cmdline/meson.build
similarity index 100%
rename from lib/librte_cmdline/meson.build
rename to lib/cmdline/meson.build
diff --git a/lib/librte_cmdline/version.map b/lib/cmdline/version.map
similarity index 100%
rename from lib/librte_cmdline/version.map
rename to lib/cmdline/version.map
diff --git a/lib/librte_compressdev/meson.build b/lib/compressdev/meson.build
similarity index 100%
rename from lib/librte_compressdev/meson.build
rename to lib/compressdev/meson.build
diff --git a/lib/librte_compressdev/rte_comp.c b/lib/compressdev/rte_comp.c
similarity index 100%
rename from lib/librte_compressdev/rte_comp.c
rename to lib/compressdev/rte_comp.c
diff --git a/lib/librte_compressdev/rte_comp.h b/lib/compressdev/rte_comp.h
similarity index 100%
rename from lib/librte_compressdev/rte_comp.h
rename to lib/compressdev/rte_comp.h
diff --git a/lib/librte_compressdev/rte_compressdev.c b/lib/compressdev/rte_compressdev.c
similarity index 100%
rename from lib/librte_compressdev/rte_compressdev.c
rename to lib/compressdev/rte_compressdev.c
diff --git a/lib/librte_compressdev/rte_compressdev.h b/lib/compressdev/rte_compressdev.h
similarity index 100%
rename from lib/librte_compressdev/rte_compressdev.h
rename to lib/compressdev/rte_compressdev.h
diff --git a/lib/librte_compressdev/rte_compressdev_internal.h b/lib/compressdev/rte_compressdev_internal.h
similarity index 100%
rename from lib/librte_compressdev/rte_compressdev_internal.h
rename to lib/compressdev/rte_compressdev_internal.h
diff --git a/lib/librte_compressdev/rte_compressdev_pmd.c b/lib/compressdev/rte_compressdev_pmd.c
similarity index 100%
rename from lib/librte_compressdev/rte_compressdev_pmd.c
rename to lib/compressdev/rte_compressdev_pmd.c
diff --git a/lib/librte_compressdev/rte_compressdev_pmd.h b/lib/compressdev/rte_compressdev_pmd.h
similarity index 100%
rename from lib/librte_compressdev/rte_compressdev_pmd.h
rename to lib/compressdev/rte_compressdev_pmd.h
diff --git a/lib/librte_compressdev/version.map b/lib/compressdev/version.map
similarity index 100%
rename from lib/librte_compressdev/version.map
rename to lib/compressdev/version.map
diff --git a/lib/librte_cryptodev/cryptodev_trace_points.c b/lib/cryptodev/cryptodev_trace_points.c
similarity index 100%
rename from lib/librte_cryptodev/cryptodev_trace_points.c
rename to lib/cryptodev/cryptodev_trace_points.c
diff --git a/lib/librte_cryptodev/meson.build b/lib/cryptodev/meson.build
similarity index 100%
rename from lib/librte_cryptodev/meson.build
rename to lib/cryptodev/meson.build
diff --git a/lib/librte_cryptodev/rte_crypto.h b/lib/cryptodev/rte_crypto.h
similarity index 100%
rename from lib/librte_cryptodev/rte_crypto.h
rename to lib/cryptodev/rte_crypto.h
diff --git a/lib/librte_cryptodev/rte_crypto_asym.h b/lib/cryptodev/rte_crypto_asym.h
similarity index 100%
rename from lib/librte_cryptodev/rte_crypto_asym.h
rename to lib/cryptodev/rte_crypto_asym.h
diff --git a/lib/librte_cryptodev/rte_crypto_sym.h b/lib/cryptodev/rte_crypto_sym.h
similarity index 100%
rename from lib/librte_cryptodev/rte_crypto_sym.h
rename to lib/cryptodev/rte_crypto_sym.h
diff --git a/lib/librte_cryptodev/rte_cryptodev.c b/lib/cryptodev/rte_cryptodev.c
similarity index 100%
rename from lib/librte_cryptodev/rte_cryptodev.c
rename to lib/cryptodev/rte_cryptodev.c
diff --git a/lib/librte_cryptodev/rte_cryptodev.h b/lib/cryptodev/rte_cryptodev.h
similarity index 100%
rename from lib/librte_cryptodev/rte_cryptodev.h
rename to lib/cryptodev/rte_cryptodev.h
diff --git a/lib/librte_cryptodev/rte_cryptodev_pmd.c b/lib/cryptodev/rte_cryptodev_pmd.c
similarity index 100%
rename from lib/librte_cryptodev/rte_cryptodev_pmd.c
rename to lib/cryptodev/rte_cryptodev_pmd.c
diff --git a/lib/librte_cryptodev/rte_cryptodev_pmd.h b/lib/cryptodev/rte_cryptodev_pmd.h
similarity index 100%
rename from lib/librte_cryptodev/rte_cryptodev_pmd.h
rename to lib/cryptodev/rte_cryptodev_pmd.h
diff --git a/lib/librte_cryptodev/rte_cryptodev_trace.h b/lib/cryptodev/rte_cryptodev_trace.h
similarity index 100%
rename from lib/librte_cryptodev/rte_cryptodev_trace.h
rename to lib/cryptodev/rte_cryptodev_trace.h
diff --git a/lib/librte_cryptodev/rte_cryptodev_trace_fp.h b/lib/cryptodev/rte_cryptodev_trace_fp.h
similarity index 100%
rename from lib/librte_cryptodev/rte_cryptodev_trace_fp.h
rename to lib/cryptodev/rte_cryptodev_trace_fp.h
diff --git a/lib/librte_cryptodev/version.map b/lib/cryptodev/version.map
similarity index 100%
rename from lib/librte_cryptodev/version.map
rename to lib/cryptodev/version.map
diff --git a/lib/librte_distributor/distributor_private.h b/lib/distributor/distributor_private.h
similarity index 100%
rename from lib/librte_distributor/distributor_private.h
rename to lib/distributor/distributor_private.h
diff --git a/lib/librte_distributor/meson.build b/lib/distributor/meson.build
similarity index 100%
rename from lib/librte_distributor/meson.build
rename to lib/distributor/meson.build
diff --git a/lib/librte_distributor/rte_distributor.c b/lib/distributor/rte_distributor.c
similarity index 100%
rename from lib/librte_distributor/rte_distributor.c
rename to lib/distributor/rte_distributor.c
diff --git a/lib/librte_distributor/rte_distributor.h b/lib/distributor/rte_distributor.h
similarity index 100%
rename from lib/librte_distributor/rte_distributor.h
rename to lib/distributor/rte_distributor.h
diff --git a/lib/librte_distributor/rte_distributor_match_generic.c b/lib/distributor/rte_distributor_match_generic.c
similarity index 100%
rename from lib/librte_distributor/rte_distributor_match_generic.c
rename to lib/distributor/rte_distributor_match_generic.c
diff --git a/lib/librte_distributor/rte_distributor_match_sse.c b/lib/distributor/rte_distributor_match_sse.c
similarity index 100%
rename from lib/librte_distributor/rte_distributor_match_sse.c
rename to lib/distributor/rte_distributor_match_sse.c
diff --git a/lib/librte_distributor/rte_distributor_single.c b/lib/distributor/rte_distributor_single.c
similarity index 100%
rename from lib/librte_distributor/rte_distributor_single.c
rename to lib/distributor/rte_distributor_single.c
diff --git a/lib/librte_distributor/rte_distributor_single.h b/lib/distributor/rte_distributor_single.h
similarity index 100%
rename from lib/librte_distributor/rte_distributor_single.h
rename to lib/distributor/rte_distributor_single.h
diff --git a/lib/librte_distributor/version.map b/lib/distributor/version.map
similarity index 100%
rename from lib/librte_distributor/version.map
rename to lib/distributor/version.map
diff --git a/lib/librte_eal/arm/include/meson.build b/lib/eal/arm/include/meson.build
similarity index 100%
rename from lib/librte_eal/arm/include/meson.build
rename to lib/eal/arm/include/meson.build
diff --git a/lib/librte_eal/arm/include/rte_atomic.h b/lib/eal/arm/include/rte_atomic.h
similarity index 100%
rename from lib/librte_eal/arm/include/rte_atomic.h
rename to lib/eal/arm/include/rte_atomic.h
diff --git a/lib/librte_eal/arm/include/rte_atomic_32.h b/lib/eal/arm/include/rte_atomic_32.h
similarity index 100%
rename from lib/librte_eal/arm/include/rte_atomic_32.h
rename to lib/eal/arm/include/rte_atomic_32.h
diff --git a/lib/librte_eal/arm/include/rte_atomic_64.h b/lib/eal/arm/include/rte_atomic_64.h
similarity index 100%
rename from lib/librte_eal/arm/include/rte_atomic_64.h
rename to lib/eal/arm/include/rte_atomic_64.h
diff --git a/lib/librte_eal/arm/include/rte_byteorder.h b/lib/eal/arm/include/rte_byteorder.h
similarity index 100%
rename from lib/librte_eal/arm/include/rte_byteorder.h
rename to lib/eal/arm/include/rte_byteorder.h
diff --git a/lib/librte_eal/arm/include/rte_cpuflags.h b/lib/eal/arm/include/rte_cpuflags.h
similarity index 100%
rename from lib/librte_eal/arm/include/rte_cpuflags.h
rename to lib/eal/arm/include/rte_cpuflags.h
diff --git a/lib/librte_eal/arm/include/rte_cpuflags_32.h b/lib/eal/arm/include/rte_cpuflags_32.h
similarity index 100%
rename from lib/librte_eal/arm/include/rte_cpuflags_32.h
rename to lib/eal/arm/include/rte_cpuflags_32.h
diff --git a/lib/librte_eal/arm/include/rte_cpuflags_64.h b/lib/eal/arm/include/rte_cpuflags_64.h
similarity index 100%
rename from lib/librte_eal/arm/include/rte_cpuflags_64.h
rename to lib/eal/arm/include/rte_cpuflags_64.h
diff --git a/lib/librte_eal/arm/include/rte_cycles.h b/lib/eal/arm/include/rte_cycles.h
similarity index 100%
rename from lib/librte_eal/arm/include/rte_cycles.h
rename to lib/eal/arm/include/rte_cycles.h
diff --git a/lib/librte_eal/arm/include/rte_cycles_32.h b/lib/eal/arm/include/rte_cycles_32.h
similarity index 100%
rename from lib/librte_eal/arm/include/rte_cycles_32.h
rename to lib/eal/arm/include/rte_cycles_32.h
diff --git a/lib/librte_eal/arm/include/rte_cycles_64.h b/lib/eal/arm/include/rte_cycles_64.h
similarity index 100%
rename from lib/librte_eal/arm/include/rte_cycles_64.h
rename to lib/eal/arm/include/rte_cycles_64.h
diff --git a/lib/librte_eal/arm/include/rte_io.h b/lib/eal/arm/include/rte_io.h
similarity index 100%
rename from lib/librte_eal/arm/include/rte_io.h
rename to lib/eal/arm/include/rte_io.h
diff --git a/lib/librte_eal/arm/include/rte_io_64.h b/lib/eal/arm/include/rte_io_64.h
similarity index 100%
rename from lib/librte_eal/arm/include/rte_io_64.h
rename to lib/eal/arm/include/rte_io_64.h
diff --git a/lib/librte_eal/arm/include/rte_mcslock.h b/lib/eal/arm/include/rte_mcslock.h
similarity index 100%
rename from lib/librte_eal/arm/include/rte_mcslock.h
rename to lib/eal/arm/include/rte_mcslock.h
diff --git a/lib/librte_eal/arm/include/rte_memcpy.h b/lib/eal/arm/include/rte_memcpy.h
similarity index 100%
rename from lib/librte_eal/arm/include/rte_memcpy.h
rename to lib/eal/arm/include/rte_memcpy.h
diff --git a/lib/librte_eal/arm/include/rte_memcpy_32.h b/lib/eal/arm/include/rte_memcpy_32.h
similarity index 100%
rename from lib/librte_eal/arm/include/rte_memcpy_32.h
rename to lib/eal/arm/include/rte_memcpy_32.h
diff --git a/lib/librte_eal/arm/include/rte_memcpy_64.h b/lib/eal/arm/include/rte_memcpy_64.h
similarity index 100%
rename from lib/librte_eal/arm/include/rte_memcpy_64.h
rename to lib/eal/arm/include/rte_memcpy_64.h
diff --git a/lib/librte_eal/arm/include/rte_pause.h b/lib/eal/arm/include/rte_pause.h
similarity index 100%
rename from lib/librte_eal/arm/include/rte_pause.h
rename to lib/eal/arm/include/rte_pause.h
diff --git a/lib/librte_eal/arm/include/rte_pause_32.h b/lib/eal/arm/include/rte_pause_32.h
similarity index 100%
rename from lib/librte_eal/arm/include/rte_pause_32.h
rename to lib/eal/arm/include/rte_pause_32.h
diff --git a/lib/librte_eal/arm/include/rte_pause_64.h b/lib/eal/arm/include/rte_pause_64.h
similarity index 100%
rename from lib/librte_eal/arm/include/rte_pause_64.h
rename to lib/eal/arm/include/rte_pause_64.h
diff --git a/lib/librte_eal/arm/include/rte_power_intrinsics.h b/lib/eal/arm/include/rte_power_intrinsics.h
similarity index 100%
rename from lib/librte_eal/arm/include/rte_power_intrinsics.h
rename to lib/eal/arm/include/rte_power_intrinsics.h
diff --git a/lib/librte_eal/arm/include/rte_prefetch.h b/lib/eal/arm/include/rte_prefetch.h
similarity index 100%
rename from lib/librte_eal/arm/include/rte_prefetch.h
rename to lib/eal/arm/include/rte_prefetch.h
diff --git a/lib/librte_eal/arm/include/rte_prefetch_32.h b/lib/eal/arm/include/rte_prefetch_32.h
similarity index 100%
rename from lib/librte_eal/arm/include/rte_prefetch_32.h
rename to lib/eal/arm/include/rte_prefetch_32.h
diff --git a/lib/librte_eal/arm/include/rte_prefetch_64.h b/lib/eal/arm/include/rte_prefetch_64.h
similarity index 100%
rename from lib/librte_eal/arm/include/rte_prefetch_64.h
rename to lib/eal/arm/include/rte_prefetch_64.h
diff --git a/lib/librte_eal/arm/include/rte_rwlock.h b/lib/eal/arm/include/rte_rwlock.h
similarity index 100%
rename from lib/librte_eal/arm/include/rte_rwlock.h
rename to lib/eal/arm/include/rte_rwlock.h
diff --git a/lib/librte_eal/arm/include/rte_spinlock.h b/lib/eal/arm/include/rte_spinlock.h
similarity index 100%
rename from lib/librte_eal/arm/include/rte_spinlock.h
rename to lib/eal/arm/include/rte_spinlock.h
diff --git a/lib/librte_eal/arm/include/rte_ticketlock.h b/lib/eal/arm/include/rte_ticketlock.h
similarity index 100%
rename from lib/librte_eal/arm/include/rte_ticketlock.h
rename to lib/eal/arm/include/rte_ticketlock.h
diff --git a/lib/librte_eal/arm/include/rte_vect.h b/lib/eal/arm/include/rte_vect.h
similarity index 100%
rename from lib/librte_eal/arm/include/rte_vect.h
rename to lib/eal/arm/include/rte_vect.h
diff --git a/lib/librte_eal/arm/meson.build b/lib/eal/arm/meson.build
similarity index 100%
rename from lib/librte_eal/arm/meson.build
rename to lib/eal/arm/meson.build
diff --git a/lib/librte_eal/arm/rte_cpuflags.c b/lib/eal/arm/rte_cpuflags.c
similarity index 100%
rename from lib/librte_eal/arm/rte_cpuflags.c
rename to lib/eal/arm/rte_cpuflags.c
diff --git a/lib/librte_eal/arm/rte_cycles.c b/lib/eal/arm/rte_cycles.c
similarity index 100%
rename from lib/librte_eal/arm/rte_cycles.c
rename to lib/eal/arm/rte_cycles.c
diff --git a/lib/librte_eal/arm/rte_hypervisor.c b/lib/eal/arm/rte_hypervisor.c
similarity index 100%
rename from lib/librte_eal/arm/rte_hypervisor.c
rename to lib/eal/arm/rte_hypervisor.c
diff --git a/lib/librte_eal/arm/rte_power_intrinsics.c b/lib/eal/arm/rte_power_intrinsics.c
similarity index 100%
rename from lib/librte_eal/arm/rte_power_intrinsics.c
rename to lib/eal/arm/rte_power_intrinsics.c
diff --git a/lib/librte_eal/common/eal_common_bus.c b/lib/eal/common/eal_common_bus.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_bus.c
rename to lib/eal/common/eal_common_bus.c
diff --git a/lib/librte_eal/common/eal_common_class.c b/lib/eal/common/eal_common_class.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_class.c
rename to lib/eal/common/eal_common_class.c
diff --git a/lib/librte_eal/common/eal_common_config.c b/lib/eal/common/eal_common_config.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_config.c
rename to lib/eal/common/eal_common_config.c
diff --git a/lib/librte_eal/common/eal_common_cpuflags.c b/lib/eal/common/eal_common_cpuflags.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_cpuflags.c
rename to lib/eal/common/eal_common_cpuflags.c
diff --git a/lib/librte_eal/common/eal_common_debug.c b/lib/eal/common/eal_common_debug.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_debug.c
rename to lib/eal/common/eal_common_debug.c
diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/eal/common/eal_common_dev.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_dev.c
rename to lib/eal/common/eal_common_dev.c
diff --git a/lib/librte_eal/common/eal_common_devargs.c b/lib/eal/common/eal_common_devargs.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_devargs.c
rename to lib/eal/common/eal_common_devargs.c
diff --git a/lib/librte_eal/common/eal_common_dynmem.c b/lib/eal/common/eal_common_dynmem.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_dynmem.c
rename to lib/eal/common/eal_common_dynmem.c
diff --git a/lib/librte_eal/common/eal_common_errno.c b/lib/eal/common/eal_common_errno.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_errno.c
rename to lib/eal/common/eal_common_errno.c
diff --git a/lib/librte_eal/common/eal_common_fbarray.c b/lib/eal/common/eal_common_fbarray.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_fbarray.c
rename to lib/eal/common/eal_common_fbarray.c
diff --git a/lib/librte_eal/common/eal_common_hexdump.c b/lib/eal/common/eal_common_hexdump.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_hexdump.c
rename to lib/eal/common/eal_common_hexdump.c
diff --git a/lib/librte_eal/common/eal_common_hypervisor.c b/lib/eal/common/eal_common_hypervisor.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_hypervisor.c
rename to lib/eal/common/eal_common_hypervisor.c
diff --git a/lib/librte_eal/common/eal_common_launch.c b/lib/eal/common/eal_common_launch.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_launch.c
rename to lib/eal/common/eal_common_launch.c
diff --git a/lib/librte_eal/common/eal_common_lcore.c b/lib/eal/common/eal_common_lcore.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_lcore.c
rename to lib/eal/common/eal_common_lcore.c
diff --git a/lib/librte_eal/common/eal_common_log.c b/lib/eal/common/eal_common_log.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_log.c
rename to lib/eal/common/eal_common_log.c
diff --git a/lib/librte_eal/common/eal_common_mcfg.c b/lib/eal/common/eal_common_mcfg.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_mcfg.c
rename to lib/eal/common/eal_common_mcfg.c
diff --git a/lib/librte_eal/common/eal_common_memalloc.c b/lib/eal/common/eal_common_memalloc.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_memalloc.c
rename to lib/eal/common/eal_common_memalloc.c
diff --git a/lib/librte_eal/common/eal_common_memory.c b/lib/eal/common/eal_common_memory.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_memory.c
rename to lib/eal/common/eal_common_memory.c
diff --git a/lib/librte_eal/common/eal_common_memzone.c b/lib/eal/common/eal_common_memzone.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_memzone.c
rename to lib/eal/common/eal_common_memzone.c
diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/eal/common/eal_common_options.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_options.c
rename to lib/eal/common/eal_common_options.c
diff --git a/lib/librte_eal/common/eal_common_proc.c b/lib/eal/common/eal_common_proc.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_proc.c
rename to lib/eal/common/eal_common_proc.c
diff --git a/lib/librte_eal/common/eal_common_string_fns.c b/lib/eal/common/eal_common_string_fns.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_string_fns.c
rename to lib/eal/common/eal_common_string_fns.c
diff --git a/lib/librte_eal/common/eal_common_tailqs.c b/lib/eal/common/eal_common_tailqs.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_tailqs.c
rename to lib/eal/common/eal_common_tailqs.c
diff --git a/lib/librte_eal/common/eal_common_thread.c b/lib/eal/common/eal_common_thread.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_thread.c
rename to lib/eal/common/eal_common_thread.c
diff --git a/lib/librte_eal/common/eal_common_timer.c b/lib/eal/common/eal_common_timer.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_timer.c
rename to lib/eal/common/eal_common_timer.c
diff --git a/lib/librte_eal/common/eal_common_trace.c b/lib/eal/common/eal_common_trace.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_trace.c
rename to lib/eal/common/eal_common_trace.c
diff --git a/lib/librte_eal/common/eal_common_trace_ctf.c b/lib/eal/common/eal_common_trace_ctf.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_trace_ctf.c
rename to lib/eal/common/eal_common_trace_ctf.c
diff --git a/lib/librte_eal/common/eal_common_trace_points.c b/lib/eal/common/eal_common_trace_points.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_trace_points.c
rename to lib/eal/common/eal_common_trace_points.c
diff --git a/lib/librte_eal/common/eal_common_trace_utils.c b/lib/eal/common/eal_common_trace_utils.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_trace_utils.c
rename to lib/eal/common/eal_common_trace_utils.c
diff --git a/lib/librte_eal/common/eal_common_uuid.c b/lib/eal/common/eal_common_uuid.c
similarity index 100%
rename from lib/librte_eal/common/eal_common_uuid.c
rename to lib/eal/common/eal_common_uuid.c
diff --git a/lib/librte_eal/common/eal_filesystem.h b/lib/eal/common/eal_filesystem.h
similarity index 100%
rename from lib/librte_eal/common/eal_filesystem.h
rename to lib/eal/common/eal_filesystem.h
diff --git a/lib/librte_eal/common/eal_hugepages.h b/lib/eal/common/eal_hugepages.h
similarity index 100%
rename from lib/librte_eal/common/eal_hugepages.h
rename to lib/eal/common/eal_hugepages.h
diff --git a/lib/librte_eal/common/eal_internal_cfg.h b/lib/eal/common/eal_internal_cfg.h
similarity index 100%
rename from lib/librte_eal/common/eal_internal_cfg.h
rename to lib/eal/common/eal_internal_cfg.h
diff --git a/lib/librte_eal/common/eal_memalloc.h b/lib/eal/common/eal_memalloc.h
similarity index 100%
rename from lib/librte_eal/common/eal_memalloc.h
rename to lib/eal/common/eal_memalloc.h
diff --git a/lib/librte_eal/common/eal_memcfg.h b/lib/eal/common/eal_memcfg.h
similarity index 100%
rename from lib/librte_eal/common/eal_memcfg.h
rename to lib/eal/common/eal_memcfg.h
diff --git a/lib/librte_eal/common/eal_options.h b/lib/eal/common/eal_options.h
similarity index 100%
rename from lib/librte_eal/common/eal_options.h
rename to lib/eal/common/eal_options.h
diff --git a/lib/librte_eal/common/eal_private.h b/lib/eal/common/eal_private.h
similarity index 100%
rename from lib/librte_eal/common/eal_private.h
rename to lib/eal/common/eal_private.h
diff --git a/lib/librte_eal/common/eal_thread.h b/lib/eal/common/eal_thread.h
similarity index 100%
rename from lib/librte_eal/common/eal_thread.h
rename to lib/eal/common/eal_thread.h
diff --git a/lib/librte_eal/common/eal_trace.h b/lib/eal/common/eal_trace.h
similarity index 100%
rename from lib/librte_eal/common/eal_trace.h
rename to lib/eal/common/eal_trace.h
diff --git a/lib/librte_eal/common/hotplug_mp.c b/lib/eal/common/hotplug_mp.c
similarity index 100%
rename from lib/librte_eal/common/hotplug_mp.c
rename to lib/eal/common/hotplug_mp.c
diff --git a/lib/librte_eal/common/hotplug_mp.h b/lib/eal/common/hotplug_mp.h
similarity index 100%
rename from lib/librte_eal/common/hotplug_mp.h
rename to lib/eal/common/hotplug_mp.h
diff --git a/lib/librte_eal/common/malloc_elem.c b/lib/eal/common/malloc_elem.c
similarity index 100%
rename from lib/librte_eal/common/malloc_elem.c
rename to lib/eal/common/malloc_elem.c
diff --git a/lib/librte_eal/common/malloc_elem.h b/lib/eal/common/malloc_elem.h
similarity index 100%
rename from lib/librte_eal/common/malloc_elem.h
rename to lib/eal/common/malloc_elem.h
diff --git a/lib/librte_eal/common/malloc_heap.c b/lib/eal/common/malloc_heap.c
similarity index 100%
rename from lib/librte_eal/common/malloc_heap.c
rename to lib/eal/common/malloc_heap.c
diff --git a/lib/librte_eal/common/malloc_heap.h b/lib/eal/common/malloc_heap.h
similarity index 100%
rename from lib/librte_eal/common/malloc_heap.h
rename to lib/eal/common/malloc_heap.h
diff --git a/lib/librte_eal/common/malloc_mp.c b/lib/eal/common/malloc_mp.c
similarity index 100%
rename from lib/librte_eal/common/malloc_mp.c
rename to lib/eal/common/malloc_mp.c
diff --git a/lib/librte_eal/common/malloc_mp.h b/lib/eal/common/malloc_mp.h
similarity index 100%
rename from lib/librte_eal/common/malloc_mp.h
rename to lib/eal/common/malloc_mp.h
diff --git a/lib/librte_eal/common/meson.build b/lib/eal/common/meson.build
similarity index 100%
rename from lib/librte_eal/common/meson.build
rename to lib/eal/common/meson.build
diff --git a/lib/librte_eal/common/rte_keepalive.c b/lib/eal/common/rte_keepalive.c
similarity index 100%
rename from lib/librte_eal/common/rte_keepalive.c
rename to lib/eal/common/rte_keepalive.c
diff --git a/lib/librte_eal/common/rte_malloc.c b/lib/eal/common/rte_malloc.c
similarity index 100%
rename from lib/librte_eal/common/rte_malloc.c
rename to lib/eal/common/rte_malloc.c
diff --git a/lib/librte_eal/common/rte_random.c b/lib/eal/common/rte_random.c
similarity index 100%
rename from lib/librte_eal/common/rte_random.c
rename to lib/eal/common/rte_random.c
diff --git a/lib/librte_eal/common/rte_reciprocal.c b/lib/eal/common/rte_reciprocal.c
similarity index 100%
rename from lib/librte_eal/common/rte_reciprocal.c
rename to lib/eal/common/rte_reciprocal.c
diff --git a/lib/librte_eal/common/rte_service.c b/lib/eal/common/rte_service.c
similarity index 100%
rename from lib/librte_eal/common/rte_service.c
rename to lib/eal/common/rte_service.c
diff --git a/lib/librte_eal/common/rte_version.c b/lib/eal/common/rte_version.c
similarity index 100%
rename from lib/librte_eal/common/rte_version.c
rename to lib/eal/common/rte_version.c
diff --git a/lib/librte_eal/freebsd/eal.c b/lib/eal/freebsd/eal.c
similarity index 100%
rename from lib/librte_eal/freebsd/eal.c
rename to lib/eal/freebsd/eal.c
diff --git a/lib/librte_eal/freebsd/eal_alarm.c b/lib/eal/freebsd/eal_alarm.c
similarity index 100%
rename from lib/librte_eal/freebsd/eal_alarm.c
rename to lib/eal/freebsd/eal_alarm.c
diff --git a/lib/librte_eal/freebsd/eal_alarm_private.h b/lib/eal/freebsd/eal_alarm_private.h
similarity index 100%
rename from lib/librte_eal/freebsd/eal_alarm_private.h
rename to lib/eal/freebsd/eal_alarm_private.h
diff --git a/lib/librte_eal/freebsd/eal_cpuflags.c b/lib/eal/freebsd/eal_cpuflags.c
similarity index 100%
rename from lib/librte_eal/freebsd/eal_cpuflags.c
rename to lib/eal/freebsd/eal_cpuflags.c
diff --git a/lib/librte_eal/freebsd/eal_debug.c b/lib/eal/freebsd/eal_debug.c
similarity index 100%
rename from lib/librte_eal/freebsd/eal_debug.c
rename to lib/eal/freebsd/eal_debug.c
diff --git a/lib/librte_eal/freebsd/eal_dev.c b/lib/eal/freebsd/eal_dev.c
similarity index 100%
rename from lib/librte_eal/freebsd/eal_dev.c
rename to lib/eal/freebsd/eal_dev.c
diff --git a/lib/librte_eal/freebsd/eal_hugepage_info.c b/lib/eal/freebsd/eal_hugepage_info.c
similarity index 100%
rename from lib/librte_eal/freebsd/eal_hugepage_info.c
rename to lib/eal/freebsd/eal_hugepage_info.c
diff --git a/lib/librte_eal/freebsd/eal_interrupts.c b/lib/eal/freebsd/eal_interrupts.c
similarity index 100%
rename from lib/librte_eal/freebsd/eal_interrupts.c
rename to lib/eal/freebsd/eal_interrupts.c
diff --git a/lib/librte_eal/freebsd/eal_lcore.c b/lib/eal/freebsd/eal_lcore.c
similarity index 100%
rename from lib/librte_eal/freebsd/eal_lcore.c
rename to lib/eal/freebsd/eal_lcore.c
diff --git a/lib/librte_eal/freebsd/eal_memalloc.c b/lib/eal/freebsd/eal_memalloc.c
similarity index 100%
rename from lib/librte_eal/freebsd/eal_memalloc.c
rename to lib/eal/freebsd/eal_memalloc.c
diff --git a/lib/librte_eal/freebsd/eal_memory.c b/lib/eal/freebsd/eal_memory.c
similarity index 100%
rename from lib/librte_eal/freebsd/eal_memory.c
rename to lib/eal/freebsd/eal_memory.c
diff --git a/lib/librte_eal/freebsd/eal_thread.c b/lib/eal/freebsd/eal_thread.c
similarity index 100%
rename from lib/librte_eal/freebsd/eal_thread.c
rename to lib/eal/freebsd/eal_thread.c
diff --git a/lib/librte_eal/freebsd/eal_timer.c b/lib/eal/freebsd/eal_timer.c
similarity index 100%
rename from lib/librte_eal/freebsd/eal_timer.c
rename to lib/eal/freebsd/eal_timer.c
diff --git a/lib/librte_eal/freebsd/include/meson.build b/lib/eal/freebsd/include/meson.build
similarity index 100%
rename from lib/librte_eal/freebsd/include/meson.build
rename to lib/eal/freebsd/include/meson.build
diff --git a/lib/librte_eal/freebsd/include/rte_os.h b/lib/eal/freebsd/include/rte_os.h
similarity index 100%
rename from lib/librte_eal/freebsd/include/rte_os.h
rename to lib/eal/freebsd/include/rte_os.h
diff --git a/lib/librte_eal/freebsd/meson.build b/lib/eal/freebsd/meson.build
similarity index 100%
rename from lib/librte_eal/freebsd/meson.build
rename to lib/eal/freebsd/meson.build
diff --git a/lib/librte_eal/include/generic/rte_atomic.h b/lib/eal/include/generic/rte_atomic.h
similarity index 100%
rename from lib/librte_eal/include/generic/rte_atomic.h
rename to lib/eal/include/generic/rte_atomic.h
diff --git a/lib/librte_eal/include/generic/rte_byteorder.h b/lib/eal/include/generic/rte_byteorder.h
similarity index 100%
rename from lib/librte_eal/include/generic/rte_byteorder.h
rename to lib/eal/include/generic/rte_byteorder.h
diff --git a/lib/librte_eal/include/generic/rte_cpuflags.h b/lib/eal/include/generic/rte_cpuflags.h
similarity index 100%
rename from lib/librte_eal/include/generic/rte_cpuflags.h
rename to lib/eal/include/generic/rte_cpuflags.h
diff --git a/lib/librte_eal/include/generic/rte_cycles.h b/lib/eal/include/generic/rte_cycles.h
similarity index 100%
rename from lib/librte_eal/include/generic/rte_cycles.h
rename to lib/eal/include/generic/rte_cycles.h
diff --git a/lib/librte_eal/include/generic/rte_io.h b/lib/eal/include/generic/rte_io.h
similarity index 100%
rename from lib/librte_eal/include/generic/rte_io.h
rename to lib/eal/include/generic/rte_io.h
diff --git a/lib/librte_eal/include/generic/rte_mcslock.h b/lib/eal/include/generic/rte_mcslock.h
similarity index 100%
rename from lib/librte_eal/include/generic/rte_mcslock.h
rename to lib/eal/include/generic/rte_mcslock.h
diff --git a/lib/librte_eal/include/generic/rte_memcpy.h b/lib/eal/include/generic/rte_memcpy.h
similarity index 100%
rename from lib/librte_eal/include/generic/rte_memcpy.h
rename to lib/eal/include/generic/rte_memcpy.h
diff --git a/lib/librte_eal/include/generic/rte_pause.h b/lib/eal/include/generic/rte_pause.h
similarity index 100%
rename from lib/librte_eal/include/generic/rte_pause.h
rename to lib/eal/include/generic/rte_pause.h
diff --git a/lib/librte_eal/include/generic/rte_power_intrinsics.h b/lib/eal/include/generic/rte_power_intrinsics.h
similarity index 100%
rename from lib/librte_eal/include/generic/rte_power_intrinsics.h
rename to lib/eal/include/generic/rte_power_intrinsics.h
diff --git a/lib/librte_eal/include/generic/rte_prefetch.h b/lib/eal/include/generic/rte_prefetch.h
similarity index 100%
rename from lib/librte_eal/include/generic/rte_prefetch.h
rename to lib/eal/include/generic/rte_prefetch.h
diff --git a/lib/librte_eal/include/generic/rte_rwlock.h b/lib/eal/include/generic/rte_rwlock.h
similarity index 100%
rename from lib/librte_eal/include/generic/rte_rwlock.h
rename to lib/eal/include/generic/rte_rwlock.h
diff --git a/lib/librte_eal/include/generic/rte_spinlock.h b/lib/eal/include/generic/rte_spinlock.h
similarity index 100%
rename from lib/librte_eal/include/generic/rte_spinlock.h
rename to lib/eal/include/generic/rte_spinlock.h
diff --git a/lib/librte_eal/include/generic/rte_ticketlock.h b/lib/eal/include/generic/rte_ticketlock.h
similarity index 100%
rename from lib/librte_eal/include/generic/rte_ticketlock.h
rename to lib/eal/include/generic/rte_ticketlock.h
diff --git a/lib/librte_eal/include/generic/rte_vect.h b/lib/eal/include/generic/rte_vect.h
similarity index 100%
rename from lib/librte_eal/include/generic/rte_vect.h
rename to lib/eal/include/generic/rte_vect.h
diff --git a/lib/librte_eal/include/meson.build b/lib/eal/include/meson.build
similarity index 100%
rename from lib/librte_eal/include/meson.build
rename to lib/eal/include/meson.build
diff --git a/lib/librte_eal/include/rte_alarm.h b/lib/eal/include/rte_alarm.h
similarity index 100%
rename from lib/librte_eal/include/rte_alarm.h
rename to lib/eal/include/rte_alarm.h
diff --git a/lib/librte_eal/include/rte_bitmap.h b/lib/eal/include/rte_bitmap.h
similarity index 100%
rename from lib/librte_eal/include/rte_bitmap.h
rename to lib/eal/include/rte_bitmap.h
diff --git a/lib/librte_eal/include/rte_bitops.h b/lib/eal/include/rte_bitops.h
similarity index 100%
rename from lib/librte_eal/include/rte_bitops.h
rename to lib/eal/include/rte_bitops.h
diff --git a/lib/librte_eal/include/rte_branch_prediction.h b/lib/eal/include/rte_branch_prediction.h
similarity index 100%
rename from lib/librte_eal/include/rte_branch_prediction.h
rename to lib/eal/include/rte_branch_prediction.h
diff --git a/lib/librte_eal/include/rte_bus.h b/lib/eal/include/rte_bus.h
similarity index 100%
rename from lib/librte_eal/include/rte_bus.h
rename to lib/eal/include/rte_bus.h
diff --git a/lib/librte_eal/include/rte_class.h b/lib/eal/include/rte_class.h
similarity index 100%
rename from lib/librte_eal/include/rte_class.h
rename to lib/eal/include/rte_class.h
diff --git a/lib/librte_eal/include/rte_common.h b/lib/eal/include/rte_common.h
similarity index 100%
rename from lib/librte_eal/include/rte_common.h
rename to lib/eal/include/rte_common.h
diff --git a/lib/librte_eal/include/rte_compat.h b/lib/eal/include/rte_compat.h
similarity index 100%
rename from lib/librte_eal/include/rte_compat.h
rename to lib/eal/include/rte_compat.h
diff --git a/lib/librte_eal/include/rte_debug.h b/lib/eal/include/rte_debug.h
similarity index 100%
rename from lib/librte_eal/include/rte_debug.h
rename to lib/eal/include/rte_debug.h
diff --git a/lib/librte_eal/include/rte_dev.h b/lib/eal/include/rte_dev.h
similarity index 100%
rename from lib/librte_eal/include/rte_dev.h
rename to lib/eal/include/rte_dev.h
diff --git a/lib/librte_eal/include/rte_devargs.h b/lib/eal/include/rte_devargs.h
similarity index 100%
rename from lib/librte_eal/include/rte_devargs.h
rename to lib/eal/include/rte_devargs.h
diff --git a/lib/librte_eal/include/rte_eal.h b/lib/eal/include/rte_eal.h
similarity index 100%
rename from lib/librte_eal/include/rte_eal.h
rename to lib/eal/include/rte_eal.h
diff --git a/lib/librte_eal/include/rte_eal_interrupts.h b/lib/eal/include/rte_eal_interrupts.h
similarity index 100%
rename from lib/librte_eal/include/rte_eal_interrupts.h
rename to lib/eal/include/rte_eal_interrupts.h
diff --git a/lib/librte_eal/include/rte_eal_memconfig.h b/lib/eal/include/rte_eal_memconfig.h
similarity index 100%
rename from lib/librte_eal/include/rte_eal_memconfig.h
rename to lib/eal/include/rte_eal_memconfig.h
diff --git a/lib/librte_eal/include/rte_eal_paging.h b/lib/eal/include/rte_eal_paging.h
similarity index 100%
rename from lib/librte_eal/include/rte_eal_paging.h
rename to lib/eal/include/rte_eal_paging.h
diff --git a/lib/librte_eal/include/rte_eal_trace.h b/lib/eal/include/rte_eal_trace.h
similarity index 100%
rename from lib/librte_eal/include/rte_eal_trace.h
rename to lib/eal/include/rte_eal_trace.h
diff --git a/lib/librte_eal/include/rte_errno.h b/lib/eal/include/rte_errno.h
similarity index 100%
rename from lib/librte_eal/include/rte_errno.h
rename to lib/eal/include/rte_errno.h
diff --git a/lib/librte_eal/include/rte_fbarray.h b/lib/eal/include/rte_fbarray.h
similarity index 100%
rename from lib/librte_eal/include/rte_fbarray.h
rename to lib/eal/include/rte_fbarray.h
diff --git a/lib/librte_eal/include/rte_function_versioning.h b/lib/eal/include/rte_function_versioning.h
similarity index 100%
rename from lib/librte_eal/include/rte_function_versioning.h
rename to lib/eal/include/rte_function_versioning.h
diff --git a/lib/librte_eal/include/rte_hexdump.h b/lib/eal/include/rte_hexdump.h
similarity index 100%
rename from lib/librte_eal/include/rte_hexdump.h
rename to lib/eal/include/rte_hexdump.h
diff --git a/lib/librte_eal/include/rte_hypervisor.h b/lib/eal/include/rte_hypervisor.h
similarity index 100%
rename from lib/librte_eal/include/rte_hypervisor.h
rename to lib/eal/include/rte_hypervisor.h
diff --git a/lib/librte_eal/include/rte_interrupts.h b/lib/eal/include/rte_interrupts.h
similarity index 100%
rename from lib/librte_eal/include/rte_interrupts.h
rename to lib/eal/include/rte_interrupts.h
diff --git a/lib/librte_eal/include/rte_keepalive.h b/lib/eal/include/rte_keepalive.h
similarity index 100%
rename from lib/librte_eal/include/rte_keepalive.h
rename to lib/eal/include/rte_keepalive.h
diff --git a/lib/librte_eal/include/rte_launch.h b/lib/eal/include/rte_launch.h
similarity index 100%
rename from lib/librte_eal/include/rte_launch.h
rename to lib/eal/include/rte_launch.h
diff --git a/lib/librte_eal/include/rte_lcore.h b/lib/eal/include/rte_lcore.h
similarity index 100%
rename from lib/librte_eal/include/rte_lcore.h
rename to lib/eal/include/rte_lcore.h
diff --git a/lib/librte_eal/include/rte_log.h b/lib/eal/include/rte_log.h
similarity index 100%
rename from lib/librte_eal/include/rte_log.h
rename to lib/eal/include/rte_log.h
diff --git a/lib/librte_eal/include/rte_malloc.h b/lib/eal/include/rte_malloc.h
similarity index 100%
rename from lib/librte_eal/include/rte_malloc.h
rename to lib/eal/include/rte_malloc.h
diff --git a/lib/librte_eal/include/rte_memory.h b/lib/eal/include/rte_memory.h
similarity index 100%
rename from lib/librte_eal/include/rte_memory.h
rename to lib/eal/include/rte_memory.h
diff --git a/lib/librte_eal/include/rte_memzone.h b/lib/eal/include/rte_memzone.h
similarity index 100%
rename from lib/librte_eal/include/rte_memzone.h
rename to lib/eal/include/rte_memzone.h
diff --git a/lib/librte_eal/include/rte_pci_dev_feature_defs.h b/lib/eal/include/rte_pci_dev_feature_defs.h
similarity index 100%
rename from lib/librte_eal/include/rte_pci_dev_feature_defs.h
rename to lib/eal/include/rte_pci_dev_feature_defs.h
diff --git a/lib/librte_eal/include/rte_pci_dev_features.h b/lib/eal/include/rte_pci_dev_features.h
similarity index 100%
rename from lib/librte_eal/include/rte_pci_dev_features.h
rename to lib/eal/include/rte_pci_dev_features.h
diff --git a/lib/librte_eal/include/rte_per_lcore.h b/lib/eal/include/rte_per_lcore.h
similarity index 100%
rename from lib/librte_eal/include/rte_per_lcore.h
rename to lib/eal/include/rte_per_lcore.h
diff --git a/lib/librte_eal/include/rte_random.h b/lib/eal/include/rte_random.h
similarity index 100%
rename from lib/librte_eal/include/rte_random.h
rename to lib/eal/include/rte_random.h
diff --git a/lib/librte_eal/include/rte_reciprocal.h b/lib/eal/include/rte_reciprocal.h
similarity index 100%
rename from lib/librte_eal/include/rte_reciprocal.h
rename to lib/eal/include/rte_reciprocal.h
diff --git a/lib/librte_eal/include/rte_service.h b/lib/eal/include/rte_service.h
similarity index 100%
rename from lib/librte_eal/include/rte_service.h
rename to lib/eal/include/rte_service.h
diff --git a/lib/librte_eal/include/rte_service_component.h b/lib/eal/include/rte_service_component.h
similarity index 100%
rename from lib/librte_eal/include/rte_service_component.h
rename to lib/eal/include/rte_service_component.h
diff --git a/lib/librte_eal/include/rte_string_fns.h b/lib/eal/include/rte_string_fns.h
similarity index 100%
rename from lib/librte_eal/include/rte_string_fns.h
rename to lib/eal/include/rte_string_fns.h
diff --git a/lib/librte_eal/include/rte_tailq.h b/lib/eal/include/rte_tailq.h
similarity index 100%
rename from lib/librte_eal/include/rte_tailq.h
rename to lib/eal/include/rte_tailq.h
diff --git a/lib/librte_eal/include/rte_test.h b/lib/eal/include/rte_test.h
similarity index 100%
rename from lib/librte_eal/include/rte_test.h
rename to lib/eal/include/rte_test.h
diff --git a/lib/librte_eal/include/rte_thread.h b/lib/eal/include/rte_thread.h
similarity index 100%
rename from lib/librte_eal/include/rte_thread.h
rename to lib/eal/include/rte_thread.h
diff --git a/lib/librte_eal/include/rte_time.h b/lib/eal/include/rte_time.h
similarity index 100%
rename from lib/librte_eal/include/rte_time.h
rename to lib/eal/include/rte_time.h
diff --git a/lib/librte_eal/include/rte_trace.h b/lib/eal/include/rte_trace.h
similarity index 100%
rename from lib/librte_eal/include/rte_trace.h
rename to lib/eal/include/rte_trace.h
diff --git a/lib/librte_eal/include/rte_trace_point.h b/lib/eal/include/rte_trace_point.h
similarity index 100%
rename from lib/librte_eal/include/rte_trace_point.h
rename to lib/eal/include/rte_trace_point.h
diff --git a/lib/librte_eal/include/rte_trace_point_register.h b/lib/eal/include/rte_trace_point_register.h
similarity index 100%
rename from lib/librte_eal/include/rte_trace_point_register.h
rename to lib/eal/include/rte_trace_point_register.h
diff --git a/lib/librte_eal/include/rte_uuid.h b/lib/eal/include/rte_uuid.h
similarity index 100%
rename from lib/librte_eal/include/rte_uuid.h
rename to lib/eal/include/rte_uuid.h
diff --git a/lib/librte_eal/include/rte_version.h b/lib/eal/include/rte_version.h
similarity index 100%
rename from lib/librte_eal/include/rte_version.h
rename to lib/eal/include/rte_version.h
diff --git a/lib/librte_eal/include/rte_vfio.h b/lib/eal/include/rte_vfio.h
similarity index 100%
rename from lib/librte_eal/include/rte_vfio.h
rename to lib/eal/include/rte_vfio.h
diff --git a/lib/librte_eal/linux/eal.c b/lib/eal/linux/eal.c
similarity index 100%
rename from lib/librte_eal/linux/eal.c
rename to lib/eal/linux/eal.c
diff --git a/lib/librte_eal/linux/eal_alarm.c b/lib/eal/linux/eal_alarm.c
similarity index 100%
rename from lib/librte_eal/linux/eal_alarm.c
rename to lib/eal/linux/eal_alarm.c
diff --git a/lib/librte_eal/linux/eal_cpuflags.c b/lib/eal/linux/eal_cpuflags.c
similarity index 100%
rename from lib/librte_eal/linux/eal_cpuflags.c
rename to lib/eal/linux/eal_cpuflags.c
diff --git a/lib/librte_eal/linux/eal_debug.c b/lib/eal/linux/eal_debug.c
similarity index 100%
rename from lib/librte_eal/linux/eal_debug.c
rename to lib/eal/linux/eal_debug.c
diff --git a/lib/librte_eal/linux/eal_dev.c b/lib/eal/linux/eal_dev.c
similarity index 100%
rename from lib/librte_eal/linux/eal_dev.c
rename to lib/eal/linux/eal_dev.c
diff --git a/lib/librte_eal/linux/eal_hugepage_info.c b/lib/eal/linux/eal_hugepage_info.c
similarity index 100%
rename from lib/librte_eal/linux/eal_hugepage_info.c
rename to lib/eal/linux/eal_hugepage_info.c
diff --git a/lib/librte_eal/linux/eal_interrupts.c b/lib/eal/linux/eal_interrupts.c
similarity index 100%
rename from lib/librte_eal/linux/eal_interrupts.c
rename to lib/eal/linux/eal_interrupts.c
diff --git a/lib/librte_eal/linux/eal_lcore.c b/lib/eal/linux/eal_lcore.c
similarity index 100%
rename from lib/librte_eal/linux/eal_lcore.c
rename to lib/eal/linux/eal_lcore.c
diff --git a/lib/librte_eal/linux/eal_log.c b/lib/eal/linux/eal_log.c
similarity index 100%
rename from lib/librte_eal/linux/eal_log.c
rename to lib/eal/linux/eal_log.c
diff --git a/lib/librte_eal/linux/eal_memalloc.c b/lib/eal/linux/eal_memalloc.c
similarity index 100%
rename from lib/librte_eal/linux/eal_memalloc.c
rename to lib/eal/linux/eal_memalloc.c
diff --git a/lib/librte_eal/linux/eal_memory.c b/lib/eal/linux/eal_memory.c
similarity index 100%
rename from lib/librte_eal/linux/eal_memory.c
rename to lib/eal/linux/eal_memory.c
diff --git a/lib/librte_eal/linux/eal_thread.c b/lib/eal/linux/eal_thread.c
similarity index 100%
rename from lib/librte_eal/linux/eal_thread.c
rename to lib/eal/linux/eal_thread.c
diff --git a/lib/librte_eal/linux/eal_timer.c b/lib/eal/linux/eal_timer.c
similarity index 100%
rename from lib/librte_eal/linux/eal_timer.c
rename to lib/eal/linux/eal_timer.c
diff --git a/lib/librte_eal/linux/eal_vfio.c b/lib/eal/linux/eal_vfio.c
similarity index 100%
rename from lib/librte_eal/linux/eal_vfio.c
rename to lib/eal/linux/eal_vfio.c
diff --git a/lib/librte_eal/linux/eal_vfio.h b/lib/eal/linux/eal_vfio.h
similarity index 100%
rename from lib/librte_eal/linux/eal_vfio.h
rename to lib/eal/linux/eal_vfio.h
diff --git a/lib/librte_eal/linux/eal_vfio_mp_sync.c b/lib/eal/linux/eal_vfio_mp_sync.c
similarity index 100%
rename from lib/librte_eal/linux/eal_vfio_mp_sync.c
rename to lib/eal/linux/eal_vfio_mp_sync.c
diff --git a/lib/librte_eal/linux/include/meson.build b/lib/eal/linux/include/meson.build
similarity index 100%
rename from lib/librte_eal/linux/include/meson.build
rename to lib/eal/linux/include/meson.build
diff --git a/lib/librte_eal/linux/include/rte_os.h b/lib/eal/linux/include/rte_os.h
similarity index 100%
rename from lib/librte_eal/linux/include/rte_os.h
rename to lib/eal/linux/include/rte_os.h
diff --git a/lib/librte_eal/linux/meson.build b/lib/eal/linux/meson.build
similarity index 100%
rename from lib/librte_eal/linux/meson.build
rename to lib/eal/linux/meson.build
diff --git a/lib/librte_eal/meson.build b/lib/eal/meson.build
similarity index 100%
rename from lib/librte_eal/meson.build
rename to lib/eal/meson.build
diff --git a/lib/librte_eal/ppc/include/meson.build b/lib/eal/ppc/include/meson.build
similarity index 100%
rename from lib/librte_eal/ppc/include/meson.build
rename to lib/eal/ppc/include/meson.build
diff --git a/lib/librte_eal/ppc/include/rte_altivec.h b/lib/eal/ppc/include/rte_altivec.h
similarity index 100%
rename from lib/librte_eal/ppc/include/rte_altivec.h
rename to lib/eal/ppc/include/rte_altivec.h
diff --git a/lib/librte_eal/ppc/include/rte_atomic.h b/lib/eal/ppc/include/rte_atomic.h
similarity index 100%
rename from lib/librte_eal/ppc/include/rte_atomic.h
rename to lib/eal/ppc/include/rte_atomic.h
diff --git a/lib/librte_eal/ppc/include/rte_byteorder.h b/lib/eal/ppc/include/rte_byteorder.h
similarity index 100%
rename from lib/librte_eal/ppc/include/rte_byteorder.h
rename to lib/eal/ppc/include/rte_byteorder.h
diff --git a/lib/librte_eal/ppc/include/rte_cpuflags.h b/lib/eal/ppc/include/rte_cpuflags.h
similarity index 100%
rename from lib/librte_eal/ppc/include/rte_cpuflags.h
rename to lib/eal/ppc/include/rte_cpuflags.h
diff --git a/lib/librte_eal/ppc/include/rte_cycles.h b/lib/eal/ppc/include/rte_cycles.h
similarity index 100%
rename from lib/librte_eal/ppc/include/rte_cycles.h
rename to lib/eal/ppc/include/rte_cycles.h
diff --git a/lib/librte_eal/ppc/include/rte_io.h b/lib/eal/ppc/include/rte_io.h
similarity index 100%
rename from lib/librte_eal/ppc/include/rte_io.h
rename to lib/eal/ppc/include/rte_io.h
diff --git a/lib/librte_eal/ppc/include/rte_mcslock.h b/lib/eal/ppc/include/rte_mcslock.h
similarity index 100%
rename from lib/librte_eal/ppc/include/rte_mcslock.h
rename to lib/eal/ppc/include/rte_mcslock.h
diff --git a/lib/librte_eal/ppc/include/rte_memcpy.h b/lib/eal/ppc/include/rte_memcpy.h
similarity index 100%
rename from lib/librte_eal/ppc/include/rte_memcpy.h
rename to lib/eal/ppc/include/rte_memcpy.h
diff --git a/lib/librte_eal/ppc/include/rte_pause.h b/lib/eal/ppc/include/rte_pause.h
similarity index 100%
rename from lib/librte_eal/ppc/include/rte_pause.h
rename to lib/eal/ppc/include/rte_pause.h
diff --git a/lib/librte_eal/ppc/include/rte_power_intrinsics.h b/lib/eal/ppc/include/rte_power_intrinsics.h
similarity index 100%
rename from lib/librte_eal/ppc/include/rte_power_intrinsics.h
rename to lib/eal/ppc/include/rte_power_intrinsics.h
diff --git a/lib/librte_eal/ppc/include/rte_prefetch.h b/lib/eal/ppc/include/rte_prefetch.h
similarity index 100%
rename from lib/librte_eal/ppc/include/rte_prefetch.h
rename to lib/eal/ppc/include/rte_prefetch.h
diff --git a/lib/librte_eal/ppc/include/rte_rwlock.h b/lib/eal/ppc/include/rte_rwlock.h
similarity index 100%
rename from lib/librte_eal/ppc/include/rte_rwlock.h
rename to lib/eal/ppc/include/rte_rwlock.h
diff --git a/lib/librte_eal/ppc/include/rte_spinlock.h b/lib/eal/ppc/include/rte_spinlock.h
similarity index 100%
rename from lib/librte_eal/ppc/include/rte_spinlock.h
rename to lib/eal/ppc/include/rte_spinlock.h
diff --git a/lib/librte_eal/ppc/include/rte_ticketlock.h b/lib/eal/ppc/include/rte_ticketlock.h
similarity index 100%
rename from lib/librte_eal/ppc/include/rte_ticketlock.h
rename to lib/eal/ppc/include/rte_ticketlock.h
diff --git a/lib/librte_eal/ppc/include/rte_vect.h b/lib/eal/ppc/include/rte_vect.h
similarity index 100%
rename from lib/librte_eal/ppc/include/rte_vect.h
rename to lib/eal/ppc/include/rte_vect.h
diff --git a/lib/librte_eal/ppc/meson.build b/lib/eal/ppc/meson.build
similarity index 100%
rename from lib/librte_eal/ppc/meson.build
rename to lib/eal/ppc/meson.build
diff --git a/lib/librte_eal/ppc/rte_cpuflags.c b/lib/eal/ppc/rte_cpuflags.c
similarity index 100%
rename from lib/librte_eal/ppc/rte_cpuflags.c
rename to lib/eal/ppc/rte_cpuflags.c
diff --git a/lib/librte_eal/ppc/rte_cycles.c b/lib/eal/ppc/rte_cycles.c
similarity index 100%
rename from lib/librte_eal/ppc/rte_cycles.c
rename to lib/eal/ppc/rte_cycles.c
diff --git a/lib/librte_eal/ppc/rte_hypervisor.c b/lib/eal/ppc/rte_hypervisor.c
similarity index 100%
rename from lib/librte_eal/ppc/rte_hypervisor.c
rename to lib/eal/ppc/rte_hypervisor.c
diff --git a/lib/librte_eal/ppc/rte_power_intrinsics.c b/lib/eal/ppc/rte_power_intrinsics.c
similarity index 100%
rename from lib/librte_eal/ppc/rte_power_intrinsics.c
rename to lib/eal/ppc/rte_power_intrinsics.c
diff --git a/lib/librte_eal/rte_eal_exports.def b/lib/eal/rte_eal_exports.def
similarity index 100%
rename from lib/librte_eal/rte_eal_exports.def
rename to lib/eal/rte_eal_exports.def
diff --git a/lib/librte_eal/unix/eal_file.c b/lib/eal/unix/eal_file.c
similarity index 100%
rename from lib/librte_eal/unix/eal_file.c
rename to lib/eal/unix/eal_file.c
diff --git a/lib/librte_eal/unix/eal_unix_memory.c b/lib/eal/unix/eal_unix_memory.c
similarity index 100%
rename from lib/librte_eal/unix/eal_unix_memory.c
rename to lib/eal/unix/eal_unix_memory.c
diff --git a/lib/librte_eal/unix/eal_unix_timer.c b/lib/eal/unix/eal_unix_timer.c
similarity index 100%
rename from lib/librte_eal/unix/eal_unix_timer.c
rename to lib/eal/unix/eal_unix_timer.c
diff --git a/lib/librte_eal/unix/meson.build b/lib/eal/unix/meson.build
similarity index 100%
rename from lib/librte_eal/unix/meson.build
rename to lib/eal/unix/meson.build
diff --git a/lib/librte_eal/unix/rte_thread.c b/lib/eal/unix/rte_thread.c
similarity index 100%
rename from lib/librte_eal/unix/rte_thread.c
rename to lib/eal/unix/rte_thread.c
diff --git a/lib/librte_eal/version.map b/lib/eal/version.map
similarity index 100%
rename from lib/librte_eal/version.map
rename to lib/eal/version.map
diff --git a/lib/librte_eal/windows/eal.c b/lib/eal/windows/eal.c
similarity index 100%
rename from lib/librte_eal/windows/eal.c
rename to lib/eal/windows/eal.c
diff --git a/lib/librte_eal/windows/eal_alarm.c b/lib/eal/windows/eal_alarm.c
similarity index 100%
rename from lib/librte_eal/windows/eal_alarm.c
rename to lib/eal/windows/eal_alarm.c
diff --git a/lib/librte_eal/windows/eal_debug.c b/lib/eal/windows/eal_debug.c
similarity index 100%
rename from lib/librte_eal/windows/eal_debug.c
rename to lib/eal/windows/eal_debug.c
diff --git a/lib/librte_eal/windows/eal_file.c b/lib/eal/windows/eal_file.c
similarity index 100%
rename from lib/librte_eal/windows/eal_file.c
rename to lib/eal/windows/eal_file.c
diff --git a/lib/librte_eal/windows/eal_hugepages.c b/lib/eal/windows/eal_hugepages.c
similarity index 100%
rename from lib/librte_eal/windows/eal_hugepages.c
rename to lib/eal/windows/eal_hugepages.c
diff --git a/lib/librte_eal/windows/eal_interrupts.c b/lib/eal/windows/eal_interrupts.c
similarity index 100%
rename from lib/librte_eal/windows/eal_interrupts.c
rename to lib/eal/windows/eal_interrupts.c
diff --git a/lib/librte_eal/windows/eal_lcore.c b/lib/eal/windows/eal_lcore.c
similarity index 100%
rename from lib/librte_eal/windows/eal_lcore.c
rename to lib/eal/windows/eal_lcore.c
diff --git a/lib/librte_eal/windows/eal_log.c b/lib/eal/windows/eal_log.c
similarity index 100%
rename from lib/librte_eal/windows/eal_log.c
rename to lib/eal/windows/eal_log.c
diff --git a/lib/librte_eal/windows/eal_memalloc.c b/lib/eal/windows/eal_memalloc.c
similarity index 100%
rename from lib/librte_eal/windows/eal_memalloc.c
rename to lib/eal/windows/eal_memalloc.c
diff --git a/lib/librte_eal/windows/eal_memory.c b/lib/eal/windows/eal_memory.c
similarity index 100%
rename from lib/librte_eal/windows/eal_memory.c
rename to lib/eal/windows/eal_memory.c
diff --git a/lib/librte_eal/windows/eal_mp.c b/lib/eal/windows/eal_mp.c
similarity index 100%
rename from lib/librte_eal/windows/eal_mp.c
rename to lib/eal/windows/eal_mp.c
diff --git a/lib/librte_eal/windows/eal_thread.c b/lib/eal/windows/eal_thread.c
similarity index 100%
rename from lib/librte_eal/windows/eal_thread.c
rename to lib/eal/windows/eal_thread.c
diff --git a/lib/librte_eal/windows/eal_timer.c b/lib/eal/windows/eal_timer.c
similarity index 100%
rename from lib/librte_eal/windows/eal_timer.c
rename to lib/eal/windows/eal_timer.c
diff --git a/lib/librte_eal/windows/eal_windows.h b/lib/eal/windows/eal_windows.h
similarity index 100%
rename from lib/librte_eal/windows/eal_windows.h
rename to lib/eal/windows/eal_windows.h
diff --git a/lib/librte_eal/windows/fnmatch.c b/lib/eal/windows/fnmatch.c
similarity index 100%
rename from lib/librte_eal/windows/fnmatch.c
rename to lib/eal/windows/fnmatch.c
diff --git a/lib/librte_eal/windows/getopt.c b/lib/eal/windows/getopt.c
similarity index 100%
rename from lib/librte_eal/windows/getopt.c
rename to lib/eal/windows/getopt.c
diff --git a/lib/librte_eal/windows/include/arpa/inet.h b/lib/eal/windows/include/arpa/inet.h
similarity index 100%
rename from lib/librte_eal/windows/include/arpa/inet.h
rename to lib/eal/windows/include/arpa/inet.h
diff --git a/lib/librte_eal/windows/include/dirent.h b/lib/eal/windows/include/dirent.h
similarity index 100%
rename from lib/librte_eal/windows/include/dirent.h
rename to lib/eal/windows/include/dirent.h
diff --git a/lib/librte_eal/windows/include/fnmatch.h b/lib/eal/windows/include/fnmatch.h
similarity index 100%
rename from lib/librte_eal/windows/include/fnmatch.h
rename to lib/eal/windows/include/fnmatch.h
diff --git a/lib/librte_eal/windows/include/getopt.h b/lib/eal/windows/include/getopt.h
similarity index 100%
rename from lib/librte_eal/windows/include/getopt.h
rename to lib/eal/windows/include/getopt.h
diff --git a/lib/librte_eal/windows/include/meson.build b/lib/eal/windows/include/meson.build
similarity index 100%
rename from lib/librte_eal/windows/include/meson.build
rename to lib/eal/windows/include/meson.build
diff --git a/lib/librte_eal/windows/include/netinet/in.h b/lib/eal/windows/include/netinet/in.h
similarity index 100%
rename from lib/librte_eal/windows/include/netinet/in.h
rename to lib/eal/windows/include/netinet/in.h
diff --git a/lib/librte_eal/windows/include/netinet/ip.h b/lib/eal/windows/include/netinet/ip.h
similarity index 100%
rename from lib/librte_eal/windows/include/netinet/ip.h
rename to lib/eal/windows/include/netinet/ip.h
diff --git a/lib/librte_eal/windows/include/pthread.h b/lib/eal/windows/include/pthread.h
similarity index 100%
rename from lib/librte_eal/windows/include/pthread.h
rename to lib/eal/windows/include/pthread.h
diff --git a/lib/librte_eal/windows/include/regex.h b/lib/eal/windows/include/regex.h
similarity index 100%
rename from lib/librte_eal/windows/include/regex.h
rename to lib/eal/windows/include/regex.h
diff --git a/lib/librte_eal/windows/include/rte_os.h b/lib/eal/windows/include/rte_os.h
similarity index 100%
rename from lib/librte_eal/windows/include/rte_os.h
rename to lib/eal/windows/include/rte_os.h
diff --git a/lib/librte_eal/windows/include/rte_virt2phys.h b/lib/eal/windows/include/rte_virt2phys.h
similarity index 100%
rename from lib/librte_eal/windows/include/rte_virt2phys.h
rename to lib/eal/windows/include/rte_virt2phys.h
diff --git a/lib/librte_eal/windows/include/rte_windows.h b/lib/eal/windows/include/rte_windows.h
similarity index 100%
rename from lib/librte_eal/windows/include/rte_windows.h
rename to lib/eal/windows/include/rte_windows.h
diff --git a/lib/librte_eal/windows/include/sched.h b/lib/eal/windows/include/sched.h
similarity index 100%
rename from lib/librte_eal/windows/include/sched.h
rename to lib/eal/windows/include/sched.h
diff --git a/lib/librte_eal/windows/include/sys/queue.h b/lib/eal/windows/include/sys/queue.h
similarity index 100%
rename from lib/librte_eal/windows/include/sys/queue.h
rename to lib/eal/windows/include/sys/queue.h
diff --git a/lib/librte_eal/windows/include/sys/socket.h b/lib/eal/windows/include/sys/socket.h
similarity index 100%
rename from lib/librte_eal/windows/include/sys/socket.h
rename to lib/eal/windows/include/sys/socket.h
diff --git a/lib/librte_eal/windows/include/unistd.h b/lib/eal/windows/include/unistd.h
similarity index 100%
rename from lib/librte_eal/windows/include/unistd.h
rename to lib/eal/windows/include/unistd.h
diff --git a/lib/librte_eal/windows/meson.build b/lib/eal/windows/meson.build
similarity index 100%
rename from lib/librte_eal/windows/meson.build
rename to lib/eal/windows/meson.build
diff --git a/lib/librte_eal/windows/rte_thread.c b/lib/eal/windows/rte_thread.c
similarity index 100%
rename from lib/librte_eal/windows/rte_thread.c
rename to lib/eal/windows/rte_thread.c
diff --git a/lib/librte_eal/x86/include/meson.build b/lib/eal/x86/include/meson.build
similarity index 100%
rename from lib/librte_eal/x86/include/meson.build
rename to lib/eal/x86/include/meson.build
diff --git a/lib/librte_eal/x86/include/rte_atomic.h b/lib/eal/x86/include/rte_atomic.h
similarity index 100%
rename from lib/librte_eal/x86/include/rte_atomic.h
rename to lib/eal/x86/include/rte_atomic.h
diff --git a/lib/librte_eal/x86/include/rte_atomic_32.h b/lib/eal/x86/include/rte_atomic_32.h
similarity index 100%
rename from lib/librte_eal/x86/include/rte_atomic_32.h
rename to lib/eal/x86/include/rte_atomic_32.h
diff --git a/lib/librte_eal/x86/include/rte_atomic_64.h b/lib/eal/x86/include/rte_atomic_64.h
similarity index 100%
rename from lib/librte_eal/x86/include/rte_atomic_64.h
rename to lib/eal/x86/include/rte_atomic_64.h
diff --git a/lib/librte_eal/x86/include/rte_byteorder.h b/lib/eal/x86/include/rte_byteorder.h
similarity index 100%
rename from lib/librte_eal/x86/include/rte_byteorder.h
rename to lib/eal/x86/include/rte_byteorder.h
diff --git a/lib/librte_eal/x86/include/rte_byteorder_32.h b/lib/eal/x86/include/rte_byteorder_32.h
similarity index 100%
rename from lib/librte_eal/x86/include/rte_byteorder_32.h
rename to lib/eal/x86/include/rte_byteorder_32.h
diff --git a/lib/librte_eal/x86/include/rte_byteorder_64.h b/lib/eal/x86/include/rte_byteorder_64.h
similarity index 100%
rename from lib/librte_eal/x86/include/rte_byteorder_64.h
rename to lib/eal/x86/include/rte_byteorder_64.h
diff --git a/lib/librte_eal/x86/include/rte_cpuflags.h b/lib/eal/x86/include/rte_cpuflags.h
similarity index 100%
rename from lib/librte_eal/x86/include/rte_cpuflags.h
rename to lib/eal/x86/include/rte_cpuflags.h
diff --git a/lib/librte_eal/x86/include/rte_cycles.h b/lib/eal/x86/include/rte_cycles.h
similarity index 100%
rename from lib/librte_eal/x86/include/rte_cycles.h
rename to lib/eal/x86/include/rte_cycles.h
diff --git a/lib/librte_eal/x86/include/rte_io.h b/lib/eal/x86/include/rte_io.h
similarity index 100%
rename from lib/librte_eal/x86/include/rte_io.h
rename to lib/eal/x86/include/rte_io.h
diff --git a/lib/librte_eal/x86/include/rte_mcslock.h b/lib/eal/x86/include/rte_mcslock.h
similarity index 100%
rename from lib/librte_eal/x86/include/rte_mcslock.h
rename to lib/eal/x86/include/rte_mcslock.h
diff --git a/lib/librte_eal/x86/include/rte_memcpy.h b/lib/eal/x86/include/rte_memcpy.h
similarity index 100%
rename from lib/librte_eal/x86/include/rte_memcpy.h
rename to lib/eal/x86/include/rte_memcpy.h
diff --git a/lib/librte_eal/x86/include/rte_pause.h b/lib/eal/x86/include/rte_pause.h
similarity index 100%
rename from lib/librte_eal/x86/include/rte_pause.h
rename to lib/eal/x86/include/rte_pause.h
diff --git a/lib/librte_eal/x86/include/rte_power_intrinsics.h b/lib/eal/x86/include/rte_power_intrinsics.h
similarity index 100%
rename from lib/librte_eal/x86/include/rte_power_intrinsics.h
rename to lib/eal/x86/include/rte_power_intrinsics.h
diff --git a/lib/librte_eal/x86/include/rte_prefetch.h b/lib/eal/x86/include/rte_prefetch.h
similarity index 100%
rename from lib/librte_eal/x86/include/rte_prefetch.h
rename to lib/eal/x86/include/rte_prefetch.h
diff --git a/lib/librte_eal/x86/include/rte_rtm.h b/lib/eal/x86/include/rte_rtm.h
similarity index 100%
rename from lib/librte_eal/x86/include/rte_rtm.h
rename to lib/eal/x86/include/rte_rtm.h
diff --git a/lib/librte_eal/x86/include/rte_rwlock.h b/lib/eal/x86/include/rte_rwlock.h
similarity index 100%
rename from lib/librte_eal/x86/include/rte_rwlock.h
rename to lib/eal/x86/include/rte_rwlock.h
diff --git a/lib/librte_eal/x86/include/rte_spinlock.h b/lib/eal/x86/include/rte_spinlock.h
similarity index 100%
rename from lib/librte_eal/x86/include/rte_spinlock.h
rename to lib/eal/x86/include/rte_spinlock.h
diff --git a/lib/librte_eal/x86/include/rte_ticketlock.h b/lib/eal/x86/include/rte_ticketlock.h
similarity index 100%
rename from lib/librte_eal/x86/include/rte_ticketlock.h
rename to lib/eal/x86/include/rte_ticketlock.h
diff --git a/lib/librte_eal/x86/include/rte_vect.h b/lib/eal/x86/include/rte_vect.h
similarity index 100%
rename from lib/librte_eal/x86/include/rte_vect.h
rename to lib/eal/x86/include/rte_vect.h
diff --git a/lib/librte_eal/x86/meson.build b/lib/eal/x86/meson.build
similarity index 100%
rename from lib/librte_eal/x86/meson.build
rename to lib/eal/x86/meson.build
diff --git a/lib/librte_eal/x86/rte_cpuflags.c b/lib/eal/x86/rte_cpuflags.c
similarity index 100%
rename from lib/librte_eal/x86/rte_cpuflags.c
rename to lib/eal/x86/rte_cpuflags.c
diff --git a/lib/librte_eal/x86/rte_cpuid.h b/lib/eal/x86/rte_cpuid.h
similarity index 100%
rename from lib/librte_eal/x86/rte_cpuid.h
rename to lib/eal/x86/rte_cpuid.h
diff --git a/lib/librte_eal/x86/rte_cycles.c b/lib/eal/x86/rte_cycles.c
similarity index 100%
rename from lib/librte_eal/x86/rte_cycles.c
rename to lib/eal/x86/rte_cycles.c
diff --git a/lib/librte_eal/x86/rte_hypervisor.c b/lib/eal/x86/rte_hypervisor.c
similarity index 100%
rename from lib/librte_eal/x86/rte_hypervisor.c
rename to lib/eal/x86/rte_hypervisor.c
diff --git a/lib/librte_eal/x86/rte_power_intrinsics.c b/lib/eal/x86/rte_power_intrinsics.c
similarity index 100%
rename from lib/librte_eal/x86/rte_power_intrinsics.c
rename to lib/eal/x86/rte_power_intrinsics.c
diff --git a/lib/librte_eal/x86/rte_spinlock.c b/lib/eal/x86/rte_spinlock.c
similarity index 100%
rename from lib/librte_eal/x86/rte_spinlock.c
rename to lib/eal/x86/rte_spinlock.c
diff --git a/lib/librte_efd/meson.build b/lib/efd/meson.build
similarity index 100%
rename from lib/librte_efd/meson.build
rename to lib/efd/meson.build
diff --git a/lib/librte_efd/rte_efd.c b/lib/efd/rte_efd.c
similarity index 100%
rename from lib/librte_efd/rte_efd.c
rename to lib/efd/rte_efd.c
diff --git a/lib/librte_efd/rte_efd.h b/lib/efd/rte_efd.h
similarity index 100%
rename from lib/librte_efd/rte_efd.h
rename to lib/efd/rte_efd.h
diff --git a/lib/librte_efd/rte_efd_arm64.h b/lib/efd/rte_efd_arm64.h
similarity index 100%
rename from lib/librte_efd/rte_efd_arm64.h
rename to lib/efd/rte_efd_arm64.h
diff --git a/lib/librte_efd/rte_efd_x86.h b/lib/efd/rte_efd_x86.h
similarity index 100%
rename from lib/librte_efd/rte_efd_x86.h
rename to lib/efd/rte_efd_x86.h
diff --git a/lib/librte_efd/version.map b/lib/efd/version.map
similarity index 100%
rename from lib/librte_efd/version.map
rename to lib/efd/version.map
diff --git a/lib/librte_ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h
similarity index 100%
rename from lib/librte_ethdev/ethdev_driver.h
rename to lib/ethdev/ethdev_driver.h
diff --git a/lib/librte_ethdev/ethdev_pci.h b/lib/ethdev/ethdev_pci.h
similarity index 100%
rename from lib/librte_ethdev/ethdev_pci.h
rename to lib/ethdev/ethdev_pci.h
diff --git a/lib/librte_ethdev/ethdev_private.c b/lib/ethdev/ethdev_private.c
similarity index 100%
rename from lib/librte_ethdev/ethdev_private.c
rename to lib/ethdev/ethdev_private.c
diff --git a/lib/librte_ethdev/ethdev_private.h b/lib/ethdev/ethdev_private.h
similarity index 100%
rename from lib/librte_ethdev/ethdev_private.h
rename to lib/ethdev/ethdev_private.h
diff --git a/lib/librte_ethdev/ethdev_profile.c b/lib/ethdev/ethdev_profile.c
similarity index 100%
rename from lib/librte_ethdev/ethdev_profile.c
rename to lib/ethdev/ethdev_profile.c
diff --git a/lib/librte_ethdev/ethdev_profile.h b/lib/ethdev/ethdev_profile.h
similarity index 100%
rename from lib/librte_ethdev/ethdev_profile.h
rename to lib/ethdev/ethdev_profile.h
diff --git a/lib/librte_ethdev/ethdev_trace_points.c b/lib/ethdev/ethdev_trace_points.c
similarity index 100%
rename from lib/librte_ethdev/ethdev_trace_points.c
rename to lib/ethdev/ethdev_trace_points.c
diff --git a/lib/librte_ethdev/ethdev_vdev.h b/lib/ethdev/ethdev_vdev.h
similarity index 100%
rename from lib/librte_ethdev/ethdev_vdev.h
rename to lib/ethdev/ethdev_vdev.h
diff --git a/lib/librte_ethdev/meson.build b/lib/ethdev/meson.build
similarity index 100%
rename from lib/librte_ethdev/meson.build
rename to lib/ethdev/meson.build
diff --git a/lib/librte_ethdev/rte_class_eth.c b/lib/ethdev/rte_class_eth.c
similarity index 100%
rename from lib/librte_ethdev/rte_class_eth.c
rename to lib/ethdev/rte_class_eth.c
diff --git a/lib/librte_ethdev/rte_dev_info.h b/lib/ethdev/rte_dev_info.h
similarity index 100%
rename from lib/librte_ethdev/rte_dev_info.h
rename to lib/ethdev/rte_dev_info.h
diff --git a/lib/librte_ethdev/rte_eth_ctrl.h b/lib/ethdev/rte_eth_ctrl.h
similarity index 100%
rename from lib/librte_ethdev/rte_eth_ctrl.h
rename to lib/ethdev/rte_eth_ctrl.h
diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
similarity index 100%
rename from lib/librte_ethdev/rte_ethdev.c
rename to lib/ethdev/rte_ethdev.c
diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h
similarity index 100%
rename from lib/librte_ethdev/rte_ethdev.h
rename to lib/ethdev/rte_ethdev.h
diff --git a/lib/librte_ethdev/rte_ethdev_core.h b/lib/ethdev/rte_ethdev_core.h
similarity index 100%
rename from lib/librte_ethdev/rte_ethdev_core.h
rename to lib/ethdev/rte_ethdev_core.h
diff --git a/lib/librte_ethdev/rte_ethdev_trace.h b/lib/ethdev/rte_ethdev_trace.h
similarity index 100%
rename from lib/librte_ethdev/rte_ethdev_trace.h
rename to lib/ethdev/rte_ethdev_trace.h
diff --git a/lib/librte_ethdev/rte_ethdev_trace_fp.h b/lib/ethdev/rte_ethdev_trace_fp.h
similarity index 100%
rename from lib/librte_ethdev/rte_ethdev_trace_fp.h
rename to lib/ethdev/rte_ethdev_trace_fp.h
diff --git a/lib/librte_ethdev/rte_flow.c b/lib/ethdev/rte_flow.c
similarity index 100%
rename from lib/librte_ethdev/rte_flow.c
rename to lib/ethdev/rte_flow.c
diff --git a/lib/librte_ethdev/rte_flow.h b/lib/ethdev/rte_flow.h
similarity index 100%
rename from lib/librte_ethdev/rte_flow.h
rename to lib/ethdev/rte_flow.h
diff --git a/lib/librte_ethdev/rte_flow_driver.h b/lib/ethdev/rte_flow_driver.h
similarity index 100%
rename from lib/librte_ethdev/rte_flow_driver.h
rename to lib/ethdev/rte_flow_driver.h
diff --git a/lib/librte_ethdev/rte_mtr.c b/lib/ethdev/rte_mtr.c
similarity index 100%
rename from lib/librte_ethdev/rte_mtr.c
rename to lib/ethdev/rte_mtr.c
diff --git a/lib/librte_ethdev/rte_mtr.h b/lib/ethdev/rte_mtr.h
similarity index 100%
rename from lib/librte_ethdev/rte_mtr.h
rename to lib/ethdev/rte_mtr.h
diff --git a/lib/librte_ethdev/rte_mtr_driver.h b/lib/ethdev/rte_mtr_driver.h
similarity index 100%
rename from lib/librte_ethdev/rte_mtr_driver.h
rename to lib/ethdev/rte_mtr_driver.h
diff --git a/lib/librte_ethdev/rte_tm.c b/lib/ethdev/rte_tm.c
similarity index 100%
rename from lib/librte_ethdev/rte_tm.c
rename to lib/ethdev/rte_tm.c
diff --git a/lib/librte_ethdev/rte_tm.h b/lib/ethdev/rte_tm.h
similarity index 100%
rename from lib/librte_ethdev/rte_tm.h
rename to lib/ethdev/rte_tm.h
diff --git a/lib/librte_ethdev/rte_tm_driver.h b/lib/ethdev/rte_tm_driver.h
similarity index 100%
rename from lib/librte_ethdev/rte_tm_driver.h
rename to lib/ethdev/rte_tm_driver.h
diff --git a/lib/librte_ethdev/version.map b/lib/ethdev/version.map
similarity index 100%
rename from lib/librte_ethdev/version.map
rename to lib/ethdev/version.map
diff --git a/lib/librte_eventdev/eventdev_pmd.h b/lib/eventdev/eventdev_pmd.h
similarity index 100%
rename from lib/librte_eventdev/eventdev_pmd.h
rename to lib/eventdev/eventdev_pmd.h
diff --git a/lib/librte_eventdev/eventdev_pmd_pci.h b/lib/eventdev/eventdev_pmd_pci.h
similarity index 100%
rename from lib/librte_eventdev/eventdev_pmd_pci.h
rename to lib/eventdev/eventdev_pmd_pci.h
diff --git a/lib/librte_eventdev/eventdev_pmd_vdev.h b/lib/eventdev/eventdev_pmd_vdev.h
similarity index 100%
rename from lib/librte_eventdev/eventdev_pmd_vdev.h
rename to lib/eventdev/eventdev_pmd_vdev.h
diff --git a/lib/librte_eventdev/eventdev_trace_points.c b/lib/eventdev/eventdev_trace_points.c
similarity index 100%
rename from lib/librte_eventdev/eventdev_trace_points.c
rename to lib/eventdev/eventdev_trace_points.c
diff --git a/lib/librte_eventdev/meson.build b/lib/eventdev/meson.build
similarity index 100%
rename from lib/librte_eventdev/meson.build
rename to lib/eventdev/meson.build
diff --git a/lib/librte_eventdev/rte_event_crypto_adapter.c b/lib/eventdev/rte_event_crypto_adapter.c
similarity index 100%
rename from lib/librte_eventdev/rte_event_crypto_adapter.c
rename to lib/eventdev/rte_event_crypto_adapter.c
diff --git a/lib/librte_eventdev/rte_event_crypto_adapter.h b/lib/eventdev/rte_event_crypto_adapter.h
similarity index 100%
rename from lib/librte_eventdev/rte_event_crypto_adapter.h
rename to lib/eventdev/rte_event_crypto_adapter.h
diff --git a/lib/librte_eventdev/rte_event_eth_rx_adapter.c b/lib/eventdev/rte_event_eth_rx_adapter.c
similarity index 100%
rename from lib/librte_eventdev/rte_event_eth_rx_adapter.c
rename to lib/eventdev/rte_event_eth_rx_adapter.c
diff --git a/lib/librte_eventdev/rte_event_eth_rx_adapter.h b/lib/eventdev/rte_event_eth_rx_adapter.h
similarity index 100%
rename from lib/librte_eventdev/rte_event_eth_rx_adapter.h
rename to lib/eventdev/rte_event_eth_rx_adapter.h
diff --git a/lib/librte_eventdev/rte_event_eth_tx_adapter.c b/lib/eventdev/rte_event_eth_tx_adapter.c
similarity index 100%
rename from lib/librte_eventdev/rte_event_eth_tx_adapter.c
rename to lib/eventdev/rte_event_eth_tx_adapter.c
diff --git a/lib/librte_eventdev/rte_event_eth_tx_adapter.h b/lib/eventdev/rte_event_eth_tx_adapter.h
similarity index 100%
rename from lib/librte_eventdev/rte_event_eth_tx_adapter.h
rename to lib/eventdev/rte_event_eth_tx_adapter.h
diff --git a/lib/librte_eventdev/rte_event_ring.c b/lib/eventdev/rte_event_ring.c
similarity index 100%
rename from lib/librte_eventdev/rte_event_ring.c
rename to lib/eventdev/rte_event_ring.c
diff --git a/lib/librte_eventdev/rte_event_ring.h b/lib/eventdev/rte_event_ring.h
similarity index 100%
rename from lib/librte_eventdev/rte_event_ring.h
rename to lib/eventdev/rte_event_ring.h
diff --git a/lib/librte_eventdev/rte_event_timer_adapter.c b/lib/eventdev/rte_event_timer_adapter.c
similarity index 100%
rename from lib/librte_eventdev/rte_event_timer_adapter.c
rename to lib/eventdev/rte_event_timer_adapter.c
diff --git a/lib/librte_eventdev/rte_event_timer_adapter.h b/lib/eventdev/rte_event_timer_adapter.h
similarity index 100%
rename from lib/librte_eventdev/rte_event_timer_adapter.h
rename to lib/eventdev/rte_event_timer_adapter.h
diff --git a/lib/librte_eventdev/rte_event_timer_adapter_pmd.h b/lib/eventdev/rte_event_timer_adapter_pmd.h
similarity index 100%
rename from lib/librte_eventdev/rte_event_timer_adapter_pmd.h
rename to lib/eventdev/rte_event_timer_adapter_pmd.h
diff --git a/lib/librte_eventdev/rte_eventdev.c b/lib/eventdev/rte_eventdev.c
similarity index 100%
rename from lib/librte_eventdev/rte_eventdev.c
rename to lib/eventdev/rte_eventdev.c
diff --git a/lib/librte_eventdev/rte_eventdev.h b/lib/eventdev/rte_eventdev.h
similarity index 100%
rename from lib/librte_eventdev/rte_eventdev.h
rename to lib/eventdev/rte_eventdev.h
diff --git a/lib/librte_eventdev/rte_eventdev_trace.h b/lib/eventdev/rte_eventdev_trace.h
similarity index 100%
rename from lib/librte_eventdev/rte_eventdev_trace.h
rename to lib/eventdev/rte_eventdev_trace.h
diff --git a/lib/librte_eventdev/rte_eventdev_trace_fp.h b/lib/eventdev/rte_eventdev_trace_fp.h
similarity index 100%
rename from lib/librte_eventdev/rte_eventdev_trace_fp.h
rename to lib/eventdev/rte_eventdev_trace_fp.h
diff --git a/lib/librte_eventdev/version.map b/lib/eventdev/version.map
similarity index 100%
rename from lib/librte_eventdev/version.map
rename to lib/eventdev/version.map
diff --git a/lib/librte_fib/dir24_8.c b/lib/fib/dir24_8.c
similarity index 100%
rename from lib/librte_fib/dir24_8.c
rename to lib/fib/dir24_8.c
diff --git a/lib/librte_fib/dir24_8.h b/lib/fib/dir24_8.h
similarity index 100%
rename from lib/librte_fib/dir24_8.h
rename to lib/fib/dir24_8.h
diff --git a/lib/librte_fib/dir24_8_avx512.c b/lib/fib/dir24_8_avx512.c
similarity index 100%
rename from lib/librte_fib/dir24_8_avx512.c
rename to lib/fib/dir24_8_avx512.c
diff --git a/lib/librte_fib/dir24_8_avx512.h b/lib/fib/dir24_8_avx512.h
similarity index 100%
rename from lib/librte_fib/dir24_8_avx512.h
rename to lib/fib/dir24_8_avx512.h
diff --git a/lib/librte_fib/meson.build b/lib/fib/meson.build
similarity index 100%
rename from lib/librte_fib/meson.build
rename to lib/fib/meson.build
diff --git a/lib/librte_fib/rte_fib.c b/lib/fib/rte_fib.c
similarity index 100%
rename from lib/librte_fib/rte_fib.c
rename to lib/fib/rte_fib.c
diff --git a/lib/librte_fib/rte_fib.h b/lib/fib/rte_fib.h
similarity index 100%
rename from lib/librte_fib/rte_fib.h
rename to lib/fib/rte_fib.h
diff --git a/lib/librte_fib/rte_fib6.c b/lib/fib/rte_fib6.c
similarity index 100%
rename from lib/librte_fib/rte_fib6.c
rename to lib/fib/rte_fib6.c
diff --git a/lib/librte_fib/rte_fib6.h b/lib/fib/rte_fib6.h
similarity index 100%
rename from lib/librte_fib/rte_fib6.h
rename to lib/fib/rte_fib6.h
diff --git a/lib/librte_fib/trie.c b/lib/fib/trie.c
similarity index 100%
rename from lib/librte_fib/trie.c
rename to lib/fib/trie.c
diff --git a/lib/librte_fib/trie.h b/lib/fib/trie.h
similarity index 100%
rename from lib/librte_fib/trie.h
rename to lib/fib/trie.h
diff --git a/lib/librte_fib/trie_avx512.c b/lib/fib/trie_avx512.c
similarity index 100%
rename from lib/librte_fib/trie_avx512.c
rename to lib/fib/trie_avx512.c
diff --git a/lib/librte_fib/trie_avx512.h b/lib/fib/trie_avx512.h
similarity index 100%
rename from lib/librte_fib/trie_avx512.h
rename to lib/fib/trie_avx512.h
diff --git a/lib/librte_fib/version.map b/lib/fib/version.map
similarity index 100%
rename from lib/librte_fib/version.map
rename to lib/fib/version.map
diff --git a/lib/librte_flow_classify/meson.build b/lib/flow_classify/meson.build
similarity index 100%
rename from lib/librte_flow_classify/meson.build
rename to lib/flow_classify/meson.build
diff --git a/lib/librte_flow_classify/rte_flow_classify.c b/lib/flow_classify/rte_flow_classify.c
similarity index 100%
rename from lib/librte_flow_classify/rte_flow_classify.c
rename to lib/flow_classify/rte_flow_classify.c
diff --git a/lib/librte_flow_classify/rte_flow_classify.h b/lib/flow_classify/rte_flow_classify.h
similarity index 100%
rename from lib/librte_flow_classify/rte_flow_classify.h
rename to lib/flow_classify/rte_flow_classify.h
diff --git a/lib/librte_flow_classify/rte_flow_classify_parse.c b/lib/flow_classify/rte_flow_classify_parse.c
similarity index 100%
rename from lib/librte_flow_classify/rte_flow_classify_parse.c
rename to lib/flow_classify/rte_flow_classify_parse.c
diff --git a/lib/librte_flow_classify/rte_flow_classify_parse.h b/lib/flow_classify/rte_flow_classify_parse.h
similarity index 100%
rename from lib/librte_flow_classify/rte_flow_classify_parse.h
rename to lib/flow_classify/rte_flow_classify_parse.h
diff --git a/lib/librte_flow_classify/version.map b/lib/flow_classify/version.map
similarity index 100%
rename from lib/librte_flow_classify/version.map
rename to lib/flow_classify/version.map
diff --git a/lib/librte_graph/graph.c b/lib/graph/graph.c
similarity index 100%
rename from lib/librte_graph/graph.c
rename to lib/graph/graph.c
diff --git a/lib/librte_graph/graph_debug.c b/lib/graph/graph_debug.c
similarity index 100%
rename from lib/librte_graph/graph_debug.c
rename to lib/graph/graph_debug.c
diff --git a/lib/librte_graph/graph_ops.c b/lib/graph/graph_ops.c
similarity index 100%
rename from lib/librte_graph/graph_ops.c
rename to lib/graph/graph_ops.c
diff --git a/lib/librte_graph/graph_populate.c b/lib/graph/graph_populate.c
similarity index 100%
rename from lib/librte_graph/graph_populate.c
rename to lib/graph/graph_populate.c
diff --git a/lib/librte_graph/graph_private.h b/lib/graph/graph_private.h
similarity index 100%
rename from lib/librte_graph/graph_private.h
rename to lib/graph/graph_private.h
diff --git a/lib/librte_graph/graph_stats.c b/lib/graph/graph_stats.c
similarity index 100%
rename from lib/librte_graph/graph_stats.c
rename to lib/graph/graph_stats.c
diff --git a/lib/librte_graph/meson.build b/lib/graph/meson.build
similarity index 100%
rename from lib/librte_graph/meson.build
rename to lib/graph/meson.build
diff --git a/lib/librte_graph/node.c b/lib/graph/node.c
similarity index 100%
rename from lib/librte_graph/node.c
rename to lib/graph/node.c
diff --git a/lib/librte_graph/rte_graph.h b/lib/graph/rte_graph.h
similarity index 100%
rename from lib/librte_graph/rte_graph.h
rename to lib/graph/rte_graph.h
diff --git a/lib/librte_graph/rte_graph_worker.h b/lib/graph/rte_graph_worker.h
similarity index 100%
rename from lib/librte_graph/rte_graph_worker.h
rename to lib/graph/rte_graph_worker.h
diff --git a/lib/librte_graph/version.map b/lib/graph/version.map
similarity index 100%
rename from lib/librte_graph/version.map
rename to lib/graph/version.map
diff --git a/lib/librte_gro/gro_tcp4.c b/lib/gro/gro_tcp4.c
similarity index 100%
rename from lib/librte_gro/gro_tcp4.c
rename to lib/gro/gro_tcp4.c
diff --git a/lib/librte_gro/gro_tcp4.h b/lib/gro/gro_tcp4.h
similarity index 100%
rename from lib/librte_gro/gro_tcp4.h
rename to lib/gro/gro_tcp4.h
diff --git a/lib/librte_gro/gro_udp4.c b/lib/gro/gro_udp4.c
similarity index 100%
rename from lib/librte_gro/gro_udp4.c
rename to lib/gro/gro_udp4.c
diff --git a/lib/librte_gro/gro_udp4.h b/lib/gro/gro_udp4.h
similarity index 100%
rename from lib/librte_gro/gro_udp4.h
rename to lib/gro/gro_udp4.h
diff --git a/lib/librte_gro/gro_vxlan_tcp4.c b/lib/gro/gro_vxlan_tcp4.c
similarity index 100%
rename from lib/librte_gro/gro_vxlan_tcp4.c
rename to lib/gro/gro_vxlan_tcp4.c
diff --git a/lib/librte_gro/gro_vxlan_tcp4.h b/lib/gro/gro_vxlan_tcp4.h
similarity index 100%
rename from lib/librte_gro/gro_vxlan_tcp4.h
rename to lib/gro/gro_vxlan_tcp4.h
diff --git a/lib/librte_gro/gro_vxlan_udp4.c b/lib/gro/gro_vxlan_udp4.c
similarity index 100%
rename from lib/librte_gro/gro_vxlan_udp4.c
rename to lib/gro/gro_vxlan_udp4.c
diff --git a/lib/librte_gro/gro_vxlan_udp4.h b/lib/gro/gro_vxlan_udp4.h
similarity index 100%
rename from lib/librte_gro/gro_vxlan_udp4.h
rename to lib/gro/gro_vxlan_udp4.h
diff --git a/lib/librte_gro/meson.build b/lib/gro/meson.build
similarity index 100%
rename from lib/librte_gro/meson.build
rename to lib/gro/meson.build
diff --git a/lib/librte_gro/rte_gro.c b/lib/gro/rte_gro.c
similarity index 100%
rename from lib/librte_gro/rte_gro.c
rename to lib/gro/rte_gro.c
diff --git a/lib/librte_gro/rte_gro.h b/lib/gro/rte_gro.h
similarity index 100%
rename from lib/librte_gro/rte_gro.h
rename to lib/gro/rte_gro.h
diff --git a/lib/librte_gro/version.map b/lib/gro/version.map
similarity index 100%
rename from lib/librte_gro/version.map
rename to lib/gro/version.map
diff --git a/lib/librte_gso/gso_common.c b/lib/gso/gso_common.c
similarity index 100%
rename from lib/librte_gso/gso_common.c
rename to lib/gso/gso_common.c
diff --git a/lib/librte_gso/gso_common.h b/lib/gso/gso_common.h
similarity index 100%
rename from lib/librte_gso/gso_common.h
rename to lib/gso/gso_common.h
diff --git a/lib/librte_gso/gso_tcp4.c b/lib/gso/gso_tcp4.c
similarity index 100%
rename from lib/librte_gso/gso_tcp4.c
rename to lib/gso/gso_tcp4.c
diff --git a/lib/librte_gso/gso_tcp4.h b/lib/gso/gso_tcp4.h
similarity index 100%
rename from lib/librte_gso/gso_tcp4.h
rename to lib/gso/gso_tcp4.h
diff --git a/lib/librte_gso/gso_tunnel_tcp4.c b/lib/gso/gso_tunnel_tcp4.c
similarity index 100%
rename from lib/librte_gso/gso_tunnel_tcp4.c
rename to lib/gso/gso_tunnel_tcp4.c
diff --git a/lib/librte_gso/gso_tunnel_tcp4.h b/lib/gso/gso_tunnel_tcp4.h
similarity index 100%
rename from lib/librte_gso/gso_tunnel_tcp4.h
rename to lib/gso/gso_tunnel_tcp4.h
diff --git a/lib/librte_gso/gso_tunnel_udp4.c b/lib/gso/gso_tunnel_udp4.c
similarity index 100%
rename from lib/librte_gso/gso_tunnel_udp4.c
rename to lib/gso/gso_tunnel_udp4.c
diff --git a/lib/librte_gso/gso_tunnel_udp4.h b/lib/gso/gso_tunnel_udp4.h
similarity index 100%
rename from lib/librte_gso/gso_tunnel_udp4.h
rename to lib/gso/gso_tunnel_udp4.h
diff --git a/lib/librte_gso/gso_udp4.c b/lib/gso/gso_udp4.c
similarity index 100%
rename from lib/librte_gso/gso_udp4.c
rename to lib/gso/gso_udp4.c
diff --git a/lib/librte_gso/gso_udp4.h b/lib/gso/gso_udp4.h
similarity index 100%
rename from lib/librte_gso/gso_udp4.h
rename to lib/gso/gso_udp4.h
diff --git a/lib/librte_gso/meson.build b/lib/gso/meson.build
similarity index 100%
rename from lib/librte_gso/meson.build
rename to lib/gso/meson.build
diff --git a/lib/librte_gso/rte_gso.c b/lib/gso/rte_gso.c
similarity index 100%
rename from lib/librte_gso/rte_gso.c
rename to lib/gso/rte_gso.c
diff --git a/lib/librte_gso/rte_gso.h b/lib/gso/rte_gso.h
similarity index 100%
rename from lib/librte_gso/rte_gso.h
rename to lib/gso/rte_gso.h
diff --git a/lib/librte_gso/version.map b/lib/gso/version.map
similarity index 100%
rename from lib/librte_gso/version.map
rename to lib/gso/version.map
diff --git a/lib/librte_hash/meson.build b/lib/hash/meson.build
similarity index 100%
rename from lib/librte_hash/meson.build
rename to lib/hash/meson.build
diff --git a/lib/librte_hash/rte_cmp_arm64.h b/lib/hash/rte_cmp_arm64.h
similarity index 100%
rename from lib/librte_hash/rte_cmp_arm64.h
rename to lib/hash/rte_cmp_arm64.h
diff --git a/lib/librte_hash/rte_cmp_x86.h b/lib/hash/rte_cmp_x86.h
similarity index 100%
rename from lib/librte_hash/rte_cmp_x86.h
rename to lib/hash/rte_cmp_x86.h
diff --git a/lib/librte_hash/rte_crc_arm64.h b/lib/hash/rte_crc_arm64.h
similarity index 100%
rename from lib/librte_hash/rte_crc_arm64.h
rename to lib/hash/rte_crc_arm64.h
diff --git a/lib/librte_hash/rte_cuckoo_hash.c b/lib/hash/rte_cuckoo_hash.c
similarity index 100%
rename from lib/librte_hash/rte_cuckoo_hash.c
rename to lib/hash/rte_cuckoo_hash.c
diff --git a/lib/librte_hash/rte_cuckoo_hash.h b/lib/hash/rte_cuckoo_hash.h
similarity index 100%
rename from lib/librte_hash/rte_cuckoo_hash.h
rename to lib/hash/rte_cuckoo_hash.h
diff --git a/lib/librte_hash/rte_fbk_hash.c b/lib/hash/rte_fbk_hash.c
similarity index 100%
rename from lib/librte_hash/rte_fbk_hash.c
rename to lib/hash/rte_fbk_hash.c
diff --git a/lib/librte_hash/rte_fbk_hash.h b/lib/hash/rte_fbk_hash.h
similarity index 100%
rename from lib/librte_hash/rte_fbk_hash.h
rename to lib/hash/rte_fbk_hash.h
diff --git a/lib/librte_hash/rte_hash.h b/lib/hash/rte_hash.h
similarity index 100%
rename from lib/librte_hash/rte_hash.h
rename to lib/hash/rte_hash.h
diff --git a/lib/librte_hash/rte_hash_crc.h b/lib/hash/rte_hash_crc.h
similarity index 100%
rename from lib/librte_hash/rte_hash_crc.h
rename to lib/hash/rte_hash_crc.h
diff --git a/lib/librte_hash/rte_jhash.h b/lib/hash/rte_jhash.h
similarity index 100%
rename from lib/librte_hash/rte_jhash.h
rename to lib/hash/rte_jhash.h
diff --git a/lib/librte_hash/rte_thash.h b/lib/hash/rte_thash.h
similarity index 100%
rename from lib/librte_hash/rte_thash.h
rename to lib/hash/rte_thash.h
diff --git a/lib/librte_hash/version.map b/lib/hash/version.map
similarity index 100%
rename from lib/librte_hash/version.map
rename to lib/hash/version.map
diff --git a/lib/librte_ip_frag/ip_frag_common.h b/lib/ip_frag/ip_frag_common.h
similarity index 100%
rename from lib/librte_ip_frag/ip_frag_common.h
rename to lib/ip_frag/ip_frag_common.h
diff --git a/lib/librte_ip_frag/ip_frag_internal.c b/lib/ip_frag/ip_frag_internal.c
similarity index 100%
rename from lib/librte_ip_frag/ip_frag_internal.c
rename to lib/ip_frag/ip_frag_internal.c
diff --git a/lib/librte_ip_frag/meson.build b/lib/ip_frag/meson.build
similarity index 100%
rename from lib/librte_ip_frag/meson.build
rename to lib/ip_frag/meson.build
diff --git a/lib/librte_ip_frag/rte_ip_frag.h b/lib/ip_frag/rte_ip_frag.h
similarity index 100%
rename from lib/librte_ip_frag/rte_ip_frag.h
rename to lib/ip_frag/rte_ip_frag.h
diff --git a/lib/librte_ip_frag/rte_ip_frag_common.c b/lib/ip_frag/rte_ip_frag_common.c
similarity index 100%
rename from lib/librte_ip_frag/rte_ip_frag_common.c
rename to lib/ip_frag/rte_ip_frag_common.c
diff --git a/lib/librte_ip_frag/rte_ipv4_fragmentation.c b/lib/ip_frag/rte_ipv4_fragmentation.c
similarity index 100%
rename from lib/librte_ip_frag/rte_ipv4_fragmentation.c
rename to lib/ip_frag/rte_ipv4_fragmentation.c
diff --git a/lib/librte_ip_frag/rte_ipv4_reassembly.c b/lib/ip_frag/rte_ipv4_reassembly.c
similarity index 100%
rename from lib/librte_ip_frag/rte_ipv4_reassembly.c
rename to lib/ip_frag/rte_ipv4_reassembly.c
diff --git a/lib/librte_ip_frag/rte_ipv6_fragmentation.c b/lib/ip_frag/rte_ipv6_fragmentation.c
similarity index 100%
rename from lib/librte_ip_frag/rte_ipv6_fragmentation.c
rename to lib/ip_frag/rte_ipv6_fragmentation.c
diff --git a/lib/librte_ip_frag/rte_ipv6_reassembly.c b/lib/ip_frag/rte_ipv6_reassembly.c
similarity index 100%
rename from lib/librte_ip_frag/rte_ipv6_reassembly.c
rename to lib/ip_frag/rte_ipv6_reassembly.c
diff --git a/lib/librte_ip_frag/version.map b/lib/ip_frag/version.map
similarity index 100%
rename from lib/librte_ip_frag/version.map
rename to lib/ip_frag/version.map
diff --git a/lib/librte_ipsec/crypto.h b/lib/ipsec/crypto.h
similarity index 100%
rename from lib/librte_ipsec/crypto.h
rename to lib/ipsec/crypto.h
diff --git a/lib/librte_ipsec/esp_inb.c b/lib/ipsec/esp_inb.c
similarity index 100%
rename from lib/librte_ipsec/esp_inb.c
rename to lib/ipsec/esp_inb.c
diff --git a/lib/librte_ipsec/esp_outb.c b/lib/ipsec/esp_outb.c
similarity index 100%
rename from lib/librte_ipsec/esp_outb.c
rename to lib/ipsec/esp_outb.c
diff --git a/lib/librte_ipsec/iph.h b/lib/ipsec/iph.h
similarity index 100%
rename from lib/librte_ipsec/iph.h
rename to lib/ipsec/iph.h
diff --git a/lib/librte_ipsec/ipsec_sad.c b/lib/ipsec/ipsec_sad.c
similarity index 100%
rename from lib/librte_ipsec/ipsec_sad.c
rename to lib/ipsec/ipsec_sad.c
diff --git a/lib/librte_ipsec/ipsec_sqn.h b/lib/ipsec/ipsec_sqn.h
similarity index 100%
rename from lib/librte_ipsec/ipsec_sqn.h
rename to lib/ipsec/ipsec_sqn.h
diff --git a/lib/librte_ipsec/meson.build b/lib/ipsec/meson.build
similarity index 100%
rename from lib/librte_ipsec/meson.build
rename to lib/ipsec/meson.build
diff --git a/lib/librte_ipsec/misc.h b/lib/ipsec/misc.h
similarity index 100%
rename from lib/librte_ipsec/misc.h
rename to lib/ipsec/misc.h
diff --git a/lib/librte_ipsec/pad.h b/lib/ipsec/pad.h
similarity index 100%
rename from lib/librte_ipsec/pad.h
rename to lib/ipsec/pad.h
diff --git a/lib/librte_ipsec/rte_ipsec.h b/lib/ipsec/rte_ipsec.h
similarity index 100%
rename from lib/librte_ipsec/rte_ipsec.h
rename to lib/ipsec/rte_ipsec.h
diff --git a/lib/librte_ipsec/rte_ipsec_group.h b/lib/ipsec/rte_ipsec_group.h
similarity index 100%
rename from lib/librte_ipsec/rte_ipsec_group.h
rename to lib/ipsec/rte_ipsec_group.h
diff --git a/lib/librte_ipsec/rte_ipsec_sa.h b/lib/ipsec/rte_ipsec_sa.h
similarity index 100%
rename from lib/librte_ipsec/rte_ipsec_sa.h
rename to lib/ipsec/rte_ipsec_sa.h
diff --git a/lib/librte_ipsec/rte_ipsec_sad.h b/lib/ipsec/rte_ipsec_sad.h
similarity index 100%
rename from lib/librte_ipsec/rte_ipsec_sad.h
rename to lib/ipsec/rte_ipsec_sad.h
diff --git a/lib/librte_ipsec/sa.c b/lib/ipsec/sa.c
similarity index 100%
rename from lib/librte_ipsec/sa.c
rename to lib/ipsec/sa.c
diff --git a/lib/librte_ipsec/sa.h b/lib/ipsec/sa.h
similarity index 100%
rename from lib/librte_ipsec/sa.h
rename to lib/ipsec/sa.h
diff --git a/lib/librte_ipsec/ses.c b/lib/ipsec/ses.c
similarity index 100%
rename from lib/librte_ipsec/ses.c
rename to lib/ipsec/ses.c
diff --git a/lib/librte_ipsec/version.map b/lib/ipsec/version.map
similarity index 100%
rename from lib/librte_ipsec/version.map
rename to lib/ipsec/version.map
diff --git a/lib/librte_jobstats/meson.build b/lib/jobstats/meson.build
similarity index 100%
rename from lib/librte_jobstats/meson.build
rename to lib/jobstats/meson.build
diff --git a/lib/librte_jobstats/rte_jobstats.c b/lib/jobstats/rte_jobstats.c
similarity index 100%
rename from lib/librte_jobstats/rte_jobstats.c
rename to lib/jobstats/rte_jobstats.c
diff --git a/lib/librte_jobstats/rte_jobstats.h b/lib/jobstats/rte_jobstats.h
similarity index 100%
rename from lib/librte_jobstats/rte_jobstats.h
rename to lib/jobstats/rte_jobstats.h
diff --git a/lib/librte_jobstats/version.map b/lib/jobstats/version.map
similarity index 100%
rename from lib/librte_jobstats/version.map
rename to lib/jobstats/version.map
diff --git a/lib/librte_kni/meson.build b/lib/kni/meson.build
similarity index 100%
rename from lib/librte_kni/meson.build
rename to lib/kni/meson.build
diff --git a/lib/librte_kni/rte_kni.c b/lib/kni/rte_kni.c
similarity index 100%
rename from lib/librte_kni/rte_kni.c
rename to lib/kni/rte_kni.c
diff --git a/lib/librte_kni/rte_kni.h b/lib/kni/rte_kni.h
similarity index 100%
rename from lib/librte_kni/rte_kni.h
rename to lib/kni/rte_kni.h
diff --git a/lib/librte_kni/rte_kni_common.h b/lib/kni/rte_kni_common.h
similarity index 100%
rename from lib/librte_kni/rte_kni_common.h
rename to lib/kni/rte_kni_common.h
diff --git a/lib/librte_kni/rte_kni_fifo.h b/lib/kni/rte_kni_fifo.h
similarity index 100%
rename from lib/librte_kni/rte_kni_fifo.h
rename to lib/kni/rte_kni_fifo.h
diff --git a/lib/librte_kni/version.map b/lib/kni/version.map
similarity index 100%
rename from lib/librte_kni/version.map
rename to lib/kni/version.map
diff --git a/lib/librte_kvargs/meson.build b/lib/kvargs/meson.build
similarity index 100%
rename from lib/librte_kvargs/meson.build
rename to lib/kvargs/meson.build
diff --git a/lib/librte_kvargs/rte_kvargs.c b/lib/kvargs/rte_kvargs.c
similarity index 100%
rename from lib/librte_kvargs/rte_kvargs.c
rename to lib/kvargs/rte_kvargs.c
diff --git a/lib/librte_kvargs/rte_kvargs.h b/lib/kvargs/rte_kvargs.h
similarity index 100%
rename from lib/librte_kvargs/rte_kvargs.h
rename to lib/kvargs/rte_kvargs.h
diff --git a/lib/librte_kvargs/version.map b/lib/kvargs/version.map
similarity index 100%
rename from lib/librte_kvargs/version.map
rename to lib/kvargs/version.map
diff --git a/lib/librte_latencystats/meson.build b/lib/latencystats/meson.build
similarity index 100%
rename from lib/librte_latencystats/meson.build
rename to lib/latencystats/meson.build
diff --git a/lib/librte_latencystats/rte_latencystats.c b/lib/latencystats/rte_latencystats.c
similarity index 100%
rename from lib/librte_latencystats/rte_latencystats.c
rename to lib/latencystats/rte_latencystats.c
diff --git a/lib/librte_latencystats/rte_latencystats.h b/lib/latencystats/rte_latencystats.h
similarity index 100%
rename from lib/librte_latencystats/rte_latencystats.h
rename to lib/latencystats/rte_latencystats.h
diff --git a/lib/librte_latencystats/version.map b/lib/latencystats/version.map
similarity index 100%
rename from lib/librte_latencystats/version.map
rename to lib/latencystats/version.map
diff --git a/lib/librte_lpm/meson.build b/lib/lpm/meson.build
similarity index 100%
rename from lib/librte_lpm/meson.build
rename to lib/lpm/meson.build
diff --git a/lib/librte_lpm/rte_lpm.c b/lib/lpm/rte_lpm.c
similarity index 100%
rename from lib/librte_lpm/rte_lpm.c
rename to lib/lpm/rte_lpm.c
diff --git a/lib/librte_lpm/rte_lpm.h b/lib/lpm/rte_lpm.h
similarity index 100%
rename from lib/librte_lpm/rte_lpm.h
rename to lib/lpm/rte_lpm.h
diff --git a/lib/librte_lpm/rte_lpm6.c b/lib/lpm/rte_lpm6.c
similarity index 100%
rename from lib/librte_lpm/rte_lpm6.c
rename to lib/lpm/rte_lpm6.c
diff --git a/lib/librte_lpm/rte_lpm6.h b/lib/lpm/rte_lpm6.h
similarity index 100%
rename from lib/librte_lpm/rte_lpm6.h
rename to lib/lpm/rte_lpm6.h
diff --git a/lib/librte_lpm/rte_lpm_altivec.h b/lib/lpm/rte_lpm_altivec.h
similarity index 100%
rename from lib/librte_lpm/rte_lpm_altivec.h
rename to lib/lpm/rte_lpm_altivec.h
diff --git a/lib/librte_lpm/rte_lpm_neon.h b/lib/lpm/rte_lpm_neon.h
similarity index 100%
rename from lib/librte_lpm/rte_lpm_neon.h
rename to lib/lpm/rte_lpm_neon.h
diff --git a/lib/librte_lpm/rte_lpm_sse.h b/lib/lpm/rte_lpm_sse.h
similarity index 100%
rename from lib/librte_lpm/rte_lpm_sse.h
rename to lib/lpm/rte_lpm_sse.h
diff --git a/lib/librte_lpm/rte_lpm_sve.h b/lib/lpm/rte_lpm_sve.h
similarity index 100%
rename from lib/librte_lpm/rte_lpm_sve.h
rename to lib/lpm/rte_lpm_sve.h
diff --git a/lib/librte_lpm/version.map b/lib/lpm/version.map
similarity index 100%
rename from lib/librte_lpm/version.map
rename to lib/lpm/version.map
diff --git a/lib/librte_mbuf/meson.build b/lib/mbuf/meson.build
similarity index 100%
rename from lib/librte_mbuf/meson.build
rename to lib/mbuf/meson.build
diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/mbuf/rte_mbuf.c
similarity index 100%
rename from lib/librte_mbuf/rte_mbuf.c
rename to lib/mbuf/rte_mbuf.c
diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/mbuf/rte_mbuf.h
similarity index 100%
rename from lib/librte_mbuf/rte_mbuf.h
rename to lib/mbuf/rte_mbuf.h
diff --git a/lib/librte_mbuf/rte_mbuf_core.h b/lib/mbuf/rte_mbuf_core.h
similarity index 100%
rename from lib/librte_mbuf/rte_mbuf_core.h
rename to lib/mbuf/rte_mbuf_core.h
diff --git a/lib/librte_mbuf/rte_mbuf_dyn.c b/lib/mbuf/rte_mbuf_dyn.c
similarity index 100%
rename from lib/librte_mbuf/rte_mbuf_dyn.c
rename to lib/mbuf/rte_mbuf_dyn.c
diff --git a/lib/librte_mbuf/rte_mbuf_dyn.h b/lib/mbuf/rte_mbuf_dyn.h
similarity index 100%
rename from lib/librte_mbuf/rte_mbuf_dyn.h
rename to lib/mbuf/rte_mbuf_dyn.h
diff --git a/lib/librte_mbuf/rte_mbuf_pool_ops.c b/lib/mbuf/rte_mbuf_pool_ops.c
similarity index 100%
rename from lib/librte_mbuf/rte_mbuf_pool_ops.c
rename to lib/mbuf/rte_mbuf_pool_ops.c
diff --git a/lib/librte_mbuf/rte_mbuf_pool_ops.h b/lib/mbuf/rte_mbuf_pool_ops.h
similarity index 100%
rename from lib/librte_mbuf/rte_mbuf_pool_ops.h
rename to lib/mbuf/rte_mbuf_pool_ops.h
diff --git a/lib/librte_mbuf/rte_mbuf_ptype.c b/lib/mbuf/rte_mbuf_ptype.c
similarity index 100%
rename from lib/librte_mbuf/rte_mbuf_ptype.c
rename to lib/mbuf/rte_mbuf_ptype.c
diff --git a/lib/librte_mbuf/rte_mbuf_ptype.h b/lib/mbuf/rte_mbuf_ptype.h
similarity index 100%
rename from lib/librte_mbuf/rte_mbuf_ptype.h
rename to lib/mbuf/rte_mbuf_ptype.h
diff --git a/lib/librte_mbuf/version.map b/lib/mbuf/version.map
similarity index 100%
rename from lib/librte_mbuf/version.map
rename to lib/mbuf/version.map
diff --git a/lib/librte_member/meson.build b/lib/member/meson.build
similarity index 100%
rename from lib/librte_member/meson.build
rename to lib/member/meson.build
diff --git a/lib/librte_member/rte_member.c b/lib/member/rte_member.c
similarity index 100%
rename from lib/librte_member/rte_member.c
rename to lib/member/rte_member.c
diff --git a/lib/librte_member/rte_member.h b/lib/member/rte_member.h
similarity index 100%
rename from lib/librte_member/rte_member.h
rename to lib/member/rte_member.h
diff --git a/lib/librte_member/rte_member_ht.c b/lib/member/rte_member_ht.c
similarity index 100%
rename from lib/librte_member/rte_member_ht.c
rename to lib/member/rte_member_ht.c
diff --git a/lib/librte_member/rte_member_ht.h b/lib/member/rte_member_ht.h
similarity index 100%
rename from lib/librte_member/rte_member_ht.h
rename to lib/member/rte_member_ht.h
diff --git a/lib/librte_member/rte_member_vbf.c b/lib/member/rte_member_vbf.c
similarity index 100%
rename from lib/librte_member/rte_member_vbf.c
rename to lib/member/rte_member_vbf.c
diff --git a/lib/librte_member/rte_member_vbf.h b/lib/member/rte_member_vbf.h
similarity index 100%
rename from lib/librte_member/rte_member_vbf.h
rename to lib/member/rte_member_vbf.h
diff --git a/lib/librte_member/rte_member_x86.h b/lib/member/rte_member_x86.h
similarity index 100%
rename from lib/librte_member/rte_member_x86.h
rename to lib/member/rte_member_x86.h
diff --git a/lib/librte_member/version.map b/lib/member/version.map
similarity index 100%
rename from lib/librte_member/version.map
rename to lib/member/version.map
diff --git a/lib/librte_mempool/mempool_trace_points.c b/lib/mempool/mempool_trace_points.c
similarity index 100%
rename from lib/librte_mempool/mempool_trace_points.c
rename to lib/mempool/mempool_trace_points.c
diff --git a/lib/librte_mempool/meson.build b/lib/mempool/meson.build
similarity index 100%
rename from lib/librte_mempool/meson.build
rename to lib/mempool/meson.build
diff --git a/lib/librte_mempool/rte_mempool.c b/lib/mempool/rte_mempool.c
similarity index 100%
rename from lib/librte_mempool/rte_mempool.c
rename to lib/mempool/rte_mempool.c
diff --git a/lib/librte_mempool/rte_mempool.h b/lib/mempool/rte_mempool.h
similarity index 100%
rename from lib/librte_mempool/rte_mempool.h
rename to lib/mempool/rte_mempool.h
diff --git a/lib/librte_mempool/rte_mempool_ops.c b/lib/mempool/rte_mempool_ops.c
similarity index 100%
rename from lib/librte_mempool/rte_mempool_ops.c
rename to lib/mempool/rte_mempool_ops.c
diff --git a/lib/librte_mempool/rte_mempool_ops_default.c b/lib/mempool/rte_mempool_ops_default.c
similarity index 100%
rename from lib/librte_mempool/rte_mempool_ops_default.c
rename to lib/mempool/rte_mempool_ops_default.c
diff --git a/lib/librte_mempool/rte_mempool_trace.h b/lib/mempool/rte_mempool_trace.h
similarity index 100%
rename from lib/librte_mempool/rte_mempool_trace.h
rename to lib/mempool/rte_mempool_trace.h
diff --git a/lib/librte_mempool/rte_mempool_trace_fp.h b/lib/mempool/rte_mempool_trace_fp.h
similarity index 100%
rename from lib/librte_mempool/rte_mempool_trace_fp.h
rename to lib/mempool/rte_mempool_trace_fp.h
diff --git a/lib/librte_mempool/version.map b/lib/mempool/version.map
similarity index 100%
rename from lib/librte_mempool/version.map
rename to lib/mempool/version.map
diff --git a/lib/meson.build b/lib/meson.build
index 7821dc9290..dc236c06de 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -81,8 +81,10 @@ foreach l:libraries
         deps += ['eal']
     endif
 
-    dir_name = 'librte_' + l
-    subdir(dir_name)
+    subdir(l)
+    if name != l
+        warning('Library name, "@0@", and directory name, "@1@", do not match'.format(name, l))
+    endif
 
     if not build
         dpdk_libs_disabled += name
@@ -95,7 +97,7 @@ foreach l:libraries
     foreach d:deps
         if not is_variable('shared_rte_' + d)
             error('Missing internal dependency "@0@" for @1@ [@2@]'
-                    .format(d, name, 'lib/' + dir_name))
+                    .format(d, name, 'lib/' + l))
         endif
         shared_deps += [get_variable('shared_rte_' + d)]
         static_deps += [get_variable('static_rte_' + d)]
@@ -108,7 +110,7 @@ foreach l:libraries
     dpdk_chkinc_headers += headers
 
     libname = 'rte_' + name
-    includes += include_directories(dir_name)
+    includes += include_directories(l)
 
     if is_windows and use_function_versioning
         message('@0@: Function versioning is not supported by Windows.'.format(name))
@@ -140,8 +142,8 @@ foreach l:libraries
         cflags += '-DRTE_BUILD_SHARED_LIB'
     endif
     version_map = '@0@/@1@/version.map'.format(
-            meson.current_source_dir(), dir_name)
-    implib = dir_name + '.dll.a'
+            meson.current_source_dir(), l)
+    implib = 'librte_' + l + '.dll.a'
 
     def_file = custom_target(libname + '_def',
             command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'],
@@ -199,5 +201,5 @@ foreach l:libraries
 
     set_variable('shared_rte_' + name, shared_dep)
     set_variable('static_rte_' + name, static_dep)
-    message('lib/@0@: Defining dependency "@1@"'.format(dir_name, name))
+    message('lib/@0@: Defining dependency "@1@"'.format(l, name))
 endforeach
diff --git a/lib/librte_meter/meson.build b/lib/meter/meson.build
similarity index 100%
rename from lib/librte_meter/meson.build
rename to lib/meter/meson.build
diff --git a/lib/librte_meter/rte_meter.c b/lib/meter/rte_meter.c
similarity index 100%
rename from lib/librte_meter/rte_meter.c
rename to lib/meter/rte_meter.c
diff --git a/lib/librte_meter/rte_meter.h b/lib/meter/rte_meter.h
similarity index 100%
rename from lib/librte_meter/rte_meter.h
rename to lib/meter/rte_meter.h
diff --git a/lib/librte_meter/version.map b/lib/meter/version.map
similarity index 100%
rename from lib/librte_meter/version.map
rename to lib/meter/version.map
diff --git a/lib/librte_metrics/meson.build b/lib/metrics/meson.build
similarity index 100%
rename from lib/librte_metrics/meson.build
rename to lib/metrics/meson.build
diff --git a/lib/librte_metrics/rte_metrics.c b/lib/metrics/rte_metrics.c
similarity index 100%
rename from lib/librte_metrics/rte_metrics.c
rename to lib/metrics/rte_metrics.c
diff --git a/lib/librte_metrics/rte_metrics.h b/lib/metrics/rte_metrics.h
similarity index 100%
rename from lib/librte_metrics/rte_metrics.h
rename to lib/metrics/rte_metrics.h
diff --git a/lib/librte_metrics/rte_metrics_telemetry.c b/lib/metrics/rte_metrics_telemetry.c
similarity index 100%
rename from lib/librte_metrics/rte_metrics_telemetry.c
rename to lib/metrics/rte_metrics_telemetry.c
diff --git a/lib/librte_metrics/rte_metrics_telemetry.h b/lib/metrics/rte_metrics_telemetry.h
similarity index 100%
rename from lib/librte_metrics/rte_metrics_telemetry.h
rename to lib/metrics/rte_metrics_telemetry.h
diff --git a/lib/librte_metrics/version.map b/lib/metrics/version.map
similarity index 100%
rename from lib/librte_metrics/version.map
rename to lib/metrics/version.map
diff --git a/lib/librte_net/meson.build b/lib/net/meson.build
similarity index 100%
rename from lib/librte_net/meson.build
rename to lib/net/meson.build
diff --git a/lib/librte_net/net_crc.h b/lib/net/net_crc.h
similarity index 100%
rename from lib/librte_net/net_crc.h
rename to lib/net/net_crc.h
diff --git a/lib/librte_net/net_crc_avx512.c b/lib/net/net_crc_avx512.c
similarity index 100%
rename from lib/librte_net/net_crc_avx512.c
rename to lib/net/net_crc_avx512.c
diff --git a/lib/librte_net/net_crc_neon.c b/lib/net/net_crc_neon.c
similarity index 100%
rename from lib/librte_net/net_crc_neon.c
rename to lib/net/net_crc_neon.c
diff --git a/lib/librte_net/net_crc_sse.c b/lib/net/net_crc_sse.c
similarity index 100%
rename from lib/librte_net/net_crc_sse.c
rename to lib/net/net_crc_sse.c
diff --git a/lib/librte_net/rte_arp.c b/lib/net/rte_arp.c
similarity index 100%
rename from lib/librte_net/rte_arp.c
rename to lib/net/rte_arp.c
diff --git a/lib/librte_net/rte_arp.h b/lib/net/rte_arp.h
similarity index 100%
rename from lib/librte_net/rte_arp.h
rename to lib/net/rte_arp.h
diff --git a/lib/librte_net/rte_ecpri.h b/lib/net/rte_ecpri.h
similarity index 100%
rename from lib/librte_net/rte_ecpri.h
rename to lib/net/rte_ecpri.h
diff --git a/lib/librte_net/rte_esp.h b/lib/net/rte_esp.h
similarity index 100%
rename from lib/librte_net/rte_esp.h
rename to lib/net/rte_esp.h
diff --git a/lib/librte_net/rte_ether.c b/lib/net/rte_ether.c
similarity index 100%
rename from lib/librte_net/rte_ether.c
rename to lib/net/rte_ether.c
diff --git a/lib/librte_net/rte_ether.h b/lib/net/rte_ether.h
similarity index 100%
rename from lib/librte_net/rte_ether.h
rename to lib/net/rte_ether.h
diff --git a/lib/librte_net/rte_geneve.h b/lib/net/rte_geneve.h
similarity index 100%
rename from lib/librte_net/rte_geneve.h
rename to lib/net/rte_geneve.h
diff --git a/lib/librte_net/rte_gre.h b/lib/net/rte_gre.h
similarity index 100%
rename from lib/librte_net/rte_gre.h
rename to lib/net/rte_gre.h
diff --git a/lib/librte_net/rte_gtp.h b/lib/net/rte_gtp.h
similarity index 100%
rename from lib/librte_net/rte_gtp.h
rename to lib/net/rte_gtp.h
diff --git a/lib/librte_net/rte_higig.h b/lib/net/rte_higig.h
similarity index 100%
rename from lib/librte_net/rte_higig.h
rename to lib/net/rte_higig.h
diff --git a/lib/librte_net/rte_icmp.h b/lib/net/rte_icmp.h
similarity index 100%
rename from lib/librte_net/rte_icmp.h
rename to lib/net/rte_icmp.h
diff --git a/lib/librte_net/rte_ip.h b/lib/net/rte_ip.h
similarity index 100%
rename from lib/librte_net/rte_ip.h
rename to lib/net/rte_ip.h
diff --git a/lib/librte_net/rte_mpls.h b/lib/net/rte_mpls.h
similarity index 100%
rename from lib/librte_net/rte_mpls.h
rename to lib/net/rte_mpls.h
diff --git a/lib/librte_net/rte_net.c b/lib/net/rte_net.c
similarity index 100%
rename from lib/librte_net/rte_net.c
rename to lib/net/rte_net.c
diff --git a/lib/librte_net/rte_net.h b/lib/net/rte_net.h
similarity index 100%
rename from lib/librte_net/rte_net.h
rename to lib/net/rte_net.h
diff --git a/lib/librte_net/rte_net_crc.c b/lib/net/rte_net_crc.c
similarity index 100%
rename from lib/librte_net/rte_net_crc.c
rename to lib/net/rte_net_crc.c
diff --git a/lib/librte_net/rte_net_crc.h b/lib/net/rte_net_crc.h
similarity index 100%
rename from lib/librte_net/rte_net_crc.h
rename to lib/net/rte_net_crc.h
diff --git a/lib/librte_net/rte_sctp.h b/lib/net/rte_sctp.h
similarity index 100%
rename from lib/librte_net/rte_sctp.h
rename to lib/net/rte_sctp.h
diff --git a/lib/librte_net/rte_tcp.h b/lib/net/rte_tcp.h
similarity index 100%
rename from lib/librte_net/rte_tcp.h
rename to lib/net/rte_tcp.h
diff --git a/lib/librte_net/rte_udp.h b/lib/net/rte_udp.h
similarity index 100%
rename from lib/librte_net/rte_udp.h
rename to lib/net/rte_udp.h
diff --git a/lib/librte_net/rte_vxlan.h b/lib/net/rte_vxlan.h
similarity index 100%
rename from lib/librte_net/rte_vxlan.h
rename to lib/net/rte_vxlan.h
diff --git a/lib/librte_net/version.map b/lib/net/version.map
similarity index 100%
rename from lib/librte_net/version.map
rename to lib/net/version.map
diff --git a/lib/librte_node/ethdev_ctrl.c b/lib/node/ethdev_ctrl.c
similarity index 100%
rename from lib/librte_node/ethdev_ctrl.c
rename to lib/node/ethdev_ctrl.c
diff --git a/lib/librte_node/ethdev_rx.c b/lib/node/ethdev_rx.c
similarity index 100%
rename from lib/librte_node/ethdev_rx.c
rename to lib/node/ethdev_rx.c
diff --git a/lib/librte_node/ethdev_rx_priv.h b/lib/node/ethdev_rx_priv.h
similarity index 100%
rename from lib/librte_node/ethdev_rx_priv.h
rename to lib/node/ethdev_rx_priv.h
diff --git a/lib/librte_node/ethdev_tx.c b/lib/node/ethdev_tx.c
similarity index 100%
rename from lib/librte_node/ethdev_tx.c
rename to lib/node/ethdev_tx.c
diff --git a/lib/librte_node/ethdev_tx_priv.h b/lib/node/ethdev_tx_priv.h
similarity index 100%
rename from lib/librte_node/ethdev_tx_priv.h
rename to lib/node/ethdev_tx_priv.h
diff --git a/lib/librte_node/ip4_lookup.c b/lib/node/ip4_lookup.c
similarity index 100%
rename from lib/librte_node/ip4_lookup.c
rename to lib/node/ip4_lookup.c
diff --git a/lib/librte_node/ip4_lookup_neon.h b/lib/node/ip4_lookup_neon.h
similarity index 100%
rename from lib/librte_node/ip4_lookup_neon.h
rename to lib/node/ip4_lookup_neon.h
diff --git a/lib/librte_node/ip4_lookup_sse.h b/lib/node/ip4_lookup_sse.h
similarity index 100%
rename from lib/librte_node/ip4_lookup_sse.h
rename to lib/node/ip4_lookup_sse.h
diff --git a/lib/librte_node/ip4_rewrite.c b/lib/node/ip4_rewrite.c
similarity index 100%
rename from lib/librte_node/ip4_rewrite.c
rename to lib/node/ip4_rewrite.c
diff --git a/lib/librte_node/ip4_rewrite_priv.h b/lib/node/ip4_rewrite_priv.h
similarity index 100%
rename from lib/librte_node/ip4_rewrite_priv.h
rename to lib/node/ip4_rewrite_priv.h
diff --git a/lib/librte_node/log.c b/lib/node/log.c
similarity index 100%
rename from lib/librte_node/log.c
rename to lib/node/log.c
diff --git a/lib/librte_node/meson.build b/lib/node/meson.build
similarity index 100%
rename from lib/librte_node/meson.build
rename to lib/node/meson.build
diff --git a/lib/librte_node/node_private.h b/lib/node/node_private.h
similarity index 100%
rename from lib/librte_node/node_private.h
rename to lib/node/node_private.h
diff --git a/lib/librte_node/null.c b/lib/node/null.c
similarity index 100%
rename from lib/librte_node/null.c
rename to lib/node/null.c
diff --git a/lib/librte_node/pkt_cls.c b/lib/node/pkt_cls.c
similarity index 100%
rename from lib/librte_node/pkt_cls.c
rename to lib/node/pkt_cls.c
diff --git a/lib/librte_node/pkt_cls_priv.h b/lib/node/pkt_cls_priv.h
similarity index 100%
rename from lib/librte_node/pkt_cls_priv.h
rename to lib/node/pkt_cls_priv.h
diff --git a/lib/librte_node/pkt_drop.c b/lib/node/pkt_drop.c
similarity index 100%
rename from lib/librte_node/pkt_drop.c
rename to lib/node/pkt_drop.c
diff --git a/lib/librte_node/rte_node_eth_api.h b/lib/node/rte_node_eth_api.h
similarity index 100%
rename from lib/librte_node/rte_node_eth_api.h
rename to lib/node/rte_node_eth_api.h
diff --git a/lib/librte_node/rte_node_ip4_api.h b/lib/node/rte_node_ip4_api.h
similarity index 100%
rename from lib/librte_node/rte_node_ip4_api.h
rename to lib/node/rte_node_ip4_api.h
diff --git a/lib/librte_node/version.map b/lib/node/version.map
similarity index 100%
rename from lib/librte_node/version.map
rename to lib/node/version.map
diff --git a/lib/librte_pci/meson.build b/lib/pci/meson.build
similarity index 100%
rename from lib/librte_pci/meson.build
rename to lib/pci/meson.build
diff --git a/lib/librte_pci/rte_pci.c b/lib/pci/rte_pci.c
similarity index 100%
rename from lib/librte_pci/rte_pci.c
rename to lib/pci/rte_pci.c
diff --git a/lib/librte_pci/rte_pci.h b/lib/pci/rte_pci.h
similarity index 100%
rename from lib/librte_pci/rte_pci.h
rename to lib/pci/rte_pci.h
diff --git a/lib/librte_pci/version.map b/lib/pci/version.map
similarity index 100%
rename from lib/librte_pci/version.map
rename to lib/pci/version.map
diff --git a/lib/librte_pdump/meson.build b/lib/pdump/meson.build
similarity index 100%
rename from lib/librte_pdump/meson.build
rename to lib/pdump/meson.build
diff --git a/lib/librte_pdump/rte_pdump.c b/lib/pdump/rte_pdump.c
similarity index 100%
rename from lib/librte_pdump/rte_pdump.c
rename to lib/pdump/rte_pdump.c
diff --git a/lib/librte_pdump/rte_pdump.h b/lib/pdump/rte_pdump.h
similarity index 100%
rename from lib/librte_pdump/rte_pdump.h
rename to lib/pdump/rte_pdump.h
diff --git a/lib/librte_pdump/version.map b/lib/pdump/version.map
similarity index 100%
rename from lib/librte_pdump/version.map
rename to lib/pdump/version.map
diff --git a/lib/librte_pipeline/meson.build b/lib/pipeline/meson.build
similarity index 100%
rename from lib/librte_pipeline/meson.build
rename to lib/pipeline/meson.build
diff --git a/lib/librte_pipeline/rte_pipeline.c b/lib/pipeline/rte_pipeline.c
similarity index 100%
rename from lib/librte_pipeline/rte_pipeline.c
rename to lib/pipeline/rte_pipeline.c
diff --git a/lib/librte_pipeline/rte_pipeline.h b/lib/pipeline/rte_pipeline.h
similarity index 100%
rename from lib/librte_pipeline/rte_pipeline.h
rename to lib/pipeline/rte_pipeline.h
diff --git a/lib/librte_pipeline/rte_port_in_action.c b/lib/pipeline/rte_port_in_action.c
similarity index 100%
rename from lib/librte_pipeline/rte_port_in_action.c
rename to lib/pipeline/rte_port_in_action.c
diff --git a/lib/librte_pipeline/rte_port_in_action.h b/lib/pipeline/rte_port_in_action.h
similarity index 100%
rename from lib/librte_pipeline/rte_port_in_action.h
rename to lib/pipeline/rte_port_in_action.h
diff --git a/lib/librte_pipeline/rte_swx_ctl.c b/lib/pipeline/rte_swx_ctl.c
similarity index 100%
rename from lib/librte_pipeline/rte_swx_ctl.c
rename to lib/pipeline/rte_swx_ctl.c
diff --git a/lib/librte_pipeline/rte_swx_ctl.h b/lib/pipeline/rte_swx_ctl.h
similarity index 100%
rename from lib/librte_pipeline/rte_swx_ctl.h
rename to lib/pipeline/rte_swx_ctl.h
diff --git a/lib/librte_pipeline/rte_swx_extern.h b/lib/pipeline/rte_swx_extern.h
similarity index 100%
rename from lib/librte_pipeline/rte_swx_extern.h
rename to lib/pipeline/rte_swx_extern.h
diff --git a/lib/librte_pipeline/rte_swx_pipeline.c b/lib/pipeline/rte_swx_pipeline.c
similarity index 100%
rename from lib/librte_pipeline/rte_swx_pipeline.c
rename to lib/pipeline/rte_swx_pipeline.c
diff --git a/lib/librte_pipeline/rte_swx_pipeline.h b/lib/pipeline/rte_swx_pipeline.h
similarity index 100%
rename from lib/librte_pipeline/rte_swx_pipeline.h
rename to lib/pipeline/rte_swx_pipeline.h
diff --git a/lib/librte_pipeline/rte_swx_pipeline_spec.c b/lib/pipeline/rte_swx_pipeline_spec.c
similarity index 100%
rename from lib/librte_pipeline/rte_swx_pipeline_spec.c
rename to lib/pipeline/rte_swx_pipeline_spec.c
diff --git a/lib/librte_pipeline/rte_table_action.c b/lib/pipeline/rte_table_action.c
similarity index 100%
rename from lib/librte_pipeline/rte_table_action.c
rename to lib/pipeline/rte_table_action.c
diff --git a/lib/librte_pipeline/rte_table_action.h b/lib/pipeline/rte_table_action.h
similarity index 100%
rename from lib/librte_pipeline/rte_table_action.h
rename to lib/pipeline/rte_table_action.h
diff --git a/lib/librte_pipeline/version.map b/lib/pipeline/version.map
similarity index 100%
rename from lib/librte_pipeline/version.map
rename to lib/pipeline/version.map
diff --git a/lib/librte_port/meson.build b/lib/port/meson.build
similarity index 100%
rename from lib/librte_port/meson.build
rename to lib/port/meson.build
diff --git a/lib/librte_port/rte_port.h b/lib/port/rte_port.h
similarity index 100%
rename from lib/librte_port/rte_port.h
rename to lib/port/rte_port.h
diff --git a/lib/librte_port/rte_port_ethdev.c b/lib/port/rte_port_ethdev.c
similarity index 100%
rename from lib/librte_port/rte_port_ethdev.c
rename to lib/port/rte_port_ethdev.c
diff --git a/lib/librte_port/rte_port_ethdev.h b/lib/port/rte_port_ethdev.h
similarity index 100%
rename from lib/librte_port/rte_port_ethdev.h
rename to lib/port/rte_port_ethdev.h
diff --git a/lib/librte_port/rte_port_eventdev.c b/lib/port/rte_port_eventdev.c
similarity index 100%
rename from lib/librte_port/rte_port_eventdev.c
rename to lib/port/rte_port_eventdev.c
diff --git a/lib/librte_port/rte_port_eventdev.h b/lib/port/rte_port_eventdev.h
similarity index 100%
rename from lib/librte_port/rte_port_eventdev.h
rename to lib/port/rte_port_eventdev.h
diff --git a/lib/librte_port/rte_port_fd.c b/lib/port/rte_port_fd.c
similarity index 100%
rename from lib/librte_port/rte_port_fd.c
rename to lib/port/rte_port_fd.c
diff --git a/lib/librte_port/rte_port_fd.h b/lib/port/rte_port_fd.h
similarity index 100%
rename from lib/librte_port/rte_port_fd.h
rename to lib/port/rte_port_fd.h
diff --git a/lib/librte_port/rte_port_frag.c b/lib/port/rte_port_frag.c
similarity index 100%
rename from lib/librte_port/rte_port_frag.c
rename to lib/port/rte_port_frag.c
diff --git a/lib/librte_port/rte_port_frag.h b/lib/port/rte_port_frag.h
similarity index 100%
rename from lib/librte_port/rte_port_frag.h
rename to lib/port/rte_port_frag.h
diff --git a/lib/librte_port/rte_port_kni.c b/lib/port/rte_port_kni.c
similarity index 100%
rename from lib/librte_port/rte_port_kni.c
rename to lib/port/rte_port_kni.c
diff --git a/lib/librte_port/rte_port_kni.h b/lib/port/rte_port_kni.h
similarity index 100%
rename from lib/librte_port/rte_port_kni.h
rename to lib/port/rte_port_kni.h
diff --git a/lib/librte_port/rte_port_ras.c b/lib/port/rte_port_ras.c
similarity index 100%
rename from lib/librte_port/rte_port_ras.c
rename to lib/port/rte_port_ras.c
diff --git a/lib/librte_port/rte_port_ras.h b/lib/port/rte_port_ras.h
similarity index 100%
rename from lib/librte_port/rte_port_ras.h
rename to lib/port/rte_port_ras.h
diff --git a/lib/librte_port/rte_port_ring.c b/lib/port/rte_port_ring.c
similarity index 100%
rename from lib/librte_port/rte_port_ring.c
rename to lib/port/rte_port_ring.c
diff --git a/lib/librte_port/rte_port_ring.h b/lib/port/rte_port_ring.h
similarity index 100%
rename from lib/librte_port/rte_port_ring.h
rename to lib/port/rte_port_ring.h
diff --git a/lib/librte_port/rte_port_sched.c b/lib/port/rte_port_sched.c
similarity index 100%
rename from lib/librte_port/rte_port_sched.c
rename to lib/port/rte_port_sched.c
diff --git a/lib/librte_port/rte_port_sched.h b/lib/port/rte_port_sched.h
similarity index 100%
rename from lib/librte_port/rte_port_sched.h
rename to lib/port/rte_port_sched.h
diff --git a/lib/librte_port/rte_port_source_sink.c b/lib/port/rte_port_source_sink.c
similarity index 100%
rename from lib/librte_port/rte_port_source_sink.c
rename to lib/port/rte_port_source_sink.c
diff --git a/lib/librte_port/rte_port_source_sink.h b/lib/port/rte_port_source_sink.h
similarity index 100%
rename from lib/librte_port/rte_port_source_sink.h
rename to lib/port/rte_port_source_sink.h
diff --git a/lib/librte_port/rte_port_sym_crypto.c b/lib/port/rte_port_sym_crypto.c
similarity index 100%
rename from lib/librte_port/rte_port_sym_crypto.c
rename to lib/port/rte_port_sym_crypto.c
diff --git a/lib/librte_port/rte_port_sym_crypto.h b/lib/port/rte_port_sym_crypto.h
similarity index 100%
rename from lib/librte_port/rte_port_sym_crypto.h
rename to lib/port/rte_port_sym_crypto.h
diff --git a/lib/librte_port/rte_swx_port.h b/lib/port/rte_swx_port.h
similarity index 100%
rename from lib/librte_port/rte_swx_port.h
rename to lib/port/rte_swx_port.h
diff --git a/lib/librte_port/rte_swx_port_ethdev.c b/lib/port/rte_swx_port_ethdev.c
similarity index 100%
rename from lib/librte_port/rte_swx_port_ethdev.c
rename to lib/port/rte_swx_port_ethdev.c
diff --git a/lib/librte_port/rte_swx_port_ethdev.h b/lib/port/rte_swx_port_ethdev.h
similarity index 100%
rename from lib/librte_port/rte_swx_port_ethdev.h
rename to lib/port/rte_swx_port_ethdev.h
diff --git a/lib/librte_port/rte_swx_port_fd.c b/lib/port/rte_swx_port_fd.c
similarity index 100%
rename from lib/librte_port/rte_swx_port_fd.c
rename to lib/port/rte_swx_port_fd.c
diff --git a/lib/librte_port/rte_swx_port_fd.h b/lib/port/rte_swx_port_fd.h
similarity index 100%
rename from lib/librte_port/rte_swx_port_fd.h
rename to lib/port/rte_swx_port_fd.h
diff --git a/lib/librte_port/rte_swx_port_ring.c b/lib/port/rte_swx_port_ring.c
similarity index 100%
rename from lib/librte_port/rte_swx_port_ring.c
rename to lib/port/rte_swx_port_ring.c
diff --git a/lib/librte_port/rte_swx_port_ring.h b/lib/port/rte_swx_port_ring.h
similarity index 100%
rename from lib/librte_port/rte_swx_port_ring.h
rename to lib/port/rte_swx_port_ring.h
diff --git a/lib/librte_port/rte_swx_port_source_sink.c b/lib/port/rte_swx_port_source_sink.c
similarity index 100%
rename from lib/librte_port/rte_swx_port_source_sink.c
rename to lib/port/rte_swx_port_source_sink.c
diff --git a/lib/librte_port/rte_swx_port_source_sink.h b/lib/port/rte_swx_port_source_sink.h
similarity index 100%
rename from lib/librte_port/rte_swx_port_source_sink.h
rename to lib/port/rte_swx_port_source_sink.h
diff --git a/lib/librte_port/version.map b/lib/port/version.map
similarity index 100%
rename from lib/librte_port/version.map
rename to lib/port/version.map
diff --git a/lib/librte_power/guest_channel.c b/lib/power/guest_channel.c
similarity index 100%
rename from lib/librte_power/guest_channel.c
rename to lib/power/guest_channel.c
diff --git a/lib/librte_power/guest_channel.h b/lib/power/guest_channel.h
similarity index 100%
rename from lib/librte_power/guest_channel.h
rename to lib/power/guest_channel.h
diff --git a/lib/librte_power/meson.build b/lib/power/meson.build
similarity index 100%
rename from lib/librte_power/meson.build
rename to lib/power/meson.build
diff --git a/lib/librte_power/power_acpi_cpufreq.c b/lib/power/power_acpi_cpufreq.c
similarity index 100%
rename from lib/librte_power/power_acpi_cpufreq.c
rename to lib/power/power_acpi_cpufreq.c
diff --git a/lib/librte_power/power_acpi_cpufreq.h b/lib/power/power_acpi_cpufreq.h
similarity index 100%
rename from lib/librte_power/power_acpi_cpufreq.h
rename to lib/power/power_acpi_cpufreq.h
diff --git a/lib/librte_power/power_common.c b/lib/power/power_common.c
similarity index 100%
rename from lib/librte_power/power_common.c
rename to lib/power/power_common.c
diff --git a/lib/librte_power/power_common.h b/lib/power/power_common.h
similarity index 100%
rename from lib/librte_power/power_common.h
rename to lib/power/power_common.h
diff --git a/lib/librte_power/power_kvm_vm.c b/lib/power/power_kvm_vm.c
similarity index 100%
rename from lib/librte_power/power_kvm_vm.c
rename to lib/power/power_kvm_vm.c
diff --git a/lib/librte_power/power_kvm_vm.h b/lib/power/power_kvm_vm.h
similarity index 100%
rename from lib/librte_power/power_kvm_vm.h
rename to lib/power/power_kvm_vm.h
diff --git a/lib/librte_power/power_pstate_cpufreq.c b/lib/power/power_pstate_cpufreq.c
similarity index 100%
rename from lib/librte_power/power_pstate_cpufreq.c
rename to lib/power/power_pstate_cpufreq.c
diff --git a/lib/librte_power/power_pstate_cpufreq.h b/lib/power/power_pstate_cpufreq.h
similarity index 100%
rename from lib/librte_power/power_pstate_cpufreq.h
rename to lib/power/power_pstate_cpufreq.h
diff --git a/lib/librte_power/rte_power.c b/lib/power/rte_power.c
similarity index 100%
rename from lib/librte_power/rte_power.c
rename to lib/power/rte_power.c
diff --git a/lib/librte_power/rte_power.h b/lib/power/rte_power.h
similarity index 100%
rename from lib/librte_power/rte_power.h
rename to lib/power/rte_power.h
diff --git a/lib/librte_power/rte_power_empty_poll.c b/lib/power/rte_power_empty_poll.c
similarity index 100%
rename from lib/librte_power/rte_power_empty_poll.c
rename to lib/power/rte_power_empty_poll.c
diff --git a/lib/librte_power/rte_power_empty_poll.h b/lib/power/rte_power_empty_poll.h
similarity index 100%
rename from lib/librte_power/rte_power_empty_poll.h
rename to lib/power/rte_power_empty_poll.h
diff --git a/lib/librte_power/rte_power_guest_channel.h b/lib/power/rte_power_guest_channel.h
similarity index 100%
rename from lib/librte_power/rte_power_guest_channel.h
rename to lib/power/rte_power_guest_channel.h
diff --git a/lib/librte_power/rte_power_pmd_mgmt.c b/lib/power/rte_power_pmd_mgmt.c
similarity index 100%
rename from lib/librte_power/rte_power_pmd_mgmt.c
rename to lib/power/rte_power_pmd_mgmt.c
diff --git a/lib/librte_power/rte_power_pmd_mgmt.h b/lib/power/rte_power_pmd_mgmt.h
similarity index 100%
rename from lib/librte_power/rte_power_pmd_mgmt.h
rename to lib/power/rte_power_pmd_mgmt.h
diff --git a/lib/librte_power/version.map b/lib/power/version.map
similarity index 100%
rename from lib/librte_power/version.map
rename to lib/power/version.map
diff --git a/lib/librte_rawdev/meson.build b/lib/rawdev/meson.build
similarity index 100%
rename from lib/librte_rawdev/meson.build
rename to lib/rawdev/meson.build
diff --git a/lib/librte_rawdev/rte_rawdev.c b/lib/rawdev/rte_rawdev.c
similarity index 100%
rename from lib/librte_rawdev/rte_rawdev.c
rename to lib/rawdev/rte_rawdev.c
diff --git a/lib/librte_rawdev/rte_rawdev.h b/lib/rawdev/rte_rawdev.h
similarity index 100%
rename from lib/librte_rawdev/rte_rawdev.h
rename to lib/rawdev/rte_rawdev.h
diff --git a/lib/librte_rawdev/rte_rawdev_pmd.h b/lib/rawdev/rte_rawdev_pmd.h
similarity index 100%
rename from lib/librte_rawdev/rte_rawdev_pmd.h
rename to lib/rawdev/rte_rawdev_pmd.h
diff --git a/lib/librte_rawdev/version.map b/lib/rawdev/version.map
similarity index 100%
rename from lib/librte_rawdev/version.map
rename to lib/rawdev/version.map
diff --git a/lib/librte_rcu/meson.build b/lib/rcu/meson.build
similarity index 100%
rename from lib/librte_rcu/meson.build
rename to lib/rcu/meson.build
diff --git a/lib/librte_rcu/rcu_qsbr_pvt.h b/lib/rcu/rcu_qsbr_pvt.h
similarity index 100%
rename from lib/librte_rcu/rcu_qsbr_pvt.h
rename to lib/rcu/rcu_qsbr_pvt.h
diff --git a/lib/librte_rcu/rte_rcu_qsbr.c b/lib/rcu/rte_rcu_qsbr.c
similarity index 100%
rename from lib/librte_rcu/rte_rcu_qsbr.c
rename to lib/rcu/rte_rcu_qsbr.c
diff --git a/lib/librte_rcu/rte_rcu_qsbr.h b/lib/rcu/rte_rcu_qsbr.h
similarity index 100%
rename from lib/librte_rcu/rte_rcu_qsbr.h
rename to lib/rcu/rte_rcu_qsbr.h
diff --git a/lib/librte_rcu/version.map b/lib/rcu/version.map
similarity index 100%
rename from lib/librte_rcu/version.map
rename to lib/rcu/version.map
diff --git a/lib/librte_regexdev/meson.build b/lib/regexdev/meson.build
similarity index 100%
rename from lib/librte_regexdev/meson.build
rename to lib/regexdev/meson.build
diff --git a/lib/librte_regexdev/rte_regexdev.c b/lib/regexdev/rte_regexdev.c
similarity index 100%
rename from lib/librte_regexdev/rte_regexdev.c
rename to lib/regexdev/rte_regexdev.c
diff --git a/lib/librte_regexdev/rte_regexdev.h b/lib/regexdev/rte_regexdev.h
similarity index 100%
rename from lib/librte_regexdev/rte_regexdev.h
rename to lib/regexdev/rte_regexdev.h
diff --git a/lib/librte_regexdev/rte_regexdev_core.h b/lib/regexdev/rte_regexdev_core.h
similarity index 100%
rename from lib/librte_regexdev/rte_regexdev_core.h
rename to lib/regexdev/rte_regexdev_core.h
diff --git a/lib/librte_regexdev/rte_regexdev_driver.h b/lib/regexdev/rte_regexdev_driver.h
similarity index 100%
rename from lib/librte_regexdev/rte_regexdev_driver.h
rename to lib/regexdev/rte_regexdev_driver.h
diff --git a/lib/librte_regexdev/version.map b/lib/regexdev/version.map
similarity index 100%
rename from lib/librte_regexdev/version.map
rename to lib/regexdev/version.map
diff --git a/lib/librte_reorder/meson.build b/lib/reorder/meson.build
similarity index 100%
rename from lib/librte_reorder/meson.build
rename to lib/reorder/meson.build
diff --git a/lib/librte_reorder/rte_reorder.c b/lib/reorder/rte_reorder.c
similarity index 100%
rename from lib/librte_reorder/rte_reorder.c
rename to lib/reorder/rte_reorder.c
diff --git a/lib/librte_reorder/rte_reorder.h b/lib/reorder/rte_reorder.h
similarity index 100%
rename from lib/librte_reorder/rte_reorder.h
rename to lib/reorder/rte_reorder.h
diff --git a/lib/librte_reorder/version.map b/lib/reorder/version.map
similarity index 100%
rename from lib/librte_reorder/version.map
rename to lib/reorder/version.map
diff --git a/lib/librte_rib/meson.build b/lib/rib/meson.build
similarity index 100%
rename from lib/librte_rib/meson.build
rename to lib/rib/meson.build
diff --git a/lib/librte_rib/rte_rib.c b/lib/rib/rte_rib.c
similarity index 100%
rename from lib/librte_rib/rte_rib.c
rename to lib/rib/rte_rib.c
diff --git a/lib/librte_rib/rte_rib.h b/lib/rib/rte_rib.h
similarity index 100%
rename from lib/librte_rib/rte_rib.h
rename to lib/rib/rte_rib.h
diff --git a/lib/librte_rib/rte_rib6.c b/lib/rib/rte_rib6.c
similarity index 100%
rename from lib/librte_rib/rte_rib6.c
rename to lib/rib/rte_rib6.c
diff --git a/lib/librte_rib/rte_rib6.h b/lib/rib/rte_rib6.h
similarity index 100%
rename from lib/librte_rib/rte_rib6.h
rename to lib/rib/rte_rib6.h
diff --git a/lib/librte_rib/version.map b/lib/rib/version.map
similarity index 100%
rename from lib/librte_rib/version.map
rename to lib/rib/version.map
diff --git a/lib/librte_ring/meson.build b/lib/ring/meson.build
similarity index 100%
rename from lib/librte_ring/meson.build
rename to lib/ring/meson.build
diff --git a/lib/librte_ring/rte_ring.c b/lib/ring/rte_ring.c
similarity index 100%
rename from lib/librte_ring/rte_ring.c
rename to lib/ring/rte_ring.c
diff --git a/lib/librte_ring/rte_ring.h b/lib/ring/rte_ring.h
similarity index 100%
rename from lib/librte_ring/rte_ring.h
rename to lib/ring/rte_ring.h
diff --git a/lib/librte_ring/rte_ring_c11_pvt.h b/lib/ring/rte_ring_c11_pvt.h
similarity index 100%
rename from lib/librte_ring/rte_ring_c11_pvt.h
rename to lib/ring/rte_ring_c11_pvt.h
diff --git a/lib/librte_ring/rte_ring_core.h b/lib/ring/rte_ring_core.h
similarity index 100%
rename from lib/librte_ring/rte_ring_core.h
rename to lib/ring/rte_ring_core.h
diff --git a/lib/librte_ring/rte_ring_elem.h b/lib/ring/rte_ring_elem.h
similarity index 100%
rename from lib/librte_ring/rte_ring_elem.h
rename to lib/ring/rte_ring_elem.h
diff --git a/lib/librte_ring/rte_ring_elem_pvt.h b/lib/ring/rte_ring_elem_pvt.h
similarity index 100%
rename from lib/librte_ring/rte_ring_elem_pvt.h
rename to lib/ring/rte_ring_elem_pvt.h
diff --git a/lib/librte_ring/rte_ring_generic_pvt.h b/lib/ring/rte_ring_generic_pvt.h
similarity index 100%
rename from lib/librte_ring/rte_ring_generic_pvt.h
rename to lib/ring/rte_ring_generic_pvt.h
diff --git a/lib/librte_ring/rte_ring_hts.h b/lib/ring/rte_ring_hts.h
similarity index 100%
rename from lib/librte_ring/rte_ring_hts.h
rename to lib/ring/rte_ring_hts.h
diff --git a/lib/librte_ring/rte_ring_hts_elem_pvt.h b/lib/ring/rte_ring_hts_elem_pvt.h
similarity index 100%
rename from lib/librte_ring/rte_ring_hts_elem_pvt.h
rename to lib/ring/rte_ring_hts_elem_pvt.h
diff --git a/lib/librte_ring/rte_ring_peek.h b/lib/ring/rte_ring_peek.h
similarity index 100%
rename from lib/librte_ring/rte_ring_peek.h
rename to lib/ring/rte_ring_peek.h
diff --git a/lib/librte_ring/rte_ring_peek_elem_pvt.h b/lib/ring/rte_ring_peek_elem_pvt.h
similarity index 100%
rename from lib/librte_ring/rte_ring_peek_elem_pvt.h
rename to lib/ring/rte_ring_peek_elem_pvt.h
diff --git a/lib/librte_ring/rte_ring_peek_zc.h b/lib/ring/rte_ring_peek_zc.h
similarity index 100%
rename from lib/librte_ring/rte_ring_peek_zc.h
rename to lib/ring/rte_ring_peek_zc.h
diff --git a/lib/librte_ring/rte_ring_rts.h b/lib/ring/rte_ring_rts.h
similarity index 100%
rename from lib/librte_ring/rte_ring_rts.h
rename to lib/ring/rte_ring_rts.h
diff --git a/lib/librte_ring/rte_ring_rts_elem_pvt.h b/lib/ring/rte_ring_rts_elem_pvt.h
similarity index 100%
rename from lib/librte_ring/rte_ring_rts_elem_pvt.h
rename to lib/ring/rte_ring_rts_elem_pvt.h
diff --git a/lib/librte_ring/version.map b/lib/ring/version.map
similarity index 100%
rename from lib/librte_ring/version.map
rename to lib/ring/version.map
diff --git a/lib/librte_sched/meson.build b/lib/sched/meson.build
similarity index 100%
rename from lib/librte_sched/meson.build
rename to lib/sched/meson.build
diff --git a/lib/librte_sched/rte_approx.c b/lib/sched/rte_approx.c
similarity index 100%
rename from lib/librte_sched/rte_approx.c
rename to lib/sched/rte_approx.c
diff --git a/lib/librte_sched/rte_approx.h b/lib/sched/rte_approx.h
similarity index 100%
rename from lib/librte_sched/rte_approx.h
rename to lib/sched/rte_approx.h
diff --git a/lib/librte_sched/rte_red.c b/lib/sched/rte_red.c
similarity index 100%
rename from lib/librte_sched/rte_red.c
rename to lib/sched/rte_red.c
diff --git a/lib/librte_sched/rte_red.h b/lib/sched/rte_red.h
similarity index 100%
rename from lib/librte_sched/rte_red.h
rename to lib/sched/rte_red.h
diff --git a/lib/librte_sched/rte_sched.c b/lib/sched/rte_sched.c
similarity index 100%
rename from lib/librte_sched/rte_sched.c
rename to lib/sched/rte_sched.c
diff --git a/lib/librte_sched/rte_sched.h b/lib/sched/rte_sched.h
similarity index 100%
rename from lib/librte_sched/rte_sched.h
rename to lib/sched/rte_sched.h
diff --git a/lib/librte_sched/rte_sched_common.h b/lib/sched/rte_sched_common.h
similarity index 100%
rename from lib/librte_sched/rte_sched_common.h
rename to lib/sched/rte_sched_common.h
diff --git a/lib/librte_sched/version.map b/lib/sched/version.map
similarity index 100%
rename from lib/librte_sched/version.map
rename to lib/sched/version.map
diff --git a/lib/librte_security/meson.build b/lib/security/meson.build
similarity index 100%
rename from lib/librte_security/meson.build
rename to lib/security/meson.build
diff --git a/lib/librte_security/rte_security.c b/lib/security/rte_security.c
similarity index 100%
rename from lib/librte_security/rte_security.c
rename to lib/security/rte_security.c
diff --git a/lib/librte_security/rte_security.h b/lib/security/rte_security.h
similarity index 100%
rename from lib/librte_security/rte_security.h
rename to lib/security/rte_security.h
diff --git a/lib/librte_security/rte_security_driver.h b/lib/security/rte_security_driver.h
similarity index 100%
rename from lib/librte_security/rte_security_driver.h
rename to lib/security/rte_security_driver.h
diff --git a/lib/librte_security/version.map b/lib/security/version.map
similarity index 100%
rename from lib/librte_security/version.map
rename to lib/security/version.map
diff --git a/lib/librte_stack/meson.build b/lib/stack/meson.build
similarity index 100%
rename from lib/librte_stack/meson.build
rename to lib/stack/meson.build
diff --git a/lib/librte_stack/rte_stack.c b/lib/stack/rte_stack.c
similarity index 100%
rename from lib/librte_stack/rte_stack.c
rename to lib/stack/rte_stack.c
diff --git a/lib/librte_stack/rte_stack.h b/lib/stack/rte_stack.h
similarity index 100%
rename from lib/librte_stack/rte_stack.h
rename to lib/stack/rte_stack.h
diff --git a/lib/librte_stack/rte_stack_lf.c b/lib/stack/rte_stack_lf.c
similarity index 100%
rename from lib/librte_stack/rte_stack_lf.c
rename to lib/stack/rte_stack_lf.c
diff --git a/lib/librte_stack/rte_stack_lf.h b/lib/stack/rte_stack_lf.h
similarity index 100%
rename from lib/librte_stack/rte_stack_lf.h
rename to lib/stack/rte_stack_lf.h
diff --git a/lib/librte_stack/rte_stack_lf_c11.h b/lib/stack/rte_stack_lf_c11.h
similarity index 100%
rename from lib/librte_stack/rte_stack_lf_c11.h
rename to lib/stack/rte_stack_lf_c11.h
diff --git a/lib/librte_stack/rte_stack_lf_generic.h b/lib/stack/rte_stack_lf_generic.h
similarity index 100%
rename from lib/librte_stack/rte_stack_lf_generic.h
rename to lib/stack/rte_stack_lf_generic.h
diff --git a/lib/librte_stack/rte_stack_lf_stubs.h b/lib/stack/rte_stack_lf_stubs.h
similarity index 100%
rename from lib/librte_stack/rte_stack_lf_stubs.h
rename to lib/stack/rte_stack_lf_stubs.h
diff --git a/lib/librte_stack/rte_stack_std.c b/lib/stack/rte_stack_std.c
similarity index 100%
rename from lib/librte_stack/rte_stack_std.c
rename to lib/stack/rte_stack_std.c
diff --git a/lib/librte_stack/rte_stack_std.h b/lib/stack/rte_stack_std.h
similarity index 100%
rename from lib/librte_stack/rte_stack_std.h
rename to lib/stack/rte_stack_std.h
diff --git a/lib/librte_stack/stack_pvt.h b/lib/stack/stack_pvt.h
similarity index 100%
rename from lib/librte_stack/stack_pvt.h
rename to lib/stack/stack_pvt.h
diff --git a/lib/librte_stack/version.map b/lib/stack/version.map
similarity index 100%
rename from lib/librte_stack/version.map
rename to lib/stack/version.map
diff --git a/lib/librte_table/meson.build b/lib/table/meson.build
similarity index 100%
rename from lib/librte_table/meson.build
rename to lib/table/meson.build
diff --git a/lib/librte_table/rte_lru.h b/lib/table/rte_lru.h
similarity index 100%
rename from lib/librte_table/rte_lru.h
rename to lib/table/rte_lru.h
diff --git a/lib/librte_table/rte_lru_arm64.h b/lib/table/rte_lru_arm64.h
similarity index 100%
rename from lib/librte_table/rte_lru_arm64.h
rename to lib/table/rte_lru_arm64.h
diff --git a/lib/librte_table/rte_lru_x86.h b/lib/table/rte_lru_x86.h
similarity index 100%
rename from lib/librte_table/rte_lru_x86.h
rename to lib/table/rte_lru_x86.h
diff --git a/lib/librte_table/rte_swx_table.h b/lib/table/rte_swx_table.h
similarity index 100%
rename from lib/librte_table/rte_swx_table.h
rename to lib/table/rte_swx_table.h
diff --git a/lib/librte_table/rte_swx_table_em.c b/lib/table/rte_swx_table_em.c
similarity index 100%
rename from lib/librte_table/rte_swx_table_em.c
rename to lib/table/rte_swx_table_em.c
diff --git a/lib/librte_table/rte_swx_table_em.h b/lib/table/rte_swx_table_em.h
similarity index 100%
rename from lib/librte_table/rte_swx_table_em.h
rename to lib/table/rte_swx_table_em.h
diff --git a/lib/librte_table/rte_swx_table_wm.c b/lib/table/rte_swx_table_wm.c
similarity index 100%
rename from lib/librte_table/rte_swx_table_wm.c
rename to lib/table/rte_swx_table_wm.c
diff --git a/lib/librte_table/rte_swx_table_wm.h b/lib/table/rte_swx_table_wm.h
similarity index 100%
rename from lib/librte_table/rte_swx_table_wm.h
rename to lib/table/rte_swx_table_wm.h
diff --git a/lib/librte_table/rte_table.h b/lib/table/rte_table.h
similarity index 100%
rename from lib/librte_table/rte_table.h
rename to lib/table/rte_table.h
diff --git a/lib/librte_table/rte_table_acl.c b/lib/table/rte_table_acl.c
similarity index 100%
rename from lib/librte_table/rte_table_acl.c
rename to lib/table/rte_table_acl.c
diff --git a/lib/librte_table/rte_table_acl.h b/lib/table/rte_table_acl.h
similarity index 100%
rename from lib/librte_table/rte_table_acl.h
rename to lib/table/rte_table_acl.h
diff --git a/lib/librte_table/rte_table_array.c b/lib/table/rte_table_array.c
similarity index 100%
rename from lib/librte_table/rte_table_array.c
rename to lib/table/rte_table_array.c
diff --git a/lib/librte_table/rte_table_array.h b/lib/table/rte_table_array.h
similarity index 100%
rename from lib/librte_table/rte_table_array.h
rename to lib/table/rte_table_array.h
diff --git a/lib/librte_table/rte_table_hash.h b/lib/table/rte_table_hash.h
similarity index 100%
rename from lib/librte_table/rte_table_hash.h
rename to lib/table/rte_table_hash.h
diff --git a/lib/librte_table/rte_table_hash_cuckoo.c b/lib/table/rte_table_hash_cuckoo.c
similarity index 100%
rename from lib/librte_table/rte_table_hash_cuckoo.c
rename to lib/table/rte_table_hash_cuckoo.c
diff --git a/lib/librte_table/rte_table_hash_cuckoo.h b/lib/table/rte_table_hash_cuckoo.h
similarity index 100%
rename from lib/librte_table/rte_table_hash_cuckoo.h
rename to lib/table/rte_table_hash_cuckoo.h
diff --git a/lib/librte_table/rte_table_hash_ext.c b/lib/table/rte_table_hash_ext.c
similarity index 100%
rename from lib/librte_table/rte_table_hash_ext.c
rename to lib/table/rte_table_hash_ext.c
diff --git a/lib/librte_table/rte_table_hash_func.h b/lib/table/rte_table_hash_func.h
similarity index 100%
rename from lib/librte_table/rte_table_hash_func.h
rename to lib/table/rte_table_hash_func.h
diff --git a/lib/librte_table/rte_table_hash_func_arm64.h b/lib/table/rte_table_hash_func_arm64.h
similarity index 100%
rename from lib/librte_table/rte_table_hash_func_arm64.h
rename to lib/table/rte_table_hash_func_arm64.h
diff --git a/lib/librte_table/rte_table_hash_key16.c b/lib/table/rte_table_hash_key16.c
similarity index 100%
rename from lib/librte_table/rte_table_hash_key16.c
rename to lib/table/rte_table_hash_key16.c
diff --git a/lib/librte_table/rte_table_hash_key32.c b/lib/table/rte_table_hash_key32.c
similarity index 100%
rename from lib/librte_table/rte_table_hash_key32.c
rename to lib/table/rte_table_hash_key32.c
diff --git a/lib/librte_table/rte_table_hash_key8.c b/lib/table/rte_table_hash_key8.c
similarity index 100%
rename from lib/librte_table/rte_table_hash_key8.c
rename to lib/table/rte_table_hash_key8.c
diff --git a/lib/librte_table/rte_table_hash_lru.c b/lib/table/rte_table_hash_lru.c
similarity index 100%
rename from lib/librte_table/rte_table_hash_lru.c
rename to lib/table/rte_table_hash_lru.c
diff --git a/lib/librte_table/rte_table_lpm.c b/lib/table/rte_table_lpm.c
similarity index 100%
rename from lib/librte_table/rte_table_lpm.c
rename to lib/table/rte_table_lpm.c
diff --git a/lib/librte_table/rte_table_lpm.h b/lib/table/rte_table_lpm.h
similarity index 100%
rename from lib/librte_table/rte_table_lpm.h
rename to lib/table/rte_table_lpm.h
diff --git a/lib/librte_table/rte_table_lpm_ipv6.c b/lib/table/rte_table_lpm_ipv6.c
similarity index 100%
rename from lib/librte_table/rte_table_lpm_ipv6.c
rename to lib/table/rte_table_lpm_ipv6.c
diff --git a/lib/librte_table/rte_table_lpm_ipv6.h b/lib/table/rte_table_lpm_ipv6.h
similarity index 100%
rename from lib/librte_table/rte_table_lpm_ipv6.h
rename to lib/table/rte_table_lpm_ipv6.h
diff --git a/lib/librte_table/rte_table_stub.c b/lib/table/rte_table_stub.c
similarity index 100%
rename from lib/librte_table/rte_table_stub.c
rename to lib/table/rte_table_stub.c
diff --git a/lib/librte_table/rte_table_stub.h b/lib/table/rte_table_stub.h
similarity index 100%
rename from lib/librte_table/rte_table_stub.h
rename to lib/table/rte_table_stub.h
diff --git a/lib/librte_table/version.map b/lib/table/version.map
similarity index 100%
rename from lib/librte_table/version.map
rename to lib/table/version.map
diff --git a/lib/librte_telemetry/meson.build b/lib/telemetry/meson.build
similarity index 80%
rename from lib/librte_telemetry/meson.build
rename to lib/telemetry/meson.build
index 719973ff92..f84c9aa3be 100644
--- a/lib/librte_telemetry/meson.build
+++ b/lib/telemetry/meson.build
@@ -5,4 +5,4 @@ includes = [global_inc]
 
 sources = files('telemetry.c', 'telemetry_data.c', 'telemetry_legacy.c')
 headers = files('rte_telemetry.h')
-includes += include_directories('../librte_metrics')
+includes += include_directories('../metrics')
diff --git a/lib/librte_telemetry/rte_telemetry.h b/lib/telemetry/rte_telemetry.h
similarity index 100%
rename from lib/librte_telemetry/rte_telemetry.h
rename to lib/telemetry/rte_telemetry.h
diff --git a/lib/librte_telemetry/telemetry.c b/lib/telemetry/telemetry.c
similarity index 100%
rename from lib/librte_telemetry/telemetry.c
rename to lib/telemetry/telemetry.c
diff --git a/lib/librte_telemetry/telemetry_data.c b/lib/telemetry/telemetry_data.c
similarity index 100%
rename from lib/librte_telemetry/telemetry_data.c
rename to lib/telemetry/telemetry_data.c
diff --git a/lib/librte_telemetry/telemetry_data.h b/lib/telemetry/telemetry_data.h
similarity index 100%
rename from lib/librte_telemetry/telemetry_data.h
rename to lib/telemetry/telemetry_data.h
diff --git a/lib/librte_telemetry/telemetry_internal.h b/lib/telemetry/telemetry_internal.h
similarity index 100%
rename from lib/librte_telemetry/telemetry_internal.h
rename to lib/telemetry/telemetry_internal.h
diff --git a/lib/librte_telemetry/telemetry_json.h b/lib/telemetry/telemetry_json.h
similarity index 100%
rename from lib/librte_telemetry/telemetry_json.h
rename to lib/telemetry/telemetry_json.h
diff --git a/lib/librte_telemetry/telemetry_legacy.c b/lib/telemetry/telemetry_legacy.c
similarity index 100%
rename from lib/librte_telemetry/telemetry_legacy.c
rename to lib/telemetry/telemetry_legacy.c
diff --git a/lib/librte_telemetry/version.map b/lib/telemetry/version.map
similarity index 100%
rename from lib/librte_telemetry/version.map
rename to lib/telemetry/version.map
diff --git a/lib/librte_timer/meson.build b/lib/timer/meson.build
similarity index 100%
rename from lib/librte_timer/meson.build
rename to lib/timer/meson.build
diff --git a/lib/librte_timer/rte_timer.c b/lib/timer/rte_timer.c
similarity index 100%
rename from lib/librte_timer/rte_timer.c
rename to lib/timer/rte_timer.c
diff --git a/lib/librte_timer/rte_timer.h b/lib/timer/rte_timer.h
similarity index 100%
rename from lib/librte_timer/rte_timer.h
rename to lib/timer/rte_timer.h
diff --git a/lib/librte_timer/version.map b/lib/timer/version.map
similarity index 100%
rename from lib/librte_timer/version.map
rename to lib/timer/version.map
diff --git a/lib/librte_vhost/fd_man.c b/lib/vhost/fd_man.c
similarity index 100%
rename from lib/librte_vhost/fd_man.c
rename to lib/vhost/fd_man.c
diff --git a/lib/librte_vhost/fd_man.h b/lib/vhost/fd_man.h
similarity index 100%
rename from lib/librte_vhost/fd_man.h
rename to lib/vhost/fd_man.h
diff --git a/lib/librte_vhost/iotlb.c b/lib/vhost/iotlb.c
similarity index 100%
rename from lib/librte_vhost/iotlb.c
rename to lib/vhost/iotlb.c
diff --git a/lib/librte_vhost/iotlb.h b/lib/vhost/iotlb.h
similarity index 100%
rename from lib/librte_vhost/iotlb.h
rename to lib/vhost/iotlb.h
diff --git a/lib/librte_vhost/meson.build b/lib/vhost/meson.build
similarity index 100%
rename from lib/librte_vhost/meson.build
rename to lib/vhost/meson.build
diff --git a/lib/librte_vhost/rte_vdpa.h b/lib/vhost/rte_vdpa.h
similarity index 100%
rename from lib/librte_vhost/rte_vdpa.h
rename to lib/vhost/rte_vdpa.h
diff --git a/lib/librte_vhost/rte_vdpa_dev.h b/lib/vhost/rte_vdpa_dev.h
similarity index 100%
rename from lib/librte_vhost/rte_vdpa_dev.h
rename to lib/vhost/rte_vdpa_dev.h
diff --git a/lib/librte_vhost/rte_vhost.h b/lib/vhost/rte_vhost.h
similarity index 100%
rename from lib/librte_vhost/rte_vhost.h
rename to lib/vhost/rte_vhost.h
diff --git a/lib/librte_vhost/rte_vhost_async.h b/lib/vhost/rte_vhost_async.h
similarity index 100%
rename from lib/librte_vhost/rte_vhost_async.h
rename to lib/vhost/rte_vhost_async.h
diff --git a/lib/librte_vhost/rte_vhost_crypto.h b/lib/vhost/rte_vhost_crypto.h
similarity index 100%
rename from lib/librte_vhost/rte_vhost_crypto.h
rename to lib/vhost/rte_vhost_crypto.h
diff --git a/lib/librte_vhost/socket.c b/lib/vhost/socket.c
similarity index 100%
rename from lib/librte_vhost/socket.c
rename to lib/vhost/socket.c
diff --git a/lib/librte_vhost/vdpa.c b/lib/vhost/vdpa.c
similarity index 100%
rename from lib/librte_vhost/vdpa.c
rename to lib/vhost/vdpa.c
diff --git a/lib/librte_vhost/version.map b/lib/vhost/version.map
similarity index 100%
rename from lib/librte_vhost/version.map
rename to lib/vhost/version.map
diff --git a/lib/librte_vhost/vhost.c b/lib/vhost/vhost.c
similarity index 100%
rename from lib/librte_vhost/vhost.c
rename to lib/vhost/vhost.c
diff --git a/lib/librte_vhost/vhost.h b/lib/vhost/vhost.h
similarity index 100%
rename from lib/librte_vhost/vhost.h
rename to lib/vhost/vhost.h
diff --git a/lib/librte_vhost/vhost_crypto.c b/lib/vhost/vhost_crypto.c
similarity index 100%
rename from lib/librte_vhost/vhost_crypto.c
rename to lib/vhost/vhost_crypto.c
diff --git a/lib/librte_vhost/vhost_user.c b/lib/vhost/vhost_user.c
similarity index 100%
rename from lib/librte_vhost/vhost_user.c
rename to lib/vhost/vhost_user.c
diff --git a/lib/librte_vhost/vhost_user.h b/lib/vhost/vhost_user.h
similarity index 100%
rename from lib/librte_vhost/vhost_user.h
rename to lib/vhost/vhost_user.h
diff --git a/lib/librte_vhost/virtio_crypto.h b/lib/vhost/virtio_crypto.h
similarity index 100%
rename from lib/librte_vhost/virtio_crypto.h
rename to lib/vhost/virtio_crypto.h
diff --git a/lib/librte_vhost/virtio_net.c b/lib/vhost/virtio_net.c
similarity index 100%
rename from lib/librte_vhost/virtio_net.c
rename to lib/vhost/virtio_net.c
diff --git a/license/exceptions.txt b/license/exceptions.txt
index 636c69b9bf..1bd4dbf8f7 100644
--- a/license/exceptions.txt
+++ b/license/exceptions.txt
@@ -12,8 +12,8 @@ Note that following licenses are not exceptions:-
 ---------------------------------------------------------------------------------------------------
 SPDX Identifier     TB Approval Date  GB Approval Date  File name
 ---------------------------------------------------------------------------------------------------
-1.MIT               10/23/2019        02/10/2020        lib/librte_eal/windows/include/dirent.h
-2.BSD-2-Clause      10/23/2019        12/18/2019        lib/librte_eal/windows/include/getopt.h
+1.MIT               10/23/2019        02/10/2020        lib/eal/windows/include/dirent.h
+2.BSD-2-Clause      10/23/2019        12/18/2019        lib/eal/windows/include/getopt.h
 3.ISC AND
-  BSD-2-Clause      10/23/2019        12/18/2019        lib/librte_eal/windows/getopt.c
+  BSD-2-Clause      10/23/2019        12/18/2019        lib/eal/windows/getopt.c
 ---------------------------------------------------------------------------------------------------
diff --git a/meson.build b/meson.build
index 30b5a43794..882aaf4211 100644
--- a/meson.build
+++ b/meson.build
@@ -36,9 +36,9 @@ endif
 # able to be included in any file. We also store a global array of include dirs
 # for passing to pmdinfogen scripts
 global_inc = include_directories('.', 'config',
-    'lib/librte_eal/include',
-    'lib/librte_eal/@0@/include'.format(host_machine.system()),
-    'lib/librte_eal/@0@/include'.format(arch_subdir),
+    'lib/eal/include',
+    'lib/eal/@0@/include'.format(host_machine.system()),
+    'lib/eal/@0@/include'.format(arch_subdir),
 )
 
 # do configuration and get tool paths
-- 
2.27.0


^ permalink raw reply	[relevance 1%]

* Re: [dpdk-dev] [PATCH] eal: move DMA mapping from bus-specific to generic driver
  2021-03-31 22:53  4% ` Thomas Monjalon
@ 2021-04-01  8:40  0%   ` Kinsella, Ray
  2021-04-12 15:03  0%   ` Kinsella, Ray
  1 sibling, 0 replies; 200+ results
From: Kinsella, Ray @ 2021-04-01  8:40 UTC (permalink / raw)
  To: Thomas Monjalon
  Cc: dev, hemant.agrawal, rosen.xu, sthemmin, longli, jerinj,
	ferruh.yigit, andrew.rybchenko, Matan Azrad, Shahaf Shuler,
	Viacheslav Ovsiienko, Maxime Coquelin, Chenbo Xia, xuemingl,
	david.marchand



On 31/03/2021 23:53, Thomas Monjalon wrote:
> 01/04/2021 00:45, Thomas Monjalon:
>> The operations of DMA mapping and unmapping are controlled in some
>> bus drivers, following rte_bus specification.
>> If the device driver don't provide any specific mapping operation,
>> the bus driver may have a fallback (VFIO case for PCI).
>>
>> The DMA mapping done by the device drivers are called
>> from the bus drivers via function pointers in bus-specific structures:
>> rte_vdev_driver and rte_pci_driver.
>>
>> The device driver DMA mapping is not specific to the bus,
>> so it can be generalized to all device drivers, based on rte_device.
>> That's why the function pointers dma_map and dma_unmap
>> are moved to rte_driver, avoiding useless casts of device object.
>>
>> The function prototypes rte_dev_dma_map_t and rte_dev_dma_unmap_t
>> are removed from rte_bus.h because the definition in rte_dev.h is enough,
>> but they are still used in rte_bus for bus drivers,
>> while being added in rte_driver for device drivers,
>> and removed from rte_vdev_driver/rte_pci_driver.
>>
>> The impacted device drivers are mlx5 (PCI) and virtio_user (vdev).
>>
>> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
>> ---
>> Depends-on: series-16017 ("pci: add rte prefix")
>> ---
>>  drivers/bus/pci/pci_common.c            |  8 ++--
>>  drivers/bus/pci/rte_bus_pci.h           | 40 --------------------
>>  drivers/bus/vdev/rte_bus_vdev.h         | 40 --------------------
>>  drivers/bus/vdev/vdev.c                 | 32 +++++-----------
>>  drivers/common/mlx5/mlx5_common_pci.c   | 30 ++++++++-------
>>  drivers/net/mlx5/mlx5.c                 |  4 +-
>>  drivers/net/mlx5/mlx5_mr.c              | 50 +++++++++++++------------
>>  drivers/net/mlx5/mlx5_rxtx.h            |  4 +-
>>  drivers/net/virtio/virtio_user_ethdev.c | 22 +++++------
>>  lib/librte_eal/include/rte_bus.h        | 42 ---------------------
>>  lib/librte_eal/include/rte_dev.h        | 49 +++++++++++++++++++++++-
>>  11 files changed, 117 insertions(+), 204 deletions(-)
> 
> The ABI checker reports some issues on the driver interface.
> It needs to be carefully analyzed, because driver interface
> should not be part of the ABI compatibility contract.
> 
ok - I will take a look. 

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH 1/2] ethdev: add pre-defined meter policy API
  @ 2021-04-01  6:54  1% ` Li Zhang
  0 siblings, 0 replies; 200+ results
From: Li Zhang @ 2021-04-01  6:54 UTC (permalink / raw)
  To: dekelp, orika, viacheslavo, matan, shahafs, cristian.dumitrescu,
	lironh, Wisam Jaddo, Xiaoyun Li, Jasvinder Singh,
	Thomas Monjalon, Ferruh Yigit, Andrew Rybchenko, Ray Kinsella,
	Neil Horman
  Cc: dev, rasland, roniba, Haifei Luo

Currently, the flow meter policy does not support multiple actions
per color; also the allowed action types per color are very limited.
In addition, the policy cannot be pre-defined.

Due to the growing in flow actions offload abilities there is a potential
for the user to use variety of actions per color differently.
This new meter policy API comes to allow this potential in the most ethdev
common way using rte_flow action definition.
A list of rte_flow actions will be provided by the user per color
in order to create a meter policy.
In addition, the API forces to pre-define the policy before
the meters creation in order to allow sharing of single policy
with multiple meters efficiently.

meter_policy_id is added into struct rte_mtr_params.
So that it can get the policy during the meters creation.

Policy id 0 is default policy. Action per color as below:
green - nothing, yellow - nothing, red - drop

Allow coloring the packet using a new rte_flow_action_color
as could be done by the old policy API,

The next API function were added:
- rte_mtr_meter_policy_create
- rte_mtr_meter_policy_delete
- rte_mtr_meter_policy_update
- rte_mtr_meter_policy_validate
The next struct was changed:
- rte_mtr_params
- rte_mtr_capabilities
The next API was deleted:
- rte_mtr_policer_actions_update

To support this API the following app were changed:
app/test-flow-perf: clean meter policer
app/testpmd: clean meter policer

To support this API the following drivers were changed:
net/softnic: support meter policy API
1. cleans meter rte_mtr_policer_action.
2. Support policy API to get color action as policer action did.
   The color action will be mapped into rte_table_action_policer.
3. Create default policy if policy id is RTE_MTR_DEFAULT_POLICY_ID.
   default policy actoins:
   green - do nothing, yellow - do nothing, red - drop

net/mlx5: clean meter creation management
Cleans and breaks part of the current meter management
in order to allow better design with policy API.

Signed-off-by: Li Zhang <lizh@nvidia.com>
Signed-off-by: Haifei Luo <haifeil@nvidia.com>
---
 app/test-flow-perf/main.c                     |   7 -
 app/test-pmd/cmdline.c                        |   1 -
 app/test-pmd/cmdline_mtr.c                    | 172 -------
 app/test-pmd/cmdline_mtr.h                    |   1 -
 doc/guides/rel_notes/release_20_11.rst        |   3 +
 drivers/net/mlx5/mlx5.h                       |  24 +-
 drivers/net/mlx5/mlx5_flow.c                  |  46 --
 drivers/net/mlx5/mlx5_flow.h                  |  18 +-
 drivers/net/mlx5/mlx5_flow_aso.c              |   8 +-
 drivers/net/mlx5/mlx5_flow_dv.c               | 461 +-----------------
 drivers/net/mlx5/mlx5_flow_meter.c            | 369 +-------------
 drivers/net/softnic/rte_eth_softnic_flow.c    |  19 +-
 .../net/softnic/rte_eth_softnic_internals.h   |  18 +-
 drivers/net/softnic/rte_eth_softnic_meter.c   | 303 +++++++++---
 lib/librte_ethdev/rte_flow.h                  |  18 +
 lib/librte_ethdev/rte_mtr.c                   |  55 ++-
 lib/librte_ethdev/rte_mtr.h                   | 166 +++++--
 lib/librte_ethdev/rte_mtr_driver.h            |  44 +-
 lib/librte_ethdev/version.map                 |   4 +
 19 files changed, 507 insertions(+), 1230 deletions(-)

diff --git a/app/test-flow-perf/main.c b/app/test-flow-perf/main.c
index 99d0463456..66ec776017 100644
--- a/app/test-flow-perf/main.c
+++ b/app/test-flow-perf/main.c
@@ -924,13 +924,6 @@ create_meter_rule(int port_id, uint32_t counter)
 
 	/*create meter*/
 	params.meter_profile_id = default_prof_id;
-	params.action[RTE_COLOR_GREEN] =
-		MTR_POLICER_ACTION_COLOR_GREEN;
-	params.action[RTE_COLOR_YELLOW] =
-		MTR_POLICER_ACTION_COLOR_YELLOW;
-	params.action[RTE_COLOR_RED] =
-		MTR_POLICER_ACTION_DROP;
-
 	ret = rte_mtr_create(port_id, counter, &params, 1, &error);
 	if (ret != 0) {
 		printf("Port %u create meter idx(%d) error(%d) message: %s\n",
diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 14110eb2e4..dcb5f9c871 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -17069,7 +17069,6 @@ cmdline_parse_ctx_t main_ctx[] = {
 	(cmdline_parse_inst_t *)&cmd_del_port_meter,
 	(cmdline_parse_inst_t *)&cmd_set_port_meter_profile,
 	(cmdline_parse_inst_t *)&cmd_set_port_meter_dscp_table,
-	(cmdline_parse_inst_t *)&cmd_set_port_meter_policer_action,
 	(cmdline_parse_inst_t *)&cmd_set_port_meter_stats_mask,
 	(cmdline_parse_inst_t *)&cmd_show_port_meter_stats,
 	(cmdline_parse_inst_t *)&cmd_mcast_addr,
diff --git a/app/test-pmd/cmdline_mtr.c b/app/test-pmd/cmdline_mtr.c
index 3982787d20..44394e3ea1 100644
--- a/app/test-pmd/cmdline_mtr.c
+++ b/app/test-pmd/cmdline_mtr.c
@@ -146,53 +146,6 @@ parse_meter_color_str(char *c_str, uint32_t *use_prev_meter_color,
 	return 0;
 }
 
-static int
-string_to_policer_action(char *s)
-{
-	if ((strcmp(s, "G") == 0) || (strcmp(s, "g") == 0))
-		return MTR_POLICER_ACTION_COLOR_GREEN;
-
-	if ((strcmp(s, "Y") == 0) || (strcmp(s, "y") == 0))
-		return MTR_POLICER_ACTION_COLOR_YELLOW;
-
-	if ((strcmp(s, "R") == 0) || (strcmp(s, "r") == 0))
-		return MTR_POLICER_ACTION_COLOR_RED;
-
-	if ((strcmp(s, "D") == 0) || (strcmp(s, "d") == 0))
-		return MTR_POLICER_ACTION_DROP;
-
-	return -1;
-}
-
-static int
-parse_policer_action_string(char *p_str, uint32_t action_mask,
-	enum rte_mtr_policer_action actions[])
-{
-	char *token;
-	int count = __builtin_popcount(action_mask);
-	int g_color = 0, y_color = 0, action, i;
-
-	for (i = 0; i < count; i++) {
-		token = strtok_r(p_str, PARSE_DELIMITER, &p_str);
-		if (token ==  NULL)
-			return -1;
-
-		action = string_to_policer_action(token);
-		if (action == -1)
-			return -1;
-
-		if (g_color == 0 && (action_mask & 0x1)) {
-			actions[RTE_COLOR_GREEN] = action;
-			g_color = 1;
-		} else if (y_color == 0 && (action_mask & 0x2)) {
-			actions[RTE_COLOR_YELLOW] = action;
-			y_color = 1;
-		} else
-			actions[RTE_COLOR_RED] = action;
-	}
-	return 0;
-}
-
 static int
 parse_multi_token_string(char *t_str, uint16_t *port_id,
 	uint32_t *mtr_id, enum rte_color **dscp_table)
@@ -302,10 +255,6 @@ static void cmd_show_port_meter_cap_parsed(void *parsed_result,
 		cap.color_aware_trtcm_rfc2698_supported);
 	printf("cap.color_aware_trtcm_rfc4115_supported %" PRId32 "\n",
 		cap.color_aware_trtcm_rfc4115_supported);
-	printf("cap.policer_action_recolor_supported %" PRId32 "\n",
-		cap.policer_action_recolor_supported);
-	printf("cap.policer_action_drop_supported %" PRId32 "\n",
-		cap.policer_action_drop_supported);
 	printf("cap.stats_mask %" PRIx64 "\n", cap.stats_mask);
 }
 
@@ -808,12 +757,6 @@ static void cmd_create_port_meter_parsed(void *parsed_result,
 	else
 		params.meter_enable = 0;
 
-	params.action[RTE_COLOR_GREEN] =
-		string_to_policer_action(res->g_action);
-	params.action[RTE_COLOR_YELLOW] =
-		string_to_policer_action(res->y_action);
-	params.action[RTE_COLOR_RED] =
-		string_to_policer_action(res->r_action);
 	params.stats_mask = res->statistics_mask;
 
 	ret = rte_mtr_create(port_id, mtr_id, &params, shared, &error);
@@ -1181,121 +1124,6 @@ cmdline_parse_inst_t cmd_set_port_meter_dscp_table = {
 	},
 };
 
-/* *** Set Port Meter Policer Action *** */
-struct cmd_set_port_meter_policer_action_result {
-	cmdline_fixed_string_t set;
-	cmdline_fixed_string_t port;
-	cmdline_fixed_string_t meter;
-	cmdline_fixed_string_t policer;
-	cmdline_fixed_string_t action;
-	uint16_t port_id;
-	uint32_t mtr_id;
-	uint32_t action_mask;
-	cmdline_multi_string_t policer_action;
-};
-
-cmdline_parse_token_string_t cmd_set_port_meter_policer_action_set =
-	TOKEN_STRING_INITIALIZER(
-		struct cmd_set_port_meter_policer_action_result, set, "set");
-cmdline_parse_token_string_t cmd_set_port_meter_policer_action_port =
-	TOKEN_STRING_INITIALIZER(
-		struct cmd_set_port_meter_policer_action_result, port, "port");
-cmdline_parse_token_string_t cmd_set_port_meter_policer_action_meter =
-	TOKEN_STRING_INITIALIZER(
-		struct cmd_set_port_meter_policer_action_result, meter,
-		"meter");
-cmdline_parse_token_string_t cmd_set_port_meter_policer_action_policer =
-	TOKEN_STRING_INITIALIZER(
-		struct cmd_set_port_meter_policer_action_result, policer,
-		"policer");
-cmdline_parse_token_string_t cmd_set_port_meter_policer_action_action =
-	TOKEN_STRING_INITIALIZER(
-		struct cmd_set_port_meter_policer_action_result, action,
-		"action");
-cmdline_parse_token_num_t cmd_set_port_meter_policer_action_port_id =
-	TOKEN_NUM_INITIALIZER(
-		struct cmd_set_port_meter_policer_action_result, port_id,
-		RTE_UINT16);
-cmdline_parse_token_num_t cmd_set_port_meter_policer_action_mtr_id =
-	TOKEN_NUM_INITIALIZER(
-		struct cmd_set_port_meter_policer_action_result, mtr_id,
-		RTE_UINT32);
-cmdline_parse_token_num_t cmd_set_port_meter_policer_action_action_mask =
-	TOKEN_NUM_INITIALIZER(
-		struct cmd_set_port_meter_policer_action_result, action_mask,
-		RTE_UINT32);
-cmdline_parse_token_string_t cmd_set_port_meter_policer_action_policer_action =
-	TOKEN_STRING_INITIALIZER(
-		struct cmd_set_port_meter_policer_action_result,
-		policer_action, TOKEN_STRING_MULTI);
-
-static void cmd_set_port_meter_policer_action_parsed(void *parsed_result,
-	__rte_unused struct cmdline *cl,
-	__rte_unused void *data)
-{
-	struct cmd_set_port_meter_policer_action_result *res = parsed_result;
-	enum rte_mtr_policer_action *actions;
-	struct rte_mtr_error error;
-	uint32_t mtr_id = res->mtr_id;
-	uint32_t action_mask = res->action_mask;
-	uint16_t port_id = res->port_id;
-	char *p_str = res->policer_action;
-	int ret;
-
-	if (port_id_is_invalid(port_id, ENABLED_WARN))
-		return;
-
-	/* Check: action mask */
-	if (action_mask == 0 || (action_mask & (~0x7UL))) {
-		printf(" Policer action mask not correct (error)\n");
-		return;
-	}
-
-	/* Allocate memory for policer actions */
-	actions = (enum rte_mtr_policer_action *)malloc(RTE_COLORS *
-		sizeof(enum rte_mtr_policer_action));
-	if (actions == NULL) {
-		printf("Memory for policer actions not allocated (error)\n");
-		return;
-	}
-	/* Parse policer action string */
-	ret = parse_policer_action_string(p_str, action_mask, actions);
-	if (ret) {
-		printf(" Policer action string parse error\n");
-		free(actions);
-		return;
-	}
-
-	ret = rte_mtr_policer_actions_update(port_id, mtr_id,
-		action_mask, actions, &error);
-	if (ret != 0) {
-		free(actions);
-		print_err_msg(&error);
-		return;
-	}
-
-	free(actions);
-}
-
-cmdline_parse_inst_t cmd_set_port_meter_policer_action = {
-	.f = cmd_set_port_meter_policer_action_parsed,
-	.data = NULL,
-	.help_str = "set port meter policer action <port_id> <mtr_id> "
-		"<action_mask> <action0> [<action1> <action2>]",
-	.tokens = {
-		(void *)&cmd_set_port_meter_policer_action_set,
-		(void *)&cmd_set_port_meter_policer_action_port,
-		(void *)&cmd_set_port_meter_policer_action_meter,
-		(void *)&cmd_set_port_meter_policer_action_policer,
-		(void *)&cmd_set_port_meter_policer_action_action,
-		(void *)&cmd_set_port_meter_policer_action_port_id,
-		(void *)&cmd_set_port_meter_policer_action_mtr_id,
-		(void *)&cmd_set_port_meter_policer_action_action_mask,
-		(void *)&cmd_set_port_meter_policer_action_policer_action,
-		NULL,
-	},
-};
-
 /* *** Set Port Meter Stats Mask *** */
 struct cmd_set_port_meter_stats_mask_result {
 	cmdline_fixed_string_t set;
diff --git a/app/test-pmd/cmdline_mtr.h b/app/test-pmd/cmdline_mtr.h
index e69d6da023..7e2713cea3 100644
--- a/app/test-pmd/cmdline_mtr.h
+++ b/app/test-pmd/cmdline_mtr.h
@@ -17,7 +17,6 @@ extern cmdline_parse_inst_t cmd_disable_port_meter;
 extern cmdline_parse_inst_t cmd_del_port_meter;
 extern cmdline_parse_inst_t cmd_set_port_meter_profile;
 extern cmdline_parse_inst_t cmd_set_port_meter_dscp_table;
-extern cmdline_parse_inst_t cmd_set_port_meter_policer_action;
 extern cmdline_parse_inst_t cmd_set_port_meter_stats_mask;
 extern cmdline_parse_inst_t cmd_show_port_meter_stats;
 
diff --git a/doc/guides/rel_notes/release_20_11.rst b/doc/guides/rel_notes/release_20_11.rst
index 7405a9864f..5a6839758a 100644
--- a/doc/guides/rel_notes/release_20_11.rst
+++ b/doc/guides/rel_notes/release_20_11.rst
@@ -663,6 +663,9 @@ API Changes
 * sched: Removed ``tb_rate``, ``tc_rate``, ``tc_period`` and ``tb_size``
   from ``struct rte_sched_subport_params``.
 
+* ethdev: Added meter API to support pre-defined policy, rte_flow action list per color.
+  ``rte_mtr_meter_policy_create()``, ``rte_mtr_meter_policy_delete()`` and
+  ``rte_mtr_create_with_policy()``
 
 ABI Changes
 -----------
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index 08efa5d15d..b182fb6c19 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -593,14 +593,6 @@ struct mlx5_dev_shared_port {
 /* Modify this value if enum rte_mtr_color changes. */
 #define RTE_MTR_DROPPED RTE_COLORS
 
-/* Meter policer statistics */
-struct mlx5_flow_policer_stats {
-	uint32_t pass_cnt;
-	/**< Color counter for pass. */
-	uint32_t drop_cnt;
-	/**< Color counter for drop. */
-};
-
 /* Meter table structure. */
 struct mlx5_meter_domain_info {
 	struct mlx5_flow_tbl_resource *tbl;
@@ -639,24 +631,12 @@ struct mlx5_meter_domains_infos {
 
 /* Meter parameter structure. */
 struct mlx5_flow_meter_info {
-	uint32_t meter_id;
-	/**< Meter id. */
 	struct mlx5_flow_meter_profile *profile;
 	/**< Meter profile parameters. */
 	rte_spinlock_t sl; /**< Meter action spinlock. */
-	/** Policer actions (per meter output color). */
-	enum rte_mtr_policer_action action[RTE_COLORS];
 	/** Set of stats counters to be enabled.
 	 * @see enum rte_mtr_stats_type
 	 */
-	uint32_t green_bytes:1;
-	/** Set green bytes stats to be enabled. */
-	uint32_t green_pkts:1;
-	/** Set green packets stats to be enabled. */
-	uint32_t red_bytes:1;
-	/** Set red bytes stats to be enabled. */
-	uint32_t red_pkts:1;
-	/** Set red packets stats to be enabled. */
 	uint32_t bytes_dropped:1;
 	/** Set bytes dropped stats to be enabled. */
 	uint32_t pkts_dropped:1;
@@ -691,8 +671,8 @@ struct mlx5_flow_meter_info {
 	uint32_t transfer:1;
 	struct mlx5_meter_domains_infos *mfts;
 	/**< Flow table created for this meter. */
-	struct mlx5_flow_policer_stats policer_stats;
-	/**< Meter policer statistics. */
+	uint32_t drop_cnt;
+	/**< Color counter for drop. */
 	uint32_t ref_cnt;
 	/**< Use count. */
 	struct mlx5_indexed_pool *flow_ipool;
diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c
index 615fe99b69..2d0daf631a 100644
--- a/drivers/net/mlx5/mlx5_flow.c
+++ b/drivers/net/mlx5/mlx5_flow.c
@@ -6654,52 +6654,6 @@ mlx5_flow_destroy_mtr_tbls(struct rte_eth_dev *dev,
 	return fops->destroy_mtr_tbls(dev, tbls);
 }
 
-/**
- * Prepare policer rules.
- *
- * @param[in] dev
- *   Pointer to Ethernet device.
- * @param[in] fm
- *   Pointer to flow meter structure.
- * @param[in] attr
- *   Pointer to flow attributes.
- *
- * @return
- *   0 on success, -1 otherwise.
- */
-int
-mlx5_flow_prepare_policer_rules(struct rte_eth_dev *dev,
-			       struct mlx5_flow_meter_info *fm,
-			       const struct rte_flow_attr *attr)
-{
-	const struct mlx5_flow_driver_ops *fops;
-
-	fops = flow_get_drv_ops(MLX5_FLOW_TYPE_DV);
-	return fops->prepare_policer_rules(dev, fm, attr);
-}
-
-/**
- * Destroy policer rules.
- *
- * @param[in] fm
- *   Pointer to flow meter structure.
- * @param[in] attr
- *   Pointer to flow attributes.
- *
- * @return
- *   0 on success, -1 otherwise.
- */
-int
-mlx5_flow_destroy_policer_rules(struct rte_eth_dev *dev,
-				struct mlx5_flow_meter_info *fm,
-				const struct rte_flow_attr *attr)
-{
-	const struct mlx5_flow_driver_ops *fops;
-
-	fops = flow_get_drv_ops(MLX5_FLOW_TYPE_DV);
-	return fops->destroy_policer_rules(dev, fm, attr);
-}
-
 /**
  * Allocate the needed aso flow meter id.
  *
diff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h
index 59e9ce2c9e..8e4530f32c 100644
--- a/drivers/net/mlx5/mlx5_flow.h
+++ b/drivers/net/mlx5/mlx5_flow.h
@@ -838,6 +838,8 @@ struct mlx5_legacy_flow_meter {
 	/* Must be the first in struct. */
 	TAILQ_ENTRY(mlx5_legacy_flow_meter) next;
 	/**< Pointer to the next flow meter structure. */
+	uint32_t meter_id;
+	/**< Meter id. */
 	uint32_t idx; /* Index to meter object. */
 };
 
@@ -1077,14 +1079,6 @@ typedef struct mlx5_meter_domains_infos *(*mlx5_flow_create_mtr_tbls_t)
 					    (struct rte_eth_dev *dev);
 typedef int (*mlx5_flow_destroy_mtr_tbls_t)(struct rte_eth_dev *dev,
 					struct mlx5_meter_domains_infos *tbls);
-typedef int (*mlx5_flow_create_policer_rules_t)
-					(struct rte_eth_dev *dev,
-					 struct mlx5_flow_meter_info *fm,
-					 const struct rte_flow_attr *attr);
-typedef int (*mlx5_flow_destroy_policer_rules_t)
-					(struct rte_eth_dev *dev,
-					 const struct mlx5_flow_meter_info *fm,
-					 const struct rte_flow_attr *attr);
 typedef uint32_t (*mlx5_flow_mtr_alloc_t)
 					    (struct rte_eth_dev *dev);
 typedef void (*mlx5_flow_mtr_free_t)(struct rte_eth_dev *dev,
@@ -1141,8 +1135,6 @@ struct mlx5_flow_driver_ops {
 	mlx5_flow_query_t query;
 	mlx5_flow_create_mtr_tbls_t create_mtr_tbls;
 	mlx5_flow_destroy_mtr_tbls_t destroy_mtr_tbls;
-	mlx5_flow_create_policer_rules_t prepare_policer_rules;
-	mlx5_flow_destroy_policer_rules_t destroy_policer_rules;
 	mlx5_flow_mtr_alloc_t create_meter;
 	mlx5_flow_mtr_free_t free_meter;
 	mlx5_flow_counter_alloc_t counter_alloc;
@@ -1372,12 +1364,6 @@ struct mlx5_meter_domains_infos *mlx5_flow_create_mtr_tbls
 					(struct rte_eth_dev *dev);
 int mlx5_flow_destroy_mtr_tbls(struct rte_eth_dev *dev,
 			       struct mlx5_meter_domains_infos *tbl);
-int mlx5_flow_prepare_policer_rules(struct rte_eth_dev *dev,
-				   struct mlx5_flow_meter_info *fm,
-				   const struct rte_flow_attr *attr);
-int mlx5_flow_destroy_policer_rules(struct rte_eth_dev *dev,
-				    struct mlx5_flow_meter_info *fm,
-				    const struct rte_flow_attr *attr);
 int mlx5_flow_meter_flush(struct rte_eth_dev *dev,
 			  struct rte_mtr_error *error);
 int mlx5_flow_dv_discover_counter_offset_support(struct rte_eth_dev *dev);
diff --git a/drivers/net/mlx5/mlx5_flow_aso.c b/drivers/net/mlx5/mlx5_flow_aso.c
index 712f655761..4d13743ecc 100644
--- a/drivers/net/mlx5/mlx5_flow_aso.c
+++ b/drivers/net/mlx5/mlx5_flow_aso.c
@@ -809,8 +809,8 @@ mlx5_aso_meter_update_by_wqe(struct mlx5_dev_ctx_shared *sh,
 		/* Waiting for wqe resource. */
 		usleep(MLX5_ASO_WQE_CQE_RESPONSE_DELAY);
 	} while (--poll_wqe_times);
-	DRV_LOG(ERR, "Fail to send WQE for ASO meter %d",
-			mtr->fm.meter_id);
+	DRV_LOG(ERR, "Fail to send WQE for ASO meter offset %d",
+			mtr->offset);
 	return -1;
 }
 
@@ -845,7 +845,7 @@ mlx5_aso_mtr_wait(struct mlx5_dev_ctx_shared *sh,
 		/* Waiting for CQE ready. */
 		usleep(MLX5_ASO_WQE_CQE_RESPONSE_DELAY);
 	} while (--poll_cqe_times);
-	DRV_LOG(ERR, "Fail to poll CQE ready for ASO meter %d",
-			mtr->fm.meter_id);
+	DRV_LOG(ERR, "Fail to poll CQE ready for ASO meter offset %d",
+			mtr->offset);
 	return -1;
 }
diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c
index c4c54d4043..ec6097b395 100644
--- a/drivers/net/mlx5/mlx5_flow_dv.c
+++ b/drivers/net/mlx5/mlx5_flow_dv.c
@@ -184,31 +184,6 @@ flow_dv_attr_init(const struct rte_flow_item *item, union flow_dv_attr *attr,
 	attr->valid = 1;
 }
 
-/**
- * Convert rte_mtr_color to mlx5 color.
- *
- * @param[in] rcol
- *   rte_mtr_color.
- *
- * @return
- *   mlx5 color.
- */
-static int
-rte_col_2_mlx5_col(enum rte_color rcol)
-{
-	switch (rcol) {
-	case RTE_COLOR_GREEN:
-		return MLX5_FLOW_COLOR_GREEN;
-	case RTE_COLOR_YELLOW:
-		return MLX5_FLOW_COLOR_YELLOW;
-	case RTE_COLOR_RED:
-		return MLX5_FLOW_COLOR_RED;
-	default:
-		break;
-	}
-	return MLX5_FLOW_COLOR_UNDEFINED;
-}
-
 struct field_modify_info {
 	uint32_t size; /* Size of field in protocol header, in bytes. */
 	uint32_t offset; /* Offset of field in protocol header, in bytes. */
@@ -6011,12 +5986,10 @@ flow_dv_mtr_pool_create(struct rte_eth_dev *dev,
 	mtrmng->n_valid++;
 	for (i = 1; i < MLX5_ASO_MTRS_PER_POOL; ++i) {
 		pool->mtrs[i].offset = i;
-		pool->mtrs[i].fm.meter_id = UINT32_MAX;
 		LIST_INSERT_HEAD(&mtrmng->meters,
 						&pool->mtrs[i], next);
 	}
 	pool->mtrs[0].offset = 0;
-	pool->mtrs[0].fm.meter_id = UINT32_MAX;
 	*mtr_free = &pool->mtrs[0];
 	return pool;
 }
@@ -6039,7 +6012,6 @@ flow_dv_aso_mtr_release_to_pool(struct rte_eth_dev *dev, uint32_t mtr_idx)
 	MLX5_ASSERT(aso_mtr);
 	rte_spinlock_lock(&mtrmng->mtrsl);
 	aso_mtr->state = ASO_METER_FREE;
-	aso_mtr->fm.meter_id = UINT32_MAX;
 	LIST_INSERT_HEAD(&mtrmng->meters, aso_mtr, next);
 	rte_spinlock_unlock(&mtrmng->mtrsl);
 }
@@ -6081,8 +6053,8 @@ flow_dv_mtr_alloc(struct rte_eth_dev *dev)
 	mtr_free->state = ASO_METER_WAIT;
 	rte_spinlock_unlock(&mtrmng->mtrsl);
 	pool = container_of(mtr_free,
-					struct mlx5_aso_mtr_pool,
-					mtrs[mtr_free->offset]);
+			struct mlx5_aso_mtr_pool,
+			mtrs[mtr_free->offset]);
 	mtr_idx = MLX5_MAKE_MTR_IDX(pool->index, mtr_free->offset);
 	if (!mtr_free->fm.meter_action) {
 		reg_id = mlx5_flow_get_reg_id(dev, MLX5_MTR_COLOR, 0, &error);
@@ -13565,433 +13537,6 @@ flow_dv_create_mtr_tbl(struct rte_eth_dev *dev)
 	return NULL;
 }
 
-/**
- * Destroy the meter table matchers.
- * Lock free, (mutex should be acquired by caller).
- *
- * @param[in] dev
- *   Pointer to Ethernet device.
- * @param[in,out] dtb
- *   Pointer to DV meter table.
- *
- * @return
- *   Always 0.
- */
-static int
-flow_dv_destroy_mtr_matchers(struct rte_eth_dev *dev,
-			     struct mlx5_meter_domain_info *dtb)
-{
-	struct mlx5_priv *priv = dev->data->dev_private;
-	struct mlx5_flow_tbl_data_entry *tbl;
-
-	if (!priv->config.dv_flow_en)
-		return 0;
-	if (dtb->drop_matcher) {
-		tbl = container_of(dtb->drop_matcher->tbl, typeof(*tbl), tbl);
-		mlx5_cache_unregister(&tbl->matchers,
-				      &dtb->drop_matcher->entry);
-		dtb->drop_matcher = NULL;
-	}
-	if (dtb->color_matcher) {
-		tbl = container_of(dtb->color_matcher->tbl, typeof(*tbl), tbl);
-		mlx5_cache_unregister(&tbl->matchers,
-				      &dtb->color_matcher->entry);
-		dtb->color_matcher = NULL;
-	}
-	return 0;
-}
-
-/**
- * Create the matchers for meter table.
- *
- * @param[in] dev
- *   Pointer to Ethernet device.
- * @param[in] color_reg_c_idx
- *   Reg C index for color match.
- * @param[in] mtr_id_reg_c_idx
- *   Reg C index for meter_id match.
- * @param[in] mtr_id_mask
- *   Mask for meter_id match criteria.
- * @param[in,out] dtb
- *   Pointer to DV meter table.
- * @param[out] error
- *   Perform verbose error reporting if not NULL.
- *
- * @return
- *   0 on success, a negative errno value otherwise and rte_errno is set.
- */
-static int
-flow_dv_prepare_mtr_matchers(struct rte_eth_dev *dev,
-			     uint32_t color_reg_c_idx,
-			     uint32_t mtr_id_reg_c_idx,
-			     uint32_t mtr_id_mask,
-			     struct mlx5_meter_domain_info *dtb,
-			     struct rte_flow_error *error)
-{
-	struct mlx5_priv *priv = dev->data->dev_private;
-	struct mlx5_flow_tbl_data_entry *tbl_data;
-	struct mlx5_cache_entry *entry;
-	struct mlx5_flow_dv_matcher matcher = {
-		.mask = {
-			.size = sizeof(matcher.mask.buf) -
-				MLX5_ST_SZ_BYTES(fte_match_set_misc4),
-		},
-		.tbl = dtb->tbl,
-	};
-	struct mlx5_flow_dv_match_params value = {
-		.size = sizeof(value.buf) -
-			MLX5_ST_SZ_BYTES(fte_match_set_misc4),
-	};
-	struct mlx5_flow_cb_ctx ctx = {
-		.error = error,
-		.data = &matcher,
-	};
-
-	tbl_data = container_of(dtb->tbl, struct mlx5_flow_tbl_data_entry, tbl);
-	if (!dtb->drop_matcher) {
-		/* Create matchers for Drop. */
-		flow_dv_match_meta_reg(matcher.mask.buf, value.buf,
-				       mtr_id_reg_c_idx, 0, mtr_id_mask);
-		matcher.priority = MLX5_REG_BITS * 2 - priv->max_mtr_bits;
-		matcher.crc = rte_raw_cksum((const void *)matcher.mask.buf,
-					matcher.mask.size);
-		entry = mlx5_cache_register(&tbl_data->matchers, &ctx);
-		if (!entry) {
-			DRV_LOG(ERR, "Failed to register meter drop matcher.");
-			return -1;
-		}
-		dtb->drop_matcher =
-			container_of(entry, struct mlx5_flow_dv_matcher, entry);
-	}
-	if (!dtb->color_matcher) {
-		/* Create matchers for Color + meter_id. */
-		if (priv->mtr_reg_share) {
-			flow_dv_match_meta_reg(matcher.mask.buf, value.buf,
-					color_reg_c_idx, 0,
-					(mtr_id_mask |
-					 LS32_MASK(MLX5_MTR_COLOR_BITS)));
-		} else {
-			flow_dv_match_meta_reg(matcher.mask.buf, value.buf,
-					color_reg_c_idx, 0,
-					LS32_MASK(MLX5_MTR_COLOR_BITS));
-			flow_dv_match_meta_reg(matcher.mask.buf, value.buf,
-					mtr_id_reg_c_idx, 0, mtr_id_mask);
-		}
-		matcher.priority = MLX5_REG_BITS - priv->max_mtr_bits;
-		matcher.crc = rte_raw_cksum((const void *)matcher.mask.buf,
-					matcher.mask.size);
-		entry = mlx5_cache_register(&tbl_data->matchers, &ctx);
-		if (!entry) {
-			DRV_LOG(ERR, "Failed to register meter color matcher.");
-			return -1;
-		}
-		dtb->color_matcher =
-			container_of(entry, struct mlx5_flow_dv_matcher, entry);
-	}
-	return 0;
-}
-
-/**
- * Destroy domain policer rule.
- *
- * @param[in] dev
- *   Pointer to Ethernet device.
- * @param[in] dt
- *   Pointer to domain table.
- */
-static void
-flow_dv_destroy_domain_policer_rule(struct rte_eth_dev *dev,
-				    struct mlx5_meter_domain_info *dt)
-{
-	if (dt->drop_rule) {
-		claim_zero(mlx5_flow_os_destroy_flow(dt->drop_rule));
-		dt->drop_rule = NULL;
-	}
-	if (dt->green_rule) {
-		claim_zero(mlx5_flow_os_destroy_flow(dt->green_rule));
-		dt->green_rule = NULL;
-	}
-	flow_dv_destroy_mtr_matchers(dev, dt);
-	if (dt->jump_actn) {
-		claim_zero(mlx5_flow_os_destroy_flow_action(dt->jump_actn));
-		dt->jump_actn = NULL;
-	}
-}
-
-/**
- * Destroy policer rules.
- *
- * @param[in] dev
- *   Pointer to Ethernet device.
- * @param[in] fm
- *   Pointer to flow meter structure.
- * @param[in] attr
- *   Pointer to flow attributes.
- *
- * @return
- *   Always 0.
- */
-static int
-flow_dv_destroy_policer_rules(struct rte_eth_dev *dev,
-			      const struct mlx5_flow_meter_info *fm,
-			      const struct rte_flow_attr *attr)
-{
-	struct mlx5_meter_domains_infos *mtb = fm ? fm->mfts : NULL;
-
-	if (!mtb)
-		return 0;
-	if (attr->egress)
-		flow_dv_destroy_domain_policer_rule(dev, &mtb->egress);
-	if (attr->ingress)
-		flow_dv_destroy_domain_policer_rule(dev, &mtb->ingress);
-	if (attr->transfer)
-		flow_dv_destroy_domain_policer_rule(dev, &mtb->transfer);
-	return 0;
-}
-
-/**
- * Create specify domain meter policer rule.
- *
- * @param[in] dev
- *   Pointer to Ethernet device.
- * @param[in] fm
- *   Pointer to flow meter structure.
- * @param[in] mtr_idx
- *   meter index.
- * @param[in] mtb
- *   Pointer to DV meter table set.
- * @param[out] drop_rule
- *   The address of pointer saving drop rule.
- * @param[out] color_rule
- *   The address of pointer saving green rule.
- *
- * @return
- *   0 on success, -1 otherwise.
- */
-static int
-flow_dv_create_policer_forward_rule(struct rte_eth_dev *dev,
-				    struct mlx5_flow_meter_info *fm,
-				    uint32_t mtr_idx,
-				    struct mlx5_meter_domain_info *dtb,
-				    void **drop_rule,
-				    void **green_rule)
-{
-	struct mlx5_priv *priv = dev->data->dev_private;
-	struct mlx5_flow_dv_match_params matcher = {
-		.size = sizeof(matcher.buf) -
-			MLX5_ST_SZ_BYTES(fte_match_set_misc4),
-	};
-	struct mlx5_flow_dv_match_params value = {
-		.size = sizeof(value.buf) -
-			MLX5_ST_SZ_BYTES(fte_match_set_misc4),
-	};
-	struct mlx5_meter_domains_infos *mtb = fm->mfts;
-	struct rte_flow_error error;
-	uint32_t color_reg_c = mlx5_flow_get_reg_id(dev, MLX5_MTR_COLOR,
-						    0, &error);
-	uint32_t mtr_id_reg_c = mlx5_flow_get_reg_id(dev, MLX5_MTR_ID,
-						     0, &error);
-	uint8_t mtr_id_offset = priv->mtr_reg_share ? MLX5_MTR_COLOR_BITS : 0;
-	uint32_t mtr_id_mask = LS32_MASK(priv->max_mtr_bits) << mtr_id_offset;
-	void *actions[METER_ACTIONS];
-	int i;
-	int ret = 0;
-
-	/* Create jump action. */
-	if (!dtb->jump_actn)
-		ret = mlx5_flow_os_create_flow_action_dest_flow_tbl
-				(dtb->sfx_tbl->obj, &dtb->jump_actn);
-	if (ret) {
-		DRV_LOG(ERR, "Failed to create policer jump action.");
-		goto error;
-	}
-	/* Prepare matchers. */
-	if (!dtb->drop_matcher || !dtb->color_matcher) {
-		ret = flow_dv_prepare_mtr_matchers(dev, color_reg_c,
-						   mtr_id_reg_c, mtr_id_mask,
-						   dtb, &error);
-		if (ret) {
-			DRV_LOG(ERR, "Failed to setup matchers for mtr table.");
-			goto error;
-		}
-	}
-	/* Create Drop flow, matching meter_id only. */
-	i = 0;
-	flow_dv_match_meta_reg(matcher.buf, value.buf, mtr_id_reg_c,
-			       (mtr_idx << mtr_id_offset), UINT32_MAX);
-	if (mtb->drop_count)
-		actions[i++] = mtb->drop_count;
-	actions[i++] = priv->sh->esw_drop_action;
-	ret = mlx5_flow_os_create_flow(dtb->drop_matcher->matcher_object,
-				       (void *)&value, i, actions, drop_rule);
-	if (ret) {
-		DRV_LOG(ERR, "Failed to create meter policer drop rule.");
-		goto error;
-	}
-	/* Create flow matching Green color + meter_id. */
-	i = 0;
-	if (priv->mtr_reg_share) {
-		flow_dv_match_meta_reg(matcher.buf, value.buf, color_reg_c,
-				       ((mtr_idx << mtr_id_offset) |
-					rte_col_2_mlx5_col(RTE_COLOR_GREEN)),
-				       UINT32_MAX);
-	} else {
-		flow_dv_match_meta_reg(matcher.buf, value.buf, color_reg_c,
-				       rte_col_2_mlx5_col(RTE_COLOR_GREEN),
-				       UINT32_MAX);
-		flow_dv_match_meta_reg(matcher.buf, value.buf, mtr_id_reg_c,
-				       mtr_idx, UINT32_MAX);
-	}
-	if (mtb->green_count)
-		actions[i++] = mtb->green_count;
-	actions[i++] = dtb->jump_actn;
-	ret = mlx5_flow_os_create_flow(dtb->color_matcher->matcher_object,
-				       (void *)&value, i, actions, green_rule);
-	if (ret) {
-		DRV_LOG(ERR, "Failed to create meter policer color rule.");
-		goto error;
-	}
-	return 0;
-error:
-	rte_errno = errno;
-	return -1;
-}
-
-/**
- * Prepare policer rules for all domains.
- * If meter already initialized, this will replace all old rules with new ones.
- *
- * @param[in] dev
- *   Pointer to Ethernet device.
- * @param[in] fm
- *   Pointer to flow meter structure.
- * @param[in] attr
- *   Pointer to flow attributes.
- *
- * @return
- *   0 on success, -1 otherwise.
- */
-static int
-flow_dv_prepare_policer_rules(struct rte_eth_dev *dev,
-			      struct mlx5_flow_meter_info *fm,
-			      const struct rte_flow_attr *attr)
-{
-	struct mlx5_priv *priv = dev->data->dev_private;
-	struct mlx5_meter_domains_infos *mtb = fm->mfts;
-	bool initialized = false;
-	struct mlx5_flow_counter *cnt;
-	void *egress_drop_rule = NULL;
-	void *egress_green_rule = NULL;
-	void *ingress_drop_rule = NULL;
-	void *ingress_green_rule = NULL;
-	void *transfer_drop_rule = NULL;
-	void *transfer_green_rule = NULL;
-	uint32_t mtr_idx;
-	int ret;
-
-	/* Get the statistics counters for green/drop. */
-	if (fm->policer_stats.pass_cnt) {
-		cnt = flow_dv_counter_get_by_idx(dev,
-					fm->policer_stats.pass_cnt,
-					NULL);
-		mtb->green_count = cnt->action;
-	} else {
-		mtb->green_count = NULL;
-	}
-	if (fm->policer_stats.drop_cnt) {
-		cnt = flow_dv_counter_get_by_idx(dev,
-					fm->policer_stats.drop_cnt,
-					NULL);
-		mtb->drop_count = cnt->action;
-	} else {
-		mtb->drop_count = NULL;
-	}
-	/**
-	 * If flow meter has been initilized, all policer rules
-	 * are created. So can get if meter initialized by checking
-	 * any policer rule.
-	 */
-	if (mtb->egress.drop_rule)
-		initialized = true;
-	if (priv->sh->meter_aso_en) {
-		struct mlx5_aso_mtr *aso_mtr = NULL;
-		struct mlx5_aso_mtr_pool *pool;
-
-		aso_mtr = container_of(fm, struct mlx5_aso_mtr, fm);
-		pool = container_of(aso_mtr, struct mlx5_aso_mtr_pool,
-				    mtrs[aso_mtr->offset]);
-		mtr_idx = MLX5_MAKE_MTR_IDX(pool->index, aso_mtr->offset);
-	} else {
-		struct mlx5_legacy_flow_meter *legacy_fm;
-
-		legacy_fm = container_of(fm, struct mlx5_legacy_flow_meter, fm);
-		mtr_idx = legacy_fm->idx;
-	}
-	if (attr->egress) {
-		ret = flow_dv_create_policer_forward_rule(dev,
-				fm, mtr_idx, &mtb->egress,
-				&egress_drop_rule, &egress_green_rule);
-		if (ret) {
-			DRV_LOG(ERR, "Failed to create egress policer.");
-			goto error;
-		}
-	}
-	if (attr->ingress) {
-		ret = flow_dv_create_policer_forward_rule(dev,
-				fm, mtr_idx, &mtb->ingress,
-				&ingress_drop_rule, &ingress_green_rule);
-		if (ret) {
-			DRV_LOG(ERR, "Failed to create ingress policer.");
-			goto error;
-		}
-	}
-	if (attr->transfer) {
-		ret = flow_dv_create_policer_forward_rule(dev,
-				fm, mtr_idx, &mtb->transfer,
-				&transfer_drop_rule, &transfer_green_rule);
-		if (ret) {
-			DRV_LOG(ERR, "Failed to create transfer policer.");
-			goto error;
-		}
-	}
-	/* Replace old flows if existing. */
-	if (mtb->egress.drop_rule)
-		claim_zero(mlx5_flow_os_destroy_flow(mtb->egress.drop_rule));
-	if (mtb->egress.green_rule)
-		claim_zero(mlx5_flow_os_destroy_flow(mtb->egress.green_rule));
-	if (mtb->ingress.drop_rule)
-		claim_zero(mlx5_flow_os_destroy_flow(mtb->ingress.drop_rule));
-	if (mtb->ingress.green_rule)
-		claim_zero(mlx5_flow_os_destroy_flow(mtb->ingress.green_rule));
-	if (mtb->transfer.drop_rule)
-		claim_zero(mlx5_flow_os_destroy_flow(mtb->transfer.drop_rule));
-	if (mtb->transfer.green_rule)
-		claim_zero(mlx5_flow_os_destroy_flow(mtb->transfer.green_rule));
-	mtb->egress.drop_rule = egress_drop_rule;
-	mtb->egress.green_rule = egress_green_rule;
-	mtb->ingress.drop_rule = ingress_drop_rule;
-	mtb->ingress.green_rule = ingress_green_rule;
-	mtb->transfer.drop_rule = transfer_drop_rule;
-	mtb->transfer.green_rule = transfer_green_rule;
-	return 0;
-error:
-	if (egress_drop_rule)
-		claim_zero(mlx5_flow_os_destroy_flow(egress_drop_rule));
-	if (egress_green_rule)
-		claim_zero(mlx5_flow_os_destroy_flow(egress_green_rule));
-	if (ingress_drop_rule)
-		claim_zero(mlx5_flow_os_destroy_flow(ingress_drop_rule));
-	if (ingress_green_rule)
-		claim_zero(mlx5_flow_os_destroy_flow(ingress_green_rule));
-	if (transfer_drop_rule)
-		claim_zero(mlx5_flow_os_destroy_flow(transfer_drop_rule));
-	if (transfer_green_rule)
-		claim_zero(mlx5_flow_os_destroy_flow(transfer_green_rule));
-	if (!initialized)
-		flow_dv_destroy_policer_rules(dev, fm, attr);
-	return -1;
-}
-
 /**
  * Validate the batch counter support in root table.
  *
@@ -14285,8 +13830,6 @@ const struct mlx5_flow_driver_ops mlx5_flow_dv_drv_ops = {
 	.query = flow_dv_query,
 	.create_mtr_tbls = flow_dv_create_mtr_tbl,
 	.destroy_mtr_tbls = flow_dv_destroy_mtr_tbl,
-	.prepare_policer_rules = flow_dv_prepare_policer_rules,
-	.destroy_policer_rules = flow_dv_destroy_policer_rules,
 	.create_meter = flow_dv_mtr_alloc,
 	.free_meter = flow_dv_aso_mtr_release_to_pool,
 	.counter_alloc = flow_dv_counter_allocate,
diff --git a/drivers/net/mlx5/mlx5_flow_meter.c b/drivers/net/mlx5/mlx5_flow_meter.c
index c2a063abdb..af0a1c18cb 100644
--- a/drivers/net/mlx5/mlx5_flow_meter.c
+++ b/drivers/net/mlx5/mlx5_flow_meter.c
@@ -329,7 +329,6 @@ mlx5_flow_mtr_cap_get(struct rte_eth_dev *dev,
 	cap->chaining_n_mtrs_per_flow_max = 1; /* Chaining is not supported. */
 	cap->meter_srtcm_rfc2697_n_max = qattr->flow_meter_old ? cap->n_max : 0;
 	cap->meter_rate_max = 1ULL << 40; /* 1 Tera tokens per sec. */
-	cap->policer_action_drop_supported = 1;
 	cap->stats_mask = RTE_MTR_STATS_N_BYTES_DROPPED |
 			  RTE_MTR_STATS_N_PKTS_DROPPED;
 	return 0;
@@ -436,90 +435,6 @@ mlx5_flow_meter_profile_delete(struct rte_eth_dev *dev,
 	return 0;
 }
 
-/**
- * Convert wrong color setting action to verbose error.
- *
- * @param[in] action
- *   Policy color action.
- *
- * @return
- *   Verbose meter color error type.
- */
-static inline enum rte_mtr_error_type
-action2error(enum rte_mtr_policer_action action)
-{
-	switch (action) {
-	case MTR_POLICER_ACTION_COLOR_GREEN:
-		return RTE_MTR_ERROR_TYPE_POLICER_ACTION_GREEN;
-	case MTR_POLICER_ACTION_COLOR_YELLOW:
-		return RTE_MTR_ERROR_TYPE_POLICER_ACTION_YELLOW;
-	case MTR_POLICER_ACTION_COLOR_RED:
-		return RTE_MTR_ERROR_TYPE_POLICER_ACTION_RED;
-	default:
-		break;
-	}
-	return RTE_MTR_ERROR_TYPE_UNSPECIFIED;
-}
-
-/**
- * Check meter validation.
- *
- * @param[in] priv
- *   Pointer to mlx5 private data structure.
- * @param[in] meter_id
- *   Meter id.
- * @param[in] params
- *   Pointer to rte meter parameters.
- * @param[out] error
- *   Pointer to rte meter error structure.
- *
- * @return
- *   0 on success, a negative errno value otherwise and rte_errno is set.
- */
-static int
-mlx5_flow_meter_validate(struct mlx5_priv *priv, uint32_t meter_id,
-			 struct rte_mtr_params *params,
-			 struct rte_mtr_error *error)
-{
-	/* Meter must use global drop action. */
-	if (!priv->sh->esw_drop_action)
-		return -rte_mtr_error_set(error, ENOTSUP,
-					  RTE_MTR_ERROR_TYPE_MTR_PARAMS,
-					  NULL,
-					  "No drop action ready for meter.");
-	/* Meter params must not be NULL. */
-	if (params == NULL)
-		return -rte_mtr_error_set(error, EINVAL,
-					  RTE_MTR_ERROR_TYPE_MTR_PARAMS,
-					  NULL, "Meter object params null.");
-	/* Previous meter color is not supported. */
-	if (params->use_prev_mtr_color)
-		return -rte_mtr_error_set(error, ENOTSUP,
-					  RTE_MTR_ERROR_TYPE_MTR_PARAMS,
-					  NULL,
-					  "Previous meter color "
-					  "not supported.");
-	/* Validate policer settings. */
-	if (params->action[RTE_COLOR_RED] != MTR_POLICER_ACTION_DROP)
-		return -rte_mtr_error_set
-				(error, ENOTSUP,
-				 action2error(params->action[RTE_COLOR_RED]),
-				 NULL,
-				 "Red color only supports drop action.");
-	if (params->action[RTE_COLOR_GREEN] != MTR_POLICER_ACTION_COLOR_GREEN)
-		return -rte_mtr_error_set
-				(error, ENOTSUP,
-				 action2error(params->action[RTE_COLOR_GREEN]),
-				 NULL,
-				 "Green color only supports recolor green action.");
-	/* Validate meter id. */
-	if (mlx5_flow_meter_find(priv, meter_id, NULL))
-		return -rte_mtr_error_set(error, EEXIST,
-					  RTE_MTR_ERROR_TYPE_MTR_ID, NULL,
-					  "Meter object already exists.");
-	return 0;
-}
-
 /**
  * Modify the flow meter action.
  *
@@ -629,167 +544,14 @@ static void
 mlx5_flow_meter_stats_enable_update(struct mlx5_flow_meter_info *fm,
 				uint64_t stats_mask)
 {
-	fm->green_bytes = (stats_mask & RTE_MTR_STATS_N_BYTES_GREEN) ? 1 : 0;
-	fm->green_pkts = (stats_mask & RTE_MTR_STATS_N_PKTS_GREEN) ? 1 : 0;
-	fm->red_bytes = (stats_mask & RTE_MTR_STATS_N_BYTES_RED) ? 1 : 0;
-	fm->red_pkts = (stats_mask & RTE_MTR_STATS_N_PKTS_RED) ? 1 : 0;
 	fm->bytes_dropped =
 		(stats_mask & RTE_MTR_STATS_N_BYTES_DROPPED) ? 1 : 0;
 	fm->pkts_dropped = (stats_mask & RTE_MTR_STATS_N_PKTS_DROPPED) ? 1 : 0;
 }
 
-/**
- * Create meter rules.
- *
- * @param[in] dev
- *   Pointer to Ethernet device.
- * @param[in] meter_id
- *   Meter id.
- * @param[in] params
- *   Pointer to rte meter parameters.
- * @param[in] shared
- *   Meter shared with other flow or not.
- * @param[out] error
- *   Pointer to rte meter error structure.
- *
- * @return
- *   0 on success, a negative errno value otherwise and rte_errno is set.
- */
-static int
-mlx5_flow_meter_create(struct rte_eth_dev *dev, uint32_t meter_id,
-		       struct rte_mtr_params *params, int shared,
-		       struct rte_mtr_error *error)
-{
-	struct mlx5_priv *priv = dev->data->dev_private;
-	struct mlx5_legacy_flow_meters *fms = &priv->flow_meters;
-	struct mlx5_flow_meter_profile *fmp;
-	struct mlx5_legacy_flow_meter *legacy_fm;
-	struct mlx5_flow_meter_info *fm;
-	const struct rte_flow_attr attr = {
-				.ingress = 1,
-				.egress = 1,
-				.transfer = priv->config.dv_esw_en ? 1 : 0,
-			};
-	struct mlx5_indexed_pool_config flow_ipool_cfg = {
-		.size = 0,
-		.trunk_size = 64,
-		.need_lock = 1,
-		.type = "mlx5_flow_mtr_flow_id_pool",
-	};
-	struct mlx5_aso_mtr *aso_mtr;
-	union mlx5_l3t_data data;
-	uint32_t mtr_idx;
-	int ret;
-	uint8_t mtr_id_bits;
-	uint8_t mtr_reg_bits = priv->mtr_reg_share ?
-				MLX5_MTR_IDLE_BITS_IN_COLOR_REG : MLX5_REG_BITS;
-
-	if (!priv->mtr_en)
-		return -rte_mtr_error_set(error, ENOTSUP,
-					  RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
-					  "Meter is not supported");
-	/* Validate the parameters. */
-	ret = mlx5_flow_meter_validate(priv, meter_id, params, error);
-	if (ret)
-		return ret;
-	/* Meter profile must exist. */
-	fmp = mlx5_flow_meter_profile_find(priv, params->meter_profile_id);
-	if (fmp == NULL)
-		return -rte_mtr_error_set(error, ENOENT,
-					  RTE_MTR_ERROR_TYPE_METER_PROFILE_ID,
-					  NULL, "Meter profile id not valid.");
-	/* Allocate the flow meter memory. */
-	if (priv->sh->meter_aso_en) {
-		mtr_idx = mlx5_flow_mtr_alloc(dev);
-		if (!mtr_idx)
-			return -rte_mtr_error_set(error, ENOMEM,
-				RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
-				"Memory alloc failed for meter.");
-		aso_mtr = mlx5_aso_meter_by_idx(priv, mtr_idx);
-		fm = &aso_mtr->fm;
-	} else {
-		legacy_fm = mlx5_ipool_zmalloc
-				(priv->sh->ipool[MLX5_IPOOL_MTR], &mtr_idx);
-		if (legacy_fm == NULL)
-			return -rte_mtr_error_set(error, ENOMEM,
-				RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
-				"Memory alloc failed for meter.");
-		legacy_fm->idx = mtr_idx;
-		fm = &legacy_fm->fm;
-	}
-	mtr_id_bits = MLX5_REG_BITS - __builtin_clz(mtr_idx);
-	if ((mtr_id_bits + priv->max_mtr_flow_bits) > mtr_reg_bits) {
-		DRV_LOG(ERR, "Meter number exceeds max limit.");
-		goto error;
-	}
-	if (mtr_id_bits > priv->max_mtr_bits)
-		priv->max_mtr_bits = mtr_id_bits;
-	/* Fill the flow meter parameters. */
-	fm->meter_id = meter_id;
-	fm->profile = fmp;
-	memcpy(fm->action, params->action, sizeof(params->action));
-	mlx5_flow_meter_stats_enable_update(fm, params->stats_mask);
-	/* Alloc policer counters. */
-	if (fm->green_bytes || fm->green_pkts) {
-		fm->policer_stats.pass_cnt = mlx5_counter_alloc(dev);
-		if (!fm->policer_stats.pass_cnt)
-			goto error;
-	}
-	if (fm->red_bytes || fm->red_pkts ||
-	    fm->bytes_dropped || fm->pkts_dropped) {
-		fm->policer_stats.drop_cnt = mlx5_counter_alloc(dev);
-		if (!fm->policer_stats.drop_cnt)
-			goto error;
-	}
-	fm->mfts = mlx5_flow_create_mtr_tbls(dev);
-	if (!fm->mfts)
-		goto error;
-	ret = mlx5_flow_prepare_policer_rules(dev, fm, &attr);
-	if (ret)
-		goto error;
-	/* Add to the flow meter list. */
-	if (!priv->sh->meter_aso_en)
-		TAILQ_INSERT_TAIL(fms, legacy_fm, next);
-	fm->active_state = 1; /* Config meter starts as active. */
-	fm->is_enable = 1;
-	fm->shared = !!shared;
-	__atomic_add_fetch(&fm->profile->ref_cnt, 1, __ATOMIC_RELAXED);
-	fm->flow_ipool = mlx5_ipool_create(&flow_ipool_cfg);
-	if (!fm->flow_ipool)
-		goto error;
-	rte_spinlock_init(&fm->sl);
-	/* If ASO meter supported, allocate ASO flow meter. */
-	if (priv->sh->meter_aso_en) {
-		aso_mtr = container_of(fm, struct mlx5_aso_mtr, fm);
-		ret = mlx5_aso_meter_update_by_wqe(priv->sh, aso_mtr);
-		if (ret)
-			goto error;
-		data.dword = mtr_idx;
-		if (mlx5_l3t_set_entry(priv->mtr_idx_tbl, meter_id, &data))
-			goto error;
-	}
-	return 0;
-error:
-	mlx5_flow_destroy_policer_rules(dev, fm, &attr);
-	mlx5_flow_destroy_mtr_tbls(dev, fm->mfts);
-	/* Free policer counters. */
-	if (fm->policer_stats.pass_cnt)
-		mlx5_counter_free(dev, fm->policer_stats.pass_cnt);
-	if (fm->policer_stats.drop_cnt)
-		mlx5_counter_free(dev, fm->policer_stats.drop_cnt);
-	if (priv->sh->meter_aso_en)
-		mlx5_flow_mtr_free(dev, mtr_idx);
-	else
-		mlx5_ipool_free(priv->sh->ipool[MLX5_IPOOL_MTR], mtr_idx);
-	return -rte_mtr_error_set(error, -ret,
-				  RTE_MTR_ERROR_TYPE_UNSPECIFIED,
-				  NULL, "Failed to create devx meter.");
-}
-
 static int
 mlx5_flow_meter_params_flush(struct rte_eth_dev *dev,
 			struct mlx5_flow_meter_info *fm,
-			const struct rte_flow_attr *attr,
 			uint32_t mtr_idx)
 {
 	struct mlx5_priv *priv = dev->data->dev_private;
@@ -810,15 +572,12 @@ mlx5_flow_meter_params_flush(struct rte_eth_dev *dev,
 		legacy_fm = container_of(fm, struct mlx5_legacy_flow_meter, fm);
 		TAILQ_REMOVE(fms, legacy_fm, next);
 	}
-	/* Free policer counters. */
-	if (fm->policer_stats.pass_cnt)
-		mlx5_counter_free(dev, fm->policer_stats.pass_cnt);
-	if (fm->policer_stats.drop_cnt)
-		mlx5_counter_free(dev, fm->policer_stats.drop_cnt);
+	/* Free drop counters. */
+	if (fm->drop_cnt)
+		mlx5_counter_free(dev, fm->drop_cnt);
 	/* Free meter flow table. */
 	if (fm->flow_ipool)
 		mlx5_ipool_destroy(fm->flow_ipool);
-	mlx5_flow_destroy_policer_rules(dev, fm, attr);
 	mlx5_flow_destroy_mtr_tbls(dev, fm->mfts);
 	if (priv->sh->meter_aso_en)
 		mlx5_flow_mtr_free(dev, mtr_idx);
@@ -847,11 +606,6 @@ mlx5_flow_meter_destroy(struct rte_eth_dev *dev, uint32_t meter_id,
 {
 	struct mlx5_priv *priv = dev->data->dev_private;
 	struct mlx5_flow_meter_info *fm;
-	const struct rte_flow_attr attr = {
-				.ingress = 1,
-				.egress = 1,
-				.transfer = priv->config.dv_esw_en ? 1 : 0,
-			};
 	uint32_t mtr_idx = 0;
 
 	if (!priv->mtr_en)
@@ -876,7 +630,7 @@ mlx5_flow_meter_destroy(struct rte_eth_dev *dev, uint32_t meter_id,
 				"Fail to delete ASO Meter in index table.");
 	}
 	/* Destroy the meter profile. */
-	if (mlx5_flow_meter_params_flush(dev, fm, &attr, mtr_idx))
+	if (mlx5_flow_meter_params_flush(dev, fm, mtr_idx))
 		return -rte_mtr_error_set(error, EINVAL,
 					RTE_MTR_ERROR_TYPE_METER_PROFILE_ID,
 					NULL, "MTR object meter profile invalid.");
@@ -1102,13 +856,6 @@ mlx5_flow_meter_stats_update(struct rte_eth_dev *dev,
 {
 	struct mlx5_priv *priv = dev->data->dev_private;
 	struct mlx5_flow_meter_info *fm;
-	const struct rte_flow_attr attr = {
-				.ingress = 1,
-				.egress = 1,
-				.transfer = priv->config.dv_esw_en ? 1 : 0,
-			};
-	bool need_updated = false;
-	struct mlx5_flow_policer_stats old_policer_stats;
 
 	if (!priv->mtr_en)
 		return -rte_mtr_error_set(error, ENOTSUP,
@@ -1120,69 +867,6 @@ mlx5_flow_meter_stats_update(struct rte_eth_dev *dev,
 		return -rte_mtr_error_set(error, ENOENT,
 					  RTE_MTR_ERROR_TYPE_MTR_ID,
 					  NULL, "Meter object id not valid.");
-	old_policer_stats.pass_cnt = 0;
-	old_policer_stats.drop_cnt = 0;
-	if (!!((RTE_MTR_STATS_N_PKTS_GREEN |
-				RTE_MTR_STATS_N_BYTES_GREEN) & stats_mask) !=
-		!!fm->policer_stats.pass_cnt) {
-		need_updated = true;
-		if (fm->policer_stats.pass_cnt) {
-			old_policer_stats.pass_cnt = fm->policer_stats.pass_cnt;
-			fm->policer_stats.pass_cnt = 0;
-		} else {
-			fm->policer_stats.pass_cnt =
-				mlx5_counter_alloc(dev);
-			if (!fm->policer_stats.pass_cnt)
-				return -rte_mtr_error_set(error, ENOMEM,
-					  RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
-					  "Counter alloc failed for meter.");
-		}
-	}
-	if (!!((RTE_MTR_STATS_N_PKTS_RED | RTE_MTR_STATS_N_BYTES_RED |
-		RTE_MTR_STATS_N_PKTS_DROPPED | RTE_MTR_STATS_N_BYTES_DROPPED) &
-		stats_mask) !=
-		!!fm->policer_stats.drop_cnt) {
-		need_updated = true;
-		if (fm->policer_stats.drop_cnt) {
-			old_policer_stats.drop_cnt = fm->policer_stats.drop_cnt;
-			fm->policer_stats.drop_cnt = 0;
-		} else {
-			fm->policer_stats.drop_cnt =
-				mlx5_counter_alloc(dev);
-			if (!fm->policer_stats.drop_cnt)
-				return -rte_mtr_error_set(error, ENOMEM,
-					  RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
-					  "Counter alloc failed for meter.");
-		}
-	}
-	if (need_updated) {
-		if (mlx5_flow_prepare_policer_rules(dev, fm, &attr)) {
-			if (fm->policer_stats.pass_cnt &&
-				fm->policer_stats.pass_cnt !=
-				old_policer_stats.pass_cnt)
-				mlx5_counter_free(dev,
-					fm->policer_stats.pass_cnt);
-			fm->policer_stats.pass_cnt =
-					old_policer_stats.pass_cnt;
-			if (fm->policer_stats.drop_cnt &&
-				fm->policer_stats.drop_cnt !=
-				old_policer_stats.drop_cnt)
-				mlx5_counter_free(dev,
-					fm->policer_stats.drop_cnt);
-			fm->policer_stats.pass_cnt =
-					old_policer_stats.pass_cnt;
-			return -rte_mtr_error_set(error, ENOTSUP,
-				RTE_MTR_ERROR_TYPE_UNSPECIFIED,
-				NULL, "Failed to create meter policer rules.");
-		}
-		/* Free old policer counters. */
-		if (old_policer_stats.pass_cnt)
-			mlx5_counter_free(dev,
-				old_policer_stats.pass_cnt);
-		if (old_policer_stats.drop_cnt)
-			mlx5_counter_free(dev,
-				old_policer_stats.drop_cnt);
-	}
 	mlx5_flow_meter_stats_enable_update(fm, stats_mask);
 	return 0;
 }
@@ -1216,7 +900,6 @@ mlx5_flow_meter_stats_read(struct rte_eth_dev *dev,
 {
 	struct mlx5_priv *priv = dev->data->dev_private;
 	struct mlx5_flow_meter_info *fm;
-	struct mlx5_flow_policer_stats *ps;
 	uint64_t pkts;
 	uint64_t bytes;
 	int ret = 0;
@@ -1231,35 +914,14 @@ mlx5_flow_meter_stats_read(struct rte_eth_dev *dev,
 		return -rte_mtr_error_set(error, ENOENT,
 					  RTE_MTR_ERROR_TYPE_MTR_ID,
 					  NULL, "Meter object id not valid.");
-	ps = &fm->policer_stats;
 	*stats_mask = 0;
-	if (fm->green_bytes)
-		*stats_mask |= RTE_MTR_STATS_N_BYTES_GREEN;
-	if (fm->green_pkts)
-		*stats_mask |= RTE_MTR_STATS_N_PKTS_GREEN;
-	if (fm->red_bytes)
-		*stats_mask |= RTE_MTR_STATS_N_BYTES_RED;
-	if (fm->red_pkts)
-		*stats_mask |= RTE_MTR_STATS_N_PKTS_RED;
 	if (fm->bytes_dropped)
 		*stats_mask |= RTE_MTR_STATS_N_BYTES_DROPPED;
 	if (fm->pkts_dropped)
 		*stats_mask |= RTE_MTR_STATS_N_PKTS_DROPPED;
 	memset(stats, 0, sizeof(*stats));
-	if (ps->pass_cnt) {
-		ret = mlx5_counter_query(dev, ps->pass_cnt, clear, &pkts,
-						 &bytes);
-		if (ret)
-			goto error;
-		/* If need to read the packets, set it. */
-		if (fm->green_pkts)
-			stats->n_pkts[RTE_COLOR_GREEN] = pkts;
-		/* If need to read the bytes, set it. */
-		if (fm->green_bytes)
-			stats->n_bytes[RTE_COLOR_GREEN] = bytes;
-	}
-	if (ps->drop_cnt) {
-		ret = mlx5_counter_query(dev, ps->drop_cnt, clear, &pkts,
+	if (fm->drop_cnt) {
+		ret = mlx5_counter_query(dev, fm->drop_cnt, clear, &pkts,
 						 &bytes);
 		if (ret)
 			goto error;
@@ -1273,20 +935,18 @@ mlx5_flow_meter_stats_read(struct rte_eth_dev *dev,
 	return 0;
 error:
 	return -rte_mtr_error_set(error, ret, RTE_MTR_ERROR_TYPE_STATS, NULL,
-				 "Failed to read policer counters.");
+				 "Failed to read meter drop counters.");
 }
 
 static const struct rte_mtr_ops mlx5_flow_mtr_ops = {
 	.capabilities_get = mlx5_flow_mtr_cap_get,
 	.meter_profile_add = mlx5_flow_meter_profile_add,
 	.meter_profile_delete = mlx5_flow_meter_profile_delete,
-	.create = mlx5_flow_meter_create,
 	.destroy = mlx5_flow_meter_destroy,
 	.meter_enable = mlx5_flow_meter_enable,
 	.meter_disable = mlx5_flow_meter_disable,
 	.meter_profile_update = mlx5_flow_meter_profile_update,
 	.meter_dscp_table_update = NULL,
-	.policer_actions_update = NULL,
 	.stats_update = mlx5_flow_meter_stats_update,
 	.stats_read = mlx5_flow_meter_stats_read,
 };
@@ -1344,12 +1004,11 @@ mlx5_flow_meter_find(struct mlx5_priv *priv, uint32_t meter_id,
 		aso_mtr = mlx5_aso_meter_by_idx(priv, data.dword);
 		/* Remove reference taken by the mlx5_l3t_get_entry. */
 		mlx5_l3t_clear_entry(priv->mtr_idx_tbl, meter_id);
-		MLX5_ASSERT(meter_id == aso_mtr->fm.meter_id);
 		rte_spinlock_unlock(&mtrmng->mtrsl);
 		return &aso_mtr->fm;
 	}
 	TAILQ_FOREACH(legacy_fm, fms, next)
-		if (meter_id == legacy_fm->fm.meter_id) {
+		if (meter_id == legacy_fm->meter_id) {
 			if (mtr_idx)
 				*mtr_idx = legacy_fm->idx;
 			return &legacy_fm->fm;
@@ -1517,11 +1176,6 @@ mlx5_flow_meter_flush(struct rte_eth_dev *dev, struct rte_mtr_error *error)
 	struct mlx5_legacy_flow_meter *legacy_fm;
 	struct mlx5_flow_meter_info *fm;
 	struct mlx5_aso_mtr_pool *mtr_pool;
-	const struct rte_flow_attr attr = {
-				.ingress = 1,
-				.egress = 1,
-				.transfer = priv->config.dv_esw_en ? 1 : 0,
-			};
 	void *tmp;
 	uint32_t i, offset, mtr_idx;
 
@@ -1533,9 +1187,8 @@ mlx5_flow_meter_flush(struct rte_eth_dev *dev, struct rte_mtr_error *error)
 				offset++) {
 				fm = &mtr_pool->mtrs[offset].fm;
 				mtr_idx = MLX5_MAKE_MTR_IDX(i, offset);
-				if (fm->meter_id != UINT32_MAX &&
-					mlx5_flow_meter_params_flush(dev,
-						fm, &attr, mtr_idx))
+				if (mlx5_flow_meter_params_flush(dev,
+						fm, mtr_idx))
 					return -rte_mtr_error_set
 					(error, EINVAL,
 					RTE_MTR_ERROR_TYPE_METER_PROFILE_ID,
@@ -1545,7 +1198,7 @@ mlx5_flow_meter_flush(struct rte_eth_dev *dev, struct rte_mtr_error *error)
 	} else {
 		TAILQ_FOREACH_SAFE(legacy_fm, fms, next, tmp) {
 			fm = &legacy_fm->fm;
-			if (mlx5_flow_meter_params_flush(dev, fm, &attr, 0))
+			if (mlx5_flow_meter_params_flush(dev, fm, 0))
 				return -rte_mtr_error_set(error, EINVAL,
 					RTE_MTR_ERROR_TYPE_METER_PROFILE_ID,
 					NULL, "MTR object meter profile invalid.");
diff --git a/drivers/net/softnic/rte_eth_softnic_flow.c b/drivers/net/softnic/rte_eth_softnic_flow.c
index 7925bad1c0..27eaf380cd 100644
--- a/drivers/net/softnic/rte_eth_softnic_flow.c
+++ b/drivers/net/softnic/rte_eth_softnic_flow.c
@@ -1166,6 +1166,7 @@ flow_rule_action_get(struct pmd_internals *softnic,
 {
 	struct softnic_table_action_profile *profile;
 	struct softnic_table_action_profile_params *params;
+	struct softnic_mtr_meter_policy *policy;
 	int n_jump_queue_rss_drop = 0;
 	int n_count = 0;
 	int n_mark = 0;
@@ -1621,15 +1622,25 @@ flow_rule_action_get(struct pmd_internals *softnic,
 					return -1;
 				}
 			}
-
+			/* Meter policy must exist */
+			policy = softnic_mtr_meter_policy_find(softnic,
+					m->params.meter_policy_id);
+			if (policy == NULL) {
+				rte_flow_error_set(error,
+						EINVAL,
+						RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
+						NULL,
+						"METER: fail to find meter policy");
+				return -1;
+			}
 			/* RTE_TABLE_ACTION_METER */
 			rule_action->mtr.mtr[0].meter_profile_id = meter_profile_id;
 			rule_action->mtr.mtr[0].policer[RTE_COLOR_GREEN] =
-				softnic_table_action_policer(m->params.action[RTE_COLOR_GREEN]);
+				policy->policer[RTE_COLOR_GREEN];
 			rule_action->mtr.mtr[0].policer[RTE_COLOR_YELLOW] =
-				softnic_table_action_policer(m->params.action[RTE_COLOR_YELLOW]);
+				policy->policer[RTE_COLOR_YELLOW];
 			rule_action->mtr.mtr[0].policer[RTE_COLOR_RED] =
-				softnic_table_action_policer(m->params.action[RTE_COLOR_RED]);
+				policy->policer[RTE_COLOR_RED];
 			rule_action->mtr.tc_mask = 1;
 			rule_action->action_mask |= 1 << RTE_TABLE_ACTION_MTR;
 			break;
diff --git a/drivers/net/softnic/rte_eth_softnic_internals.h b/drivers/net/softnic/rte_eth_softnic_internals.h
index faf90a5a8c..1b3186ef0b 100644
--- a/drivers/net/softnic/rte_eth_softnic_internals.h
+++ b/drivers/net/softnic/rte_eth_softnic_internals.h
@@ -83,6 +83,16 @@ struct softnic_mtr_meter_profile {
 
 TAILQ_HEAD(softnic_mtr_meter_profile_list, softnic_mtr_meter_profile);
 
+/* MTR meter policy */
+struct softnic_mtr_meter_policy {
+	TAILQ_ENTRY(softnic_mtr_meter_policy) node;
+	uint32_t meter_policy_id;
+	enum rte_table_action_policer policer[RTE_COLORS];
+	uint32_t n_users;
+};
+
+TAILQ_HEAD(softnic_mtr_meter_policy_list, softnic_mtr_meter_policy);
+
 /* MTR meter object */
 struct softnic_mtr {
 	TAILQ_ENTRY(softnic_mtr) node;
@@ -95,6 +105,7 @@ TAILQ_HEAD(softnic_mtr_list, softnic_mtr);
 
 struct mtr_internals {
 	struct softnic_mtr_meter_profile_list meter_profiles;
+	struct softnic_mtr_meter_policy_list meter_policies;
 	struct softnic_mtr_list mtrs;
 };
 
@@ -678,6 +689,10 @@ struct softnic_mtr_meter_profile *
 softnic_mtr_meter_profile_find(struct pmd_internals *p,
 	uint32_t meter_profile_id);
 
+struct softnic_mtr_meter_policy *
+softnic_mtr_meter_policy_find(struct pmd_internals *p,
+	uint32_t meter_policy_id);
+
 extern const struct rte_mtr_ops pmd_mtr_ops;
 
 /**
@@ -841,9 +856,6 @@ softnic_table_action_profile_create(struct pmd_internals *p,
 	const char *name,
 	struct softnic_table_action_profile_params *params);
 
-enum rte_table_action_policer
-softnic_table_action_policer(enum rte_mtr_policer_action action);
-
 /**
  * Pipeline
  */
diff --git a/drivers/net/softnic/rte_eth_softnic_meter.c b/drivers/net/softnic/rte_eth_softnic_meter.c
index 31a2a0e6d9..99f5291556 100644
--- a/drivers/net/softnic/rte_eth_softnic_meter.c
+++ b/drivers/net/softnic/rte_eth_softnic_meter.c
@@ -65,27 +65,6 @@ softnic_mtr_meter_profile_find(struct pmd_internals *p,
 	return NULL;
 }
 
-enum rte_table_action_policer
-softnic_table_action_policer(enum rte_mtr_policer_action action)
-{
-	switch (action) {
-	case MTR_POLICER_ACTION_COLOR_GREEN:
-		return RTE_TABLE_ACTION_POLICER_COLOR_GREEN;
-
-		/* FALLTHROUGH */
-	case MTR_POLICER_ACTION_COLOR_YELLOW:
-		return RTE_TABLE_ACTION_POLICER_COLOR_YELLOW;
-
-		/* FALLTHROUGH */
-	case MTR_POLICER_ACTION_COLOR_RED:
-		return RTE_TABLE_ACTION_POLICER_COLOR_RED;
-
-		/* FALLTHROUGH */
-	default:
-		return RTE_TABLE_ACTION_POLICER_DROP;
-	}
-}
-
 static int
 meter_profile_check(struct rte_eth_dev *dev,
 	uint32_t meter_profile_id,
@@ -200,6 +179,129 @@ pmd_mtr_meter_profile_delete(struct rte_eth_dev *dev,
 	return 0;
 }
 
+struct softnic_mtr_meter_policy *
+softnic_mtr_meter_policy_find(struct pmd_internals *p,
+	uint32_t meter_policy_id)
+{
+	struct softnic_mtr_meter_policy_list *mpl = &p->mtr.meter_policies;
+	struct softnic_mtr_meter_policy *mp;
+
+	TAILQ_FOREACH(mp, mpl, node)
+		if (meter_policy_id == mp->meter_policy_id)
+			return mp;
+
+	return NULL;
+}
+
+/* MTR meter policy create */
+static int
+pmd_mtr_meter_policy_create(struct rte_eth_dev *dev,
+	uint32_t meter_policy_id,
+	const struct rte_flow_action *actions[RTE_COLORS],
+	struct rte_mtr_error *error)
+{
+	struct pmd_internals *p = dev->data->dev_private;
+	struct softnic_mtr_meter_policy_list *mpl = &p->mtr.meter_policies;
+	struct softnic_mtr_meter_policy *mp;
+	const struct rte_flow_action *act;
+	const struct rte_flow_action_color *recolor;
+	uint32_t i;
+
+	/* Meter policy ID must be valid. */
+	if (meter_policy_id == UINT32_MAX)
+		return -rte_mtr_error_set(error,
+			EINVAL,
+			RTE_MTR_ERROR_TYPE_METER_POLICY_ID,
+			NULL,
+			"Meter policy id not valid");
+
+	for (i = 0; i < RTE_COLORS; i++) {
+		act = actions[i];
+		if (act && act->type != RTE_FLOW_ACTION_TYPE_METER_COLOR &&
+			act->type != RTE_FLOW_ACTION_TYPE_DROP)
+			return -rte_mtr_error_set(error,
+				EINVAL,
+				RTE_MTR_ERROR_TYPE_METER_POLICY,
+				NULL,
+				"Action invalid");
+	}
+
+	/* Memory allocation */
+	mp = calloc(1, sizeof(struct softnic_mtr_meter_policy));
+	if (mp == NULL)
+		return -rte_mtr_error_set(error,
+			ENOMEM,
+			RTE_MTR_ERROR_TYPE_UNSPECIFIED,
+			NULL,
+			"Memory alloc failed");
+
+	/* Fill in */
+	mp->meter_policy_id = meter_policy_id;
+	for (i = 0; i < RTE_COLORS; i++) {
+		mp->policer[i] = RTE_TABLE_ACTION_POLICER_DROP;
+		act = actions[i];
+		if (!act)
+			continue;
+		if (act->type == RTE_FLOW_ACTION_TYPE_METER_COLOR) {
+			recolor = act->conf;
+			switch (recolor->color) {
+			case RTE_COLOR_GREEN:
+				mp->policer[i] =
+				RTE_TABLE_ACTION_POLICER_COLOR_GREEN;
+				break;
+			case RTE_COLOR_YELLOW:
+				mp->policer[i] =
+				RTE_TABLE_ACTION_POLICER_COLOR_YELLOW;
+				break;
+			case RTE_COLOR_RED:
+				mp->policer[i] =
+				RTE_TABLE_ACTION_POLICER_COLOR_RED;
+				break;
+			default:
+				break;
+			}
+		}
+	}
+
+	/* Add to list */
+	TAILQ_INSERT_TAIL(mpl, mp, node);
+
+	return 0;
+}
+
+/* MTR meter policy delete */
+static int
+pmd_mtr_meter_policy_delete(struct rte_eth_dev *dev,
+	uint32_t meter_policy_id,
+	struct rte_mtr_error *error)
+{
+	struct pmd_internals *p = dev->data->dev_private;
+	struct softnic_mtr_meter_policy *mp;
+
+	/* Meter policy must exist */
+	mp = softnic_mtr_meter_policy_find(p, meter_policy_id);
+	if (mp == NULL)
+		return -rte_mtr_error_set(error,
+			EINVAL,
+			RTE_MTR_ERROR_TYPE_METER_POLICY_ID,
+			NULL,
+			"Meter policy id invalid");
+
+	/* Check unused */
+	if (mp->n_users)
+		return -rte_mtr_error_set(error,
+			EBUSY,
+			RTE_MTR_ERROR_TYPE_METER_POLICY_ID,
+			NULL,
+			"Meter policy in use");
+
+	/* Remove from list */
+	TAILQ_REMOVE(&p->mtr.meter_policies, mp, node);
+	free(mp);
+
+	return 0;
+}
+
 struct softnic_mtr *
 softnic_mtr_find(struct pmd_internals *p, uint32_t mtr_id)
 {
@@ -267,8 +369,13 @@ pmd_mtr_create(struct rte_eth_dev *dev,
 	struct pmd_internals *p = dev->data->dev_private;
 	struct softnic_mtr_list *ml = &p->mtr.mtrs;
 	struct softnic_mtr_meter_profile *mp;
+	struct softnic_mtr_meter_policy *policy;
 	struct softnic_mtr *m;
 	int status;
+	struct rte_flow_action actions[RTE_COLORS];
+	struct rte_flow_action_color recolor[RTE_COLORS];
+	const struct rte_flow_action *acts[RTE_COLORS];
+	enum rte_color i;
 
 	/* Check parameters */
 	status = mtr_check(p, mtr_id, params, shared, error);
@@ -283,6 +390,46 @@ pmd_mtr_create(struct rte_eth_dev *dev,
 			RTE_MTR_ERROR_TYPE_METER_PROFILE_ID,
 			NULL,
 			"Meter profile id not valid");
+	/* Meter policy must exist */
+	policy = softnic_mtr_meter_policy_find(p, params->meter_policy_id);
+	if (policy == NULL) {
+		/* Create default policy */
+		if (params->meter_policy_id == RTE_MTR_DEFAULT_POLICY_ID) {
+			/* Green - do nothing, yellow - do nothing.*/
+			for (i = 0; i < RTE_COLOR_RED; i++) {
+				actions[i].type =
+					RTE_FLOW_ACTION_TYPE_METER_COLOR;
+				recolor[i].color = i;
+				actions[i].conf = &recolor[i];
+				acts[i] = &actions[i];
+			}
+			/* Red - drop.*/
+			actions[RTE_COLOR_RED].type =
+					RTE_FLOW_ACTION_TYPE_DROP;
+			acts[RTE_COLOR_RED] = &actions[RTE_COLOR_RED];
+			status = pmd_mtr_meter_policy_create(dev,
+					RTE_MTR_DEFAULT_POLICY_ID,
+					acts,
+					error);
+			if (status)
+				return status;
+
+			policy = softnic_mtr_meter_policy_find(p,
+					params->meter_policy_id);
+			if (policy == NULL)
+				return -rte_mtr_error_set(error,
+					EINVAL,
+					RTE_MTR_ERROR_TYPE_METER_POLICY_ID,
+					NULL,
+					"Fail to find meter default policy");
+		} else {
+			return -rte_mtr_error_set(error,
+				EINVAL,
+				RTE_MTR_ERROR_TYPE_METER_POLICY_ID,
+				NULL,
+				"Meter policy id invalid");
+		}
+	}
 
 	/* Memory allocation */
 	m = calloc(1, sizeof(struct softnic_mtr));
@@ -302,6 +449,7 @@ pmd_mtr_create(struct rte_eth_dev *dev,
 
 	/* Update dependencies */
 	mp->n_users++;
+	policy->n_users++;
 
 	return 0;
 }
@@ -316,6 +464,8 @@ pmd_mtr_destroy(struct rte_eth_dev *dev,
 	struct softnic_mtr_list *ml = &p->mtr.mtrs;
 	struct softnic_mtr_meter_profile *mp;
 	struct softnic_mtr *m;
+	struct softnic_mtr_meter_policy *policy;
+	int status;
 
 	/* MTR object must exist */
 	m = softnic_mtr_find(p, mtr_id);
@@ -343,8 +493,28 @@ pmd_mtr_destroy(struct rte_eth_dev *dev,
 			NULL,
 			"MTR object meter profile invalid");
 
+	/* Meter policy must exist */
+	policy = softnic_mtr_meter_policy_find(p, m->params.meter_policy_id);
+	if (policy == NULL)
+		return -rte_mtr_error_set(error,
+			EINVAL,
+			RTE_MTR_ERROR_TYPE_METER_POLICY_ID,
+			NULL,
+			"MTR object meter policy invalid");
+
 	/* Update dependencies */
 	mp->n_users--;
+	policy->n_users--;
+
+	/* Destory default policy*/
+	if (!policy->n_users &&
+		m->params.meter_policy_id == RTE_MTR_DEFAULT_POLICY_ID) {
+		status = pmd_mtr_meter_policy_delete(dev,
+					RTE_MTR_DEFAULT_POLICY_ID,
+					error);
+		if (status)
+			return status;
+	}
 
 	/* Remove from list */
 	TAILQ_REMOVE(ml, m, node);
@@ -506,18 +676,18 @@ pmd_mtr_meter_dscp_table_update(struct rte_eth_dev *dev,
 	return 0;
 }
 
-/* MTR object policer action update */
+/* MTR object policy update */
 static int
-pmd_mtr_policer_actions_update(struct rte_eth_dev *dev,
+pmd_mtr_meter_policy_update(struct rte_eth_dev *dev,
 	uint32_t mtr_id,
-	uint32_t action_mask,
-	enum rte_mtr_policer_action *actions,
+	uint32_t meter_policy_id,
 	struct rte_mtr_error *error)
 {
 	struct pmd_internals *p = dev->data->dev_private;
 	struct softnic_mtr *m;
 	uint32_t i;
 	int status;
+	struct softnic_mtr_meter_policy *mp_new, *mp_old;
 
 	/* MTR object id must be valid */
 	m = softnic_mtr_find(p, mtr_id);
@@ -527,29 +697,14 @@ pmd_mtr_policer_actions_update(struct rte_eth_dev *dev,
 			RTE_MTR_ERROR_TYPE_MTR_ID,
 			NULL,
 			"MTR object id not valid");
-
-	/* Valid policer actions */
-	if (actions == NULL)
+	/* Meter policy must exist */
+	mp_new = softnic_mtr_meter_policy_find(p, meter_policy_id);
+	if (mp_new == NULL)
 		return -rte_mtr_error_set(error,
 			EINVAL,
-			RTE_MTR_ERROR_TYPE_UNSPECIFIED,
+			RTE_MTR_ERROR_TYPE_METER_POLICY_ID,
 			NULL,
-			"Invalid actions");
-
-	for (i = 0; i < RTE_COLORS; i++) {
-		if (action_mask & (1 << i)) {
-			if (actions[i] != MTR_POLICER_ACTION_COLOR_GREEN  &&
-				actions[i] != MTR_POLICER_ACTION_COLOR_YELLOW &&
-				actions[i] != MTR_POLICER_ACTION_COLOR_RED &&
-				actions[i] != MTR_POLICER_ACTION_DROP) {
-				return -rte_mtr_error_set(error,
-					EINVAL,
-					RTE_MTR_ERROR_TYPE_UNSPECIFIED,
-					NULL,
-					" Invalid action value");
-			}
-		}
-	}
+			"Meter policy id invalid");
 
 	/* MTR object owner valid? */
 	if (m->flow) {
@@ -561,9 +716,7 @@ pmd_mtr_policer_actions_update(struct rte_eth_dev *dev,
 
 		/* Set action */
 		for (i = 0; i < RTE_COLORS; i++)
-			if (action_mask & (1 << i))
-				action.mtr.mtr[0].policer[i] =
-					softnic_table_action_policer(actions[i]);
+			action.mtr.mtr[0].policer[i] = mp_new->policer[i];
 
 		/* Re-add the rule */
 		status = softnic_pipeline_table_rule_add(p,
@@ -587,10 +740,14 @@ pmd_mtr_policer_actions_update(struct rte_eth_dev *dev,
 			1, NULL, 1);
 	}
 
-	/* Meter: Update policer actions */
-	for (i = 0; i < RTE_COLORS; i++)
-		if (action_mask & (1 << i))
-			m->params.action[i] = actions[i];
+	mp_old = softnic_mtr_meter_policy_find(p, m->params.meter_policy_id);
+
+	/* Meter: Set meter profile */
+	m->params.meter_policy_id = meter_policy_id;
+
+	/* Update dependencies*/
+	mp_old->n_users--;
+	mp_new->n_users++;
 
 	return 0;
 }
@@ -607,28 +764,40 @@ pmd_mtr_policer_actions_update(struct rte_eth_dev *dev,
 
 /* MTR object stats read */
 static void
-mtr_stats_convert(struct softnic_mtr *m,
+mtr_stats_convert(struct pmd_internals *p,
+	struct softnic_mtr *m,
 	struct rte_table_action_mtr_counters_tc *in,
 	struct rte_mtr_stats *out,
 	uint64_t *out_mask)
 {
+	struct softnic_mtr_meter_policy *mp;
+
 	memset(&out, 0, sizeof(out));
 	*out_mask = 0;
 
+	/* Meter policy must exist */
+	mp = softnic_mtr_meter_policy_find(p, m->params.meter_policy_id);
+	if (mp == NULL)
+		return;
+
 	if (in->n_packets_valid) {
 		uint32_t i;
 
 		for (i = 0; i < RTE_COLORS; i++) {
-			if (m->params.action[i] == MTR_POLICER_ACTION_COLOR_GREEN)
+			if (mp->policer[i] ==
+				RTE_TABLE_ACTION_POLICER_COLOR_GREEN)
 				out->n_pkts[RTE_COLOR_GREEN] += in->n_packets[i];
 
-			if (m->params.action[i] == MTR_POLICER_ACTION_COLOR_YELLOW)
+			if (mp->policer[i] ==
+				RTE_TABLE_ACTION_POLICER_COLOR_YELLOW)
 				out->n_pkts[RTE_COLOR_YELLOW] += in->n_packets[i];
 
-			if (m->params.action[i] == MTR_POLICER_ACTION_COLOR_RED)
+			if (mp->policer[i] ==
+				RTE_TABLE_ACTION_POLICER_COLOR_RED)
 				out->n_pkts[RTE_COLOR_RED] += in->n_packets[i];
 
-			if (m->params.action[i] == MTR_POLICER_ACTION_DROP)
+			if (mp->policer[i] ==
+				RTE_TABLE_ACTION_POLICER_DROP)
 				out->n_pkts_dropped += in->n_packets[i];
 		}
 
@@ -639,16 +808,20 @@ mtr_stats_convert(struct softnic_mtr *m,
 		uint32_t i;
 
 		for (i = 0; i < RTE_COLORS; i++) {
-			if (m->params.action[i] == MTR_POLICER_ACTION_COLOR_GREEN)
+			if (mp->policer[i] ==
+				RTE_TABLE_ACTION_POLICER_COLOR_GREEN)
 				out->n_bytes[RTE_COLOR_GREEN] += in->n_bytes[i];
 
-			if (m->params.action[i] == MTR_POLICER_ACTION_COLOR_YELLOW)
+			if (mp->policer[i] ==
+				RTE_TABLE_ACTION_POLICER_COLOR_YELLOW)
 				out->n_bytes[RTE_COLOR_YELLOW] += in->n_bytes[i];
 
-			if (m->params.action[i] == MTR_POLICER_ACTION_COLOR_RED)
+			if (mp->policer[i] ==
+				RTE_TABLE_ACTION_POLICER_COLOR_RED)
 				out->n_bytes[RTE_COLOR_RED] += in->n_bytes[i];
 
-			if (m->params.action[i] == MTR_POLICER_ACTION_DROP)
+			if (mp->policer[i] ==
+				RTE_TABLE_ACTION_POLICER_DROP)
 				out->n_bytes_dropped += in->n_bytes[i];
 		}
 
@@ -714,7 +887,8 @@ pmd_mtr_stats_read(struct rte_eth_dev *dev,
 		struct rte_mtr_stats s;
 		uint64_t s_mask = 0;
 
-		mtr_stats_convert(m,
+		mtr_stats_convert(p,
+			m,
 			&counters.stats[0],
 			&s,
 			&s_mask);
@@ -735,6 +909,9 @@ const struct rte_mtr_ops pmd_mtr_ops = {
 	.meter_profile_add = pmd_mtr_meter_profile_add,
 	.meter_profile_delete = pmd_mtr_meter_profile_delete,
 
+	.meter_policy_create = pmd_mtr_meter_policy_create,
+	.meter_policy_delete = pmd_mtr_meter_policy_delete,
+
 	.create = pmd_mtr_create,
 	.destroy = pmd_mtr_destroy,
 	.meter_enable = NULL,
@@ -742,7 +919,7 @@ const struct rte_mtr_ops pmd_mtr_ops = {
 
 	.meter_profile_update = pmd_mtr_meter_profile_update,
 	.meter_dscp_table_update = pmd_mtr_meter_dscp_table_update,
-	.policer_actions_update = pmd_mtr_policer_actions_update,
+	.meter_policy_update = pmd_mtr_meter_policy_update,
 	.stats_update = NULL,
 
 	.stats_read = pmd_mtr_stats_read,
diff --git a/lib/librte_ethdev/rte_flow.h b/lib/librte_ethdev/rte_flow.h
index 6cc57136ac..60fede4983 100644
--- a/lib/librte_ethdev/rte_flow.h
+++ b/lib/librte_ethdev/rte_flow.h
@@ -32,6 +32,7 @@
 #include <rte_ecpri.h>
 #include <rte_mbuf.h>
 #include <rte_mbuf_dyn.h>
+#include <rte_meter.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -2267,6 +2268,13 @@ enum rte_flow_action_type {
 	 * See struct rte_flow_action_modify_field.
 	 */
 	RTE_FLOW_ACTION_TYPE_MODIFY_FIELD,
+
+	/**
+	 * Color the packet to reflect the meter color result.
+	 *
+	 * See struct rte_flow_action_color.
+	 */
+	RTE_FLOW_ACTION_TYPE_METER_COLOR,
 };
 
 /**
@@ -2859,6 +2867,16 @@ struct rte_flow_action_set_dscp {
  */
 struct rte_flow_shared_action;
 
+/**
+ * RTE_FLOW_ACTION_TYPE_COLOR
+ *
+ * The meter color should be set in the packet meta-data
+ * (i.e. struct rte_mbuf::sched::color).
+ */
+struct rte_flow_action_color {
+	enum rte_color color; /**< Green/Yellow/Red. */
+};
+
 /**
  * Field IDs for MODIFY_FIELD action.
  */
diff --git a/lib/librte_ethdev/rte_mtr.c b/lib/librte_ethdev/rte_mtr.c
index 3073ac03f2..27041467c5 100644
--- a/lib/librte_ethdev/rte_mtr.c
+++ b/lib/librte_ethdev/rte_mtr.c
@@ -91,6 +91,40 @@ rte_mtr_meter_profile_delete(uint16_t port_id,
 		meter_profile_id, error);
 }
 
+/* MTR meter policy validate */
+int
+rte_mtr_meter_policy_validate(uint16_t port_id,
+	const struct rte_flow_action *actions[RTE_COLORS],
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, meter_policy_validate)(dev,
+		actions, error);
+}
+
+/* MTR meter policy create */
+int
+rte_mtr_meter_policy_create(uint16_t port_id,
+	uint32_t policy_id,
+	const struct rte_flow_action *actions[RTE_COLORS],
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, meter_policy_create)(dev,
+		policy_id, actions, error);
+}
+
+/** MTR meter policy delete */
+int
+rte_mtr_meter_policy_delete(uint16_t port_id,
+	uint32_t policy_id,
+	struct rte_mtr_error *error)
+{
+	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
+	return RTE_MTR_FUNC(port_id, meter_policy_delete)(dev,
+		policy_id, error);
+}
+
 /** MTR object create */
 int
 rte_mtr_create(uint16_t port_id,
@@ -149,29 +183,28 @@ rte_mtr_meter_profile_update(uint16_t port_id,
 		mtr_id, meter_profile_id, error);
 }
 
-/** MTR object meter DSCP table update */
+/** MTR object meter policy update */
 int
-rte_mtr_meter_dscp_table_update(uint16_t port_id,
+rte_mtr_meter_policy_update(uint16_t port_id,
 	uint32_t mtr_id,
-	enum rte_color *dscp_table,
+	uint32_t meter_policy_id,
 	struct rte_mtr_error *error)
 {
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
-	return RTE_MTR_FUNC(port_id, meter_dscp_table_update)(dev,
-		mtr_id, dscp_table, error);
+	return RTE_MTR_FUNC(port_id, meter_policy_update)(dev,
+		mtr_id, meter_policy_id, error);
 }
 
-/** MTR object policer action update */
+/** MTR object meter DSCP table update */
 int
-rte_mtr_policer_actions_update(uint16_t port_id,
+rte_mtr_meter_dscp_table_update(uint16_t port_id,
 	uint32_t mtr_id,
-	uint32_t action_mask,
-	enum rte_mtr_policer_action *actions,
+	enum rte_color *dscp_table,
 	struct rte_mtr_error *error)
 {
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
-	return RTE_MTR_FUNC(port_id, policer_actions_update)(dev,
-		mtr_id, action_mask, actions, error);
+	return RTE_MTR_FUNC(port_id, meter_dscp_table_update)(dev,
+		mtr_id, dscp_table, error);
 }
 
 /** MTR object enabled stats update */
diff --git a/lib/librte_ethdev/rte_mtr.h b/lib/librte_ethdev/rte_mtr.h
index 916a09c5c3..50b343dd27 100644
--- a/lib/librte_ethdev/rte_mtr.h
+++ b/lib/librte_ethdev/rte_mtr.h
@@ -49,6 +49,7 @@
 #include <rte_compat.h>
 #include <rte_common.h>
 #include <rte_meter.h>
+#include <rte_flow.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -174,23 +175,6 @@ struct rte_mtr_meter_profile {
 	};
 };
 
-/**
- * Policer actions
- */
-enum rte_mtr_policer_action {
-	/** Recolor the packet as green. */
-	MTR_POLICER_ACTION_COLOR_GREEN = 0,
-
-	/** Recolor the packet as yellow. */
-	MTR_POLICER_ACTION_COLOR_YELLOW,
-
-	/** Recolor the packet as red. */
-	MTR_POLICER_ACTION_COLOR_RED,
-
-	/** Drop the packet. */
-	MTR_POLICER_ACTION_DROP,
-};
-
 /**
  * Parameters for each traffic metering & policing object
  *
@@ -232,13 +216,13 @@ struct rte_mtr_params {
 	 */
 	int meter_enable;
 
-	/** Policer actions (per meter output color). */
-	enum rte_mtr_policer_action action[RTE_COLORS];
-
 	/** Set of stats counters to be enabled.
 	 * @see enum rte_mtr_stats_type
 	 */
 	uint64_t stats_mask;
+
+	/** Meter policy ID. */
+	uint32_t meter_policy_id;
 };
 
 /**
@@ -324,6 +308,13 @@ struct rte_mtr_capabilities {
 	 */
 	uint64_t meter_rate_max;
 
+	/**
+	 * Maximum number of policy objects that can have.
+	 * The value of 0 is invalid. Policy must be supported for meter.
+	 * The maximum value is *n_max*.
+	 */
+	uint64_t meter_policy_n_max;
+
 	/**
 	 * When non-zero, it indicates that color aware mode is supported for
 	 * the srTCM RFC 2697 metering algorithm.
@@ -342,18 +333,6 @@ struct rte_mtr_capabilities {
 	 */
 	int color_aware_trtcm_rfc4115_supported;
 
-	/** When non-zero, it indicates that the policer packet recolor actions
-	 * are supported.
-	 * @see enum rte_mtr_policer_action
-	 */
-	int policer_action_recolor_supported;
-
-	/** When non-zero, it indicates that the policer packet drop action is
-	 * supported.
-	 * @see enum rte_mtr_policer_action
-	 */
-	int policer_action_drop_supported;
-
 	/** Set of supported statistics counter types.
 	 * @see enum rte_mtr_stats_type
 	 */
@@ -379,6 +358,8 @@ enum rte_mtr_error_type {
 	RTE_MTR_ERROR_TYPE_STATS_MASK,
 	RTE_MTR_ERROR_TYPE_STATS,
 	RTE_MTR_ERROR_TYPE_SHARED,
+	RTE_MTR_ERROR_TYPE_METER_POLICY_ID,
+	RTE_MTR_ERROR_TYPE_METER_POLICY,
 };
 
 /**
@@ -462,6 +443,92 @@ rte_mtr_meter_profile_delete(uint16_t port_id,
 	uint32_t meter_profile_id,
 	struct rte_mtr_error *error);
 
+/**
+ * Policy id 0 is default policy.
+ * Action per color as below:
+ * green - do nothing, yellow - do nothing, red - drop
+ * It can be used without creating it by
+ * the rte_mtr_meter_policy_create function.
+ */
+#define RTE_MTR_DEFAULT_POLICY_ID 0
+
+/**
+ * Check whether a meter policy can be created on a given port.
+ *
+ * The meter policy is validated for correctness and
+ * whether it could be accepted by the device given sufficient resources.
+ * The policy is checked against the current capability information
+ * meter_policy_n_max configuration.
+ * The policy may also optionally be validated against existing
+ * device policy resources.
+ * This function has no effect on the target device.
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] actions
+ *   Associated action list per color.
+ *   list NULL is legal and means no special action.
+ *   (list terminated by the END action).
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ *
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ *
+ */
+__rte_experimental
+int
+rte_mtr_meter_policy_validate(uint16_t port_id,
+	const struct rte_flow_action *actions[RTE_COLORS],
+	struct rte_mtr_error *error);
+
+/**
+ * Meter policy add
+ *
+ * Create a new meter policy. The new policy
+ * is used to create single or multiple MTR objects.
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] policy_id
+ *   Policy identifier for the new meter policy.
+ * @param[in] actions
+ *   Associated actions per color.
+ *   list NULL is legal and means no special action.
+ *   (list terminated by the END action).
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+__rte_experimental
+int
+rte_mtr_meter_policy_create(uint16_t port_id,
+	uint32_t policy_id,
+	const struct rte_flow_action *actions[RTE_COLORS],
+	struct rte_mtr_error *error);
+
+/**
+ * Meter policy delete
+ *
+ * Delete an existing meter policy. This operation fails when there is
+ * currently at least one user (i.e. MTR object) of this policy.
+ *
+ * @param[in] port_id
+ *   The port identifier of the Ethernet device.
+ * @param[in] policy_id
+ *   Policy identifier.
+ * @param[out] error
+ *   Error details. Filled in only on error, when not NULL.
+ * @return
+ *   0 on success, non-zero error code otherwise.
+ */
+__rte_experimental
+int
+rte_mtr_meter_policy_delete(uint16_t port_id,
+	uint32_t policy_id,
+	struct rte_mtr_error *error);
+
 /**
  * MTR object create
  *
@@ -587,18 +654,14 @@ rte_mtr_meter_profile_update(uint16_t port_id,
 	struct rte_mtr_error *error);
 
 /**
- * MTR object DSCP table update
+ * MTR object meter policy update
  *
  * @param[in] port_id
  *   The port identifier of the Ethernet device.
  * @param[in] mtr_id
  *   MTR object ID. Needs to be valid.
- * @param[in] dscp_table
- *   When non-NULL: it points to a pre-allocated and pre-populated table with
- *   exactly 64 elements providing the input color for each value of the
- *   IPv4/IPv6 Differentiated Services Code Point (DSCP) input packet field.
- *   When NULL: it is equivalent to setting this parameter to an “all-green”
- *   populated table (i.e. table with all the 64 elements set to green color).
+ * @param[in] meter_policy_id
+ *   Meter policy ID for the current MTR object. Needs to be valid.
  * @param[out] error
  *   Error details. Filled in only on error, when not NULL.
  * @return
@@ -606,26 +669,24 @@ rte_mtr_meter_profile_update(uint16_t port_id,
  */
 __rte_experimental
 int
-rte_mtr_meter_dscp_table_update(uint16_t port_id,
+rte_mtr_meter_policy_update(uint16_t port_id,
 	uint32_t mtr_id,
-	enum rte_color *dscp_table,
+	uint32_t meter_policy_id,
 	struct rte_mtr_error *error);
 
 /**
- * MTR object policer actions update
+ * MTR object DSCP table update
  *
  * @param[in] port_id
  *   The port identifier of the Ethernet device.
  * @param[in] mtr_id
  *   MTR object ID. Needs to be valid.
- * @param[in] action_mask
- *   Bit mask indicating which policer actions need to be updated. One or more
- *   policer actions can be updated in a single function invocation. To update
- *   the policer action associated with color C, bit (1 << C) needs to be set in
- *   *action_mask* and element at position C in the *actions* array needs to be
- *   valid.
- * @param[in] actions
- *   Pre-allocated and pre-populated array of policer actions.
+ * @param[in] dscp_table
+ *   When non-NULL: it points to a pre-allocated and pre-populated table with
+ *   exactly 64 elements providing the input color for each value of the
+ *   IPv4/IPv6 Differentiated Services Code Point (DSCP) input packet field.
+ *   When NULL: it is equivalent to setting this parameter to an “all-green”
+ *   populated table (i.e. table with all the 64 elements set to green color).
  * @param[out] error
  *   Error details. Filled in only on error, when not NULL.
  * @return
@@ -633,10 +694,9 @@ rte_mtr_meter_dscp_table_update(uint16_t port_id,
  */
 __rte_experimental
 int
-rte_mtr_policer_actions_update(uint16_t port_id,
+rte_mtr_meter_dscp_table_update(uint16_t port_id,
 	uint32_t mtr_id,
-	uint32_t action_mask,
-	enum rte_mtr_policer_action *actions,
+	enum rte_color *dscp_table,
 	struct rte_mtr_error *error);
 
 /**
diff --git a/lib/librte_ethdev/rte_mtr_driver.h b/lib/librte_ethdev/rte_mtr_driver.h
index a0ddc2b5f4..98260ac40b 100644
--- a/lib/librte_ethdev/rte_mtr_driver.h
+++ b/lib/librte_ethdev/rte_mtr_driver.h
@@ -41,6 +41,22 @@ typedef int (*rte_mtr_meter_profile_delete_t)(struct rte_eth_dev *dev,
 	struct rte_mtr_error *error);
 /**< @internal MTR meter profile delete */
 
+typedef int (*rte_mtr_meter_policy_validate_t)(struct rte_eth_dev *dev,
+	const struct rte_flow_action *actions[RTE_COLORS],
+	struct rte_mtr_error *error);
+/**< @internal MTR meter policy validate */
+
+typedef int (*rte_mtr_meter_policy_create_t)(struct rte_eth_dev *dev,
+	uint32_t policy_id,
+	const struct rte_flow_action *actions[RTE_COLORS],
+	struct rte_mtr_error *error);
+/**< @internal MTR meter policy add */
+
+typedef int (*rte_mtr_meter_policy_delete_t)(struct rte_eth_dev *dev,
+	uint32_t policy_id,
+	struct rte_mtr_error *error);
+/**< @internal MTR meter policy delete */
+
 typedef int (*rte_mtr_create_t)(struct rte_eth_dev *dev,
 	uint32_t mtr_id,
 	struct rte_mtr_params *params,
@@ -69,18 +85,17 @@ typedef int (*rte_mtr_meter_profile_update_t)(struct rte_eth_dev *dev,
 	struct rte_mtr_error *error);
 /**< @internal MTR object meter profile update */
 
-typedef int (*rte_mtr_meter_dscp_table_update_t)(struct rte_eth_dev *dev,
+typedef int (*rte_mtr_meter_policy_update_t)(struct rte_eth_dev *dev,
 	uint32_t mtr_id,
-	enum rte_color *dscp_table,
+	uint32_t meter_policy_id,
 	struct rte_mtr_error *error);
-/**< @internal MTR object meter DSCP table update */
+/**< @internal MTR object meter policy update */
 
-typedef int (*rte_mtr_policer_actions_update_t)(struct rte_eth_dev *dev,
+typedef int (*rte_mtr_meter_dscp_table_update_t)(struct rte_eth_dev *dev,
 	uint32_t mtr_id,
-	uint32_t action_mask,
-	enum rte_mtr_policer_action *actions,
+	enum rte_color *dscp_table,
 	struct rte_mtr_error *error);
-/**< @internal MTR object policer action update*/
+/**< @internal MTR object meter DSCP table update */
 
 typedef int (*rte_mtr_stats_update_t)(struct rte_eth_dev *dev,
 	uint32_t mtr_id,
@@ -124,14 +139,23 @@ struct rte_mtr_ops {
 	/** MTR object meter DSCP table update */
 	rte_mtr_meter_dscp_table_update_t meter_dscp_table_update;
 
-	/** MTR object policer action update */
-	rte_mtr_policer_actions_update_t policer_actions_update;
-
 	/** MTR object enabled stats update */
 	rte_mtr_stats_update_t stats_update;
 
 	/** MTR object stats read */
 	rte_mtr_stats_read_t stats_read;
+
+	/** MTR meter policy validate */
+	rte_mtr_meter_policy_validate_t meter_policy_validate;
+
+	/** MTR meter policy create */
+	rte_mtr_meter_policy_create_t meter_policy_create;
+
+	/** MTR meter policy delete */
+	rte_mtr_meter_policy_delete_t meter_policy_delete;
+
+	/** MTR object meter policy update */
+	rte_mtr_meter_policy_update_t meter_policy_update;
 };
 
 /**
diff --git a/lib/librte_ethdev/version.map b/lib/librte_ethdev/version.map
index 93ad388e96..a45834b87f 100644
--- a/lib/librte_ethdev/version.map
+++ b/lib/librte_ethdev/version.map
@@ -246,6 +246,10 @@ EXPERIMENTAL {
 
 	# added in 21.05
 	rte_eth_representor_info_get;
+	rte_mtr_meter_policy_create;
+	rte_mtr_meter_policy_delete;
+	rte_mtr_meter_policy_update;
+	rte_mtr_meter_policy_validate;
 };
 
 INTERNAL {
-- 
2.27.0


^ permalink raw reply	[relevance 1%]

* Re: [dpdk-dev] [PATCH] eal: move DMA mapping from bus-specific to generic driver
  @ 2021-03-31 22:53  4% ` Thomas Monjalon
  2021-04-01  8:40  0%   ` Kinsella, Ray
  2021-04-12 15:03  0%   ` Kinsella, Ray
  0 siblings, 2 replies; 200+ results
From: Thomas Monjalon @ 2021-03-31 22:53 UTC (permalink / raw)
  To: Ray Kinsella
  Cc: dev, hemant.agrawal, rosen.xu, sthemmin, longli, jerinj,
	ferruh.yigit, andrew.rybchenko, Matan Azrad, Shahaf Shuler,
	Viacheslav Ovsiienko, Maxime Coquelin, Chenbo Xia, xuemingl,
	david.marchand

01/04/2021 00:45, Thomas Monjalon:
> The operations of DMA mapping and unmapping are controlled in some
> bus drivers, following rte_bus specification.
> If the device driver don't provide any specific mapping operation,
> the bus driver may have a fallback (VFIO case for PCI).
> 
> The DMA mapping done by the device drivers are called
> from the bus drivers via function pointers in bus-specific structures:
> rte_vdev_driver and rte_pci_driver.
> 
> The device driver DMA mapping is not specific to the bus,
> so it can be generalized to all device drivers, based on rte_device.
> That's why the function pointers dma_map and dma_unmap
> are moved to rte_driver, avoiding useless casts of device object.
> 
> The function prototypes rte_dev_dma_map_t and rte_dev_dma_unmap_t
> are removed from rte_bus.h because the definition in rte_dev.h is enough,
> but they are still used in rte_bus for bus drivers,
> while being added in rte_driver for device drivers,
> and removed from rte_vdev_driver/rte_pci_driver.
> 
> The impacted device drivers are mlx5 (PCI) and virtio_user (vdev).
> 
> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> ---
> Depends-on: series-16017 ("pci: add rte prefix")
> ---
>  drivers/bus/pci/pci_common.c            |  8 ++--
>  drivers/bus/pci/rte_bus_pci.h           | 40 --------------------
>  drivers/bus/vdev/rte_bus_vdev.h         | 40 --------------------
>  drivers/bus/vdev/vdev.c                 | 32 +++++-----------
>  drivers/common/mlx5/mlx5_common_pci.c   | 30 ++++++++-------
>  drivers/net/mlx5/mlx5.c                 |  4 +-
>  drivers/net/mlx5/mlx5_mr.c              | 50 +++++++++++++------------
>  drivers/net/mlx5/mlx5_rxtx.h            |  4 +-
>  drivers/net/virtio/virtio_user_ethdev.c | 22 +++++------
>  lib/librte_eal/include/rte_bus.h        | 42 ---------------------
>  lib/librte_eal/include/rte_dev.h        | 49 +++++++++++++++++++++++-
>  11 files changed, 117 insertions(+), 204 deletions(-)

The ABI checker reports some issues on the driver interface.
It needs to be carefully analyzed, because driver interface
should not be part of the ABI compatibility contract.




^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [dpdk-dev v2] cryptodev: change raw data path dequeue API
  2021-03-16 11:14  9% [dpdk-dev] cryptodev: change raw data path dequeue API Fan Zhang
@ 2021-03-31 17:20  4% ` Fan Zhang
  0 siblings, 0 replies; 200+ results
From: Fan Zhang @ 2021-03-31 17:20 UTC (permalink / raw)
  To: dev; +Cc: gakhil, Fan Zhang

This patch changes the experimental raw data path dequeue burst API.
Originally the API enforces the user to provide callback function
to get maximum dequeue count. This change gives the user one more
option to pass directly the expected dequeue count.

Signed-off-by: Fan Zhang <roy.fan.zhang@intel.com>
---
 app/test/test_cryptodev.c              |  8 +-------
 doc/guides/rel_notes/release_21_05.rst |  3 +++
 drivers/crypto/qat/qat_sym_hw_dp.c     | 21 ++++++++++++++++++---
 lib/librte_cryptodev/rte_cryptodev.c   |  5 +++--
 lib/librte_cryptodev/rte_cryptodev.h   |  8 ++++++++
 5 files changed, 33 insertions(+), 12 deletions(-)

diff --git a/app/test/test_cryptodev.c b/app/test/test_cryptodev.c
index f91debc168..a910547423 100644
--- a/app/test/test_cryptodev.c
+++ b/app/test/test_cryptodev.c
@@ -162,12 +162,6 @@ ceil_byte_length(uint32_t num_bits)
 		return (num_bits >> 3);
 }
 
-static uint32_t
-get_raw_dp_dequeue_count(void *user_data __rte_unused)
-{
-	return 1;
-}
-
 static void
 post_process_raw_dp_op(void *user_data,	uint32_t index __rte_unused,
 		uint8_t is_op_success)
@@ -345,7 +339,7 @@ process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,
 	n = n_success = 0;
 	while (count++ < MAX_RAW_DEQUEUE_COUNT && n == 0) {
 		n = rte_cryptodev_raw_dequeue_burst(ctx,
-			get_raw_dp_dequeue_count, post_process_raw_dp_op,
+			NULL, 1, post_process_raw_dp_op,
 				(void **)&ret_op, 0, &n_success,
 				&dequeue_status);
 		if (dequeue_status < 0) {
diff --git a/doc/guides/rel_notes/release_21_05.rst b/doc/guides/rel_notes/release_21_05.rst
index 8e686cc627..943f1596c5 100644
--- a/doc/guides/rel_notes/release_21_05.rst
+++ b/doc/guides/rel_notes/release_21_05.rst
@@ -130,6 +130,9 @@ API Changes
    Also, make sure to start the actual text at the margin.
    =======================================================
 
+* cryptodev: the function ``rte_cryptodev_raw_dequeue_burst`` is added a
+  parameter ``max_nb_to_dequeue`` to give user a more flexible dequeue control.
+
 
 ABI Changes
 -----------
diff --git a/drivers/crypto/qat/qat_sym_hw_dp.c b/drivers/crypto/qat/qat_sym_hw_dp.c
index 01afb883e3..2f64de44a1 100644
--- a/drivers/crypto/qat/qat_sym_hw_dp.c
+++ b/drivers/crypto/qat/qat_sym_hw_dp.c
@@ -707,6 +707,7 @@ qat_sym_dp_enqueue_chain_jobs(void *qp_data, uint8_t *drv_ctx,
 static __rte_always_inline uint32_t
 qat_sym_dp_dequeue_burst(void *qp_data, uint8_t *drv_ctx,
 	rte_cryptodev_raw_get_dequeue_count_t get_dequeue_count,
+	uint32_t max_nb_to_dequeue,
 	rte_cryptodev_raw_post_dequeue_t post_dequeue,
 	void **out_user_data, uint8_t is_user_data_array,
 	uint32_t *n_success_jobs, int *return_status)
@@ -736,9 +737,23 @@ qat_sym_dp_dequeue_burst(void *qp_data, uint8_t *drv_ctx,
 
 	resp_opaque = (void *)(uintptr_t)resp->opaque_data;
 	/* get the dequeue count */
-	n = get_dequeue_count(resp_opaque);
-	if (unlikely(n == 0))
-		return 0;
+	if (get_dequeue_count) {
+		n = get_dequeue_count(resp_opaque);
+		if (unlikely(n == 0))
+			return 0;
+		else if (n > 1) {
+			head = (head + rx_queue->msg_size * (n - 1)) &
+				rx_queue->modulo_mask;
+			resp = (struct icp_qat_fw_comn_resp *)(
+				(uint8_t *)rx_queue->base_addr + head);
+			if (*(uint32_t *)resp == ADF_RING_EMPTY_SIG)
+				return 0;
+		}
+	} else {
+		if (unlikely(max_nb_to_dequeue == 0))
+			return 0;
+		n = max_nb_to_dequeue;
+	}
 
 	out_user_data[0] = resp_opaque;
 	status = QAT_SYM_DP_IS_RESP_SUCCESS(resp);
diff --git a/lib/librte_cryptodev/rte_cryptodev.c b/lib/librte_cryptodev/rte_cryptodev.c
index 40f55a3cd0..0c16b04f80 100644
--- a/lib/librte_cryptodev/rte_cryptodev.c
+++ b/lib/librte_cryptodev/rte_cryptodev.c
@@ -2232,13 +2232,14 @@ rte_cryptodev_raw_enqueue_done(struct rte_crypto_raw_dp_ctx *ctx,
 uint32_t
 rte_cryptodev_raw_dequeue_burst(struct rte_crypto_raw_dp_ctx *ctx,
 	rte_cryptodev_raw_get_dequeue_count_t get_dequeue_count,
+	uint32_t max_nb_to_dequeue,
 	rte_cryptodev_raw_post_dequeue_t post_dequeue,
 	void **out_user_data, uint8_t is_user_data_array,
 	uint32_t *n_success_jobs, int *status)
 {
 	return (*ctx->dequeue_burst)(ctx->qp_data, ctx->drv_ctx_data,
-		get_dequeue_count, post_dequeue, out_user_data,
-		is_user_data_array, n_success_jobs, status);
+		get_dequeue_count, max_nb_to_dequeue, post_dequeue,
+		out_user_data, is_user_data_array, n_success_jobs, status);
 }
 
 int
diff --git a/lib/librte_cryptodev/rte_cryptodev.h b/lib/librte_cryptodev/rte_cryptodev.h
index ae34f33f69..b2a1255112 100644
--- a/lib/librte_cryptodev/rte_cryptodev.h
+++ b/lib/librte_cryptodev/rte_cryptodev.h
@@ -1546,6 +1546,9 @@ typedef void (*rte_cryptodev_raw_post_dequeue_t)(void *user_data,
  * @param	drv_ctx			Driver specific context data.
  * @param	get_dequeue_count	User provided callback function to
  *					obtain dequeue operation count.
+ * @param	max_nb_to_dequeue	When get_dequeue_count is NULL this
+ *					value is used to pass the maximum
+ *					number of operations to be dequeued.
  * @param	post_dequeue		User provided callback function to
  *					post-process a dequeued operation.
  * @param	out_user_data		User data pointer array to be retrieve
@@ -1580,6 +1583,7 @@ typedef void (*rte_cryptodev_raw_post_dequeue_t)(void *user_data,
 typedef uint32_t (*cryptodev_sym_raw_dequeue_burst_t)(void *qp,
 	uint8_t *drv_ctx,
 	rte_cryptodev_raw_get_dequeue_count_t get_dequeue_count,
+	uint32_t max_nb_to_dequeue,
 	rte_cryptodev_raw_post_dequeue_t post_dequeue,
 	void **out_user_data, uint8_t is_user_data_array,
 	uint32_t *n_success, int *dequeue_status);
@@ -1747,6 +1751,9 @@ rte_cryptodev_raw_enqueue_done(struct rte_crypto_raw_dp_ctx *ctx,
  *					data.
  * @param	get_dequeue_count	User provided callback function to
  *					obtain dequeue operation count.
+ * @param	max_nb_to_dequeue	When get_dequeue_count is NULL this
+ *					value is used to pass the maximum
+ *					number of operations to be dequeued.
  * @param	post_dequeue		User provided callback function to
  *					post-process a dequeued operation.
  * @param	out_user_data		User data pointer array to be retrieve
@@ -1782,6 +1789,7 @@ __rte_experimental
 uint32_t
 rte_cryptodev_raw_dequeue_burst(struct rte_crypto_raw_dp_ctx *ctx,
 	rte_cryptodev_raw_get_dequeue_count_t get_dequeue_count,
+	uint32_t max_nb_to_dequeue,
 	rte_cryptodev_raw_post_dequeue_t post_dequeue,
 	void **out_user_data, uint8_t is_user_data_array,
 	uint32_t *n_success, int *dequeue_status);
-- 
2.25.1


^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v10 0/8] Introduce event vectorization
  2021-03-30  8:22  4%               ` [dpdk-dev] [PATCH v9 " pbhagavatula
@ 2021-03-31  9:29  4%                 ` pbhagavatula
  2021-04-03  9:44  0%                   ` Jerin Jacob
  0 siblings, 1 reply; 200+ results
From: pbhagavatula @ 2021-03-31  9:29 UTC (permalink / raw)
  To: jerinj, jay.jayatheerthan, erik.g.carrillo, abhinandan.gujjar,
	timothy.mcdaniel, hemant.agrawal, harry.van.haaren,
	mattias.ronnblom, liang.j.ma
  Cc: dev, Pavan Nikhilesh

From: Pavan Nikhilesh <pbhagavatula@marvell.com>

In traditional event programming model, events are identified by a
flow-id and a uintptr_t. The flow-id uniquely identifies a given event
and determines the order of scheduling based on schedule type, the
uintptr_t holds a single object.

Event devices also support burst mode with configurable dequeue depth,
i.e. each dequeue call would return multiple events and each event
might be at a different stage of the pipeline.
Having a burst of events belonging to different stages in a dequeue
burst is not only difficult to vectorize but also increases the scheduler
overhead and application overhead of pipelining events further.
Using event vectors we see a performance gain of ~742.3% as shown in [1].

By introducing event vectorization, each event will be capable of holding
multiple uintptr_t of the same flow thereby allowing applications
to vectorize their pipeline and reduce the complexity of pipelining
events across multiple stages. This also reduces the complexity of handling
enqueue and dequeue on an event device.

Since event devices are transparent to the events they are scheduling
so the event producers such as eth_rx_adapter, crypto_adapter , etc..
are responsible for vectorizing the buffers of the same flow into a single
event.

The series also breaks ABI in the patch [8/8] which is targetted to the
v21.11 release.

The dpdk-test-eventdev application has been updated with options to test
multiple vector sizes and timeouts.

[1]
As for performance improvement, with a ARM Cortex-A72 equivalent processer,
software event device (--vdev=event_sw0), single worker core, single stage
and using one service core for Rx adapter, Tx adapter, Scheduling.

Without this patchset applied:
    ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
         --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
         --stlist=a --wlcores=20
    Port[0] using Rx adapter[0] configured
    Port[0] using Tx adapter[0] Configured
    5.071 mpps

With the patchset applied and Without event vectorization:
    ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
         --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
         --stlist=a --wlcores=20
    Port[0] using Rx adapter[0] configured
    Port[0] using Tx adapter[0] Configured
    5.123 mpps

With event vectorization:
    ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
        --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
        --stlist=a --wlcores=20 --enable_vector --nb_eth_queues 1
        --vector_size 256
    Port[0] using Rx adapter[0] configured
    Port[0] using Tx adapter[0] Configured
    42.715 mpps

Having dedicated service cores for each Rx queues and tweaking the vector,
dequeue burst size would further improve performance.

API usage is shown below:

Configuration:

	struct rte_event_eth_rx_adapter_event_vector_config vec_conf;

	vector_pool = rte_event_vector_pool_create("vector_pool",
			nb_elem, 0, vector_size, socket_id);

	rte_event_eth_rx_adapter_create(id, event_id, &adptr_conf);
	rte_event_eth_rx_adapter_queue_add(id, eth_id, -1, &queue_conf);
	if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR) {
		vec_conf.vector_sz = vector_size;
		vec_conf.vector_timeout_ns = vector_tmo_nsec;
		vec_conf.vector_mp = vector_pool;
		rte_event_eth_rx_adapter_queue_event_vector_config(id,
				eth_id, -1, &vec_conf);
	}

Fastpath:

	num = rte_event_dequeue_burst(event_id, port_id, &ev, 1, 0);
	if (!num)
		continue;

	if (ev.event_type & RTE_EVENT_TYPE_VECTOR) {
		switch (ev.event_type) {
		case RTE_EVENT_TYPE_ETHDEV_VECTOR:
		case RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR:
			struct rte_mbuf **mbufs;

			mbufs = ev.vector_ev->mbufs;
			for (i = 0; i < ev.vector_ev->nb_elem; i++)
				//Process mbufs.
			break;
		case ...
		}
	}
	...

v10 Changes:
- Update Rx adapter documentation with flow identifier bitfield format. (Jay)

v9 Changes:
- Update Rx adapter documentation w.r.t SW event vectorizations. (Jay)
- Push partial vectors to event device on queue delete. (Jay)

v8 Changes:
- Fix incorrect shift for vector timeout interval.(Jay)
- Code reallocation.(Jay)

v7 Changes:
- More doxygen fixes.(Jay)
- Reduce code duplication in 4/8.(Jay)

v6 Changes:
- Make rte_errno sign consistant.(Jay)
- Gramatical and doxygen fixes. (Jay)

v5 Changes:
- Make `rte_event_vector_pool_create non-inline` to ease ABI stability.(Ray)
- Move `rte_event_eth_rx_adapter_queue_event_vector_config` and
  `rte_event_eth_rx_adapter_vector_limits_get` implementation to the patch
  where they are initially defined.(Ray)
- Multiple gramatical and style fixes.(Jerin)
- Add missing release notes.(Jerin)

v4 Changes:
- Fix missing event vector structure in event structure.(Jay)

v3 Changes:
- Fix unintended formatting changes.

v2 Changes:
- Multiple gramatical and style fixes.(Jerin)
- Add parameter to define vector size in power of 2. (Jerin)
- Redo patch series w/o breaking ABI till the last patch.(David)
- Add deprication notice to announce ABI break in 21.11.(David)
- Add vector limits validation to app/test-eventdev.

Pavan Nikhilesh (8):
  eventdev: introduce event vector capability
  eventdev: introduce event vector Rx capability
  eventdev: introduce event vector Tx capability
  eventdev: add Rx adapter event vector support
  eventdev: add Tx adapter event vector support
  app/eventdev: add event vector mode in pipeline test
  doc: announce event Rx adapter config changes
  eventdev: simplify Rx adapter event vector config

 app/test-eventdev/evt_common.h                |   4 +
 app/test-eventdev/evt_options.c               |  52 +++
 app/test-eventdev/evt_options.h               |   4 +
 app/test-eventdev/test_pipeline_atq.c         | 310 +++++++++++++++--
 app/test-eventdev/test_pipeline_common.c      | 105 +++++-
 app/test-eventdev/test_pipeline_common.h      |  18 +
 app/test-eventdev/test_pipeline_queue.c       | 320 +++++++++++++++--
 .../prog_guide/event_ethernet_rx_adapter.rst  |  57 +++
 .../prog_guide/event_ethernet_tx_adapter.rst  |  12 +
 doc/guides/prog_guide/eventdev.rst            |  36 +-
 doc/guides/rel_notes/deprecation.rst          |   9 +
 doc/guides/rel_notes/release_21_05.rst        |   8 +
 doc/guides/tools/testeventdev.rst             |  45 ++-
 lib/librte_eventdev/eventdev_pmd.h            |  31 +-
 .../rte_event_eth_rx_adapter.c                | 327 +++++++++++++++++-
 .../rte_event_eth_rx_adapter.h                |  78 +++++
 .../rte_event_eth_tx_adapter.c                |  66 +++-
 lib/librte_eventdev/rte_eventdev.c            |  53 ++-
 lib/librte_eventdev/rte_eventdev.h            | 114 +++++-
 lib/librte_eventdev/version.map               |   4 +
 20 files changed, 1562 insertions(+), 91 deletions(-)

--
2.17.1


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] Minutes of Technical Board Meeting, 2021-03-10
  2021-03-31  0:44  3% [dpdk-dev] Minutes of Technical Board Meeting, 2021-03-10 Honnappa Nagarahalli
@ 2021-03-31  8:52  0% ` Tom Barbette
  2021-04-06 13:13  0%   ` Morten Brørup
  0 siblings, 1 reply; 200+ results
From: Tom Barbette @ 2021-03-31  8:52 UTC (permalink / raw)
  To: Honnappa Nagarahalli, dev; +Cc: nd, Alireza Farshin

Le 31-03-21 à 02:44, Honnappa Nagarahalli a écrit :
> 	- Ability to tune the values of #defines
>     * Few prominent points discussed
> 	- This will result in #ifdefs in the code (for ex: in testpmd)
> 	- One option is for all the PMDs to document their configurable #defines in PMD specific header files. Having these distributed is much easier to search.
> 	- Can some of the existing #defines be converted to runtime configurations? For ex: RTE_MAX_LCORE? This might impact ABI.
>     * Bruce to think about converting the doc to a blog or an email on the mailing list. But soliciting feedback is most important.

One alternative path worth looking at is to encourage the use of LTO, 
and modify APIs so the configuration can be provided at linking time, 
and propagated by the compiler.

E.g. one can define rte_max_lcore as a weak constant symbol, equal to 
128. At linking time the user may provide a rte_max_lcore that is more 
tailored, and still, dynamic arrays[rte_max_lcore] will be allocatable 
on the .bss section, avoiding an indirection. The compiler will be able 
to optimize loops etc which is impossible with pure runtime configuration.

In packetmill.io we actually pushed this to the next level where the 
driver can completely change its behavior without recompiling DPDK 
itself and spawning ifdefs everywhere.

However the price is the slowiness of LTO...

My 2 cents.

Tom



^ permalink raw reply	[relevance 0%]

* [dpdk-dev] Minutes of Technical Board Meeting, 2021-03-10
@ 2021-03-31  0:44  3% Honnappa Nagarahalli
  2021-03-31  8:52  0% ` Tom Barbette
  0 siblings, 1 reply; 200+ results
From: Honnappa Nagarahalli @ 2021-03-31  0:44 UTC (permalink / raw)
  To: dev; +Cc: nd, nd

Minutes of Technical Board Meeting, 2021-03-10

Members Attending:
   - Aaron Conole
   - Bruce Richardson
   - Ferruh Yigit
   - Hemant Agrawal
   - Honnappa Nagarahalli (Chair)
   - Jerin Jacob
   - Kevin Traynor
   - Konstantin Ananyev
   - Maxime Coquelin
   - Olivier Matz
   - Stephen Hemminger
   - Thomas Monjalon

NOTE: The Technical Board meetings take place every second Wednesday on https://meet.jit.si/DPDK at 3 pm UTC.
Meetings are public, and DPDK community members are welcome to attend.
Agenda and minutes can be found at http://core.dpdk.org/techboard/minutes

NOTE: Next meeting will be on Wednesday 2021-03-24 @3pm UTC, and will be chaired by Jerin.

#1 Build config improvement proposal
   * Discussion centered around the following issues
	- Ability to enable/disable compilation of libraries and PMDs. There was no objection from the techboard members on the requirement.
	- Ability to enable/disable #defines
	- Ability to tune the values of #defines
   * Few prominent points discussed
	- This will result in #ifdefs in the code (for ex: in testpmd)
	- One option is for all the PMDs to document their configurable #defines in PMD specific header files. Having these distributed is much easier to search.
	- Can some of the existing #defines be converted to runtime configurations? For ex: RTE_MAX_LCORE? This might impact ABI.
   * Bruce to think about converting the doc to a blog or an email on the mailing list. But soliciting feedback is most important.

#2 DMARC on mailing list
    * Ali Alnubani is working on the issue and will have a mailing list to test

#3 Documenting criteria on adding/removing members to technical board
    * Thomas has sent patches to the Techboard. Board members to review and provide feedback.

#4 Criteria for adding new members to security team?
    * Being known to members of the Techboard would be one criteria.
    * AI: Ferruh to put out a document or email to propose the criteria

#5 Testing leader's role definition
    * AI: Aaron Conole has it completed and will send it to the Techboard.

#6 Approval for blog on C11 adoption
    * Konstantin has provided the comments
    * Awaiting comments from PPC maintainers

#7 Update on DTS usability
    * Intel engineers working on DTS are involved in providing the feedback
    * If the test cases can be added to the unit tests, it should be allowed as well. i.e. DTS should not be made mandatory. This will provide flexibility for developers.

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v2] ethdev: introduce enable_driver_sdk to install driver headers
  2021-03-24 11:27  0%       ` Ferruh Yigit
  2021-03-24 11:30  0%         ` Thomas Monjalon
@ 2021-03-30 12:50  0%         ` Ferruh Yigit
  1 sibling, 0 replies; 200+ results
From: Ferruh Yigit @ 2021-03-30 12:50 UTC (permalink / raw)
  To: Tyler Retzlaff, thomas
  Cc: dev, andrew.rybchenko, bruce.richardson, Shepard Siegel, David Marchand

On 3/24/2021 11:27 AM, Ferruh Yigit wrote:
> On 3/24/2021 4:32 AM, Tyler Retzlaff wrote:
>> On Tue, Mar 23, 2021 at 05:04:08PM +0000, Ferruh Yigit wrote:
>>>> diff --git a/lib/librte_ethdev/meson.build b/lib/librte_ethdev/meson.build
>>>> index c37b2e377..4353fa6b7 100644
>>>> --- a/lib/librte_ethdev/meson.build
>>>> +++ b/lib/librte_ethdev/meson.build
>>>> @@ -20,8 +20,14 @@ headers = files('rte_ethdev.h',
>>>>       'rte_mtr_driver.h',
>>>>       'rte_tm.h',
>>>>       'rte_tm_driver.h')
>>>> +
>>>>   indirect_headers += files(
>>>>       'rte_ethdev_core.h',
>>>>       'rte_eth_ctrl.h')
>>>> +driver_sdk_headers += files(
>>>> +    'ethdev_driver.h',
>>>> +    'ethdev_pci.h',
>>>> +    'ethdev_vdev.h')
>>>> +
>>>>   deps += ['net', 'kvargs', 'meter', 'telemetry']
>>>
>>
>> i feel like i missed a reply here.  but just to clarify only ethdev will
>> be covered by this patch. inclusion of other driver headers was
>> discussed off list (sorry) and it emerged that it would result in
>> withdraw a number of driver api/abi that had not been marked as
>> __rte_internal.
>>
>> for driver api that were being exported as 'stable' a deprecation notice
>> will need to be issued in order to make them part of the
>> driver_sdk_headers. for that reason only ethdev is being made available
>> under this option for now.
>>
>> please ack/nack the patch as-is
>>
> 
> I am OK the patch for the ethdev part, hence
> Acked-by: Ferruh Yigit <ferruh.yigit@intel.com>
> 

Applied to dpdk-next-net/main, thanks.

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v9 0/8] Introduce event vectorization
  2021-03-26 14:08  4%             ` [dpdk-dev] [PATCH v8 " pbhagavatula
@ 2021-03-30  8:22  4%               ` pbhagavatula
  2021-03-31  9:29  4%                 ` [dpdk-dev] [PATCH v10 " pbhagavatula
  0 siblings, 1 reply; 200+ results
From: pbhagavatula @ 2021-03-30  8:22 UTC (permalink / raw)
  To: jerinj, jay.jayatheerthan, erik.g.carrillo, abhinandan.gujjar,
	timothy.mcdaniel, hemant.agrawal, harry.van.haaren,
	mattias.ronnblom, liang.j.ma
  Cc: dev, Pavan Nikhilesh

From: Pavan Nikhilesh <pbhagavatula@marvell.com>

In traditional event programming model, events are identified by a
flow-id and a uintptr_t. The flow-id uniquely identifies a given event
and determines the order of scheduling based on schedule type, the
uintptr_t holds a single object.

Event devices also support burst mode with configurable dequeue depth,
i.e. each dequeue call would return multiple events and each event
might be at a different stage of the pipeline.
Having a burst of events belonging to different stages in a dequeue
burst is not only difficult to vectorize but also increases the scheduler
overhead and application overhead of pipelining events further.
Using event vectors we see a performance gain of ~742.3% as shown in [1].

By introducing event vectorization, each event will be capable of holding
multiple uintptr_t of the same flow thereby allowing applications
to vectorize their pipeline and reduce the complexity of pipelining
events across multiple stages. This also reduces the complexity of handling
enqueue and dequeue on an event device.

Since event devices are transparent to the events they are scheduling
so the event producers such as eth_rx_adapter, crypto_adapter , etc..
are responsible for vectorizing the buffers of the same flow into a single
event.

The series also breaks ABI in the patch [8/8] which is targetted to the
v21.11 release.

The dpdk-test-eventdev application has been updated with options to test
multiple vector sizes and timeouts.

[1]
As for performance improvement, with a ARM Cortex-A72 equivalent processer,
software event device (--vdev=event_sw0), single worker core, single stage
and using one service core for Rx adapter, Tx adapter, Scheduling.

Without this patchset applied:
    ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
         --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
         --stlist=a --wlcores=20
    Port[0] using Rx adapter[0] configured
    Port[0] using Tx adapter[0] Configured
    5.071 mpps

With the patchset applied and Without event vectorization:
    ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
         --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
         --stlist=a --wlcores=20
    Port[0] using Rx adapter[0] configured
    Port[0] using Tx adapter[0] Configured
    5.123 mpps

With event vectorization:
    ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
        --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
        --stlist=a --wlcores=20 --enable_vector --nb_eth_queues 1
        --vector_size 256
    Port[0] using Rx adapter[0] configured
    Port[0] using Tx adapter[0] Configured
    42.715 mpps

Having dedicated service cores for each Rx queues and tweaking the vector,
dequeue burst size would further improve performance.

API usage is shown below:

Configuration:

	struct rte_event_eth_rx_adapter_event_vector_config vec_conf;

	vector_pool = rte_event_vector_pool_create("vector_pool",
			nb_elem, 0, vector_size, socket_id);

	rte_event_eth_rx_adapter_create(id, event_id, &adptr_conf);
	rte_event_eth_rx_adapter_queue_add(id, eth_id, -1, &queue_conf);
	if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR) {
		vec_conf.vector_sz = vector_size;
		vec_conf.vector_timeout_ns = vector_tmo_nsec;
		vec_conf.vector_mp = vector_pool;
		rte_event_eth_rx_adapter_queue_event_vector_config(id,
				eth_id, -1, &vec_conf);
	}

Fastpath:

	num = rte_event_dequeue_burst(event_id, port_id, &ev, 1, 0);
	if (!num)
		continue;

	if (ev.event_type & RTE_EVENT_TYPE_VECTOR) {
		switch (ev.event_type) {
		case RTE_EVENT_TYPE_ETHDEV_VECTOR:
		case RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR:
			struct rte_mbuf **mbufs;

			mbufs = ev.vector_ev->mbufs;
			for (i = 0; i < ev.vector_ev->nb_elem; i++)
				//Process mbufs.
			break;
		case ...
		}
	}
	...

v9 Changes:
- Update Rx adapter documentation w.r.t SW event vectorizations. (Jay)
- Push partial vectors to event device on queue delete. (Jay)

v8 Changes:
- Fix incorrect shift for vector timeout interval.(Jay)
- Code reallocation.(Jay)

v7 Changes:
- More doxygen fixes.(Jay)
- Reduce code duplication in 4/8.(Jay)

v6 Changes:
- Make rte_errno sign consistant.(Jay)
- Gramatical and doxygen fixes. (Jay)

v5 Changes:
- Make `rte_event_vector_pool_create non-inline` to ease ABI stability.(Ray)
- Move `rte_event_eth_rx_adapter_queue_event_vector_config` and
  `rte_event_eth_rx_adapter_vector_limits_get` implementation to the patch
  where they are initially defined.(Ray)
- Multiple gramatical and style fixes.(Jerin)
- Add missing release notes.(Jerin)

v4 Changes:
- Fix missing event vector structure in event structure.(Jay)

v3 Changes:
- Fix unintended formatting changes.

v2 Changes:
- Multiple gramatical and style fixes.(Jerin)
- Add parameter to define vector size in power of 2. (Jerin)
- Redo patch series w/o breaking ABI till the last patch.(David)
- Add deprication notice to announce ABI break in 21.11.(David)
- Add vector limits validation to app/test-eventdev.

Pavan Nikhilesh (8):
  eventdev: introduce event vector capability
  eventdev: introduce event vector Rx capability
  eventdev: introduce event vector Tx capability
  eventdev: add Rx adapter event vector support
  eventdev: add Tx adapter event vector support
  app/eventdev: add event vector mode in pipeline test
  doc: announce event Rx adapter config changes
  eventdev: simplify Rx adapter event vector config

 app/test-eventdev/evt_common.h                |   4 +
 app/test-eventdev/evt_options.c               |  52 +++
 app/test-eventdev/evt_options.h               |   4 +
 app/test-eventdev/test_pipeline_atq.c         | 310 +++++++++++++++--
 app/test-eventdev/test_pipeline_common.c      | 105 +++++-
 app/test-eventdev/test_pipeline_common.h      |  18 +
 app/test-eventdev/test_pipeline_queue.c       | 320 +++++++++++++++--
 .../prog_guide/event_ethernet_rx_adapter.rst  |  49 +++
 .../prog_guide/event_ethernet_tx_adapter.rst  |  12 +
 doc/guides/prog_guide/eventdev.rst            |  36 +-
 doc/guides/rel_notes/deprecation.rst          |   9 +
 doc/guides/rel_notes/release_21_05.rst        |   8 +
 doc/guides/tools/testeventdev.rst             |  45 ++-
 lib/librte_eventdev/eventdev_pmd.h            |  31 +-
 .../rte_event_eth_rx_adapter.c                | 327 +++++++++++++++++-
 .../rte_event_eth_rx_adapter.h                |  78 +++++
 .../rte_event_eth_tx_adapter.c                |  66 +++-
 lib/librte_eventdev/rte_eventdev.c            |  53 ++-
 lib/librte_eventdev/rte_eventdev.h            | 114 +++++-
 lib/librte_eventdev/version.map               |   4 +
 20 files changed, 1554 insertions(+), 91 deletions(-)

--
2.17.1


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] cryptodev: change raw data path dequeue API
@ 2021-03-30  8:07  4% Akhil Goyal
  0 siblings, 0 replies; 200+ results
From: Akhil Goyal @ 2021-03-30  8:07 UTC (permalink / raw)
  To: Fan Zhang, dev, thomas; +Cc: hemant.agrawal, g.singh

> diff --git a/doc/guides/rel_notes/release_21_05.rst
> b/doc/guides/rel_notes/release_21_05.rst
> index 21dc6d234..b9ca0cc30 100644
> --- a/doc/guides/rel_notes/release_21_05.rst
> +++ b/doc/guides/rel_notes/release_21_05.rst
> @@ -130,6 +130,8 @@ ABI Changes
> 
>  * No ABI change that would break compatibility with 20.11.
> 
> +* cryptodev: the function ``rte_cryptodev_raw_dequeue_burst`` is added a
> +  parameter ``max_nb_to_dequeue`` to give user a more flexible dequeue
> control.
> 
ABI changes are not allowed until 20.11, however, this change is an API change
(not ABI) for an experimental API which can be allowed.
Could you please move this to relevant section.

@Hemant: any comments on this patch?

Regards,
Akhil

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v5] build: alias default build as generic
  2021-03-29 10:49  3%   ` [dpdk-dev] [PATCH v4] " Juraj Linkeš
@ 2021-03-30  6:40  3%     ` Juraj Linkeš
  0 siblings, 0 replies; 200+ results
From: Juraj Linkeš @ 2021-03-30  6:40 UTC (permalink / raw)
  To: bruce.richardson, thomas, david.marchand, Ruifeng.Wang,
	Honnappa.Nagarahalli, jerinjacobk, ferruh.yigit
  Cc: dev, Juraj Linkeš

The current machine='default' build name is not descriptive. The actual
default build is machine='native'. Add an alternative string which does
the same build and better describes what we're building:
machine='generic'. Leave machine='default' for backwards compatibility.

Signed-off-by: Juraj Linkeš <juraj.linkes@pantheon.tech>
Reviewed-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---
 .ci/linux-build.sh                        |  2 +-
 config/arm/meson.build                    |  7 ++++---
 config/meson.build                        | 13 +++++++------
 devtools/test-meson-builds.sh             | 14 +++++++-------
 doc/guides/prog_guide/build-sdk-meson.rst |  4 ++--
 meson_options.txt                         |  2 +-
 6 files changed, 22 insertions(+), 20 deletions(-)

diff --git a/.ci/linux-build.sh b/.ci/linux-build.sh
index 91e43a975b..3cbeb193a1 100755
--- a/.ci/linux-build.sh
+++ b/.ci/linux-build.sh
@@ -77,7 +77,7 @@ else
     OPTS="$OPTS -Dexamples=all"
 fi
 
-OPTS="$OPTS -Dmachine=default"
+OPTS="$OPTS -Dmachine=generic"
 OPTS="$OPTS --default-library=$DEF_LIB"
 OPTS="$OPTS --buildtype=debugoptimized"
 OPTS="$OPTS -Dcheck_includes=true"
diff --git a/config/arm/meson.build b/config/arm/meson.build
index 00bc4610a3..aaed89bd5b 100644
--- a/config/arm/meson.build
+++ b/config/arm/meson.build
@@ -1,6 +1,7 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation.
 # Copyright(c) 2017 Cavium, Inc
+# Copyright(c) 2021 PANTHEON.tech s.r.o.
 
 # common flags to all aarch64 builds, with lowest priority
 flags_common = [
@@ -208,8 +209,8 @@ if dpdk_conf.get('RTE_ARCH_32')
 else
 	# aarch64 build
 	if not meson.is_cross_build()
-		if machine == 'default'
-			# default build
+		if machine == 'generic'
+			# generic build
 			implementer_id = 'generic'
 			part_number = 'generic'
 		else
@@ -256,7 +257,7 @@ else
 		      '(-Dmachine=generic) build.')
 	endif
 
-	# use default flags with implementer flags
+	# use common flags with implementer flags
 	dpdk_flags = flags_common + implementer_config['flags'] + part_number_config.get('flags', [])
 
 	# apply supported machine args
diff --git a/config/meson.build b/config/meson.build
index 66a2edcc47..3268cf6804 100644
--- a/config/meson.build
+++ b/config/meson.build
@@ -70,21 +70,22 @@ else
 	machine = get_option('machine')
 endif
 
-# machine type 'default' is special, it defaults to the per arch agreed common
-# minimal baseline needed for DPDK.
+# machine type 'generic' is special, it selects the per arch agreed common
+# minimal baseline needed for DPDK. Machine type 'default' is also supported
+# with the same meaning for backwards compatibility.
 # That might not be the most optimized, but the most portable version while
 # still being able to support the CPU features required for DPDK.
 # This can be bumped up by the DPDK project, but it can never be an
 # invariant like 'native'
-if machine == 'default'
+if machine == 'default' or machine == 'generic'
 	if host_machine.cpu_family().startswith('x86')
-		# matches the old pre-meson build systems default
+		# matches the old pre-meson build systems generic machine
 		machine = 'corei7'
 	elif host_machine.cpu_family().startswith('arm')
 		machine = 'armv7-a'
 	elif host_machine.cpu_family().startswith('aarch')
-		# arm64 manages defaults in config/arm/meson.build
-		machine = 'default'
+		# arm64 manages generic config in config/arm/meson.build
+		machine = 'generic'
 	elif host_machine.cpu_family().startswith('ppc')
 		machine = 'power8'
 	endif
diff --git a/devtools/test-meson-builds.sh b/devtools/test-meson-builds.sh
index c11ae87e0d..daf817ac3e 100755
--- a/devtools/test-meson-builds.sh
+++ b/devtools/test-meson-builds.sh
@@ -223,12 +223,12 @@ done
 # test compilation with minimal x86 instruction set
 # Set the install path for libraries to "lib" explicitly to prevent problems
 # with pkg-config prefixes if installed in "lib/x86_64-linux-gnu" later.
-default_machine='nehalem'
-if ! check_cc_flags "-march=$default_machine" ; then
-	default_machine='corei7'
+generic_machine='nehalem'
+if ! check_cc_flags "-march=$generic_machine" ; then
+	generic_machine='corei7'
 fi
-build build-x86-default cc skipABI -Dcheck_includes=true \
-	-Dlibdir=lib -Dmachine=$default_machine $use_shared
+build build-x86-generic cc skipABI -Dcheck_includes=true \
+	-Dlibdir=lib -Dmachine=$generic_machine $use_shared
 
 # 32-bit with default compiler
 if check_cc_flags '-m32' ; then
@@ -271,10 +271,10 @@ for f in $srcdir/config/ppc/ppc* ; do
 	build $targetdir $f ABI $use_shared
 done
 
-# Test installation of the x86-default target, to be used for checking
+# Test installation of the x86-generic target, to be used for checking
 # the sample apps build using the pkg-config file for cflags and libs
 load_env cc
-build_path=$(readlink -f $builds_dir/build-x86-default)
+build_path=$(readlink -f $builds_dir/build-x86-generic)
 export DESTDIR=$build_path/install
 install_target $build_path $DESTDIR
 pc_file=$(find $DESTDIR -name libdpdk.pc)
diff --git a/doc/guides/prog_guide/build-sdk-meson.rst b/doc/guides/prog_guide/build-sdk-meson.rst
index 3429e26479..c7e12eedfb 100644
--- a/doc/guides/prog_guide/build-sdk-meson.rst
+++ b/doc/guides/prog_guide/build-sdk-meson.rst
@@ -85,7 +85,7 @@ Project-specific options are passed used -Doption=value::
 
 	meson -Denable_docs=true fullbuild  # build and install docs
 
-	meson -Dmachine=default  # use builder-independent baseline -march
+	meson -Dmachine=generic  # use builder-independent baseline -march
 
 	meson -Ddisable_drivers=event/*,net/tap  # disable tap driver and all
 					# eventdev PMDs for a smaller build
@@ -114,7 +114,7 @@ Examples of setting some of the same options using meson configure::
         re-scan from meson.
 
 .. note::
-        machine=default uses a config that works on all supported architectures
+        machine=generic uses a config that works on all supported architectures
         regardless of the capabilities of the machine where the build is happening.
 
 As well as those settings taken from ``meson configure``, other options
diff --git a/meson_options.txt b/meson_options.txt
index 3b8c5d316d..686827bb1b 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -21,7 +21,7 @@ option('include_subdir_arch', type: 'string', value: '',
 option('kernel_dir', type: 'string', value: '',
 	description: 'Path to the kernel for building kernel modules. Headers must be in $kernel_dir or $kernel_dir/build. Modules will be installed in /lib/modules.')
 option('machine', type: 'string', value: 'native',
-	description: 'set the target machine type')
+	description: 'set the target machine type or "generic", a build usable on all machines of the build machine architecture or "native", which lets the compiler pick the architecture of the build machine.')
 option('max_ethports', type: 'integer', value: 32,
 	description: 'maximum number of Ethernet devices')
 option('max_lcores', type: 'integer', value: 128,
-- 
2.20.1


^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [RFC 3/5] eal: lcore state FINISHED is not required
  2021-03-19 13:42  3%         ` Ananyev, Konstantin
@ 2021-03-30  2:54  0%           ` Honnappa Nagarahalli
  0 siblings, 0 replies; 200+ results
From: Honnappa Nagarahalli @ 2021-03-30  2:54 UTC (permalink / raw)
  To: Ananyev, Konstantin, thomas, Feifei Wang, david.marchand
  Cc: hemant.agrawal, Nipun.gupta@nxp.com, jerinj, Van Haaren, Harry,
	Richardson, Bruce, dmitry.kozliuk, navasile, dmitrym, Kadam,
	Pallavi, dev, Ruifeng Wang, nd, Honnappa Nagarahalli, nd

<snip>

> 
> Hi everyone,
Thanks Konstantin for the review.

> 
> > <snip>
> >
> > > >
> > > > > > Subject: [RFC 3/5] eal: lcore state FINISHED is not required
> > > > > >
> > > > > > FINISHED state seems to be used to indicate that the worker's
> > > > > > update of the 'state' is not visible to other threads. There
> > > > > > seems to be no requirement to have such a state.
> > > > >
> > > > > I am not sure "FINISHED" is necessary to be removed, and I
> > > > > propose some of my profiles for discussion.
> > > > >  There are three states for lcore now:
> > > > > "WAIT": indicate lcore can start working
> > > > > "RUNNING": indicate lcore is working
> > > > > "FINISHED": indicate lcore has finished its working and wait to
> > > > > be reset
> > > > If you look at the definitions of "WAIT" and "FINISHED" states,
> > > > they look
> > > similar, except for "wait to be reset" in "FINISHED" state . The
> > > code really does not do anything to reset the lcore. It just changes the
> state to "WAIT".
> 
> 
> I agree that 3 states here seems excessive.
> Just 2 (RUNNING/IDLE) seems enough.
> Though we can't just remove FINISHED here - it will be an Abi breakage.
> Might be deprecate FINISHED now and remove in 21.11.
Agree, will add a new patch to deprecate the FINISHED state. Also, does the deprecation notice need to go into 20.08 release notes?

> 
> Also need to decide what rte_eal_wait_lcore() should return in that case?
> Always zero, or always status of last function called?
I am not sure why ' rte_eal_wait_lcore' has the following code:

if (lcore_config[worker_id].state == WAIT)
                return 0;

This indicates that the caller has called 'rte_eal_wait_lcore' function earlier. May be there is a use case where there are multiple threads waiting for the lcores to complete?
Anyway, IMO, returning the status of the last function always is better for this API.

> 
> > > >
> > > > >
> > > > > From the description above, we can find "FINISHED" is different
> > > > > from "WAIT", it can shows that lcore has done the work and finished
> it.
> > > > > Thus, if we remove "FINISHED", maybe we will not know whether
> > > > > the lcore finishes its work or just doesn't start, because this
> > > > > two state has the
> > > same tag "WAIT".
> > > > Looking at "eal_thread_loop", the worker thread sets the state to
> "RUNNING"
> > > before sending the ack back to main core. After that it is
> > > guaranteed that the worker will run the assigned function. Only case
> > > where it will not run the assigned function is when the 'write'
> > > syscall fails, in which case it results in a panic.
> > >
> > > Quick note: it should not panic.
> > > We must find a way to return an error without crashing the whole
> > > application.
> > The syscalls are being used to communicate the status back to the main
> thread. If they fail, it is not possible to communicate the status.
> > May be it is better to panic.
> > We could change the implementation using shared variables, but it
> > would require polling the memory. May be the syscalls are being used to
> avoid polling. However, this polling would happen during init time (or similar)
> for a short duration.
> 
> AFAIK we use read and write not for status communication, but sort of
> sleep/ack point.
> Though I agree if we can't do read/write from the system pipe then
> something is totally wrong, and probably there is no much point to continue.
> 
> > >
> > >
> > > > > Furthermore, consider such a scenario:
> > > > > Core 1 need to monitor Core 2 state, if Core 2 finishes one
> > > > > task, Core 1 can start its working.
> > > > > However, if there is only  one tag "WAIT", Core 1 maybe  start
> > > > > its work at the wrong time, when Core 2 still does not start its
> > > > > task at state
> > > "WAIT".
> > > > > This is just my guess, and at present, there is no similar
> > > > > application scenario in dpdk.
> > > > To be able to do this effectively, core 1 needs to observe the
> > > > state change
> > > from WAIT->RUNNING->FINISHED. This requires that core 1 should be
> > > calling rte_eal_remote_launch and rte_eal_wait_lcore functions. It
> > > is not possible to observe this state transition from a 3rd core
> > > (for ex: a worker might go from
> > > RUNNING->FINISHED->WAIT->RUNNING which a 3rd core might not be
> able
> > > RUNNING->FINISHED->WAIT->to
> > > observe).
> > > >
> > > > >
> > > > > On the other hand, if we decide to remove "FINISHED", please
> > > > > consider the following files:
> > > > > 1. lib/librte_eal/linux/eal_thread.c: line 31
> > > > >     lib/librte_eal/windows/eal_thread.c: line 22
> > > > >     lib/librte_eal/freebsd/eal_thread.c: line 31
> > > > I have looked at these lines, they do not capture "why" FINISHED
> > > > state is
> > > required.
> > > >
> > > >  2.
> > > > > lib/librte_eal/include/rte_launch.h: line 24, 44, 121, 123, 131 3.
> > > > > examples/l2fwd-
> > > > > keepalive/main.c: line 510
> > > > > rte_eal_wait_lcore(id_core) can be removed. Because the core
> > > > > state has been checked as "WAIT", this is a redundant operation
> > >
> > >


^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v5 00/10] eal: Add new API for threading
  @ 2021-03-29 22:40  2% ` Narcisa Ana Maria Vasile
  0 siblings, 0 replies; 200+ results
From: Narcisa Ana Maria Vasile @ 2021-03-29 22:40 UTC (permalink / raw)
  To: dev, thomas, dmitry.kozliuk, khot, navasile, dmitrym, roretzla,
	talshn, ocardona
  Cc: bruce.richardson, david.marchand, pallavi.kadam

From: Narcisa Vasile <navasile@microsoft.com>

EAL thread API

**Problem Statement**
DPDK currently uses the pthread interface to create and manage threads.
Windows does not support the POSIX thread programming model, so it currently
relies on a header file that hides the Windows calls under
pthread matched interfaces. Given that EAL should isolate the environment
specifics from the applications and libraries and mediate
all the communication with the operating systems, a new EAL interface
is needed for thread management.

**Goals**
* Introduce a generic EAL API for threading support that will remove
  the current Windows pthread.h shim.
* Replace references to pthread_* across the DPDK codebase with the new
  RTE_THREAD_* API.
* Allow users to choose between using the RTE_THREAD_* API or a
  3rd party thread library through a configuration option.

**Design plan**
New API main files:
* rte_thread.h (librte_eal/include)
* rte_thread_types.h (librte_eal/include)
* rte_thread_windows_types.h (librte_eal/windows/include)
* rte_thread.c (librte_eal/windows)
* rte_thread.c (librte_eal/common)

For flexibility, the user is offered the option of either using the RTE_THREAD_* API or
a 3rd party thread library, through a meson flag “use_external_thread_lib”.
By default, this flag is set to FALSE, which means Windows libraries and applications
will use the RTE_THREAD_* API for managing threads.

If compiling on Windows and the “use_external_thread_lib” is *not* set,
the following files will be parsed: 
* include/rte_thread.h
* windows/include/rte_thread_windows_types.h
* windows/rte_thread.c
In all other cases, the compilation/parsing includes the following files:
* include/rte_thread.h 
* include/rte_thread_types.h
* common/rte_thread.c

**A schematic example of the design**
--------------------------------------------------
lib/librte_eal/include/rte_thread.h
int rte_thread_create();

lib/librte_eal/common/rte_thread.c
int rte_thread_create() 
{
	return pthread_create();
}

lib/librte_eal/windows/rte_thread.c
int rte_thread_create() 
{
	return CreateThread();
}

lib/librte_eal/windows/meson.build
if get_option('use_external_thread_lib')
	sources += 'librte_eal/common/rte_thread.c'
else
	sources += 'librte_eal/windows/rte_thread.c'
endif
-----------------------------------------------------

**Thread attributes**

When or after a thread is created, specific characteristics of the thread
can be adjusted. Given that the thread characteristics that are of interest
for DPDK applications are affinity and priority, the following structure
that represents thread attributes has been defined:

typedef struct
{
	enum rte_thread_priority priority;
	rte_cpuset_t cpuset;
} rte_thread_attr_t;

The *rte_thread_create()* function can optionally receive an rte_thread_attr_t
object that will cause the thread to be created with the affinity and priority
described by the attributes object. If no rte_thread_attr_t is passed
(parameter is NULL), the default affinity and priority are used.
An rte_thread_attr_t object can also be set to the default values
by calling *rte_thread_attr_init()*.

*Priority* is represented through an enum that currently advertises
two values for priority:
	- RTE_THREAD_PRIORITY_NORMAL
	- RTE_THREAD_PRIORITY_REALTIME_CRITICAL
The enum can be extended to allow for multiple priority levels.
rte_thread_set_priority      - sets the priority of a thread
rte_thread_attr_set_priority - updates an rte_thread_attr_t object
                               with a new value for priority

The user can choose thread priority through an EAL parameter,
when starting an application. If EAL parameter is not used,
the per-platform default value for thread priority is used.
Otherwise administrator has an option to set one of available options:
 --thread-prio normal
 --thread-prio realtime

Example:
./dpdk-l2fwd -l 0-3 -n 4 –thread-prio normal -- -q 8 -p ffff

*Affinity* is described by the already known “rte_cpuset_t” type.
rte_thread_attr_set/get_affinity - sets/gets the affinity field in a
                                   rte_thread_attr_t object
rte_thread_set/get_affinity      – sets/gets the affinity of a thread

**Errors**
A translation function that maps Windows error codes to errno-style
error codes is provided. 

**Future work**
Note that this patchset was focused on introducing new API that will
remove the Windows pthread.h shim. In DPDK, there are still a few references
to pthread_* that were not implemented in the shim.
The long term plan is for EAL to provide full threading support:
* Adding support for conditional variables
* Additional functionality offered by pthread_* (such as pthread_setname_np, etc.)
* Static mutex initializers are not used on Windows. If we must continue
  using them, they need to be platform dependent and an implementation will
  need to be provided for Windows.

v5:
- update cover letter with more details on the priority argument

v4:
- fix function description
- rebase

v3:
- rebase

v2:
- revert changes that break ABI 
- break up changes into smaller patches
- fix coding style issues
- fix issues with errors
- fix parameter type in examples/kni.c

Narcisa Vasile (10):
  eal: add thread id and simple thread functions
  eal: add thread attributes
  windows/eal: translate Windows errors to errno-style errors
  eal: implement functions for thread affinity management
  eal: implement thread priority management functions
  eal: add thread lifetime management
  eal: implement functions for mutex management
  eal: implement functions for thread barrier management
  eal: add EAL argument for setting thread priority
  Enable the new EAL thread API

 app/test/process.h                            |   6 +-
 app/test/test_lcores.c                        |  16 +-
 app/test/test_link_bonding.c                  |  10 +-
 app/test/test_lpm_perf.c                      |  12 +-
 config/meson.build                            |   4 +
 drivers/bus/dpaa/base/qbman/bman_driver.c     |   6 +-
 drivers/bus/dpaa/base/qbman/dpaa_sys.c        |  14 +-
 drivers/bus/dpaa/base/qbman/process.c         |   6 +-
 drivers/bus/fslmc/portal/dpaa2_hw_dpio.c      |   6 +-
 drivers/compress/mlx5/mlx5_compress.c         |  10 +-
 drivers/event/dlb/pf/base/dlb_osdep.h         |   2 +-
 drivers/event/dlb2/pf/base/dlb2_osdep.h       |   2 +-
 drivers/net/af_xdp/rte_eth_af_xdp.c           |  18 +-
 drivers/net/ark/ark_ethdev.c                  |   4 +-
 drivers/net/atlantic/atl_ethdev.c             |   4 +-
 drivers/net/atlantic/atl_types.h              |   5 +-
 .../net/atlantic/hw_atl/hw_atl_utils_fw2x.c   |  24 +-
 drivers/net/axgbe/axgbe_dev.c                 |   8 +-
 drivers/net/axgbe/axgbe_ethdev.c              |   8 +-
 drivers/net/axgbe/axgbe_ethdev.h              |   8 +-
 drivers/net/axgbe/axgbe_i2c.c                 |   4 +-
 drivers/net/axgbe/axgbe_mdio.c                |   8 +-
 drivers/net/axgbe/axgbe_phy_impl.c            |   6 +-
 drivers/net/bnxt/bnxt.h                       |  16 +-
 drivers/net/bnxt/bnxt_cpr.c                   |   4 +-
 drivers/net/bnxt/bnxt_ethdev.c                |  52 +-
 drivers/net/bnxt/bnxt_irq.c                   |   8 +-
 drivers/net/bnxt/bnxt_reps.c                  |  10 +-
 drivers/net/bnxt/tf_ulp/bnxt_ulp.c            |  34 +-
 drivers/net/bnxt/tf_ulp/bnxt_ulp.h            |   4 +-
 drivers/net/bnxt/tf_ulp/ulp_fc_mgr.c          |  24 +-
 drivers/net/bnxt/tf_ulp/ulp_fc_mgr.h          |   2 +-
 drivers/net/ena/base/ena_plat_dpdk.h          |   8 +-
 drivers/net/enic/enic.h                       |   2 +-
 drivers/net/hns3/hns3_ethdev.h                |   2 +-
 drivers/net/hns3/hns3_ethdev_vf.c             |   2 +-
 drivers/net/hns3/hns3_mbx.c                   |   2 +-
 drivers/net/ice/ice_dcf_parent.c              |   4 +-
 drivers/net/ipn3ke/ipn3ke_representor.c       |   6 +-
 drivers/net/ixgbe/ixgbe_ethdev.c              |   2 +-
 drivers/net/ixgbe/ixgbe_ethdev.h              |   2 +-
 drivers/net/kni/rte_eth_kni.c                 |   6 +-
 drivers/net/mlx5/linux/mlx5_os.c              |   2 +-
 drivers/net/mlx5/mlx5.c                       |  20 +-
 drivers/net/mlx5/mlx5.h                       |   2 +-
 drivers/net/mlx5/mlx5_txpp.c                  |   8 +-
 drivers/net/mlx5/windows/mlx5_flow_os.c       |  10 +-
 drivers/net/mlx5/windows/mlx5_os.c            |   2 +-
 drivers/net/qede/base/bcm_osal.h              |   8 +-
 drivers/net/vhost/rte_eth_vhost.c             |  22 +-
 .../net/virtio/virtio_user/virtio_user_dev.c  |  30 +-
 .../net/virtio/virtio_user/virtio_user_dev.h  |   2 +-
 drivers/raw/ifpga/ifpga_rawdev.c              |   8 +-
 drivers/vdpa/ifc/ifcvf_vdpa.c                 |  36 +-
 drivers/vdpa/mlx5/mlx5_vdpa.c                 |  24 +-
 drivers/vdpa/mlx5/mlx5_vdpa.h                 |   6 +-
 drivers/vdpa/mlx5/mlx5_vdpa_event.c           |  67 +--
 examples/kni/main.c                           |   6 +-
 examples/vhost/main.c                         |   2 +-
 examples/vhost_blk/vhost_blk.c                |  10 +-
 lib/librte_eal/common/eal_common_options.c    |  36 +-
 lib/librte_eal/common/eal_common_proc.c       |  48 +-
 lib/librte_eal/common/eal_common_thread.c     |  43 +-
 lib/librte_eal/common/eal_common_trace.c      |   2 +-
 lib/librte_eal/common/eal_internal_cfg.h      |   2 +
 lib/librte_eal/common/eal_options.h           |   2 +
 lib/librte_eal/common/eal_private.h           |   2 +-
 lib/librte_eal/common/malloc_mp.c             |  32 +-
 lib/librte_eal/common/meson.build             |   1 +
 lib/librte_eal/common/rte_thread.c            | 342 ++++++++++++
 lib/librte_eal/freebsd/eal.c                  |  37 +-
 lib/librte_eal/freebsd/eal_alarm.c            |  12 +-
 lib/librte_eal/freebsd/eal_interrupts.c       |   4 +-
 lib/librte_eal/freebsd/eal_thread.c           |   8 +-
 lib/librte_eal/include/meson.build            |   1 +
 lib/librte_eal/include/rte_lcore.h            |   8 +-
 lib/librte_eal/include/rte_per_lcore.h        |   2 -
 lib/librte_eal/include/rte_thread.h           | 337 ++++++++++-
 lib/librte_eal/include/rte_thread_types.h     |  20 +
 lib/librte_eal/linux/eal.c                    |  42 +-
 lib/librte_eal/linux/eal_alarm.c              |  10 +-
 lib/librte_eal/linux/eal_interrupts.c         |   4 +-
 lib/librte_eal/linux/eal_thread.c             |   8 +-
 lib/librte_eal/linux/eal_timer.c              |   2 +-
 lib/librte_eal/rte_eal_exports.def            |  20 +
 lib/librte_eal/unix/meson.build               |   1 -
 lib/librte_eal/unix/rte_thread.c              |  92 ---
 lib/librte_eal/version.map                    |  21 +
 lib/librte_eal/windows/eal.c                  |  26 +-
 lib/librte_eal/windows/eal_interrupts.c       |   6 +-
 lib/librte_eal/windows/eal_lcore.c            | 170 ++++--
 lib/librte_eal/windows/eal_thread.c           |  24 +-
 lib/librte_eal/windows/eal_windows.h          |  20 +-
 lib/librte_eal/windows/include/meson.build    |   1 +
 lib/librte_eal/windows/include/pthread.h      | 186 -------
 .../include/rte_windows_thread_types.h        |  19 +
 lib/librte_eal/windows/include/sched.h        |   2 +-
 lib/librte_eal/windows/meson.build            |   7 +-
 lib/librte_eal/windows/rte_thread.c           | 522 +++++++++++++++++-
 lib/librte_ethdev/rte_ethdev.c                |   4 +-
 lib/librte_ethdev/rte_ethdev_core.h           |   3 +-
 lib/librte_ethdev/rte_flow.c                  |   4 +-
 .../rte_event_eth_rx_adapter.c                |   6 +-
 lib/librte_vhost/fd_man.c                     |  40 +-
 lib/librte_vhost/fd_man.h                     |   6 +-
 lib/librte_vhost/socket.c                     | 124 +++--
 lib/librte_vhost/vhost.c                      |  10 +-
 meson_options.txt                             |   2 +
 108 files changed, 2038 insertions(+), 929 deletions(-)
 create mode 100644 lib/librte_eal/common/rte_thread.c
 create mode 100644 lib/librte_eal/include/rte_thread_types.h
 delete mode 100644 lib/librte_eal/unix/rte_thread.c
 delete mode 100644 lib/librte_eal/windows/include/pthread.h
 create mode 100644 lib/librte_eal/windows/include/rte_windows_thread_types.h

-- 
2.30.0.vfs.0.2


^ permalink raw reply	[relevance 2%]

* Re: [dpdk-dev] [PATCH] ethdev: update qfi definition
  2021-03-29  9:06  3%     ` Raslan Darawsheh
@ 2021-03-29 11:14  0%       ` Ferruh Yigit
  0 siblings, 0 replies; 200+ results
From: Ferruh Yigit @ 2021-03-29 11:14 UTC (permalink / raw)
  To: Raslan Darawsheh, Ori Kam, dev, Andrew Rybchenko, Ivan Malov
  Cc: Slava Ovsiienko, Shiri Kuzin, ying.a.wang, stable,
	NBU-Contact-Thomas Monjalon, Olivier Matz

On 3/29/2021 10:06 AM, Raslan Darawsheh wrote:
> Hi,
> 
>> -----Original Message-----
>> From: Ori Kam <orika@nvidia.com>
>> Sent: Monday, March 29, 2021 11:53 AM
>> To: Ferruh Yigit <ferruh.yigit@intel.com>; Raslan Darawsheh
>> <rasland@nvidia.com>; dev@dpdk.org; Andrew Rybchenko
>> <andrew.rybchenko@oktetlabs.ru>; Ivan Malov <ivan.malov@oktetlabs.ru>
>> Cc: Slava Ovsiienko <viacheslavo@nvidia.com>; Shiri Kuzin
>> <shirik@nvidia.com>; ying.a.wang@intel.com; stable@dpdk.org; NBU-
>> Contact-Thomas Monjalon <thomas@monjalon.net>; Olivier Matz
>> <olivier.matz@6wind.com>
>> Subject: RE: [dpdk-dev] [PATCH] ethdev: update qfi definition
>>
>> Hi
>>
>>> -----Original Message-----
>>> From: dev <dev-bounces@dpdk.org> On Behalf Of Ferruh Yigit
>>> Subject: Re: [dpdk-dev] [PATCH] ethdev: update qfi definition
>>>
>>> On 3/23/2021 12:11 PM, Raslan Darawsheh wrote:
>>>> qfi field is 8 bits which represent single bit for
>>>> PPP (paging Policy Presence) single bit for RQI
>>>> (Reflective QoS Indicator) and 6 bits for qfi
>>>> (QoS Flow Identifier)
>>>
>>> Can you please put a reference for above information?
>>>>
> Sure, will send in V2,
> 
>>>> This update the doxygen format and the mask for qfi
>>>> to properly identify the full 8 bits of the field.
>>>>
>>>> note: changing the default mask would cause different
>>>> patterns generated by testpmd.
>>>>
>>>> Fixes: 346553db5bd1 ("ethdev: add GTP extension header to flow API")
>>>> Cc: ying.a.wang@intel.com
>>>> Cc: stable@dpdk.org
>>>>
>>>> Signed-off-by: Raslan Darawsheh <rasland@nvidia.com>
>>>> ---
>>>>    doc/guides/testpmd_app_ug/testpmd_funcs.rst | 3 ++-
>>>>    lib/librte_ethdev/rte_flow.h                | 4 ++--
>>>>    2 files changed, 4 insertions(+), 3 deletions(-)
>>>>
>>>> diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
>>> b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
>>>> index f59eb8a27d..dd39c4c3c2 100644
>>>> --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
>>>> +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
>>>> @@ -3742,7 +3742,8 @@ This section lists supported pattern items and
>> their
>>> attributes, if any.
>>>>    - ``gtp_psc``: match GTP PDU extension header with type 0x85.
>>>>
>>>>      - ``pdu_type {unsigned}``: PDU type.
>>>> -  - ``qfi {unsigned}``: QoS flow identifier.
>>>> +
>>>> +  - ``qfi {unsigned}``: PPP, RQI and QoS flow identifier.
>>>>
>>>>    - ``pppoes``, ``pppoed``: match PPPoE header.
>>>>
>>>> diff --git a/lib/librte_ethdev/rte_flow.h b/lib/librte_ethdev/rte_flow.h
>>>> index 669e677e91..79106e0246 100644
>>>> --- a/lib/librte_ethdev/rte_flow.h
>>>> +++ b/lib/librte_ethdev/rte_flow.h
>>>> @@ -1392,14 +1392,14 @@ static const struct rte_flow_item_meta
>>> rte_flow_item_meta_mask = {
>>>>     */
>>>>    struct rte_flow_item_gtp_psc {
>>>>    	uint8_t pdu_type; /**< PDU type. */
>>>> -	uint8_t qfi; /**< QoS flow identifier. */
>>>> +	uint8_t qfi; /**< PPP, RQI, QoS flow identifier. */
>>>>    };
>>>
>>> By design requirement, rte_flow_item_* should start with the relevant
>> protocol
>>> header.
>>>
>>> There is already a deprecation notice for using protocol header directly in
>> the
>>> rte_flow_item* [1] and Adrew/Ivan already fixed a few of them [2].
>>>
>>> Your patch is not directly related on this, but since you are touching to the
>>> flow_item, would you mind create a protocol struct for it first, and use it in
>>> the "struct rte_flow_item_gtp_psc"?
>>> So the protocol related update can be done in the protocol header, instead
>> of
>>> rte_flow struct.
>>>
>> +1
> Sure, I can create the new protocol and use it , and will send in V2. But, wouldn't it cause any ABI breakage ?

For the protocol header, it won't be problem since it is a new struct.

For the flow item struct, it may be, that is why need to use a union for now, 
please check what Adrew/Ivan did.

>>
>>>
>>> [1]
>>>
>> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgit.d
>> pdk.
>>>
>> org%2Fdpdk%2Ftree%2Fdoc%2Fguides%2Frel_notes%2Fdeprecation.rst%3F
>> h%3
>>>
>> Dv21.02%23n99&amp;data=04%7C01%7Corika%40nvidia.com%7C6391a4c064
>> 0
>>>
>> f4592b70b08d8f058e322%7C43083d15727340c1b7db39efd9ccc17a%7C0%7C0
>>>
>> %7C637523611870497932%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjA
>> w
>>>
>> MDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;sda
>> t
>>>
>> a=vU%2F5oO47zb9erTnZL1pl9j0nHCKzea3NJgOeo1FTW0Q%3D&amp;reserve
>> d=
>>> 0
>>>
>>> [2]
>>>
>> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgit.d
>> pdk.
>>> org%2Fnext%2Fdpdk-next-
>>>
>> net%2Fcommit%2F%3Fid%3D4a061a7bd70bfa023de23e8e654e&amp;data=0
>> 4%
>>>
>> 7C01%7Corika%40nvidia.com%7C6391a4c0640f4592b70b08d8f058e322%7C43
>>>
>> 083d15727340c1b7db39efd9ccc17a%7C0%7C0%7C637523611870497932%7CU
>>>
>> nknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI
>> 6Ik
>>>
>> 1haWwiLCJXVCI6Mn0%3D%7C1000&amp;sdata=WurlQ5VSLqFGVthfRj363xZs
>> C
>>> No3xJuvxNQCFVcxdkk%3D&amp;reserved=0
> 


^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v4] build: alias default build as generic
  2021-02-18 14:12  3% ` [dpdk-dev] [PATCH v3] " Juraj Linkeš
  2021-03-09  8:43  0%   ` Juraj Linkeš
@ 2021-03-29 10:49  3%   ` Juraj Linkeš
  2021-03-30  6:40  3%     ` [dpdk-dev] [PATCH v5] " Juraj Linkeš
  1 sibling, 1 reply; 200+ results
From: Juraj Linkeš @ 2021-03-29 10:49 UTC (permalink / raw)
  To: bruce.richardson, thomas, david.marchand, Ruifeng.Wang,
	Honnappa.Nagarahalli, jerinjacobk, ferruh.yigit
  Cc: dev, Juraj Linkeš

The current machine='default' build name is not descriptive. The actual
default build is machine='native'. Add an alternative string which does
the same build and better describes what we're building:
machine='generic'. Leave machine='default' for backwards compatibility.

Signed-off-by: Juraj Linkeš <juraj.linkes@pantheon.tech>
Reviewed-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---
 config/arm/meson.build                    |  7 ++++---
 config/meson.build                        | 13 +++++++------
 devtools/test-meson-builds.sh             | 14 +++++++-------
 doc/guides/prog_guide/build-sdk-meson.rst |  4 ++--
 meson_options.txt                         |  2 +-
 5 files changed, 21 insertions(+), 19 deletions(-)

diff --git a/config/arm/meson.build b/config/arm/meson.build
index 00bc4610a3..aaed89bd5b 100644
--- a/config/arm/meson.build
+++ b/config/arm/meson.build
@@ -1,6 +1,7 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation.
 # Copyright(c) 2017 Cavium, Inc
+# Copyright(c) 2021 PANTHEON.tech s.r.o.
 
 # common flags to all aarch64 builds, with lowest priority
 flags_common = [
@@ -208,8 +209,8 @@ if dpdk_conf.get('RTE_ARCH_32')
 else
 	# aarch64 build
 	if not meson.is_cross_build()
-		if machine == 'default'
-			# default build
+		if machine == 'generic'
+			# generic build
 			implementer_id = 'generic'
 			part_number = 'generic'
 		else
@@ -256,7 +257,7 @@ else
 		      '(-Dmachine=generic) build.')
 	endif
 
-	# use default flags with implementer flags
+	# use common flags with implementer flags
 	dpdk_flags = flags_common + implementer_config['flags'] + part_number_config.get('flags', [])
 
 	# apply supported machine args
diff --git a/config/meson.build b/config/meson.build
index 66a2edcc47..3268cf6804 100644
--- a/config/meson.build
+++ b/config/meson.build
@@ -70,21 +70,22 @@ else
 	machine = get_option('machine')
 endif
 
-# machine type 'default' is special, it defaults to the per arch agreed common
-# minimal baseline needed for DPDK.
+# machine type 'generic' is special, it selects the per arch agreed common
+# minimal baseline needed for DPDK. Machine type 'default' is also supported
+# with the same meaning for backwards compatibility.
 # That might not be the most optimized, but the most portable version while
 # still being able to support the CPU features required for DPDK.
 # This can be bumped up by the DPDK project, but it can never be an
 # invariant like 'native'
-if machine == 'default'
+if machine == 'default' or machine == 'generic'
 	if host_machine.cpu_family().startswith('x86')
-		# matches the old pre-meson build systems default
+		# matches the old pre-meson build systems generic machine
 		machine = 'corei7'
 	elif host_machine.cpu_family().startswith('arm')
 		machine = 'armv7-a'
 	elif host_machine.cpu_family().startswith('aarch')
-		# arm64 manages defaults in config/arm/meson.build
-		machine = 'default'
+		# arm64 manages generic config in config/arm/meson.build
+		machine = 'generic'
 	elif host_machine.cpu_family().startswith('ppc')
 		machine = 'power8'
 	endif
diff --git a/devtools/test-meson-builds.sh b/devtools/test-meson-builds.sh
index c11ae87e0d..daf817ac3e 100755
--- a/devtools/test-meson-builds.sh
+++ b/devtools/test-meson-builds.sh
@@ -223,12 +223,12 @@ done
 # test compilation with minimal x86 instruction set
 # Set the install path for libraries to "lib" explicitly to prevent problems
 # with pkg-config prefixes if installed in "lib/x86_64-linux-gnu" later.
-default_machine='nehalem'
-if ! check_cc_flags "-march=$default_machine" ; then
-	default_machine='corei7'
+generic_machine='nehalem'
+if ! check_cc_flags "-march=$generic_machine" ; then
+	generic_machine='corei7'
 fi
-build build-x86-default cc skipABI -Dcheck_includes=true \
-	-Dlibdir=lib -Dmachine=$default_machine $use_shared
+build build-x86-generic cc skipABI -Dcheck_includes=true \
+	-Dlibdir=lib -Dmachine=$generic_machine $use_shared
 
 # 32-bit with default compiler
 if check_cc_flags '-m32' ; then
@@ -271,10 +271,10 @@ for f in $srcdir/config/ppc/ppc* ; do
 	build $targetdir $f ABI $use_shared
 done
 
-# Test installation of the x86-default target, to be used for checking
+# Test installation of the x86-generic target, to be used for checking
 # the sample apps build using the pkg-config file for cflags and libs
 load_env cc
-build_path=$(readlink -f $builds_dir/build-x86-default)
+build_path=$(readlink -f $builds_dir/build-x86-generic)
 export DESTDIR=$build_path/install
 install_target $build_path $DESTDIR
 pc_file=$(find $DESTDIR -name libdpdk.pc)
diff --git a/doc/guides/prog_guide/build-sdk-meson.rst b/doc/guides/prog_guide/build-sdk-meson.rst
index 3429e26479..c7e12eedfb 100644
--- a/doc/guides/prog_guide/build-sdk-meson.rst
+++ b/doc/guides/prog_guide/build-sdk-meson.rst
@@ -85,7 +85,7 @@ Project-specific options are passed used -Doption=value::
 
 	meson -Denable_docs=true fullbuild  # build and install docs
 
-	meson -Dmachine=default  # use builder-independent baseline -march
+	meson -Dmachine=generic  # use builder-independent baseline -march
 
 	meson -Ddisable_drivers=event/*,net/tap  # disable tap driver and all
 					# eventdev PMDs for a smaller build
@@ -114,7 +114,7 @@ Examples of setting some of the same options using meson configure::
         re-scan from meson.
 
 .. note::
-        machine=default uses a config that works on all supported architectures
+        machine=generic uses a config that works on all supported architectures
         regardless of the capabilities of the machine where the build is happening.
 
 As well as those settings taken from ``meson configure``, other options
diff --git a/meson_options.txt b/meson_options.txt
index 3b8c5d316d..686827bb1b 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -21,7 +21,7 @@ option('include_subdir_arch', type: 'string', value: '',
 option('kernel_dir', type: 'string', value: '',
 	description: 'Path to the kernel for building kernel modules. Headers must be in $kernel_dir or $kernel_dir/build. Modules will be installed in /lib/modules.')
 option('machine', type: 'string', value: 'native',
-	description: 'set the target machine type')
+	description: 'set the target machine type or "generic", a build usable on all machines of the build machine architecture or "native", which lets the compiler pick the architecture of the build machine.')
 option('max_ethports', type: 'integer', value: 32,
 	description: 'maximum number of Ethernet devices')
 option('max_lcores', type: 'integer', value: 128,
-- 
2.20.1


^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH] ethdev: update qfi definition
  @ 2021-03-29  9:06  3%     ` Raslan Darawsheh
  2021-03-29 11:14  0%       ` Ferruh Yigit
  0 siblings, 1 reply; 200+ results
From: Raslan Darawsheh @ 2021-03-29  9:06 UTC (permalink / raw)
  To: Ori Kam, Ferruh Yigit, dev, Andrew Rybchenko, Ivan Malov
  Cc: Slava Ovsiienko, Shiri Kuzin, ying.a.wang, stable,
	NBU-Contact-Thomas Monjalon, Olivier Matz

Hi,

> -----Original Message-----
> From: Ori Kam <orika@nvidia.com>
> Sent: Monday, March 29, 2021 11:53 AM
> To: Ferruh Yigit <ferruh.yigit@intel.com>; Raslan Darawsheh
> <rasland@nvidia.com>; dev@dpdk.org; Andrew Rybchenko
> <andrew.rybchenko@oktetlabs.ru>; Ivan Malov <ivan.malov@oktetlabs.ru>
> Cc: Slava Ovsiienko <viacheslavo@nvidia.com>; Shiri Kuzin
> <shirik@nvidia.com>; ying.a.wang@intel.com; stable@dpdk.org; NBU-
> Contact-Thomas Monjalon <thomas@monjalon.net>; Olivier Matz
> <olivier.matz@6wind.com>
> Subject: RE: [dpdk-dev] [PATCH] ethdev: update qfi definition
> 
> Hi
> 
> > -----Original Message-----
> > From: dev <dev-bounces@dpdk.org> On Behalf Of Ferruh Yigit
> > Subject: Re: [dpdk-dev] [PATCH] ethdev: update qfi definition
> >
> > On 3/23/2021 12:11 PM, Raslan Darawsheh wrote:
> > > qfi field is 8 bits which represent single bit for
> > > PPP (paging Policy Presence) single bit for RQI
> > > (Reflective QoS Indicator) and 6 bits for qfi
> > > (QoS Flow Identifier)
> >
> > Can you please put a reference for above information?
> > >
Sure, will send in V2,

> > > This update the doxygen format and the mask for qfi
> > > to properly identify the full 8 bits of the field.
> > >
> > > note: changing the default mask would cause different
> > > patterns generated by testpmd.
> > >
> > > Fixes: 346553db5bd1 ("ethdev: add GTP extension header to flow API")
> > > Cc: ying.a.wang@intel.com
> > > Cc: stable@dpdk.org
> > >
> > > Signed-off-by: Raslan Darawsheh <rasland@nvidia.com>
> > > ---
> > >   doc/guides/testpmd_app_ug/testpmd_funcs.rst | 3 ++-
> > >   lib/librte_ethdev/rte_flow.h                | 4 ++--
> > >   2 files changed, 4 insertions(+), 3 deletions(-)
> > >
> > > diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> > b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> > > index f59eb8a27d..dd39c4c3c2 100644
> > > --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> > > +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> > > @@ -3742,7 +3742,8 @@ This section lists supported pattern items and
> their
> > attributes, if any.
> > >   - ``gtp_psc``: match GTP PDU extension header with type 0x85.
> > >
> > >     - ``pdu_type {unsigned}``: PDU type.
> > > -  - ``qfi {unsigned}``: QoS flow identifier.
> > > +
> > > +  - ``qfi {unsigned}``: PPP, RQI and QoS flow identifier.
> > >
> > >   - ``pppoes``, ``pppoed``: match PPPoE header.
> > >
> > > diff --git a/lib/librte_ethdev/rte_flow.h b/lib/librte_ethdev/rte_flow.h
> > > index 669e677e91..79106e0246 100644
> > > --- a/lib/librte_ethdev/rte_flow.h
> > > +++ b/lib/librte_ethdev/rte_flow.h
> > > @@ -1392,14 +1392,14 @@ static const struct rte_flow_item_meta
> > rte_flow_item_meta_mask = {
> > >    */
> > >   struct rte_flow_item_gtp_psc {
> > >   	uint8_t pdu_type; /**< PDU type. */
> > > -	uint8_t qfi; /**< QoS flow identifier. */
> > > +	uint8_t qfi; /**< PPP, RQI, QoS flow identifier. */
> > >   };
> >
> > By design requirement, rte_flow_item_* should start with the relevant
> protocol
> > header.
> >
> > There is already a deprecation notice for using protocol header directly in
> the
> > rte_flow_item* [1] and Adrew/Ivan already fixed a few of them [2].
> >
> > Your patch is not directly related on this, but since you are touching to the
> > flow_item, would you mind create a protocol struct for it first, and use it in
> > the "struct rte_flow_item_gtp_psc"?
> > So the protocol related update can be done in the protocol header, instead
> of
> > rte_flow struct.
> >
> +1
Sure, I can create the new protocol and use it , and will send in V2. But, wouldn't it cause any ABI breakage ?
> 
> >
> > [1]
> >
> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgit.d
> pdk.
> >
> org%2Fdpdk%2Ftree%2Fdoc%2Fguides%2Frel_notes%2Fdeprecation.rst%3F
> h%3
> >
> Dv21.02%23n99&amp;data=04%7C01%7Corika%40nvidia.com%7C6391a4c064
> 0
> >
> f4592b70b08d8f058e322%7C43083d15727340c1b7db39efd9ccc17a%7C0%7C0
> >
> %7C637523611870497932%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjA
> w
> >
> MDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;sda
> t
> >
> a=vU%2F5oO47zb9erTnZL1pl9j0nHCKzea3NJgOeo1FTW0Q%3D&amp;reserve
> d=
> > 0
> >
> > [2]
> >
> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgit.d
> pdk.
> > org%2Fnext%2Fdpdk-next-
> >
> net%2Fcommit%2F%3Fid%3D4a061a7bd70bfa023de23e8e654e&amp;data=0
> 4%
> >
> 7C01%7Corika%40nvidia.com%7C6391a4c0640f4592b70b08d8f058e322%7C43
> >
> 083d15727340c1b7db39efd9ccc17a%7C0%7C0%7C637523611870497932%7CU
> >
> nknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI
> 6Ik
> >
> 1haWwiLCJXVCI6Mn0%3D%7C1000&amp;sdata=WurlQ5VSLqFGVthfRj363xZs
> C
> > No3xJuvxNQCFVcxdkk%3D&amp;reserved=0


^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [EXTERNAL] Re: Handling missing export functions in MSVC linkage
  2021-03-26  8:39  0%     ` Thomas Monjalon
@ 2021-03-26 14:14  0%       ` Tyler Retzlaff
  0 siblings, 0 replies; 200+ results
From: Tyler Retzlaff @ 2021-03-26 14:14 UTC (permalink / raw)
  To: thomas, Dmitry Kozlyuk, ranjit.menon, Kadam, Pallavi,
	Harini Ramakrishnan, navasile, Dmitry Malloy
  Cc: dev, talshn, bruce.richardson, David Marchand, Omar Cardona

Unless I misunderstood the last status of this issue was that it was desired empty stubs that fail at runtime as opposed to conditionally generating exports.

Is this no longer the case?

-----Original Message-----
From: Thomas Monjalon <thomas@monjalon.net> 
Sent: Friday, March 26, 2021 1:40 AM
To: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>; ranjit.menon <ranjit.menon@intel.com>; Kadam, Pallavi <pallavi.kadam@intel.com>; Harini Ramakrishnan <Harini.Ramakrishnan@microsoft.com>; navasile@linux.microsoft.com; Dmitry Malloy <dmitrym@microsoft.com>
Cc: dev@dpdk.org; talshn <talshn@mellanox.com>; bruce.richardson@intel.com; David Marchand <david.marchand@redhat.com>; Tyler Retzlaff <roretzla@microsoft.com>; Omar Cardona <ocardona@microsoft.com>
Subject: [EXTERNAL] Re: [dpdk-dev] Handling missing export functions in MSVC linkage

08/06/2020 10:33, David Marchand:
> On Mon, Jun 8, 2020 at 2:09 AM Dmitry Kozlyuk <dmitry.kozliuk@gmail.com> wrote:
> > On Sun, 7 Jun 2020 12:26:56 +0000
> > If you create a .def manually, it will override the generation from 
> > .map. Of cause, this adds manual work and ideally all .def files should be generated.
> 
> On this topic, I just noticed that a patch of mine, that removed
> rte_eal_get_configuration() from the stable ABI, missed the 
> declaration in rte_eal_exports.def.
> Probably worth adding a check in devtools/, to avoid further misalignment.

The .def file keeps being out of sync.
We need a script to avoid forgetting the sync, or/and we must generate this .def from the .map.
Ideally the full EAL API (except VFIO) should be implemented for Windows.

This situation is waiting for a solution for too much time.
Windows maintainers, please solve it.




^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v4 00/10] eal: Add new API for threading
  @ 2021-03-26 23:52  2% ` Narcisa Ana Maria Vasile
  0 siblings, 0 replies; 200+ results
From: Narcisa Ana Maria Vasile @ 2021-03-26 23:52 UTC (permalink / raw)
  To: dev, thomas, dmitry.kozliuk, khot, navasile, dmitrym, roretzla,
	talshn, ocardona
  Cc: bruce.richardson, david.marchand, pallavi.kadam

From: Narcisa Vasile <navasile@microsoft.com>

EAL thread API

**Problem Statement**
DPDK currently uses the pthread interface to create and manage threads.
Windows does not support the POSIX thread programming model, so it currently
relies on a header file that hides the Windows calls under
pthread matched interfaces. Given that EAL should isolate the environment
specifics from the applications and libraries and mediate
all the communication with the operating systems, a new EAL interface
is needed for thread management.

**Goals**
* Introduce a generic EAL API for threading support that will remove
  the current Windows pthread.h shim.
* Replace references to pthread_* across the DPDK codebase with the new
  RTE_THREAD_* API.
* Allow users to choose between using the RTE_THREAD_* API or a
  3rd party thread library through a configuration option.

**Design plan**
New API main files:
* rte_thread.h (librte_eal/include)
* rte_thread_types.h (librte_eal/include)
* rte_thread_windows_types.h (librte_eal/windows/include)
* rte_thread.c (librte_eal/windows)
* rte_thread.c (librte_eal/common)

For flexibility, the user is offered the option of either using the RTE_THREAD_* API or
a 3rd party thread library, through a meson flag “use_external_thread_lib”.
By default, this flag is set to FALSE, which means Windows libraries and applications
will use the RTE_THREAD_* API for managing threads.

If compiling on Windows and the “use_external_thread_lib” is *not* set,
the following files will be parsed: 
* include/rte_thread.h
* windows/include/rte_thread_windows_types.h
* windows/rte_thread.c
In all other cases, the compilation/parsing includes the following files:
* include/rte_thread.h 
* include/rte_thread_types.h
* common/rte_thread.c

**A schematic example of the design**
--------------------------------------------------
lib/librte_eal/include/rte_thread.h
int rte_thread_create();

lib/librte_eal/common/rte_thread.c
int rte_thread_create() 
{
	return pthread_create();
}

lib/librte_eal/windows/rte_thread.c
int rte_thread_create() 
{
	return CreateThread();
}

lib/librte_eal/windows/meson.build
if get_option('use_external_thread_lib')
	sources += 'librte_eal/common/rte_thread.c'
else
	sources += 'librte_eal/windows/rte_thread.c'
endif
-----------------------------------------------------

**Thread attributes**

When or after a thread is created, specific characteristics of the thread
can be adjusted. Given that the thread characteristics that are of interest
for DPDK applications are affinity and priority, the following structure
that represents thread attributes has been defined:

typedef struct
{
	enum rte_thread_priority priority;
	rte_cpuset_t cpuset;
} rte_thread_attr_t;

The *rte_thread_create()* function can optionally receive an rte_thread_attr_t
object that will cause the thread to be created with the affinity and priority
described by the attributes object. If no rte_thread_attr_t is passed
(parameter is NULL), the default affinity and priority are used.
An rte_thread_attr_t object can also be set to the default values
by calling *rte_thread_attr_init()*.

*Priority* is represented through an enum that currently advertises
two values for priority:
	- RTE_THREAD_PRIORITY_NORMAL
	- RTE_THREAD_PRIORITY_REALTIME_CRITICAL
The enum can be extended to allow for multiple priority levels.
rte_thread_set_priority      - sets the priority of a thread
rte_thread_attr_set_priority - updates an rte_thread_attr_t object
                               with a new value for priority

The user can choose thread priority through an EAL parameter,
when starting an application. The two options above are available:

 --thread-prio normal
 --thread-prio realtime
 
Example:
./dpdk-l2fwd -l 0-3 -n 4 –thread-prio normal -- -q 8 -p ffff

*Affinity* is described by the already known “rte_cpuset_t” type.
rte_thread_attr_set/get_affinity - sets/gets the affinity field in a
                                   rte_thread_attr_t object
rte_thread_set/get_affinity      – sets/gets the affinity of a thread

**Errors**
A translation function that maps Windows error codes to errno-style
error codes is provided. 

**Future work**
Note that this patchset was focused on introducing new API that will
remove the Windows pthread.h shim. In DPDK, there are still a few references
to pthread_* that were not implemented in the shim.
The long term plan is for EAL to provide full threading support:
* Adding support for conditional variables
* Additional functionality offered by pthread_* (such as pthread_setname_np, etc.)
* Static mutex initializers are not used on Windows. If we must continue
  using them, they need to be platform dependent and an implementation will
  need to be provided for Windows.

v4:
- fix function description
- rebase

v3:
- rebase

v2:
- revert changes that break ABI 
- break up changes into smaller patches
- fix coding style issues
- fix issues with errors
- fix parameter type in examples/kni.c


Narcisa Vasile (10):
  eal: add thread id and simple thread functions
  eal: add thread attributes
  windows/eal: translate Windows errors to errno-style errors
  eal: implement functions for thread affinity management
  eal: implement thread priority management functions
  eal: add thread lifetime management
  eal: implement functions for mutex management
  eal: implement functions for thread barrier management
  eal: add EAL argument for setting thread priority
  Enable the new EAL thread API

 app/test/process.h                            |   6 +-
 app/test/test_lcores.c                        |  16 +-
 app/test/test_link_bonding.c                  |  10 +-
 app/test/test_lpm_perf.c                      |  12 +-
 config/meson.build                            |   4 +
 drivers/bus/dpaa/base/qbman/bman_driver.c     |   6 +-
 drivers/bus/dpaa/base/qbman/dpaa_sys.c        |  14 +-
 drivers/bus/dpaa/base/qbman/process.c         |   6 +-
 drivers/bus/fslmc/portal/dpaa2_hw_dpio.c      |   6 +-
 drivers/compress/mlx5/mlx5_compress.c         |  10 +-
 drivers/event/dlb/pf/base/dlb_osdep.h         |   2 +-
 drivers/event/dlb2/pf/base/dlb2_osdep.h       |   2 +-
 drivers/net/af_xdp/rte_eth_af_xdp.c           |  18 +-
 drivers/net/ark/ark_ethdev.c                  |   4 +-
 drivers/net/atlantic/atl_ethdev.c             |   4 +-
 drivers/net/atlantic/atl_types.h              |   5 +-
 .../net/atlantic/hw_atl/hw_atl_utils_fw2x.c   |  24 +-
 drivers/net/axgbe/axgbe_dev.c                 |   8 +-
 drivers/net/axgbe/axgbe_ethdev.c              |   8 +-
 drivers/net/axgbe/axgbe_ethdev.h              |   8 +-
 drivers/net/axgbe/axgbe_i2c.c                 |   4 +-
 drivers/net/axgbe/axgbe_mdio.c                |   8 +-
 drivers/net/axgbe/axgbe_phy_impl.c            |   6 +-
 drivers/net/bnxt/bnxt.h                       |  16 +-
 drivers/net/bnxt/bnxt_cpr.c                   |   4 +-
 drivers/net/bnxt/bnxt_ethdev.c                |  52 +-
 drivers/net/bnxt/bnxt_irq.c                   |   8 +-
 drivers/net/bnxt/bnxt_reps.c                  |  10 +-
 drivers/net/bnxt/tf_ulp/bnxt_ulp.c            |  34 +-
 drivers/net/bnxt/tf_ulp/bnxt_ulp.h            |   4 +-
 drivers/net/bnxt/tf_ulp/ulp_fc_mgr.c          |  24 +-
 drivers/net/bnxt/tf_ulp/ulp_fc_mgr.h          |   2 +-
 drivers/net/ena/base/ena_plat_dpdk.h          |   8 +-
 drivers/net/enic/enic.h                       |   2 +-
 drivers/net/hns3/hns3_ethdev.h                |   2 +-
 drivers/net/hns3/hns3_ethdev_vf.c             |   2 +-
 drivers/net/hns3/hns3_mbx.c                   |   2 +-
 drivers/net/ice/ice_dcf_parent.c              |   4 +-
 drivers/net/ipn3ke/ipn3ke_representor.c       |   6 +-
 drivers/net/ixgbe/ixgbe_ethdev.c              |   2 +-
 drivers/net/ixgbe/ixgbe_ethdev.h              |   2 +-
 drivers/net/kni/rte_eth_kni.c                 |   6 +-
 drivers/net/mlx5/linux/mlx5_os.c              |   2 +-
 drivers/net/mlx5/mlx5.c                       |  20 +-
 drivers/net/mlx5/mlx5.h                       |   2 +-
 drivers/net/mlx5/mlx5_txpp.c                  |   8 +-
 drivers/net/mlx5/windows/mlx5_flow_os.c       |  10 +-
 drivers/net/mlx5/windows/mlx5_os.c            |   2 +-
 drivers/net/qede/base/bcm_osal.h              |   8 +-
 drivers/net/vhost/rte_eth_vhost.c             |  22 +-
 .../net/virtio/virtio_user/virtio_user_dev.c  |  30 +-
 .../net/virtio/virtio_user/virtio_user_dev.h  |   2 +-
 drivers/raw/ifpga/ifpga_rawdev.c              |   8 +-
 drivers/vdpa/ifc/ifcvf_vdpa.c                 |  36 +-
 drivers/vdpa/mlx5/mlx5_vdpa.c                 |  24 +-
 drivers/vdpa/mlx5/mlx5_vdpa.h                 |   6 +-
 drivers/vdpa/mlx5/mlx5_vdpa_event.c           |  67 +--
 examples/kni/main.c                           |   6 +-
 examples/vhost/main.c                         |   2 +-
 examples/vhost_blk/vhost_blk.c                |  10 +-
 lib/librte_eal/common/eal_common_options.c    |  36 +-
 lib/librte_eal/common/eal_common_proc.c       |  48 +-
 lib/librte_eal/common/eal_common_thread.c     |  43 +-
 lib/librte_eal/common/eal_common_trace.c      |   2 +-
 lib/librte_eal/common/eal_internal_cfg.h      |   2 +
 lib/librte_eal/common/eal_options.h           |   2 +
 lib/librte_eal/common/eal_private.h           |   2 +-
 lib/librte_eal/common/malloc_mp.c             |  32 +-
 lib/librte_eal/common/meson.build             |   1 +
 lib/librte_eal/common/rte_thread.c            | 342 ++++++++++++
 lib/librte_eal/freebsd/eal.c                  |  37 +-
 lib/librte_eal/freebsd/eal_alarm.c            |  12 +-
 lib/librte_eal/freebsd/eal_interrupts.c       |   4 +-
 lib/librte_eal/freebsd/eal_thread.c           |   8 +-
 lib/librte_eal/include/meson.build            |   1 +
 lib/librte_eal/include/rte_lcore.h            |   8 +-
 lib/librte_eal/include/rte_per_lcore.h        |   2 -
 lib/librte_eal/include/rte_thread.h           | 337 ++++++++++-
 lib/librte_eal/include/rte_thread_types.h     |  20 +
 lib/librte_eal/linux/eal.c                    |  42 +-
 lib/librte_eal/linux/eal_alarm.c              |  10 +-
 lib/librte_eal/linux/eal_interrupts.c         |   4 +-
 lib/librte_eal/linux/eal_thread.c             |   8 +-
 lib/librte_eal/linux/eal_timer.c              |   2 +-
 lib/librte_eal/rte_eal_exports.def            |  20 +
 lib/librte_eal/unix/meson.build               |   1 -
 lib/librte_eal/unix/rte_thread.c              |  92 ---
 lib/librte_eal/version.map                    |  21 +
 lib/librte_eal/windows/eal.c                  |  26 +-
 lib/librte_eal/windows/eal_interrupts.c       |   6 +-
 lib/librte_eal/windows/eal_lcore.c            | 170 ++++--
 lib/librte_eal/windows/eal_thread.c           |  24 +-
 lib/librte_eal/windows/eal_windows.h          |  20 +-
 lib/librte_eal/windows/include/meson.build    |   1 +
 lib/librte_eal/windows/include/pthread.h      | 186 -------
 .../include/rte_windows_thread_types.h        |  19 +
 lib/librte_eal/windows/include/sched.h        |   2 +-
 lib/librte_eal/windows/meson.build            |   7 +-
 lib/librte_eal/windows/rte_thread.c           | 522 +++++++++++++++++-
 lib/librte_ethdev/rte_ethdev.c                |   4 +-
 lib/librte_ethdev/rte_ethdev_core.h           |   3 +-
 lib/librte_ethdev/rte_flow.c                  |   4 +-
 .../rte_event_eth_rx_adapter.c                |   6 +-
 lib/librte_vhost/fd_man.c                     |  40 +-
 lib/librte_vhost/fd_man.h                     |   6 +-
 lib/librte_vhost/socket.c                     | 124 +++--
 lib/librte_vhost/vhost.c                      |  10 +-
 meson_options.txt                             |   2 +
 108 files changed, 2038 insertions(+), 929 deletions(-)
 create mode 100644 lib/librte_eal/common/rte_thread.c
 create mode 100644 lib/librte_eal/include/rte_thread_types.h
 delete mode 100644 lib/librte_eal/unix/rte_thread.c
 delete mode 100644 lib/librte_eal/windows/include/pthread.h
 create mode 100644 lib/librte_eal/windows/include/rte_windows_thread_types.h

-- 
2.30.0.vfs.0.2


^ permalink raw reply	[relevance 2%]

* [dpdk-dev] [PATCH v8 0/8] Introduce event vectorization
  2021-03-25 17:10  4%           ` [dpdk-dev] [PATCH v7 " pbhagavatula
@ 2021-03-26 14:08  4%             ` pbhagavatula
  2021-03-30  8:22  4%               ` [dpdk-dev] [PATCH v9 " pbhagavatula
  0 siblings, 1 reply; 200+ results
From: pbhagavatula @ 2021-03-26 14:08 UTC (permalink / raw)
  To: jerinj, jay.jayatheerthan, erik.g.carrillo, abhinandan.gujjar,
	timothy.mcdaniel, hemant.agrawal, harry.van.haaren,
	mattias.ronnblom, liang.j.ma
  Cc: dev, Pavan Nikhilesh

From: Pavan Nikhilesh <pbhagavatula@marvell.com>

In traditional event programming model, events are identified by a
flow-id and a uintptr_t. The flow-id uniquely identifies a given event
and determines the order of scheduling based on schedule type, the
uintptr_t holds a single object.

Event devices also support burst mode with configurable dequeue depth,
i.e. each dequeue call would return multiple events and each event
might be at a different stage of the pipeline.
Having a burst of events belonging to different stages in a dequeue
burst is not only difficult to vectorize but also increases the scheduler
overhead and application overhead of pipelining events further.
Using event vectors we see a performance gain of ~742.3% as shown in [1].

By introducing event vectorization, each event will be capable of holding
multiple uintptr_t of the same flow thereby allowing applications
to vectorize their pipeline and reduce the complexity of pipelining
events across multiple stages. This also reduces the complexity of handling
enqueue and dequeue on an event device.

Since event devices are transparent to the events they are scheduling
so the event producers such as eth_rx_adapter, crypto_adapter , etc..
are responsible for vectorizing the buffers of the same flow into a single
event.

The series also breaks ABI in the patch [8/8] which is targetted to the
v21.11 release.

The dpdk-test-eventdev application has been updated with options to test
multiple vector sizes and timeouts.

[1]
As for performance improvement, with a ARM Cortex-A72 equivalent processer,
software event device (--vdev=event_sw0), single worker core, single stage
and using one service core for Rx adapter, Tx adapter, Scheduling.

Without this patchset applied:
    ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
         --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
         --stlist=a --wlcores=20
    Port[0] using Rx adapter[0] configured
    Port[0] using Tx adapter[0] Configured
    5.071 mpps

With the patchset applied and Without event vectorization:
    ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
         --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
         --stlist=a --wlcores=20
    Port[0] using Rx adapter[0] configured
    Port[0] using Tx adapter[0] Configured
    5.123 mpps

With event vectorization:
    ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
        --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
        --stlist=a --wlcores=20 --enable_vector --nb_eth_queues 1
        --vector_size 256
    Port[0] using Rx adapter[0] configured
    Port[0] using Tx adapter[0] Configured
    42.715 mpps

Having dedicated service cores for each Rx queues and tweaking the vector,
dequeue burst size would further improve performance.

API usage is shown below:

Configuration:

	struct rte_event_eth_rx_adapter_event_vector_config vec_conf;

	vector_pool = rte_event_vector_pool_create("vector_pool",
			nb_elem, 0, vector_size, socket_id);

	rte_event_eth_rx_adapter_create(id, event_id, &adptr_conf);
	rte_event_eth_rx_adapter_queue_add(id, eth_id, -1, &queue_conf);
	if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR) {
		vec_conf.vector_sz = vector_size;
		vec_conf.vector_timeout_ns = vector_tmo_nsec;
		vec_conf.vector_mp = vector_pool;
		rte_event_eth_rx_adapter_queue_event_vector_config(id,
				eth_id, -1, &vec_conf);
	}

Fastpath:

	num = rte_event_dequeue_burst(event_id, port_id, &ev, 1, 0);
	if (!num)
		continue;

	if (ev.event_type & RTE_EVENT_TYPE_VECTOR) {
		switch (ev.event_type) {
		case RTE_EVENT_TYPE_ETHDEV_VECTOR:
		case RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR:
			struct rte_mbuf **mbufs;

			mbufs = ev.vector_ev->mbufs;
			for (i = 0; i < ev.vector_ev->nb_elem; i++)
				//Process mbufs.
			break;
		case ...
		}
	}
	...

v8 Changes:
- Fix incorrect shift for vector timeout interval.(Jay)
- Code reallocation.(Jay)

v7 Changes:
- More doxygen fixes.(Jay)
- Reduce code duplication in 4/8.(Jay)

v6 Changes:
- Make rte_errno sign consistant.(Jay)
- Gramatical and doxygen fixes. (Jay)

v5 Changes:
- Make `rte_event_vector_pool_create non-inline` to ease ABI stability.(Ray)
- Move `rte_event_eth_rx_adapter_queue_event_vector_config` and
  `rte_event_eth_rx_adapter_vector_limits_get` implementation to the patch
  where they are initially defined.(Ray)
- Multiple gramatical and style fixes.(Jerin)
- Add missing release notes.(Jerin)

v4 Changes:
- Fix missing event vector structure in event structure.(Jay)

v3 Changes:
- Fix unintended formatting changes.

v2 Changes:
- Multiple gramatical and style fixes.(Jerin)
- Add parameter to define vector size in power of 2. (Jerin)
- Redo patch series w/o breaking ABI till the last patch.(David)
- Add deprication notice to announce ABI break in 21.11.(David)
- Add vector limits validation to app/test-eventdev.

Pavan Nikhilesh (8):
  eventdev: introduce event vector capability
  eventdev: introduce event vector Rx capability
  eventdev: introduce event vector Tx capability
  eventdev: add Rx adapter event vector support
  eventdev: add Tx adapter event vector support
  app/eventdev: add event vector mode in pipeline test
  doc: announce event Rx adapter config changes
  eventdev: simplify Rx adapter event vector config

 app/test-eventdev/evt_common.h                |   4 +
 app/test-eventdev/evt_options.c               |  52 +++
 app/test-eventdev/evt_options.h               |   4 +
 app/test-eventdev/test_pipeline_atq.c         | 310 +++++++++++++++--
 app/test-eventdev/test_pipeline_common.c      | 105 +++++-
 app/test-eventdev/test_pipeline_common.h      |  18 +
 app/test-eventdev/test_pipeline_queue.c       | 320 ++++++++++++++++--
 .../prog_guide/event_ethernet_rx_adapter.rst  |  38 +++
 .../prog_guide/event_ethernet_tx_adapter.rst  |  12 +
 doc/guides/prog_guide/eventdev.rst            |  36 +-
 doc/guides/rel_notes/deprecation.rst          |   9 +
 doc/guides/rel_notes/release_21_05.rst        |   8 +
 doc/guides/tools/testeventdev.rst             |  45 ++-
 lib/librte_eventdev/eventdev_pmd.h            |  31 +-
 .../rte_event_eth_rx_adapter.c                | 318 ++++++++++++++++-
 .../rte_event_eth_rx_adapter.h                |  78 +++++
 .../rte_event_eth_tx_adapter.c                |  66 +++-
 lib/librte_eventdev/rte_eventdev.c            |  53 ++-
 lib/librte_eventdev/rte_eventdev.h            | 114 ++++++-
 lib/librte_eventdev/version.map               |   4 +
 20 files changed, 1534 insertions(+), 91 deletions(-)

--
2.17.1


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH 1/7] common/octeontx: enable build only on 64bit Linux
  2021-03-25 13:02  3%                 ` Kinsella, Ray
@ 2021-03-26 10:50  0%                   ` Jerin Jacob
  0 siblings, 0 replies; 200+ results
From: Jerin Jacob @ 2021-03-26 10:50 UTC (permalink / raw)
  To: Kinsella, Ray, Richardson, Bruce, Neil Horman
  Cc: Thomas Monjalon, Pavan Nikhilesh, Jerin Jacob, dpdk-dev,
	Harman Kalra, Nithin Dabilpuram, David Marchand

On Thu, Mar 25, 2021 at 6:32 PM Kinsella, Ray <mdr@ashroe.eu> wrote:
>
>
>
> On 25/03/2021 12:58, Jerin Jacob wrote:
> > On Thu, Mar 25, 2021 at 6:17 PM Kinsella, Ray <mdr@ashroe.eu> wrote:
> >>
> >>
> >>
> >> On 25/03/2021 12:46, Jerin Jacob wrote:
> >>> On Thu, Mar 25, 2021 at 4:33 PM Thomas Monjalon <thomas@monjalon.net> wrote:
> >>>>
> >>>> 25/03/2021 11:58, Kinsella, Ray:
> >>>>> On 25/03/2021 10:46, Thomas Monjalon wrote:
> >>>>>> 25/03/2021 11:42, Thomas Monjalon:
> >>>>>>> 24/03/2021 11:55, Jerin Jacob:
> >>>>>>>> On Thu, Feb 25, 2021 at 10:33 PM <pbhagavatula@marvell.com> wrote:
> >>>>>>>>>
> >>>>>>>>> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
> >>>>>>>>>
> >>>>>>>>> Due to Linux kernel dependency, only enable build for 64bit Linux.
> >>>>>>>>>
> >>>>>>>>> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
> >>>>>>>>
> >>>>>>>> Series Acked-by: Jerin Jacob <jerinj@marvell.com>
> >>>>>>>
> >>>>>>> I've reorganized the commits per family of drivers,
> >>>>>>> so it makes more sense than grouping per driver class
> >>>>>>> with "common/octeontx" for title for all:
> >>>>>>>
> >>>>>>> net/thunderx: enable build only on 64-bit Linux
> >>>>>>> common/octeontx: enable build only on 64-bit Linux
> >>>>>>> common/octeontx2: enable build only on 64-bit Linux
> >>>>>>>
> >>>>>>> and applied.
> >>>>>>
> >>>>>> Actually not applied yet.
> >>>>>> I'm not sure what to do for the ABI check which is broken
> >>>>>> because some drivers are not compiled anymore in 32-bit build.
> >>>>>> I've workarounded locally by removing the dump files in the reference build.
> >>>>>> Should we add an exception in libabigail.abignore?
> >>>>>>
> >>>>> In the past we said that depreciating HW support would be considered to be same as an ABI Breakage.
> >>>>>
> >>>>> From the policy ...
> >>>>> "Updates to the minimum hardware requirements, which drop support for hardware which was previously supported, should be treated as an ABI change."
> >>>>
> >>>> So the patches should wait 21.11.
> >>>> Everybody agree?
> >>>
> >>> Looks good to me to postpone.
> >>>
> >>> @Ray Kinsella @Thomas Monjalon  @McDaniel, Timothy @David Marchand @Neil Horman
> >>>
> >>> Currently, I merged DLB v1 driver removal patch to next-eventdev. Is
> >>> this ABI breakge[1]?
> >>>
> >>> http://patches.dpdk.org/project/dpdk/patch/20210316210812.15614-1-timothy.mcdaniel@intel.com/
> >>>
> >>> [1]
> >>> From the policy ...
> >>> "Updates to the minimum hardware requirements, which drop support for
> >>> hardware which was previously supported, should be treated as an ABI
> >>> change."
> >>
> >> +1
> >
> > Is +1 for not to remove the dlb driver or remove it?
> >
>
> You'll note the original reply pointing at the ABI Policy was from myself.
> So I would be in favor of retention until 21.11.
>
> Thats said...
>
> We should think about making the rules less strict for 32bit in future, from 21.11 onwards perhaps.
> How many OS Vendors are shipping 32bit OSs these days for example?

Agree on 32bit.

The DLB driver removal patch from @McDaniel, Timothy
http://patches.dpdk.org/project/dpdk/patch/20210316210812.15614-1-timothy.mcdaniel@intel.com/
is deleting the complete driver. So it does not look like it is
updating the minimum HW requirements
as mentioned in the policy.

So IMO, it is OK to accept his patch for 21.05(ie. remove the driver).
Let me know if there is any objection on this?

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] Handling missing export functions in MSVC linkage
  @ 2021-03-26  8:39  0%     ` Thomas Monjalon
  2021-03-26 14:14  0%       ` [dpdk-dev] [EXTERNAL] " Tyler Retzlaff
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2021-03-26  8:39 UTC (permalink / raw)
  To: Dmitry Kozlyuk, ranjit.menon, pallavi.kadam, Harini Ramakrishnan,
	navasile, Dmitry Malloy (MESHCHANINOV)
  Cc: dev, Tal Shnaiderman, bruce.richardson, David Marchand,
	Tyler Retzlaff, Omar Cardona

08/06/2020 10:33, David Marchand:
> On Mon, Jun 8, 2020 at 2:09 AM Dmitry Kozlyuk <dmitry.kozliuk@gmail.com> wrote:
> > On Sun, 7 Jun 2020 12:26:56 +0000
> > If you create a .def manually, it will override the generation from .map. Of
> > cause, this adds manual work and ideally all .def files should be generated.
> 
> On this topic, I just noticed that a patch of mine, that removed
> rte_eal_get_configuration() from the stable ABI, missed the
> declaration in rte_eal_exports.def.
> Probably worth adding a check in devtools/, to avoid further misalignment.

The .def file keeps being out of sync.
We need a script to avoid forgetting the sync,
or/and we must generate this .def from the .map.
Ideally the full EAL API (except VFIO) should be implemented
for Windows.

This situation is waiting for a solution for too much time.
Windows maintainers, please solve it.




^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v6 0/2] EAL Thread TLS API enhancements
  2021-03-16 13:28  3% ` [dpdk-dev] [PATCH v6 0/2] EAL Thread TLS API enhancements Tal Shnaiderman
  2021-03-16 13:28  3%   ` [dpdk-dev] [PATCH v6 2/2] eal: rename key opaque pointer and functions in TLS API Tal Shnaiderman
@ 2021-03-26  8:24  0%   ` Thomas Monjalon
  1 sibling, 0 replies; 200+ results
From: Thomas Monjalon @ 2021-03-26  8:24 UTC (permalink / raw)
  To: Tal Shnaiderman
  Cc: dev, pallavi.kadam, dmitry.kozliuk, navasile, dmitrym,
	david.marchand, anatoly.burakov, vladimir.medvedkin, mb

16/03/2021 14:28, Tal Shnaiderman:
> ---
> v6: fix misalignment in comment fix from v5 and missing NL in RN [Thomas]
> v5: shorten docu comment on rte_errno and add ABI change info to release note [Thomas]
> v4: replace errno EOTHER with ENOEXEC as EOTHER is undefined in unix.
> v3: -Unify rte_errno values to a generic errno for OS compatibility [DmitryK]
> 	-Rename the TLS function to avoid redundancy[MortenB].
> v2: Rename key to avoid redundancy[MortenB].
> ---
> 
> Tal Shnaiderman (2):
>   eal: error number enhancement for thread TLS API
>   eal: rename key opaque pointer and functions in TLS API

Applied, thanks




^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] ci: remove aarch64 from Travis jobs
  2021-03-25 16:40  3%   ` Aaron Conole
@ 2021-03-25 17:11  0%     ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2021-03-25 17:11 UTC (permalink / raw)
  To: honnappa.nagarahalli, david.marchand, ruifeng.wang, Aaron Conole; +Cc: dev

25/03/2021 17:40, Aaron Conole:
> Thomas Monjalon <thomas@monjalon.net> writes:
> >> Travis is not reliable for native Arm and PPC:
> >> https://travis-ci.community/t/disk-quota-exceeded-on-arm64/7619/6
> >> 
> >> In order to get reliable Travis reports,
> >> the use of Arm machines is removed until Travis fixes it.
> >> 
> >> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> >
> > We managed without applying this patch.
> >
> > After one year passed, what is the situation today regarding Travis?
> > Can we rely on Travis service?
> 
> So far, yes.
> 
> > For which workload? Which architecture?
> 
> I think for all of them.  Looking at even the failures which pop up for
> the latest patches, they seem like real failures.
> 
> ex:
>   https://travis-ci.com/github/ovsrobot/dpdk/jobs/493722400
>   https://travis-ci.com/github/ovsrobot/dpdk/jobs/493688879
>   https://travis-ci.com/github/ovsrobot/dpdk/jobs/493624012
>   https://travis-ci.com/github/ovsrobot/dpdk/jobs/493611597
> 
> These are ABI, and doc failures - different arches, etc.
> 
> Seems like it's quite usable.
> 
> > Aaron, what do you recommend?
> 
> I think we should drop this patch - Travis continues to be useful even
> for individual developers checking their own results.  It seems the
> service works quite a bit better now for the project as well, thanks to
> Honnappa and other ARM folks for working with them.

Thanks all, patch classified as "Rejected".






^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v7 0/8] Introduce event vectorization
  2021-03-24 19:28  4%         ` [dpdk-dev] [PATCH v6 " pbhagavatula
@ 2021-03-25 17:10  4%           ` pbhagavatula
  2021-03-26 14:08  4%             ` [dpdk-dev] [PATCH v8 " pbhagavatula
  0 siblings, 1 reply; 200+ results
From: pbhagavatula @ 2021-03-25 17:10 UTC (permalink / raw)
  To: jerinj, jay.jayatheerthan, erik.g.carrillo, abhinandan.gujjar,
	timothy.mcdaniel, hemant.agrawal, harry.van.haaren,
	mattias.ronnblom, liang.j.ma
  Cc: dev, Pavan Nikhilesh

From: Pavan Nikhilesh <pbhagavatula@marvell.com>

In traditional event programming model, events are identified by a
flow-id and a uintptr_t. The flow-id uniquely identifies a given event
and determines the order of scheduling based on schedule type, the
uintptr_t holds a single object.

Event devices also support burst mode with configurable dequeue depth,
i.e. each dequeue call would return multiple events and each event
might be at a different stage of the pipeline.
Having a burst of events belonging to different stages in a dequeue
burst is not only difficult to vectorize but also increases the scheduler
overhead and application overhead of pipelining events further.
Using event vectors we see a performance gain of ~742.3% as shown in [1].

By introducing event vectorization, each event will be capable of holding
multiple uintptr_t of the same flow thereby allowing applications
to vectorize their pipeline and reduce the complexity of pipelining
events across multiple stages. This also reduces the complexity of handling
enqueue and dequeue on an event device.

Since event devices are transparent to the events they are scheduling
so the event producers such as eth_rx_adapter, crypto_adapter , etc..
are responsible for vectorizing the buffers of the same flow into a single
event.

The series also breaks ABI in the patch [8/8] which is targetted to the
v21.11 release.

The dpdk-test-eventdev application has been updated with options to test
multiple vector sizes and timeouts.

[1]
As for performance improvement, with a ARM Cortex-A72 equivalent processer,
software event device (--vdev=event_sw0), single worker core, single stage
and using one service core for Rx adapter, Tx adapter, Scheduling.

Without this patchset applied:
    ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
         --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
         --stlist=a --wlcores=20
    Port[0] using Rx adapter[0] configured
    Port[0] using Tx adapter[0] Configured
    5.071 mpps

With the patchset applied and Without event vectorization:
    ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
         --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
         --stlist=a --wlcores=20
    Port[0] using Rx adapter[0] configured
    Port[0] using Tx adapter[0] Configured
    5.123 mpps

With event vectorization:
    ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
        --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
        --stlist=a --wlcores=20 --enable_vector --nb_eth_queues 1
        --vector_size 256
    Port[0] using Rx adapter[0] configured
    Port[0] using Tx adapter[0] Configured
    42.715 mpps

Having dedicated service cores for each Rx queues and tweaking the vector,
dequeue burst size would further improve performance.

API usage is shown below:

Configuration:

	struct rte_event_eth_rx_adapter_event_vector_config vec_conf;

	vector_pool = rte_event_vector_pool_create("vector_pool",
			nb_elem, 0, vector_size, socket_id);

	rte_event_eth_rx_adapter_create(id, event_id, &adptr_conf);
	rte_event_eth_rx_adapter_queue_add(id, eth_id, -1, &queue_conf);
	if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR) {
		vec_conf.vector_sz = vector_size;
		vec_conf.vector_timeout_ns = vector_tmo_nsec;
		vec_conf.vector_mp = vector_pool;
		rte_event_eth_rx_adapter_queue_event_vector_config(id,
				eth_id, -1, &vec_conf);
	}

Fastpath:

	num = rte_event_dequeue_burst(event_id, port_id, &ev, 1, 0);
	if (!num)
		continue;

	if (ev.event_type & RTE_EVENT_TYPE_VECTOR) {
		switch (ev.event_type) {
		case RTE_EVENT_TYPE_ETHDEV_VECTOR:
		case RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR:
			struct rte_mbuf **mbufs;

			mbufs = ev.vector_ev->mbufs;
			for (i = 0; i < ev.vector_ev->nb_elem; i++)
				//Process mbufs.
			break;
		case ...
		}
	}
	...

v7 Changes:
- More doxygen fixes.(Jay)
- Reduce code duplication in 4/8.(Jay)

v6 Changes:
- Make rte_errno sign consistant.(Jay)
- Gramatical and doxygen fixes. (Jay)

v5 Changes:
- Make `rte_event_vector_pool_create non-inline` to ease ABI stability.(Ray)
- Move `rte_event_eth_rx_adapter_queue_event_vector_config` and
  `rte_event_eth_rx_adapter_vector_limits_get` implementation to the patch
  where they are initially defined.(Ray)
- Multiple gramatical and style fixes.(Jerin)
- Add missing release notes.(Jerin)

v4 Changes:
- Fix missing event vector structure in event structure.(Jay)

v3 Changes:
- Fix unintended formatting changes.

v2 Changes:
- Multiple gramatical and style fixes.(Jerin)
- Add parameter to define vector size in power of 2. (Jerin)
- Redo patch series w/o breaking ABI till the last patch.(David)
- Add deprication notice to announce ABI break in 21.11.(David)
- Add vector limits validation to app/test-eventdev.

Pavan Nikhilesh (8):
  eventdev: introduce event vector capability
  eventdev: introduce event vector Rx capability
  eventdev: introduce event vector Tx capability
  eventdev: add Rx adapter event vector support
  eventdev: add Tx adapter event vector support
  app/eventdev: add event vector mode in pipeline test
  doc: announce event Rx adapter config changes
  eventdev: simplify Rx adapter event vector config

 app/test-eventdev/evt_common.h                |   4 +
 app/test-eventdev/evt_options.c               |  52 +++
 app/test-eventdev/evt_options.h               |   4 +
 app/test-eventdev/test_pipeline_atq.c         | 310 +++++++++++++++--
 app/test-eventdev/test_pipeline_common.c      | 105 +++++-
 app/test-eventdev/test_pipeline_common.h      |  18 +
 app/test-eventdev/test_pipeline_queue.c       | 320 ++++++++++++++++--
 .../prog_guide/event_ethernet_rx_adapter.rst  |  38 +++
 .../prog_guide/event_ethernet_tx_adapter.rst  |  12 +
 doc/guides/prog_guide/eventdev.rst            |  36 +-
 doc/guides/rel_notes/deprecation.rst          |   9 +
 doc/guides/rel_notes/release_21_05.rst        |   8 +
 doc/guides/tools/testeventdev.rst             |  45 ++-
 lib/librte_eventdev/eventdev_pmd.h            |  31 +-
 .../rte_event_eth_rx_adapter.c                | 311 ++++++++++++++++-
 .../rte_event_eth_rx_adapter.h                |  78 +++++
 .../rte_event_eth_tx_adapter.c                |  66 +++-
 lib/librte_eventdev/rte_eventdev.c            |  53 ++-
 lib/librte_eventdev/rte_eventdev.h            | 114 ++++++-
 lib/librte_eventdev/version.map               |   4 +
 20 files changed, 1531 insertions(+), 87 deletions(-)

--
2.17.1


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] ci: remove aarch64 from Travis jobs
  @ 2021-03-25 16:40  3%   ` Aaron Conole
  2021-03-25 17:11  0%     ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Aaron Conole @ 2021-03-25 16:40 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: honnappa.nagarahalli, dev, david.marchand, ruifeng.wang

Thomas Monjalon <thomas@monjalon.net> writes:

> 16/04/2020 13:00, Thomas Monjalon:
>> Travis is not reliable for native Arm and PPC:
>> https://travis-ci.community/t/disk-quota-exceeded-on-arm64/7619/6
>> 
>> In order to get reliable Travis reports,
>> the use of Arm machines is removed until Travis fixes it.
>> 
>> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
>
> We managed without applying this patch.
>
> After one year passed, what is the situation today regarding Travis?
> Can we rely on Travis service?

So far, yes.

> For which workload? Which architecture?

I think for all of them.  Looking at even the failures which pop up for
the latest patches, they seem like real failures.

ex:
  https://travis-ci.com/github/ovsrobot/dpdk/jobs/493722400
  https://travis-ci.com/github/ovsrobot/dpdk/jobs/493688879
  https://travis-ci.com/github/ovsrobot/dpdk/jobs/493624012
  https://travis-ci.com/github/ovsrobot/dpdk/jobs/493611597

These are ABI, and doc failures - different arches, etc.

Seems like it's quite usable.

> Aaron, what do you recommend?

I think we should drop this patch - Travis continues to be useful even
for individual developers checking their own results.  It seems the
service works quite a bit better now for the project as well, thanks to
Honnappa and other ARM folks for working with them.


^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH 1/7] common/octeontx: enable build only on 64bit Linux
  2021-03-25 14:57  0%             ` Thomas Monjalon
@ 2021-03-25 15:01  0%               ` David Marchand
  0 siblings, 0 replies; 200+ results
From: David Marchand @ 2021-03-25 15:01 UTC (permalink / raw)
  To: Thomas Monjalon, Pavan Nikhilesh
  Cc: Jerin Jacob, Kinsella, Ray, dpdk-dev, Harman Kalra,
	Nithin Dabilpuram, Jerin Jacob

On Thu, Mar 25, 2021 at 3:57 PM Thomas Monjalon <thomas@monjalon.net> wrote:
> > > > In the past we said that depreciating HW support would be considered to be same as an ABI Breakage.
> > > >
> > > > From the policy ...
> > > > "Updates to the minimum hardware requirements, which drop support for hardware which was previously supported, should be treated as an ABI change."
> > >
> > > So the patches should wait 21.11.
> > > Everybody agree?
> >
> > Looks good to me to postpone.
>
> The v2 is waiting in patchwork with the status "Deferred":
> https://patches.dpdk.org/project/dpdk/list/?series=15885&state=*

We need a deprecation notice.


-- 
David Marchand


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 1/7] common/octeontx: enable build only on 64bit Linux
  2021-03-25 12:46  4%           ` Jerin Jacob
  2021-03-25 12:47  0%             ` Kinsella, Ray
@ 2021-03-25 14:57  0%             ` Thomas Monjalon
  2021-03-25 15:01  0%               ` David Marchand
  1 sibling, 1 reply; 200+ results
From: Thomas Monjalon @ 2021-03-25 14:57 UTC (permalink / raw)
  To: Pavan Nikhilesh
  Cc: dev, Jerin Jacob, Kinsella, Ray, dpdk-dev, Harman Kalra,
	Nithin Dabilpuram, David Marchand, Jerin Jacob

25/03/2021 13:46, Jerin Jacob:
> On Thu, Mar 25, 2021 at 4:33 PM Thomas Monjalon <thomas@monjalon.net> wrote:
> > 25/03/2021 11:58, Kinsella, Ray:
> > > On 25/03/2021 10:46, Thomas Monjalon wrote:
> > > > 25/03/2021 11:42, Thomas Monjalon:
> > > >> I've reorganized the commits per family of drivers,
> > > >> so it makes more sense than grouping per driver class
> > > >> with "common/octeontx" for title for all:
> > > >>
> > > >> net/thunderx: enable build only on 64-bit Linux
> > > >> common/octeontx: enable build only on 64-bit Linux
> > > >> common/octeontx2: enable build only on 64-bit Linux
> > > >>
> > > >> and applied.
> > > >
> > > > Actually not applied yet.
> > > > I'm not sure what to do for the ABI check which is broken
> > > > because some drivers are not compiled anymore in 32-bit build.
> > > > I've workarounded locally by removing the dump files in the reference build.
> > > > Should we add an exception in libabigail.abignore?
> > > >
> > > In the past we said that depreciating HW support would be considered to be same as an ABI Breakage.
> > >
> > > From the policy ...
> > > "Updates to the minimum hardware requirements, which drop support for hardware which was previously supported, should be treated as an ABI change."
> >
> > So the patches should wait 21.11.
> > Everybody agree?
> 
> Looks good to me to postpone.

The v2 is waiting in patchwork with the status "Deferred":
https://patches.dpdk.org/project/dpdk/list/?series=15885&state=*



^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH 21.11 v2 0/3] octeontx build only on 64-bit Linux
    @ 2021-03-25 14:52  3% ` Thomas Monjalon
  1 sibling, 0 replies; 200+ results
From: Thomas Monjalon @ 2021-03-25 14:52 UTC (permalink / raw)
  To: dev

This is a reorg of the patches from Pavan.
It has been discussed that it should wait for DPDK 21.11
for ABI compatibility reason.

Pavan Nikhilesh (3):
  net/thunderx: enable build only on 64-bit Linux
  common/octeontx: enable build only on 64-bit Linux
  common/octeontx2: enable build only on 64-bit Linux

 drivers/common/octeontx/meson.build   |  6 ++++++
 drivers/common/octeontx2/meson.build  |  4 ++--
 drivers/compress/octeontx/meson.build |  6 ++++++
 drivers/crypto/octeontx/meson.build   |  7 +++++--
 drivers/event/octeontx/meson.build    |  6 ++++++
 drivers/event/octeontx2/meson.build   |  4 ++--
 drivers/mempool/octeontx/meson.build  |  5 +++--
 drivers/mempool/octeontx2/meson.build |  9 ++-------
 drivers/net/octeontx/meson.build      |  4 ++--
 drivers/net/octeontx2/meson.build     | 10 ++--------
 drivers/net/thunderx/meson.build      |  4 ++--
 drivers/raw/octeontx2_dma/meson.build | 10 ++++++----
 12 files changed, 44 insertions(+), 31 deletions(-)

-- 
2.30.1


^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v2 2/4] telemetry: make the legacy registration function internal
  @ 2021-03-25 13:57 10%   ` Bruce Richardson
  0 siblings, 0 replies; 200+ results
From: Bruce Richardson @ 2021-03-25 13:57 UTC (permalink / raw)
  To: dev; +Cc: Bruce Richardson, Ciara Power, Kevin Laatz, Ray Kinsella, Neil Horman

The function for registration of callbacks for legacy telemetry was
documented as internal-only in the API documents, but marked as
experimental in the version.map file. Since this is an internal-only
function, for consistency we update the version mapping to have it as
internal.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Ciara Power <ciara.power@intel.com>
---
 doc/guides/rel_notes/release_21_05.rst      | 5 +++++
 lib/librte_telemetry/rte_telemetry_legacy.h | 2 +-
 lib/librte_telemetry/version.map            | 2 +-
 3 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/doc/guides/rel_notes/release_21_05.rst b/doc/guides/rel_notes/release_21_05.rst
index 8e686cc62..fb965fec3 100644
--- a/doc/guides/rel_notes/release_21_05.rst
+++ b/doc/guides/rel_notes/release_21_05.rst
@@ -148,6 +148,11 @@ ABI Changes
 
 * No ABI change that would break compatibility with 20.11.
 
+* The experimental function ``rte_telemetry_legacy_register`` has been
+  removed from the public API and is now an internal-only function. This
+  function was already marked as internal in the API documentation for it,
+  and was not for use by external applications.
+
 
 Known Issues
 ------------
diff --git a/lib/librte_telemetry/rte_telemetry_legacy.h b/lib/librte_telemetry/rte_telemetry_legacy.h
index c83f9a8d9..fb4474018 100644
--- a/lib/librte_telemetry/rte_telemetry_legacy.h
+++ b/lib/librte_telemetry/rte_telemetry_legacy.h
@@ -78,7 +78,7 @@ legacy_client_handler(void *sock_id);
  *  @return
  *  -ENOENT if max callbacks limit has been reached.
  */
-__rte_experimental
+__rte_internal
 int
 rte_telemetry_legacy_register(const char *cmd,
 		enum rte_telemetry_legacy_data_req data_req,
diff --git a/lib/librte_telemetry/version.map b/lib/librte_telemetry/version.map
index ec0ebc1be..bde80ce29 100644
--- a/lib/librte_telemetry/version.map
+++ b/lib/librte_telemetry/version.map
@@ -14,12 +14,12 @@ EXPERIMENTAL {
 	rte_tel_data_start_array;
 	rte_tel_data_start_dict;
 	rte_tel_data_string;
-	rte_telemetry_legacy_register;
 	rte_telemetry_register_cmd;
 
 	local: *;
 };
 
 INTERNAL {
+	rte_telemetry_legacy_register;
 	rte_telemetry_init;
 };
-- 
2.27.0


^ permalink raw reply	[relevance 10%]

* Re: [dpdk-dev] [PATCH 1/7] common/octeontx: enable build only on 64bit Linux
  2021-03-25 12:58  0%               ` Jerin Jacob
@ 2021-03-25 13:02  3%                 ` Kinsella, Ray
  2021-03-26 10:50  0%                   ` Jerin Jacob
  0 siblings, 1 reply; 200+ results
From: Kinsella, Ray @ 2021-03-25 13:02 UTC (permalink / raw)
  To: Jerin Jacob
  Cc: Thomas Monjalon, Pavan Nikhilesh, Jerin Jacob, dpdk-dev,
	Harman Kalra, Nithin Dabilpuram, David Marchand



On 25/03/2021 12:58, Jerin Jacob wrote:
> On Thu, Mar 25, 2021 at 6:17 PM Kinsella, Ray <mdr@ashroe.eu> wrote:
>>
>>
>>
>> On 25/03/2021 12:46, Jerin Jacob wrote:
>>> On Thu, Mar 25, 2021 at 4:33 PM Thomas Monjalon <thomas@monjalon.net> wrote:
>>>>
>>>> 25/03/2021 11:58, Kinsella, Ray:
>>>>> On 25/03/2021 10:46, Thomas Monjalon wrote:
>>>>>> 25/03/2021 11:42, Thomas Monjalon:
>>>>>>> 24/03/2021 11:55, Jerin Jacob:
>>>>>>>> On Thu, Feb 25, 2021 at 10:33 PM <pbhagavatula@marvell.com> wrote:
>>>>>>>>>
>>>>>>>>> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
>>>>>>>>>
>>>>>>>>> Due to Linux kernel dependency, only enable build for 64bit Linux.
>>>>>>>>>
>>>>>>>>> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
>>>>>>>>
>>>>>>>> Series Acked-by: Jerin Jacob <jerinj@marvell.com>
>>>>>>>
>>>>>>> I've reorganized the commits per family of drivers,
>>>>>>> so it makes more sense than grouping per driver class
>>>>>>> with "common/octeontx" for title for all:
>>>>>>>
>>>>>>> net/thunderx: enable build only on 64-bit Linux
>>>>>>> common/octeontx: enable build only on 64-bit Linux
>>>>>>> common/octeontx2: enable build only on 64-bit Linux
>>>>>>>
>>>>>>> and applied.
>>>>>>
>>>>>> Actually not applied yet.
>>>>>> I'm not sure what to do for the ABI check which is broken
>>>>>> because some drivers are not compiled anymore in 32-bit build.
>>>>>> I've workarounded locally by removing the dump files in the reference build.
>>>>>> Should we add an exception in libabigail.abignore?
>>>>>>
>>>>> In the past we said that depreciating HW support would be considered to be same as an ABI Breakage.
>>>>>
>>>>> From the policy ...
>>>>> "Updates to the minimum hardware requirements, which drop support for hardware which was previously supported, should be treated as an ABI change."
>>>>
>>>> So the patches should wait 21.11.
>>>> Everybody agree?
>>>
>>> Looks good to me to postpone.
>>>
>>> @Ray Kinsella @Thomas Monjalon  @McDaniel, Timothy @David Marchand @Neil Horman
>>>
>>> Currently, I merged DLB v1 driver removal patch to next-eventdev. Is
>>> this ABI breakge[1]?
>>>
>>> http://patches.dpdk.org/project/dpdk/patch/20210316210812.15614-1-timothy.mcdaniel@intel.com/
>>>
>>> [1]
>>> From the policy ...
>>> "Updates to the minimum hardware requirements, which drop support for
>>> hardware which was previously supported, should be treated as an ABI
>>> change."
>>
>> +1
> 
> Is +1 for not to remove the dlb driver or remove it?
> 

You'll note the original reply pointing at the ABI Policy was from myself.
So I would be in favor of retention until 21.11. 

Thats said...

We should think about making the rules less strict for 32bit in future, from 21.11 onwards perhaps.
How many OS Vendors are shipping 32bit OSs these days for example?

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH 1/7] common/octeontx: enable build only on 64bit Linux
  2021-03-25 12:47  0%             ` Kinsella, Ray
@ 2021-03-25 12:58  0%               ` Jerin Jacob
  2021-03-25 13:02  3%                 ` Kinsella, Ray
  0 siblings, 1 reply; 200+ results
From: Jerin Jacob @ 2021-03-25 12:58 UTC (permalink / raw)
  To: Kinsella, Ray
  Cc: Thomas Monjalon, Pavan Nikhilesh, Jerin Jacob, dpdk-dev,
	Harman Kalra, Nithin Dabilpuram, David Marchand

On Thu, Mar 25, 2021 at 6:17 PM Kinsella, Ray <mdr@ashroe.eu> wrote:
>
>
>
> On 25/03/2021 12:46, Jerin Jacob wrote:
> > On Thu, Mar 25, 2021 at 4:33 PM Thomas Monjalon <thomas@monjalon.net> wrote:
> >>
> >> 25/03/2021 11:58, Kinsella, Ray:
> >>> On 25/03/2021 10:46, Thomas Monjalon wrote:
> >>>> 25/03/2021 11:42, Thomas Monjalon:
> >>>>> 24/03/2021 11:55, Jerin Jacob:
> >>>>>> On Thu, Feb 25, 2021 at 10:33 PM <pbhagavatula@marvell.com> wrote:
> >>>>>>>
> >>>>>>> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
> >>>>>>>
> >>>>>>> Due to Linux kernel dependency, only enable build for 64bit Linux.
> >>>>>>>
> >>>>>>> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
> >>>>>>
> >>>>>> Series Acked-by: Jerin Jacob <jerinj@marvell.com>
> >>>>>
> >>>>> I've reorganized the commits per family of drivers,
> >>>>> so it makes more sense than grouping per driver class
> >>>>> with "common/octeontx" for title for all:
> >>>>>
> >>>>> net/thunderx: enable build only on 64-bit Linux
> >>>>> common/octeontx: enable build only on 64-bit Linux
> >>>>> common/octeontx2: enable build only on 64-bit Linux
> >>>>>
> >>>>> and applied.
> >>>>
> >>>> Actually not applied yet.
> >>>> I'm not sure what to do for the ABI check which is broken
> >>>> because some drivers are not compiled anymore in 32-bit build.
> >>>> I've workarounded locally by removing the dump files in the reference build.
> >>>> Should we add an exception in libabigail.abignore?
> >>>>
> >>> In the past we said that depreciating HW support would be considered to be same as an ABI Breakage.
> >>>
> >>> From the policy ...
> >>> "Updates to the minimum hardware requirements, which drop support for hardware which was previously supported, should be treated as an ABI change."
> >>
> >> So the patches should wait 21.11.
> >> Everybody agree?
> >
> > Looks good to me to postpone.
> >
> > @Ray Kinsella @Thomas Monjalon  @McDaniel, Timothy @David Marchand @Neil Horman
> >
> > Currently, I merged DLB v1 driver removal patch to next-eventdev. Is
> > this ABI breakge[1]?
> >
> > http://patches.dpdk.org/project/dpdk/patch/20210316210812.15614-1-timothy.mcdaniel@intel.com/
> >
> > [1]
> > From the policy ...
> > "Updates to the minimum hardware requirements, which drop support for
> > hardware which was previously supported, should be treated as an ABI
> > change."
>
> +1

Is +1 for not to remove the dlb driver or remove it?

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 1/7] common/octeontx: enable build only on 64bit Linux
  2021-03-25 12:46  4%           ` Jerin Jacob
@ 2021-03-25 12:47  0%             ` Kinsella, Ray
  2021-03-25 12:58  0%               ` Jerin Jacob
  2021-03-25 14:57  0%             ` Thomas Monjalon
  1 sibling, 1 reply; 200+ results
From: Kinsella, Ray @ 2021-03-25 12:47 UTC (permalink / raw)
  To: Jerin Jacob, Thomas Monjalon
  Cc: Pavan Nikhilesh, Jerin Jacob, dpdk-dev, Harman Kalra,
	Nithin Dabilpuram, David Marchand



On 25/03/2021 12:46, Jerin Jacob wrote:
> On Thu, Mar 25, 2021 at 4:33 PM Thomas Monjalon <thomas@monjalon.net> wrote:
>>
>> 25/03/2021 11:58, Kinsella, Ray:
>>> On 25/03/2021 10:46, Thomas Monjalon wrote:
>>>> 25/03/2021 11:42, Thomas Monjalon:
>>>>> 24/03/2021 11:55, Jerin Jacob:
>>>>>> On Thu, Feb 25, 2021 at 10:33 PM <pbhagavatula@marvell.com> wrote:
>>>>>>>
>>>>>>> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
>>>>>>>
>>>>>>> Due to Linux kernel dependency, only enable build for 64bit Linux.
>>>>>>>
>>>>>>> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
>>>>>>
>>>>>> Series Acked-by: Jerin Jacob <jerinj@marvell.com>
>>>>>
>>>>> I've reorganized the commits per family of drivers,
>>>>> so it makes more sense than grouping per driver class
>>>>> with "common/octeontx" for title for all:
>>>>>
>>>>> net/thunderx: enable build only on 64-bit Linux
>>>>> common/octeontx: enable build only on 64-bit Linux
>>>>> common/octeontx2: enable build only on 64-bit Linux
>>>>>
>>>>> and applied.
>>>>
>>>> Actually not applied yet.
>>>> I'm not sure what to do for the ABI check which is broken
>>>> because some drivers are not compiled anymore in 32-bit build.
>>>> I've workarounded locally by removing the dump files in the reference build.
>>>> Should we add an exception in libabigail.abignore?
>>>>
>>> In the past we said that depreciating HW support would be considered to be same as an ABI Breakage.
>>>
>>> From the policy ...
>>> "Updates to the minimum hardware requirements, which drop support for hardware which was previously supported, should be treated as an ABI change."
>>
>> So the patches should wait 21.11.
>> Everybody agree?
> 
> Looks good to me to postpone.
> 
> @Ray Kinsella @Thomas Monjalon  @McDaniel, Timothy @David Marchand @Neil Horman
> 
> Currently, I merged DLB v1 driver removal patch to next-eventdev. Is
> this ABI breakge[1]?
> 
> http://patches.dpdk.org/project/dpdk/patch/20210316210812.15614-1-timothy.mcdaniel@intel.com/
> 
> [1]
> From the policy ...
> "Updates to the minimum hardware requirements, which drop support for
> hardware which was previously supported, should be treated as an ABI
> change."

+1 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 1/7] common/octeontx: enable build only on 64bit Linux
  2021-03-25 11:03  0%         ` Thomas Monjalon
@ 2021-03-25 12:46  4%           ` Jerin Jacob
  2021-03-25 12:47  0%             ` Kinsella, Ray
  2021-03-25 14:57  0%             ` Thomas Monjalon
  0 siblings, 2 replies; 200+ results
From: Jerin Jacob @ 2021-03-25 12:46 UTC (permalink / raw)
  To: Thomas Monjalon
  Cc: Pavan Nikhilesh, Jerin Jacob, Kinsella, Ray, dpdk-dev,
	Harman Kalra, Nithin Dabilpuram, David Marchand

On Thu, Mar 25, 2021 at 4:33 PM Thomas Monjalon <thomas@monjalon.net> wrote:
>
> 25/03/2021 11:58, Kinsella, Ray:
> > On 25/03/2021 10:46, Thomas Monjalon wrote:
> > > 25/03/2021 11:42, Thomas Monjalon:
> > >> 24/03/2021 11:55, Jerin Jacob:
> > >>> On Thu, Feb 25, 2021 at 10:33 PM <pbhagavatula@marvell.com> wrote:
> > >>>>
> > >>>> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
> > >>>>
> > >>>> Due to Linux kernel dependency, only enable build for 64bit Linux.
> > >>>>
> > >>>> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
> > >>>
> > >>> Series Acked-by: Jerin Jacob <jerinj@marvell.com>
> > >>
> > >> I've reorganized the commits per family of drivers,
> > >> so it makes more sense than grouping per driver class
> > >> with "common/octeontx" for title for all:
> > >>
> > >> net/thunderx: enable build only on 64-bit Linux
> > >> common/octeontx: enable build only on 64-bit Linux
> > >> common/octeontx2: enable build only on 64-bit Linux
> > >>
> > >> and applied.
> > >
> > > Actually not applied yet.
> > > I'm not sure what to do for the ABI check which is broken
> > > because some drivers are not compiled anymore in 32-bit build.
> > > I've workarounded locally by removing the dump files in the reference build.
> > > Should we add an exception in libabigail.abignore?
> > >
> > In the past we said that depreciating HW support would be considered to be same as an ABI Breakage.
> >
> > From the policy ...
> > "Updates to the minimum hardware requirements, which drop support for hardware which was previously supported, should be treated as an ABI change."
>
> So the patches should wait 21.11.
> Everybody agree?

Looks good to me to postpone.

@Ray Kinsella @Thomas Monjalon  @McDaniel, Timothy @David Marchand @Neil Horman

Currently, I merged DLB v1 driver removal patch to next-eventdev. Is
this ABI breakge[1]?

http://patches.dpdk.org/project/dpdk/patch/20210316210812.15614-1-timothy.mcdaniel@intel.com/

[1]
From the policy ...
"Updates to the minimum hardware requirements, which drop support for
hardware which was previously supported, should be treated as an ABI
change."

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH V2] ethdev: add queue state when retrieve queue information
  2021-03-18 12:25 13% [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information Lijun Ou
  2021-03-22  9:22  3% ` Ferruh Yigit
@ 2021-03-25 11:09 13% ` Lijun Ou
  2021-04-06  0:49  0%   ` oulijun
  2021-04-06 14:02  0%   ` Ananyev, Konstantin
  1 sibling, 2 replies; 200+ results
From: Lijun Ou @ 2021-03-25 11:09 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev, linuxarm

Currently, upper-layer application could get queue state only
through pointers such as dev->data->tx_queue_state[queue_id],
this is not the recommended way to access it. So this patch
add get queue state when call rte_eth_rx_queue_info_get and
rte_eth_tx_queue_info_get API.

Note: The hairpin queue is not supported with above
rte_eth_*x_queue_info_get, so the queue state could be
RTE_ETH_QUEUE_STATE_STARTED or RTE_ETH_QUEUE_STATE_STOPPED.
Note: After add queue_state field, the 'struct rte_eth_rxq_info' size
remains 128B, and the 'struct rte_eth_txq_info' size remains 64B, so
it could be ABI compatible.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
Signed-off-by: Lijun Ou <oulijun@huawei.com>
---
V1->V2:
- move queue state defines to public file
---
 doc/guides/rel_notes/release_21_05.rst |  6 ++++++
 lib/librte_ethdev/ethdev_driver.h      |  7 -------
 lib/librte_ethdev/rte_ethdev.c         |  3 +++
 lib/librte_ethdev/rte_ethdev.h         | 11 +++++++++++
 4 files changed, 20 insertions(+), 7 deletions(-)

diff --git a/doc/guides/rel_notes/release_21_05.rst b/doc/guides/rel_notes/release_21_05.rst
index 22aa80a..503daf9 100644
--- a/doc/guides/rel_notes/release_21_05.rst
+++ b/doc/guides/rel_notes/release_21_05.rst
@@ -164,6 +164,12 @@ ABI Changes
 
 * No ABI change that would break compatibility with 20.11.
 
+* Added new field ``queue_state`` to ``rte_eth_rxq_info`` structure
+  to provide indicated rxq queue state.
+
+* Added new field ``queue_state`` to ``rte_eth_txq_info`` structure
+  to provide indicated txq queue state.
+
 
 Known Issues
 ------------
diff --git a/lib/librte_ethdev/ethdev_driver.h b/lib/librte_ethdev/ethdev_driver.h
index cdd4b43..ec5a17d 100644
--- a/lib/librte_ethdev/ethdev_driver.h
+++ b/lib/librte_ethdev/ethdev_driver.h
@@ -970,13 +970,6 @@ struct eth_dev_ops {
 };
 
 /**
- * RX/TX queue states
- */
-#define RTE_ETH_QUEUE_STATE_STOPPED 0
-#define RTE_ETH_QUEUE_STATE_STARTED 1
-#define RTE_ETH_QUEUE_STATE_HAIRPIN 2
-
-/**
  * @internal
  * Check if the selected Rx queue is hairpin queue.
  *
diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
index 3059aa5..fbd10b2 100644
--- a/lib/librte_ethdev/rte_ethdev.c
+++ b/lib/librte_ethdev/rte_ethdev.c
@@ -5042,6 +5042,8 @@ rte_eth_rx_queue_info_get(uint16_t port_id, uint16_t queue_id,
 
 	memset(qinfo, 0, sizeof(*qinfo));
 	dev->dev_ops->rxq_info_get(dev, queue_id, qinfo);
+	qinfo->queue_state = dev->data->rx_queue_state[queue_id];
+
 	return 0;
 }
 
@@ -5082,6 +5084,7 @@ rte_eth_tx_queue_info_get(uint16_t port_id, uint16_t queue_id,
 
 	memset(qinfo, 0, sizeof(*qinfo));
 	dev->dev_ops->txq_info_get(dev, queue_id, qinfo);
+	qinfo->queue_state = dev->data->tx_queue_state[queue_id];
 
 	return 0;
 }
diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
index efda313..4f0b1b2 100644
--- a/lib/librte_ethdev/rte_ethdev.h
+++ b/lib/librte_ethdev/rte_ethdev.h
@@ -1582,6 +1582,13 @@ struct rte_eth_dev_info {
 };
 
 /**
+ * RX/TX queue states
+ */
+#define RTE_ETH_QUEUE_STATE_STOPPED 0
+#define RTE_ETH_QUEUE_STATE_STARTED 1
+#define RTE_ETH_QUEUE_STATE_HAIRPIN 2
+
+/**
  * Ethernet device RX queue information structure.
  * Used to retrieve information about configured queue.
  */
@@ -1591,6 +1598,8 @@ struct rte_eth_rxq_info {
 	uint8_t scattered_rx;       /**< scattered packets RX supported. */
 	uint16_t nb_desc;           /**< configured number of RXDs. */
 	uint16_t rx_buf_size;       /**< hardware receive buffer size. */
+	/**< Queues state: STARTED(1) / STOPPED(0). */
+	uint8_t queue_state;
 } __rte_cache_min_aligned;
 
 /**
@@ -1600,6 +1609,8 @@ struct rte_eth_rxq_info {
 struct rte_eth_txq_info {
 	struct rte_eth_txconf conf; /**< queue config parameters. */
 	uint16_t nb_desc;           /**< configured number of TXDs. */
+	/**< Queues state: STARTED(1) / STOPPED(0). */
+	uint8_t queue_state;
 } __rte_cache_min_aligned;
 
 /* Generic Burst mode flag definition, values can be ORed. */
-- 
2.7.4


^ permalink raw reply	[relevance 13%]

* Re: [dpdk-dev] [PATCH 1/7] common/octeontx: enable build only on 64bit Linux
  2021-03-25 10:58  4%       ` Kinsella, Ray
@ 2021-03-25 11:03  0%         ` Thomas Monjalon
  2021-03-25 12:46  4%           ` Jerin Jacob
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2021-03-25 11:03 UTC (permalink / raw)
  To: Pavan Nikhilesh, Jerin Jacob, Kinsella, Ray
  Cc: Jerin Jacob, dev, Harman Kalra, Nithin Dabilpuram, david.marchand

25/03/2021 11:58, Kinsella, Ray:
> On 25/03/2021 10:46, Thomas Monjalon wrote:
> > 25/03/2021 11:42, Thomas Monjalon:
> >> 24/03/2021 11:55, Jerin Jacob:
> >>> On Thu, Feb 25, 2021 at 10:33 PM <pbhagavatula@marvell.com> wrote:
> >>>>
> >>>> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
> >>>>
> >>>> Due to Linux kernel dependency, only enable build for 64bit Linux.
> >>>>
> >>>> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
> >>>
> >>> Series Acked-by: Jerin Jacob <jerinj@marvell.com>
> >>
> >> I've reorganized the commits per family of drivers,
> >> so it makes more sense than grouping per driver class
> >> with "common/octeontx" for title for all:
> >>
> >> net/thunderx: enable build only on 64-bit Linux
> >> common/octeontx: enable build only on 64-bit Linux
> >> common/octeontx2: enable build only on 64-bit Linux
> >>
> >> and applied.
> > 
> > Actually not applied yet.
> > I'm not sure what to do for the ABI check which is broken
> > because some drivers are not compiled anymore in 32-bit build.
> > I've workarounded locally by removing the dump files in the reference build.
> > Should we add an exception in libabigail.abignore?
> > 
> In the past we said that depreciating HW support would be considered to be same as an ABI Breakage.
> 
> From the policy ... 
> "Updates to the minimum hardware requirements, which drop support for hardware which was previously supported, should be treated as an ABI change."

So the patches should wait 21.11.
Everybody agree?



^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 1/7] common/octeontx: enable build only on 64bit Linux
  2021-03-25 10:46  3%     ` Thomas Monjalon
@ 2021-03-25 10:58  4%       ` Kinsella, Ray
  2021-03-25 11:03  0%         ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Kinsella, Ray @ 2021-03-25 10:58 UTC (permalink / raw)
  To: Thomas Monjalon, Pavan Nikhilesh, Jerin Jacob
  Cc: Jerin Jacob, dev, Harman Kalra, Nithin Dabilpuram, david.marchand



On 25/03/2021 10:46, Thomas Monjalon wrote:
> 25/03/2021 11:42, Thomas Monjalon:
>> 24/03/2021 11:55, Jerin Jacob:
>>> On Thu, Feb 25, 2021 at 10:33 PM <pbhagavatula@marvell.com> wrote:
>>>>
>>>> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
>>>>
>>>> Due to Linux kernel dependency, only enable build for 64bit Linux.
>>>>
>>>> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
>>>
>>> Series Acked-by: Jerin Jacob <jerinj@marvell.com>
>>
>> I've reorganized the commits per family of drivers,
>> so it makes more sense than grouping per driver class
>> with "common/octeontx" for title for all:
>>
>> net/thunderx: enable build only on 64-bit Linux
>> common/octeontx: enable build only on 64-bit Linux
>> common/octeontx2: enable build only on 64-bit Linux
>>
>> and applied.
> 
> Actually not applied yet.
> I'm not sure what to do for the ABI check which is broken
> because some drivers are not compiled anymore in 32-bit build.
> I've workarounded locally by removing the dump files in the reference build.
> Should we add an exception in libabigail.abignore?
> 
In the past we said that depreciating HW support would be considered to be same as an ABI Breakage.

From the policy ... 
"Updates to the minimum hardware requirements, which drop support for hardware which was previously supported, should be treated as an ABI change."


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH 1/7] common/octeontx: enable build only on 64bit Linux
  @ 2021-03-25 10:46  3%     ` Thomas Monjalon
  2021-03-25 10:58  4%       ` Kinsella, Ray
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2021-03-25 10:46 UTC (permalink / raw)
  To: Pavan Nikhilesh, Jerin Jacob, Ray Kinsella
  Cc: Jerin Jacob, dev, Harman Kalra, Nithin Dabilpuram, david.marchand

25/03/2021 11:42, Thomas Monjalon:
> 24/03/2021 11:55, Jerin Jacob:
> > On Thu, Feb 25, 2021 at 10:33 PM <pbhagavatula@marvell.com> wrote:
> > >
> > > From: Pavan Nikhilesh <pbhagavatula@marvell.com>
> > >
> > > Due to Linux kernel dependency, only enable build for 64bit Linux.
> > >
> > > Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
> > 
> > Series Acked-by: Jerin Jacob <jerinj@marvell.com>
> 
> I've reorganized the commits per family of drivers,
> so it makes more sense than grouping per driver class
> with "common/octeontx" for title for all:
> 
> net/thunderx: enable build only on 64-bit Linux
> common/octeontx: enable build only on 64-bit Linux
> common/octeontx2: enable build only on 64-bit Linux
> 
> and applied.

Actually not applied yet.
I'm not sure what to do for the ABI check which is broken
because some drivers are not compiled anymore in 32-bit build.
I've workarounded locally by removing the dump files in the reference build.
Should we add an exception in libabigail.abignore?



^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
  2021-03-25 10:01  0%       ` oulijun
@ 2021-03-25 10:18  0%         ` Ananyev, Konstantin
  0 siblings, 0 replies; 200+ results
From: Ananyev, Konstantin @ 2021-03-25 10:18 UTC (permalink / raw)
  To: oulijun, Andrew Rybchenko, Yigit, Ferruh, thomas
  Cc: dev, linuxarm, Andrew Rybchenko, David Marchand, Ray Kinsella,
	Luca Boccassi


> 
> 
> 在 2021/3/22 23:45, Ananyev, Konstantin 写道:
> >
> >
> >> -----Original Message-----
> >> From: dev <dev-bounces@dpdk.org> On Behalf Of Andrew Rybchenko
> >> Sent: Monday, March 22, 2021 2:49 PM
> >> To: Yigit, Ferruh <ferruh.yigit@intel.com>; Lijun Ou <oulijun@huawei.com>; thomas@monjalon.net
> >> Cc: dev@dpdk.org; linuxarm@openeuler.org; Andrew Rybchenko <arybchenko@solarflare.com>; David Marchand
> >> <david.marchand@redhat.com>; Ray Kinsella <mdr@ashroe.eu>; Luca Boccassi <bluca@debian.org>
> >> Subject: Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
> >>
> >> On 3/22/21 12:22 PM, Ferruh Yigit wrote:
> >>> On 3/18/2021 12:25 PM, Lijun Ou wrote:
> >>>> Currently, upper-layer application could get queue state only
> >>>> through pointers such as dev->data->tx_queue_state[queue_id],
> >>>> this is not the recommended way to access it. So this patch
> >>>> add get queue state when call rte_eth_rx_queue_info_get and
> >>>> rte_eth_tx_queue_info_get API.
> >>>>
> >>>> Note: The hairpin queue is not supported with above
> >>>> rte_eth_*x_queue_info_get, so the queue state could be
> >>>> RTE_ETH_QUEUE_STATE_STARTED or RTE_ETH_QUEUE_STATE_STOPPED.
> >>>> Note: After add queue_state field, the 'struct rte_eth_rxq_info' size
> >>>> remains 128B, and the 'struct rte_eth_txq_info' size remains 64B, so
> >>>> it could be ABI compatible.
> >>>>
> >>>> Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
> >>>> Signed-off-by: Lijun Ou <oulijun@huawei.com>
> >>>
> >>> <...>
> >>>
> >>>> diff --git a/lib/librte_ethdev/rte_ethdev.h
> >>>> b/lib/librte_ethdev/rte_ethdev.h
> >>>> index efda313..3b83c5a 100644
> >>>> --- a/lib/librte_ethdev/rte_ethdev.h
> >>>> +++ b/lib/librte_ethdev/rte_ethdev.h
> >>>> @@ -1591,6 +1591,8 @@ struct rte_eth_rxq_info {
> >>>>        uint8_t scattered_rx;       /**< scattered packets RX supported. */
> >>>>        uint16_t nb_desc;           /**< configured number of RXDs. */
> >>>>        uint16_t rx_buf_size;       /**< hardware receive buffer size. */
> >>>> +    /**< Queues state: STARTED(1) / STOPPED(0). */
> >>>> +    uint8_t queue_state;
> >>>>    } __rte_cache_min_aligned;
> >>>>      /**
> >>>> @@ -1600,6 +1602,8 @@ struct rte_eth_rxq_info {
> >>>>    struct rte_eth_txq_info {
> >>>>        struct rte_eth_txconf conf; /**< queue config parameters. */
> >>>>        uint16_t nb_desc;           /**< configured number of TXDs. */
> >>>> +    /**< Queues state: STARTED(1) / STOPPED(0). */
> >>>> +    uint8_t queue_state;
> >>>>    } __rte_cache_min_aligned;
> >>>>      /* Generic Burst mode flag definition, values can be ORed. */
> >>>>
> >>>
> >>> This is causing an ABI warning [1], but I guess it is safe since the
> >>> size of the struct is not changing (cache align). Adding a few more
> >>> people to comment.
> >>>
> >>>
> >>> [1]
> >>> https://travis-ci.com/github/ovsrobot/dpdk/builds/220497651
> >>
> >> Frankly speaking I dislike addition of queue_state as uint8_t.
> >> IMHO it should be either 'bool started' or enum to support more
> >> states in the future if we need.
> >
> > I think we already have set of defines for it:
> > lib/librte_ethdev/rte_ethdev_driver.h:925:#define RTE_ETH_QUEUE_STATE_STOPPED 0
> > lib/librte_ethdev/rte_ethdev_driver.h:926:#define RTE_ETH_QUEUE_STATE_STARTED 1
> > lib/librte_ethdev/rte_ethdev_driver.h:927:#define RTE_ETH_QUEUE_STATE_HAIRPIN 2
> At the latest date, the rte_ethdev_driver.h file does not exist.

Yep, It was renamed to ethdev_driver.h.
But the defines are still there.

> >
> > If we want to publish it, then might be enough just move these macros to rte_ethdev.h or so.
> >
> > About uint8_t vs enum - yes, in principle enum would be a bit nicer,
> > but right now rte_eth_dev_data.(rx|tx)_queue_state[]  itself is an array of uint8_t.
> > So probably not much point to waste extra 3B in rte_eth_(rxq|txq)_info.
> > Unless in future will want to change it in struct rte_eth_dev_data too
> > (or even hide it inside dev private queue data).
> >
> >
> >

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
  2021-03-22 15:45  0%     ` Ananyev, Konstantin
  2021-03-22 16:02  0%       ` Andrew Rybchenko
@ 2021-03-25 10:01  0%       ` oulijun
  2021-03-25 10:18  0%         ` Ananyev, Konstantin
  1 sibling, 1 reply; 200+ results
From: oulijun @ 2021-03-25 10:01 UTC (permalink / raw)
  To: Ananyev, Konstantin, Andrew Rybchenko, Yigit, Ferruh, thomas
  Cc: dev, linuxarm, Andrew Rybchenko, David Marchand, Ray Kinsella,
	Luca Boccassi



在 2021/3/22 23:45, Ananyev, Konstantin 写道:
> 
> 
>> -----Original Message-----
>> From: dev <dev-bounces@dpdk.org> On Behalf Of Andrew Rybchenko
>> Sent: Monday, March 22, 2021 2:49 PM
>> To: Yigit, Ferruh <ferruh.yigit@intel.com>; Lijun Ou <oulijun@huawei.com>; thomas@monjalon.net
>> Cc: dev@dpdk.org; linuxarm@openeuler.org; Andrew Rybchenko <arybchenko@solarflare.com>; David Marchand
>> <david.marchand@redhat.com>; Ray Kinsella <mdr@ashroe.eu>; Luca Boccassi <bluca@debian.org>
>> Subject: Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
>>
>> On 3/22/21 12:22 PM, Ferruh Yigit wrote:
>>> On 3/18/2021 12:25 PM, Lijun Ou wrote:
>>>> Currently, upper-layer application could get queue state only
>>>> through pointers such as dev->data->tx_queue_state[queue_id],
>>>> this is not the recommended way to access it. So this patch
>>>> add get queue state when call rte_eth_rx_queue_info_get and
>>>> rte_eth_tx_queue_info_get API.
>>>>
>>>> Note: The hairpin queue is not supported with above
>>>> rte_eth_*x_queue_info_get, so the queue state could be
>>>> RTE_ETH_QUEUE_STATE_STARTED or RTE_ETH_QUEUE_STATE_STOPPED.
>>>> Note: After add queue_state field, the 'struct rte_eth_rxq_info' size
>>>> remains 128B, and the 'struct rte_eth_txq_info' size remains 64B, so
>>>> it could be ABI compatible.
>>>>
>>>> Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
>>>> Signed-off-by: Lijun Ou <oulijun@huawei.com>
>>>
>>> <...>
>>>
>>>> diff --git a/lib/librte_ethdev/rte_ethdev.h
>>>> b/lib/librte_ethdev/rte_ethdev.h
>>>> index efda313..3b83c5a 100644
>>>> --- a/lib/librte_ethdev/rte_ethdev.h
>>>> +++ b/lib/librte_ethdev/rte_ethdev.h
>>>> @@ -1591,6 +1591,8 @@ struct rte_eth_rxq_info {
>>>>        uint8_t scattered_rx;       /**< scattered packets RX supported. */
>>>>        uint16_t nb_desc;           /**< configured number of RXDs. */
>>>>        uint16_t rx_buf_size;       /**< hardware receive buffer size. */
>>>> +    /**< Queues state: STARTED(1) / STOPPED(0). */
>>>> +    uint8_t queue_state;
>>>>    } __rte_cache_min_aligned;
>>>>      /**
>>>> @@ -1600,6 +1602,8 @@ struct rte_eth_rxq_info {
>>>>    struct rte_eth_txq_info {
>>>>        struct rte_eth_txconf conf; /**< queue config parameters. */
>>>>        uint16_t nb_desc;           /**< configured number of TXDs. */
>>>> +    /**< Queues state: STARTED(1) / STOPPED(0). */
>>>> +    uint8_t queue_state;
>>>>    } __rte_cache_min_aligned;
>>>>      /* Generic Burst mode flag definition, values can be ORed. */
>>>>
>>>
>>> This is causing an ABI warning [1], but I guess it is safe since the
>>> size of the struct is not changing (cache align). Adding a few more
>>> people to comment.
>>>
>>>
>>> [1]
>>> https://travis-ci.com/github/ovsrobot/dpdk/builds/220497651
>>
>> Frankly speaking I dislike addition of queue_state as uint8_t.
>> IMHO it should be either 'bool started' or enum to support more
>> states in the future if we need.
> 
> I think we already have set of defines for it:
> lib/librte_ethdev/rte_ethdev_driver.h:925:#define RTE_ETH_QUEUE_STATE_STOPPED 0
> lib/librte_ethdev/rte_ethdev_driver.h:926:#define RTE_ETH_QUEUE_STATE_STARTED 1
> lib/librte_ethdev/rte_ethdev_driver.h:927:#define RTE_ETH_QUEUE_STATE_HAIRPIN 2
At the latest date, the rte_ethdev_driver.h file does not exist.
> 
> If we want to publish it, then might be enough just move these macros to rte_ethdev.h or so.
> 
> About uint8_t vs enum - yes, in principle enum would be a bit nicer,
> but right now rte_eth_dev_data.(rx|tx)_queue_state[]  itself is an array of uint8_t.
> So probably not much point to waste extra 3B in rte_eth_(rxq|txq)_info.
> Unless in future will want to change it in struct rte_eth_dev_data too
> (or even hide it inside dev private queue data).
>    
> 
> 

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v3 00/10] eal: Add new API for threading
  2021-03-23  0:20  2%   ` [dpdk-dev] [PATCH v2 00/10] eal: Add new API for threading Narcisa Ana Maria Vasile
@ 2021-03-25  3:46  2%     ` Narcisa Ana Maria Vasile
  0 siblings, 0 replies; 200+ results
From: Narcisa Ana Maria Vasile @ 2021-03-25  3:46 UTC (permalink / raw)
  To: dev, thomas, dmitry.kozliuk, khot, navasile, dmitrym, roretzla,
	talshn, ocardona
  Cc: bruce.richardson, david.marchand, pallavi.kadam

From: Narcisa Vasile <navasile@microsoft.com>

EAL thread API

**Problem Statement**
DPDK currently uses the pthread interface to create and manage threads.
Windows does not support the POSIX thread programming model, so it currently
relies on a header file that hides the Windows calls under
pthread matched interfaces. Given that EAL should isolate the environment
specifics from the applications and libraries and mediate
all the communication with the operating systems, a new EAL interface
is needed for thread management.

**Goals**
* Introduce a generic EAL API for threading support that will remove
  the current Windows pthread.h shim.
* Replace references to pthread_* across the DPDK codebase with the new
  RTE_THREAD_* API.
* Allow users to choose between using the RTE_THREAD_* API or a
  3rd party thread library through a configuration option.

**Design plan**
New API main files:
* rte_thread.h (librte_eal/include)
* rte_thread_types.h (librte_eal/include)
* rte_thread_windows_types.h (librte_eal/windows/include)
* rte_thread.c (librte_eal/windows)
* rte_thread.c (librte_eal/common)

For flexibility, the user is offered the option of either using the RTE_THREAD_* API or
a 3rd party thread library, through a meson flag “use_external_thread_lib”.
By default, this flag is set to FALSE, which means Windows libraries and applications
will use the RTE_THREAD_* API for managing threads.

If compiling on Windows and the “use_external_thread_lib” is *not* set,
the following files will be parsed: 
* include/rte_thread.h
* windows/include/rte_thread_windows_types.h
* windows/rte_thread.c
In all other cases, the compilation/parsing includes the following files:
* include/rte_thread.h 
* include/rte_thread_types.h
* common/rte_thread.c

**A schematic example of the design**
--------------------------------------------------
lib/librte_eal/include/rte_thread.h
int rte_thread_create();

lib/librte_eal/common/rte_thread.c
int rte_thread_create() 
{
	return pthread_create();
}

lib/librte_eal/windows/rte_thread.c
int rte_thread_create() 
{
	return CreateThread();
}

lib/librte_eal/windows/meson.build
if get_option('use_external_thread_lib')
	sources += 'librte_eal/common/rte_thread.c'
else
	sources += 'librte_eal/windows/rte_thread.c'
endif
-----------------------------------------------------

**Thread attributes**

When or after a thread is created, specific characteristics of the thread
can be adjusted. Given that the thread characteristics that are of interest
for DPDK applications are affinity and priority, the following structure
that represents thread attributes has been defined:

typedef struct
{
	enum rte_thread_priority priority;
	rte_cpuset_t cpuset;
} rte_thread_attr_t;

The *rte_thread_create()* function can optionally receive an rte_thread_attr_t
object that will cause the thread to be created with the affinity and priority
described by the attributes object. If no rte_thread_attr_t is passed
(parameter is NULL), the default affinity and priority are used.
An rte_thread_attr_t object can also be set to the default values
by calling *rte_thread_attr_init()*.

*Priority* is represented through an enum that currently advertises
two values for priority:
	- RTE_THREAD_PRIORITY_NORMAL
	- RTE_THREAD_PRIORITY_REALTIME_CRITICAL
The enum can be extended to allow for multiple priority levels.
rte_thread_set_priority      - sets the priority of a thread
rte_thread_attr_set_priority - updates an rte_thread_attr_t object
                               with a new value for priority

The user can choose thread priority through an EAL parameter,
when starting an application. The two options above are available:

 --thread-prio normal
 --thread-prio realtime
 
Example:
./dpdk-l2fwd -l 0-3 -n 4 –thread-prio normal -- -q 8 -p ffff

*Affinity* is described by the already known “rte_cpuset_t” type.
rte_thread_attr_set/get_affinity - sets/gets the affinity field in a
                                   rte_thread_attr_t object
rte_thread_set/get_affinity      – sets/gets the affinity of a thread

**Errors**
A translation function that maps Windows error codes to errno-style
error codes is provided. 

**Future work**
Note that this patchset was focused on introducing new API that will
remove the Windows pthread.h shim. In DPDK, there are still a few references
to pthread_* that were not implemented in the shim.
The long term plan is for EAL to provide full threading support:
* Adding support for conditional variables
* Additional functionality offered by pthread_* (such as pthread_setname_np, etc.)
* Static mutex initializers are not used on Windows. If we must continue
  using them, they need to be platform dependent and an implementation will
  need to be provided for Windows.

v3:
- rebase

v2:
- revert changes that break ABI 
- break up changes into smaller patches
- fix coding style issues
- fix issues with errors
- fix parameter type in examples/kni.c

Narcisa Vasile (10):
  eal: add thread id and simple thread functions
  eal: add thread attributes
  windows/eal: translate Windows errors to errno-style errors
  eal: implement functions for thread affinity management
  eal: implement thread priority management functions
  eal: add thread lifetime management
  eal: implement functions for mutex management
  eal: implement functions for thread barrier management
  eal: add EAL argument for setting thread priority
  Enable the new EAL thread API

 app/test/process.h                            |   6 +-
 app/test/test_lcores.c                        |  16 +-
 app/test/test_link_bonding.c                  |  10 +-
 app/test/test_lpm_perf.c                      |  12 +-
 config/meson.build                            |   4 +
 drivers/bus/dpaa/base/qbman/bman_driver.c     |   6 +-
 drivers/bus/dpaa/base/qbman/dpaa_sys.c        |  14 +-
 drivers/bus/dpaa/base/qbman/process.c         |   6 +-
 drivers/bus/fslmc/portal/dpaa2_hw_dpio.c      |   6 +-
 drivers/compress/mlx5/mlx5_compress.c         |  10 +-
 drivers/event/dlb/pf/base/dlb_osdep.h         |   2 +-
 drivers/event/dlb2/pf/base/dlb2_osdep.h       |   2 +-
 drivers/net/af_xdp/rte_eth_af_xdp.c           |  18 +-
 drivers/net/ark/ark_ethdev.c                  |   4 +-
 drivers/net/atlantic/atl_ethdev.c             |   4 +-
 drivers/net/atlantic/atl_types.h              |   5 +-
 .../net/atlantic/hw_atl/hw_atl_utils_fw2x.c   |  24 +-
 drivers/net/axgbe/axgbe_dev.c                 |   8 +-
 drivers/net/axgbe/axgbe_ethdev.c              |   8 +-
 drivers/net/axgbe/axgbe_ethdev.h              |   8 +-
 drivers/net/axgbe/axgbe_i2c.c                 |   4 +-
 drivers/net/axgbe/axgbe_mdio.c                |   8 +-
 drivers/net/axgbe/axgbe_phy_impl.c            |   6 +-
 drivers/net/bnxt/bnxt.h                       |  16 +-
 drivers/net/bnxt/bnxt_cpr.c                   |   4 +-
 drivers/net/bnxt/bnxt_ethdev.c                |  52 +-
 drivers/net/bnxt/bnxt_irq.c                   |   8 +-
 drivers/net/bnxt/bnxt_reps.c                  |  10 +-
 drivers/net/bnxt/tf_ulp/bnxt_ulp.c            |  34 +-
 drivers/net/bnxt/tf_ulp/bnxt_ulp.h            |   4 +-
 drivers/net/bnxt/tf_ulp/ulp_fc_mgr.c          |  24 +-
 drivers/net/bnxt/tf_ulp/ulp_fc_mgr.h          |   2 +-
 drivers/net/ena/base/ena_plat_dpdk.h          |   8 +-
 drivers/net/enic/enic.h                       |   2 +-
 drivers/net/hns3/hns3_ethdev.h                |   2 +-
 drivers/net/hns3/hns3_ethdev_vf.c             |   2 +-
 drivers/net/hns3/hns3_mbx.c                   |   2 +-
 drivers/net/ice/ice_dcf_parent.c              |   4 +-
 drivers/net/ipn3ke/ipn3ke_representor.c       |   6 +-
 drivers/net/ixgbe/ixgbe_ethdev.c              |   2 +-
 drivers/net/ixgbe/ixgbe_ethdev.h              |   2 +-
 drivers/net/kni/rte_eth_kni.c                 |   6 +-
 drivers/net/mlx5/linux/mlx5_os.c              |   2 +-
 drivers/net/mlx5/mlx5.c                       |  20 +-
 drivers/net/mlx5/mlx5.h                       |   2 +-
 drivers/net/mlx5/mlx5_txpp.c                  |   8 +-
 drivers/net/mlx5/windows/mlx5_flow_os.c       |  10 +-
 drivers/net/mlx5/windows/mlx5_os.c            |   2 +-
 drivers/net/qede/base/bcm_osal.h              |   8 +-
 drivers/net/vhost/rte_eth_vhost.c             |  22 +-
 .../net/virtio/virtio_user/virtio_user_dev.c  |  30 +-
 .../net/virtio/virtio_user/virtio_user_dev.h  |   2 +-
 drivers/raw/ifpga/ifpga_rawdev.c              |   8 +-
 drivers/vdpa/ifc/ifcvf_vdpa.c                 |  36 +-
 drivers/vdpa/mlx5/mlx5_vdpa.c                 |  24 +-
 drivers/vdpa/mlx5/mlx5_vdpa.h                 |   6 +-
 drivers/vdpa/mlx5/mlx5_vdpa_event.c           |  67 +--
 examples/kni/main.c                           |   6 +-
 examples/vhost/main.c                         |   2 +-
 examples/vhost_blk/vhost_blk.c                |  10 +-
 lib/librte_eal/common/eal_common_options.c    |  36 +-
 lib/librte_eal/common/eal_common_proc.c       |  48 +-
 lib/librte_eal/common/eal_common_thread.c     |  43 +-
 lib/librte_eal/common/eal_common_trace.c      |   2 +-
 lib/librte_eal/common/eal_internal_cfg.h      |   2 +
 lib/librte_eal/common/eal_options.h           |   2 +
 lib/librte_eal/common/eal_private.h           |   2 +-
 lib/librte_eal/common/malloc_mp.c             |  32 +-
 lib/librte_eal/common/meson.build             |   1 +
 lib/librte_eal/common/rte_thread.c            | 342 ++++++++++++
 lib/librte_eal/freebsd/eal.c                  |  37 +-
 lib/librte_eal/freebsd/eal_alarm.c            |  12 +-
 lib/librte_eal/freebsd/eal_interrupts.c       |   4 +-
 lib/librte_eal/freebsd/eal_thread.c           |   8 +-
 lib/librte_eal/include/meson.build            |   1 +
 lib/librte_eal/include/rte_lcore.h            |   8 +-
 lib/librte_eal/include/rte_per_lcore.h        |   2 -
 lib/librte_eal/include/rte_thread.h           | 333 ++++++++++-
 lib/librte_eal/include/rte_thread_types.h     |  20 +
 lib/librte_eal/linux/eal.c                    |  42 +-
 lib/librte_eal/linux/eal_alarm.c              |  10 +-
 lib/librte_eal/linux/eal_interrupts.c         |   4 +-
 lib/librte_eal/linux/eal_thread.c             |   8 +-
 lib/librte_eal/linux/eal_timer.c              |   2 +-
 lib/librte_eal/rte_eal_exports.def            |  19 +
 lib/librte_eal/unix/meson.build               |   1 -
 lib/librte_eal/unix/rte_thread.c              |  86 ---
 lib/librte_eal/version.map                    |  21 +
 lib/librte_eal/windows/eal.c                  |  26 +-
 lib/librte_eal/windows/eal_interrupts.c       |   6 +-
 lib/librte_eal/windows/eal_lcore.c            | 170 ++++--
 lib/librte_eal/windows/eal_thread.c           |  24 +-
 lib/librte_eal/windows/eal_windows.h          |  20 +-
 lib/librte_eal/windows/include/meson.build    |   1 +
 lib/librte_eal/windows/include/pthread.h      | 186 -------
 .../include/rte_windows_thread_types.h        |  19 +
 lib/librte_eal/windows/include/sched.h        |   2 +-
 lib/librte_eal/windows/meson.build            |   7 +-
 lib/librte_eal/windows/rte_thread.c           | 516 +++++++++++++++++-
 lib/librte_ethdev/rte_ethdev.c                |   4 +-
 lib/librte_ethdev/rte_ethdev_core.h           |   3 +-
 lib/librte_ethdev/rte_flow.c                  |   4 +-
 .../rte_event_eth_rx_adapter.c                |   6 +-
 lib/librte_vhost/fd_man.c                     |  40 +-
 lib/librte_vhost/fd_man.h                     |   6 +-
 lib/librte_vhost/socket.c                     | 124 ++---
 lib/librte_vhost/vhost.c                      |  10 +-
 meson_options.txt                             |   2 +
 108 files changed, 2039 insertions(+), 911 deletions(-)
 create mode 100644 lib/librte_eal/common/rte_thread.c
 create mode 100644 lib/librte_eal/include/rte_thread_types.h
 delete mode 100644 lib/librte_eal/unix/rte_thread.c
 delete mode 100644 lib/librte_eal/windows/include/pthread.h
 create mode 100644 lib/librte_eal/windows/include/rte_windows_thread_types.h

-- 
2.30.0.vfs.0.2


^ permalink raw reply	[relevance 2%]

* Re: [dpdk-dev] [PATCH v3 0/8] eal: cleanup resources on shutdown
  @ 2021-03-24 21:30  0%     ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2021-03-24 21:30 UTC (permalink / raw)
  To: Stephen Hemminger
  Cc: dev, David Marchand, ferruh.yigit, bruce.richardson, andrew.rybchenko

Ping

20/10/2020 00:24, Thomas Monjalon:
> That's a pity this patchset is not concluded.
> Please Stephen, could you respin with a fix?
> 
> 
> 03/05/2020 19:21, David Marchand:
> > On Wed, Apr 29, 2020 at 1:58 AM Stephen Hemminger
> > <stephen@networkplumber.org> wrote:
> > >
> > > Started using valgrind with DPDK, and there are lots of leftover
> > > memory and file descriptors. This makes it hard to find application
> > > leaks versus DPDK leaks.
> > >
> > > The DPDK has a function that applications can use to tell it
> > > to cleanup resources on shutdown (rte_eal_cleanup). But the
> > > current coverage of that API is spotty. Many internal parts of
> > > DPDK leave files and allocated memory behind.
> > >
> > > This patch set is a first step at getting the sub-parts of
> > > DPDK to cleanup after themselves. These are the easier ones,
> > > the harder and more critical ones are in the drivers
> > > and the memory subsystem.
> > >
> > > There are no new exposed API or ABI changes here.
> > >
> > > v3
> > >  - fix a couple of minor checkpatch complaints
> > >
> > > v2
> > >  - rebase after 20.05 file renames
> > >  - incorporate review comment feedback
> > >  - hold off some of the more involved patches for later
> > 
> > Same segfault as v1.
> > 
> > $ ./devtools/test-null.sh ./build/app/dpdk-testpmd 0x3 --plop
> > ./build/app/dpdk-testpmd: unrecognized option '--plop'
> > EAL: Detected 8 lcore(s)
> > EAL: Detected 1 NUMA nodes
> > 
> > Usage: ./build/app/dpdk-testpmd [options]
> > 
> > (snip)
> > 
> > EAL: FATAL: Invalid 'command line' arguments.
> > EAL: Invalid 'command line' arguments.
> > EAL: Error - exiting with code: 1
> >   Cause: Cannot init EAL: Invalid argument
> > ./devtools/test-null.sh: line 32: 23134 Broken pipe             (
> > sleep 1 && echo stop )
> >      23135 Segmentation fault      (core dumped) | $testpmd -c
> > $coremask --no-huge -m 20 $libs -w 0:0.0 --vdev net_null1 --vdev
> > net_null2 $eal_options -- --no-mlockall --total-num-mbufs=2048
> > $testpmd_options -ia
> > 
> > 
> > 
> 
> 
> 
> 
> 
> 






^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v6 0/8] Introduce event vectorization
  2021-03-24  5:05  4%       ` [dpdk-dev] [PATCH v5 " pbhagavatula
  2021-03-24  5:39  0%         ` Jayatheerthan, Jay
@ 2021-03-24 19:28  4%         ` pbhagavatula
  2021-03-25 17:10  4%           ` [dpdk-dev] [PATCH v7 " pbhagavatula
  1 sibling, 1 reply; 200+ results
From: pbhagavatula @ 2021-03-24 19:28 UTC (permalink / raw)
  To: jerinj, jay.jayatheerthan, erik.g.carrillo, abhinandan.gujjar,
	timothy.mcdaniel, hemant.agrawal, harry.van.haaren,
	mattias.ronnblom, liang.j.ma
  Cc: dev, Pavan Nikhilesh

From: Pavan Nikhilesh <pbhagavatula@marvell.com>

In traditional event programming model, events are identified by a
flow-id and a uintptr_t. The flow-id uniquely identifies a given event
and determines the order of scheduling based on schedule type, the
uintptr_t holds a single object.

Event devices also support burst mode with configurable dequeue depth,
i.e. each dequeue call would return multiple events and each event
might be at a different stage of the pipeline.
Having a burst of events belonging to different stages in a dequeue
burst is not only difficult to vectorize but also increases the scheduler
overhead and application overhead of pipelining events further.
Using event vectors we see a performance gain of ~742.3% as shown in [1].

By introducing event vectorization, each event will be capable of holding
multiple uintptr_t of the same flow thereby allowing applications
to vectorize their pipeline and reduce the complexity of pipelining
events across multiple stages. This also reduces the complexity of handling
enqueue and dequeue on an event device.

Since event devices are transparent to the events they are scheduling
so the event producers such as eth_rx_adapter, crypto_adapter , etc..
are responsible for vectorizing the buffers of the same flow into a single
event.

The series also breaks ABI in the patch [8/8] which is targetted to the
v21.11 release.

The dpdk-test-eventdev application has been updated with options to test
multiple vector sizes and timeouts.

[1]
As for performance improvement, with a ARM Cortex-A72 equivalent processer,
software event device (--vdev=event_sw0), single worker core, single stage
and using one service core for Rx adapter, Tx adapter, Scheduling.

Without this patchset applied:
    ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
         --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
         --stlist=a --wlcores=20
    Port[0] using Rx adapter[0] configured
    Port[0] using Tx adapter[0] Configured
    5.071 mpps

With the patchset applied and Without event vectorization:
    ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
         --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
         --stlist=a --wlcores=20
    Port[0] using Rx adapter[0] configured
    Port[0] using Tx adapter[0] Configured
    5.123 mpps

With event vectorization:
    ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
        --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
        --stlist=a --wlcores=20 --enable_vector --nb_eth_queues 1
        --vector_size 256
    Port[0] using Rx adapter[0] configured
    Port[0] using Tx adapter[0] Configured
    42.715 mpps

Having dedicated service cores for each Rx queues and tweaking the vector,
dequeue burst size would further improve performance.

API usage is shown below:

Configuration:

	struct rte_event_eth_rx_adapter_event_vector_config vec_conf;

	vector_pool = rte_event_vector_pool_create("vector_pool",
			nb_elem, 0, vector_size, socket_id);

	rte_event_eth_rx_adapter_create(id, event_id, &adptr_conf);
	rte_event_eth_rx_adapter_queue_add(id, eth_id, -1, &queue_conf);
	if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR) {
		vec_conf.vector_sz = vector_size;
		vec_conf.vector_timeout_ns = vector_tmo_nsec;
		vec_conf.vector_mp = vector_pool;
		rte_event_eth_rx_adapter_queue_event_vector_config(id,
				eth_id, -1, &vec_conf);
	}

Fastpath:

	num = rte_event_dequeue_burst(event_id, port_id, &ev, 1, 0);
	if (!num)
		continue;

	if (ev.event_type & RTE_EVENT_TYPE_VECTOR) {
		switch (ev.event_type) {
		case RTE_EVENT_TYPE_ETHDEV_VECTOR:
		case RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR:
			struct rte_mbuf **mbufs;

			mbufs = ev.vector_ev->mbufs;
			for (i = 0; i < ev.vector_ev->nb_elem; i++)
				//Process mbufs.
			break;
		case ...
		}
	}
	...

v6 Changes:
- Make rte_errno sign consistant.(Jay)
- Gramatical and doxygen fixes. (Jay)

v5 Changes:
- Make `rte_event_vector_pool_create non-inline` to ease ABI stability.(Ray)
- Move `rte_event_eth_rx_adapter_queue_event_vector_config` and
  `rte_event_eth_rx_adapter_vector_limits_get` implementation to the patch
  where they are initially defined.(Ray)
- Multiple gramatical and style fixes.(Jerin)
- Add missing release notes.(Jerin)

v4 Changes:
- Fix missing event vector structure in event structure.(Jay)

v3 Changes:
- Fix unintended formatting changes.

v2 Changes:
- Multiple gramatical and style fixes.(Jerin)
- Add parameter to define vector size in power of 2. (Jerin)
- Redo patch series w/o breaking ABI till the last patch.(David)
- Add deprication notice to announce ABI break in 21.11.(David)
- Add vector limits validation to app/test-eventdev.

Pavan Nikhilesh (8):
  eventdev: introduce event vector capability
  eventdev: introduce event vector Rx capability
  eventdev: introduce event vector Tx capability
  eventdev: add Rx adapter event vector support
  eventdev: add Tx adapter event vector support
  app/eventdev: add event vector mode in pipeline test
  doc: announce event Rx adapter config changes
  eventdev: simplify Rx adapter event vector config

 app/test-eventdev/evt_common.h                |   4 +
 app/test-eventdev/evt_options.c               |  52 +++
 app/test-eventdev/evt_options.h               |   4 +
 app/test-eventdev/test_pipeline_atq.c         | 310 +++++++++++++++--
 app/test-eventdev/test_pipeline_common.c      | 105 +++++-
 app/test-eventdev/test_pipeline_common.h      |  18 +
 app/test-eventdev/test_pipeline_queue.c       | 320 ++++++++++++++++--
 .../prog_guide/event_ethernet_rx_adapter.rst  |  38 +++
 .../prog_guide/event_ethernet_tx_adapter.rst  |  12 +
 doc/guides/prog_guide/eventdev.rst            |  36 +-
 doc/guides/rel_notes/deprecation.rst          |   9 +
 doc/guides/rel_notes/release_21_05.rst        |   8 +
 doc/guides/tools/testeventdev.rst             |  45 ++-
 lib/librte_eventdev/eventdev_pmd.h            |  31 +-
 .../rte_event_eth_rx_adapter.c                | 305 ++++++++++++++++-
 .../rte_event_eth_rx_adapter.h                |  78 +++++
 .../rte_event_eth_tx_adapter.c                |  66 +++-
 lib/librte_eventdev/rte_eventdev.c            |  53 ++-
 lib/librte_eventdev/rte_eventdev.h            | 114 ++++++-
 lib/librte_eventdev/version.map               |   4 +
 20 files changed, 1525 insertions(+), 87 deletions(-)

--
2.17.1


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH 1/2] eal: make max interrupt vector id configurable
  2021-03-24 15:25  0%       ` David Marchand
@ 2021-03-24 16:20  0%         ` Jerin Jacob
  0 siblings, 0 replies; 200+ results
From: Jerin Jacob @ 2021-03-24 16:20 UTC (permalink / raw)
  To: David Marchand
  Cc: Ray Kinsella, Pavan Nikhilesh, Harman Kalra, Thomas Monjalon,
	Jerin Jacob, Bruce Richardson, dpdk-dev

On Wed, Mar 24, 2021 at 8:56 PM David Marchand
<david.marchand@redhat.com> wrote:
>
> On Wed, Mar 24, 2021 at 1:55 PM Jerin Jacob <jerinjacobk@gmail.com> wrote:
> > > > IMO, We dont need to make it configurable and each platform sets its
> > > > value. That scheme won't work as generic distribution build will fail
> > > > to run.
> > > > Since PCIe specification defines this value and there is no
> > > > performance impact on increasing this,
> > > > IMO, We can change to 2048 as default.
> > >
> > > It probably breaks rte_intr_* ABI.
> >
> > Yes. Even though all APIs are used as a pointer (ie. "struct
> > rte_intr_handle *"), the definition
> > kept in the header file.
> >
> >
> > > struct rte_intr_handle {
> > > ...
> > >         int efds[RTE_MAX_RXTX_INTR_VEC_ID];  /**< intr vectors/efds mapping */
> > >         struct rte_epoll_event elist[RTE_MAX_RXTX_INTR_VEC_ID];
> > >                                        /**< intr vector epoll event */
> > > ...
> > >
> > >
> > > I see you need this for octeontx2, so wondering if you could handle
> > > this differently in octeontx2 drivers?
> >
> > This is an issue with any PCIe device that has more than 512 MSIX interrupts.
> >
> > The PCI spec the max is defined as 2K.
> >
> > CN10K drivers have 1K interrupt lines per PCIe device.
> >
> > I think, following are the options.
> > 1) To avoid ABI breakage  in default configuration use the existing patch
> > 2) In 21.11 break ABI and Either change to
> > a) RTE_MAX_RXTX_INTR_VEC_ID as 1024
> > or
> > b) Make it full dynamic allocation based on PCI device MSIX size on probe time.
> > That brings some kind of dependency rte_intr with PCI device. Need to
> > understand,
> > How it can clearly be abstracted out and Is it worth trouble for the
> > amount of memory.
> > Looks like the cost of one entry is 40B. So additional 512 is 40B *
> > 512 =  21KB virtual memory.
>
> Since you mentioned performance is not impacted, I guess this is
> control path only.

Yes.

> And there is no need to expose this.
> So:
>
> c) Rework API so that we don't expose such details.

Yes. That's what I meant by option (b).("Make it fully dynamic
allocation based on PCI device MSIX size on probe time.")

>
>
> --
> David Marchand
>

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 1/2] eal: make max interrupt vector id configurable
  2021-03-24 12:54  4%     ` Jerin Jacob
@ 2021-03-24 15:25  0%       ` David Marchand
  2021-03-24 16:20  0%         ` Jerin Jacob
  0 siblings, 1 reply; 200+ results
From: David Marchand @ 2021-03-24 15:25 UTC (permalink / raw)
  To: Jerin Jacob
  Cc: Ray Kinsella, Pavan Nikhilesh, Harman Kalra, Thomas Monjalon,
	Jerin Jacob, Bruce Richardson, dpdk-dev

On Wed, Mar 24, 2021 at 1:55 PM Jerin Jacob <jerinjacobk@gmail.com> wrote:
> > > IMO, We dont need to make it configurable and each platform sets its
> > > value. That scheme won't work as generic distribution build will fail
> > > to run.
> > > Since PCIe specification defines this value and there is no
> > > performance impact on increasing this,
> > > IMO, We can change to 2048 as default.
> >
> > It probably breaks rte_intr_* ABI.
>
> Yes. Even though all APIs are used as a pointer (ie. "struct
> rte_intr_handle *"), the definition
> kept in the header file.
>
>
> > struct rte_intr_handle {
> > ...
> >         int efds[RTE_MAX_RXTX_INTR_VEC_ID];  /**< intr vectors/efds mapping */
> >         struct rte_epoll_event elist[RTE_MAX_RXTX_INTR_VEC_ID];
> >                                        /**< intr vector epoll event */
> > ...
> >
> >
> > I see you need this for octeontx2, so wondering if you could handle
> > this differently in octeontx2 drivers?
>
> This is an issue with any PCIe device that has more than 512 MSIX interrupts.
>
> The PCI spec the max is defined as 2K.
>
> CN10K drivers have 1K interrupt lines per PCIe device.
>
> I think, following are the options.
> 1) To avoid ABI breakage  in default configuration use the existing patch
> 2) In 21.11 break ABI and Either change to
> a) RTE_MAX_RXTX_INTR_VEC_ID as 1024
> or
> b) Make it full dynamic allocation based on PCI device MSIX size on probe time.
> That brings some kind of dependency rte_intr with PCI device. Need to
> understand,
> How it can clearly be abstracted out and Is it worth trouble for the
> amount of memory.
> Looks like the cost of one entry is 40B. So additional 512 is 40B *
> 512 =  21KB virtual memory.

Since you mentioned performance is not impacted, I guess this is
control path only.
And there is no need to expose this.
So:

c) Rework API so that we don't expose such details.


-- 
David Marchand


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 1/2] eal: make max interrupt vector id configurable
  2021-03-24 11:14  3%   ` David Marchand
@ 2021-03-24 12:54  4%     ` Jerin Jacob
  2021-03-24 15:25  0%       ` David Marchand
  0 siblings, 1 reply; 200+ results
From: Jerin Jacob @ 2021-03-24 12:54 UTC (permalink / raw)
  To: David Marchand, Ray Kinsella
  Cc: Pavan Nikhilesh, Harman Kalra, Thomas Monjalon, Jerin Jacob,
	Bruce Richardson, dpdk-dev

On Wed, Mar 24, 2021 at 4:45 PM David Marchand
<david.marchand@redhat.com> wrote:
>
> On Wed, Mar 24, 2021 at 12:01 PM Jerin Jacob <jerinjacobk@gmail.com> wrote:
> >
> > On Fri, Feb 26, 2021 at 12:31 AM <pbhagavatula@marvell.com> wrote:
> > >
> > > From: Pavan Nikhilesh <pbhagavatula@marvell.com>
> > >
> > > Make RTE_MAX_RXTX_INTR_VEC_ID configurable as MSI-X support a
> > > maximum of 2048 vectors.
> > > The default value is unchanged and set to 512.
> >
> >
> > IMO, We dont need to make it configurable and each platform sets its
> > value. That scheme won't work as generic distribution build will fail
> > to run.
> > Since PCIe specification defines this value and there is no
> > performance impact on increasing this,
> > IMO, We can change to 2048 as default.
>
> It probably breaks rte_intr_* ABI.

Yes. Even though all APIs are used as a pointer (ie. "struct
rte_intr_handle *"), the definition
kept in the header file.


> struct rte_intr_handle {
> ...
>         int efds[RTE_MAX_RXTX_INTR_VEC_ID];  /**< intr vectors/efds mapping */
>         struct rte_epoll_event elist[RTE_MAX_RXTX_INTR_VEC_ID];
>                                        /**< intr vector epoll event */
> ...
>
>
> I see you need this for octeontx2, so wondering if you could handle
> this differently in octeontx2 drivers?

This is an issue with any PCIe device that has more than 512 MSIX interrupts.

The PCI spec the max is defined as 2K.

CN10K drivers have 1K interrupt lines per PCIe device.

I think, following are the options.
1) To avoid ABI breakage  in default configuration use the existing patch
2) In 21.11 break ABI and Either change to
a) RTE_MAX_RXTX_INTR_VEC_ID as 1024
or
b) Make it full dynamic allocation based on PCI device MSIX size on probe time.
That brings some kind of dependency rte_intr with PCI device. Need to
understand,
How it can clearly be abstracted out and Is it worth trouble for the
amount of memory.
Looks like the cost of one entry is 40B. So additional 512 is 40B *
512 =  21KB virtual memory.


Thoughts?

>
>
> --
> David Marchand
>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v2] ethdev: introduce enable_driver_sdk to install driver headers
  2021-03-24 11:27  0%       ` Ferruh Yigit
@ 2021-03-24 11:30  0%         ` Thomas Monjalon
  2021-03-30 12:50  0%         ` Ferruh Yigit
  1 sibling, 0 replies; 200+ results
From: Thomas Monjalon @ 2021-03-24 11:30 UTC (permalink / raw)
  To: Ferruh Yigit
  Cc: Tyler Retzlaff, dev, andrew.rybchenko, bruce.richardson,
	Shepard Siegel, David Marchand

24/03/2021 12:27, Ferruh Yigit:
> On 3/24/2021 4:32 AM, Tyler Retzlaff wrote:
> > On Tue, Mar 23, 2021 at 05:04:08PM +0000, Ferruh Yigit wrote:
> >>> diff --git a/lib/librte_ethdev/meson.build b/lib/librte_ethdev/meson.build
> >>> index c37b2e377..4353fa6b7 100644
> >>> --- a/lib/librte_ethdev/meson.build
> >>> +++ b/lib/librte_ethdev/meson.build
> >>> @@ -20,8 +20,14 @@ headers = files('rte_ethdev.h',
> >>>   	'rte_mtr_driver.h',
> >>>   	'rte_tm.h',
> >>>   	'rte_tm_driver.h')
> >>> +
> >>>   indirect_headers += files(
> >>>   	'rte_ethdev_core.h',
> >>>   	'rte_eth_ctrl.h')
> >>> +driver_sdk_headers += files(
> >>> +	'ethdev_driver.h',
> >>> +	'ethdev_pci.h',
> >>> +	'ethdev_vdev.h')
> >>> +
> >>>   deps += ['net', 'kvargs', 'meter', 'telemetry']
> >>
> > 
> > i feel like i missed a reply here.  but just to clarify only ethdev will
> > be covered by this patch. inclusion of other driver headers was
> > discussed off list (sorry) and it emerged that it would result in
> > withdraw a number of driver api/abi that had not been marked as
> > __rte_internal.
> > 
> > for driver api that were being exported as 'stable' a deprecation notice
> > will need to be issued in order to make them part of the
> > driver_sdk_headers. for that reason only ethdev is being made available
> > under this option for now.
> > 
> > please ack/nack the patch as-is
> > 
> 
> I am OK the patch for the ethdev part, hence
> Acked-by: Ferruh Yigit <ferruh.yigit@intel.com>
> 
> 
> But not sure how to manage the same problem for whole project, if install all 
> headers in one patch, or add them gradually via separate patches by time ...

We did a cleanup in ethdev but not in other driver classes.
When the cleanup will be done gradually, the headers
must move in this new category driver_sdk_headers.



^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v2] ethdev: introduce enable_driver_sdk to install driver headers
  2021-03-24  4:32  3%     ` Tyler Retzlaff
@ 2021-03-24 11:27  0%       ` Ferruh Yigit
  2021-03-24 11:30  0%         ` Thomas Monjalon
  2021-03-30 12:50  0%         ` Ferruh Yigit
  0 siblings, 2 replies; 200+ results
From: Ferruh Yigit @ 2021-03-24 11:27 UTC (permalink / raw)
  To: Tyler Retzlaff, thomas
  Cc: dev, andrew.rybchenko, bruce.richardson, Shepard Siegel, David Marchand

On 3/24/2021 4:32 AM, Tyler Retzlaff wrote:
> On Tue, Mar 23, 2021 at 05:04:08PM +0000, Ferruh Yigit wrote:
>>> diff --git a/lib/librte_ethdev/meson.build b/lib/librte_ethdev/meson.build
>>> index c37b2e377..4353fa6b7 100644
>>> --- a/lib/librte_ethdev/meson.build
>>> +++ b/lib/librte_ethdev/meson.build
>>> @@ -20,8 +20,14 @@ headers = files('rte_ethdev.h',
>>>   	'rte_mtr_driver.h',
>>>   	'rte_tm.h',
>>>   	'rte_tm_driver.h')
>>> +
>>>   indirect_headers += files(
>>>   	'rte_ethdev_core.h',
>>>   	'rte_eth_ctrl.h')
>>> +driver_sdk_headers += files(
>>> +	'ethdev_driver.h',
>>> +	'ethdev_pci.h',
>>> +	'ethdev_vdev.h')
>>> +
>>>   deps += ['net', 'kvargs', 'meter', 'telemetry']
>>
> 
> i feel like i missed a reply here.  but just to clarify only ethdev will
> be covered by this patch. inclusion of other driver headers was
> discussed off list (sorry) and it emerged that it would result in
> withdraw a number of driver api/abi that had not been marked as
> __rte_internal.
> 
> for driver api that were being exported as 'stable' a deprecation notice
> will need to be issued in order to make them part of the
> driver_sdk_headers. for that reason only ethdev is being made available
> under this option for now.
> 
> please ack/nack the patch as-is
> 

I am OK the patch for the ethdev part, hence
Acked-by: Ferruh Yigit <ferruh.yigit@intel.com>


But not sure how to manage the same problem for whole project, if install all 
headers in one patch, or add them gradually via separate patches by time ...

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 1/2] eal: make max interrupt vector id configurable
  @ 2021-03-24 11:14  3%   ` David Marchand
  2021-03-24 12:54  4%     ` Jerin Jacob
  0 siblings, 1 reply; 200+ results
From: David Marchand @ 2021-03-24 11:14 UTC (permalink / raw)
  To: Jerin Jacob, Pavan Nikhilesh, Harman Kalra
  Cc: Thomas Monjalon, Jerin Jacob, Bruce Richardson, dpdk-dev, Ray Kinsella

On Wed, Mar 24, 2021 at 12:01 PM Jerin Jacob <jerinjacobk@gmail.com> wrote:
>
> On Fri, Feb 26, 2021 at 12:31 AM <pbhagavatula@marvell.com> wrote:
> >
> > From: Pavan Nikhilesh <pbhagavatula@marvell.com>
> >
> > Make RTE_MAX_RXTX_INTR_VEC_ID configurable as MSI-X support a
> > maximum of 2048 vectors.
> > The default value is unchanged and set to 512.
>
>
> IMO, We dont need to make it configurable and each platform sets its
> value. That scheme won't work as generic distribution build will fail
> to run.
> Since PCIe specification defines this value and there is no
> performance impact on increasing this,
> IMO, We can change to 2048 as default.

It probably breaks rte_intr_* ABI.

struct rte_intr_handle {
...
        int efds[RTE_MAX_RXTX_INTR_VEC_ID];  /**< intr vectors/efds mapping */
        struct rte_epoll_event elist[RTE_MAX_RXTX_INTR_VEC_ID];
                                       /**< intr vector epoll event */
...


I see you need this for octeontx2, so wondering if you could handle
this differently in octeontx2 drivers?


-- 
David Marchand


^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v5 0/8] Introduce event vectorization
  2021-03-24  6:44  0%           ` Pavan Nikhilesh Bhagavatula
@ 2021-03-24  8:10  0%             ` Jayatheerthan, Jay
  0 siblings, 0 replies; 200+ results
From: Jayatheerthan, Jay @ 2021-03-24  8:10 UTC (permalink / raw)
  To: Pavan Nikhilesh Bhagavatula, Jerin Jacob Kollanukkaran, Carrillo,
	Erik G, Gujjar, Abhinandan S, McDaniel, Timothy, hemant.agrawal,
	Van Haaren, Harry, mattias.ronnblom, Ma, Liang J
  Cc: dev

> -----Original Message-----
> From: Pavan Nikhilesh Bhagavatula <pbhagavatula@marvell.com>
> Sent: Wednesday, March 24, 2021 12:15 PM
> To: Jayatheerthan, Jay <jay.jayatheerthan@intel.com>; Jerin Jacob Kollanukkaran <jerinj@marvell.com>; Carrillo, Erik G
> <erik.g.carrillo@intel.com>; Gujjar, Abhinandan S <abhinandan.gujjar@intel.com>; McDaniel, Timothy
> <timothy.mcdaniel@intel.com>; hemant.agrawal@nxp.com; Van Haaren, Harry <harry.van.haaren@intel.com>; mattias.ronnblom
> <mattias.ronnblom@ericsson.com>; Ma, Liang J <liang.j.ma@intel.com>
> Cc: dev@dpdk.org
> Subject: RE: [dpdk-dev] [PATCH v5 0/8] Introduce event vectorization
> 
> >> From: pbhagavatula@marvell.com <pbhagavatula@marvell.com>
> >> Sent: Wednesday, March 24, 2021 10:35 AM
> >> To: jerinj@marvell.com; Jayatheerthan, Jay
> ><jay.jayatheerthan@intel.com>; Carrillo, Erik G
> ><erik.g.carrillo@intel.com>; Gujjar, Abhinandan
> >> S <abhinandan.gujjar@intel.com>; McDaniel, Timothy
> ><timothy.mcdaniel@intel.com>; hemant.agrawal@nxp.com; Van
> >Haaren, Harry
> >> <harry.van.haaren@intel.com>; mattias.ronnblom
> ><mattias.ronnblom@ericsson.com>; Ma, Liang J
> ><liang.j.ma@intel.com>
> >> Cc: dev@dpdk.org; Pavan Nikhilesh <pbhagavatula@marvell.com>
> >> Subject: [dpdk-dev] [PATCH v5 0/8] Introduce event vectorization
> >>
> >> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
> >>
> >> In traditional event programming model, events are identified by a
> >> flow-id and a uintptr_t. The flow-id uniquely identifies a given event
> >> and determines the order of scheduling based on schedule type, the
> >> uintptr_t holds a single object.
> >>
> >> Event devices also support burst mode with configurable dequeue
> >depth,
> >> i.e. each dequeue call would return multiple events and each event
> >> might be at a different stage of the pipeline.
> >> Having a burst of events belonging to different stages in a dequeue
> >> burst is not only difficult to vectorize but also increases the scheduler
> >> overhead and application overhead of pipelining events further.
> >> Using event vectors we see a performance gain of ~628% as shown in
> >[1].
> >This is very impressive performance boost. Thanks so much for putting
> >this patchset together! Just curious, was any performance
> >measurement done for existing applications (non-vector)?
> >>
> >> By introducing event vectorization, each event will be capable of
> >holding
> >> multiple uintptr_t of the same flow thereby allowing applications
> >> to vectorize their pipeline and reduce the complexity of pipelining
> >> events across multiple stages. This also reduces the complexity of
> >handling
> >> enqueue and dequeue on an event device.
> >>
> >> Since event devices are transparent to the events they are scheduling
> >> so the event producers such as eth_rx_adapter, crypto_adapter , etc..
> >> are responsible for vectorizing the buffers of the same flow into a
> >single
> >> event.
> >>
> >> The series also breaks ABI in the patch [8/8] which is targetted to the
> >> v21.11 release.
> >>
> >> The dpdk-test-eventdev application has been updated with options to
> >test
> >> multiple vector sizes and timeouts.
> >>
> >> [1]
> >> As for performance improvement, with a ARM Cortex-A72 equivalent
> >processer,
> >> software event device (--vdev=event_sw0), single worker core, single
> >stage
> >> and using one service core for Rx adapter, Tx adapter, Scheduling.
> >>
> >> Without event vectorization:
> >>     ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --
> >vdev="event_sw0" --
> >>          --prod_type_ethdev --nb_pkts=0 --verbose 2 --
> >test=pipeline_queue
> >>          --stlist=a --wlcores=20
> >>     Port[0] using Rx adapter[0] configured
> >>     Port[0] using Tx adapter[0] Configured
> >>     4.728 mpps avg 4.728 mpps
> >Is this number before the patchset? If so, it would help put similar
> >number with the patchset but not using vectorization feature.
> 
> I don’t remember the exact clock frequency I was using when I ran
> the above test but with equal clocks:
> 1. Without the patchset applied
> 	5.071 mpps
> 2. With patchset applied w/o enabling vector
> 	5.123 mpps
> 3. With patchset applied with enabling vector
> 	vector_sz@256 42.715 mpps
> 	vector_sz@512 45.335 mpps
> 

Thanks Pavan for the details. It may be useful to include this info in the patchset.

> >>
> >> With event vectorization:
> >>     ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --
> >vdev="event_sw0" --
> >>         --prod_type_ethdev --nb_pkts=0 --verbose 2 --
> >test=pipeline_queue
> >>         --stlist=a --wlcores=20 --enable_vector --nb_eth_queues 1
> >>         --vector_size 256
> >>     Port[0] using Rx adapter[0] configured
> >>     Port[0] using Tx adapter[0] Configured
> >>     34.383 mpps avg 34.383 mpps
> >>
> >> Having dedicated service cores for each Rx queues and tweaking the
> >vector,
> >> dequeue burst size would further improve performance.
> >>
> >> API usage is shown below:
> >>
> >> Configuration:
> >>
> >> 	struct rte_event_eth_rx_adapter_event_vector_config
> >vec_conf;
> >>
> >> 	vector_pool = rte_event_vector_pool_create("vector_pool",
> >> 			nb_elem, 0, vector_size, socket_id);
> >>
> >> 	rte_event_eth_rx_adapter_create(id, event_id, &adptr_conf);
> >> 	rte_event_eth_rx_adapter_queue_add(id, eth_id, -1,
> >&queue_conf);
> >> 	if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR)
> >{
> >> 		vec_conf.vector_sz = vector_size;
> >> 		vec_conf.vector_timeout_ns = vector_tmo_nsec;
> >> 		vec_conf.vector_mp = vector_pool;
> >>
> >	rte_event_eth_rx_adapter_queue_event_vector_config(id,
> >> 				eth_id, -1, &vec_conf);
> >> 	}
> >>
> >> Fastpath:
> >>
> >> 	num = rte_event_dequeue_burst(event_id, port_id, &ev, 1, 0);
> >> 	if (!num)
> >> 		continue;
> >>
> >> 	if (ev.event_type & RTE_EVENT_TYPE_VECTOR) {
> >> 		switch (ev.event_type) {
> >> 		case RTE_EVENT_TYPE_ETHDEV_VECTOR:
> >> 		case RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR:
> >> 			struct rte_mbuf **mbufs;
> >>
> >> 			mbufs = ev.vector_ev->mbufs;
> >> 			for (i = 0; i < ev.vector_ev->nb_elem; i++)
> >> 				//Process mbufs.
> >> 			break;
> >> 		case ...
> >> 		}
> >> 	}
> >> 	...
> >>
> >> v5 Changes:
> >> - Make `rte_event_vector_pool_create non-inline` to ease ABI
> >stability.(Ray)
> >> - Move `rte_event_eth_rx_adapter_queue_event_vector_config` and
> >>   `rte_event_eth_rx_adapter_vector_limits_get` implementation to
> >the patch
> >>   where they are initially defined.(Ray)
> >> - Multiple gramatical and style fixes.(Jerin)
> >> - Add missing release notes.(Jerin)
> >>
> >> v4 Changes:
> >> - Fix missing event vector structure in event structure.(Jay)
> >>
> >> v3 Changes:
> >> - Fix unintended formatting changes.
> >>
> >> v2 Changes:
> >> - Multiple gramatical and style fixes.(Jerin)
> >> - Add parameter to define vector size in power of 2. (Jerin)
> >> - Redo patch series w/o breaking ABI till the last patch.(David)
> >> - Add deprication notice to announce ABI break in 21.11.(David)
> >> - Add vector limits validation to app/test-eventdev.
> >>
> >> Pavan Nikhilesh (8):
> >>   eventdev: introduce event vector capability
> >>   eventdev: introduce event vector Rx capability
> >>   eventdev: introduce event vector Tx capability
> >>   eventdev: add Rx adapter event vector support
> >>   eventdev: add Tx adapter event vector support
> >>   app/eventdev: add event vector mode in pipeline test
> >>   doc: announce event Rx adapter config changes
> >>   eventdev: simplify Rx adapter event vector config
> >>
> >>  app/test-eventdev/evt_common.h                |   4 +
> >>  app/test-eventdev/evt_options.c               |  52 +++
> >>  app/test-eventdev/evt_options.h               |   4 +
> >>  app/test-eventdev/test_pipeline_atq.c         | 310 +++++++++++++++--
> >>  app/test-eventdev/test_pipeline_common.c      | 105 +++++-
> >>  app/test-eventdev/test_pipeline_common.h      |  18 +
> >>  app/test-eventdev/test_pipeline_queue.c       | 320
> >++++++++++++++++--
> >>  .../prog_guide/event_ethernet_rx_adapter.rst  |  38 +++
> >>  .../prog_guide/event_ethernet_tx_adapter.rst  |  12 +
> >>  doc/guides/prog_guide/eventdev.rst            |  36 +-
> >>  doc/guides/rel_notes/deprecation.rst          |   9 +
> >>  doc/guides/rel_notes/release_21_05.rst        |   8 +
> >>  doc/guides/tools/testeventdev.rst             |  45 ++-
> >>  lib/librte_eventdev/eventdev_pmd.h            |  31 +-
> >>  .../rte_event_eth_rx_adapter.c                | 305 ++++++++++++++++-
> >>  .../rte_event_eth_rx_adapter.h                |  78 +++++
> >>  .../rte_event_eth_tx_adapter.c                |  66 +++-
> >>  lib/librte_eventdev/rte_eventdev.c            |  53 ++-
> >>  lib/librte_eventdev/rte_eventdev.h            | 113 ++++++-
> >>  lib/librte_eventdev/version.map               |   4 +
> >>  20 files changed, 1524 insertions(+), 87 deletions(-)
> >>
> >> --
> >> 2.17.1
> >
> >Just a heads up. v5 patchset doesn't apply cleanly on HEAD
> >(5f0849c1155849dfdbf950c91c52cdf9cd301f59). Although, it applies
> >cleanly on app/eventdev: fix timeout accuracy
> >(c33d48387dc8ccf1b432820f6e0cd4992ab486df).
> 
> This patchset is currently rebased on main branch, I will rebase it on
> dpdk-next-event in next version.
> 


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v5 0/8] Introduce event vectorization
  2021-03-24  5:39  0%         ` Jayatheerthan, Jay
@ 2021-03-24  6:44  0%           ` Pavan Nikhilesh Bhagavatula
  2021-03-24  8:10  0%             ` Jayatheerthan, Jay
  0 siblings, 1 reply; 200+ results
From: Pavan Nikhilesh Bhagavatula @ 2021-03-24  6:44 UTC (permalink / raw)
  To: Jayatheerthan, Jay, Jerin Jacob Kollanukkaran, Carrillo, Erik G,
	Gujjar, Abhinandan S, McDaniel, Timothy, hemant.agrawal,
	Van Haaren, Harry, mattias.ronnblom, Ma, Liang J
  Cc: dev

>> From: pbhagavatula@marvell.com <pbhagavatula@marvell.com>
>> Sent: Wednesday, March 24, 2021 10:35 AM
>> To: jerinj@marvell.com; Jayatheerthan, Jay
><jay.jayatheerthan@intel.com>; Carrillo, Erik G
><erik.g.carrillo@intel.com>; Gujjar, Abhinandan
>> S <abhinandan.gujjar@intel.com>; McDaniel, Timothy
><timothy.mcdaniel@intel.com>; hemant.agrawal@nxp.com; Van
>Haaren, Harry
>> <harry.van.haaren@intel.com>; mattias.ronnblom
><mattias.ronnblom@ericsson.com>; Ma, Liang J
><liang.j.ma@intel.com>
>> Cc: dev@dpdk.org; Pavan Nikhilesh <pbhagavatula@marvell.com>
>> Subject: [dpdk-dev] [PATCH v5 0/8] Introduce event vectorization
>>
>> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
>>
>> In traditional event programming model, events are identified by a
>> flow-id and a uintptr_t. The flow-id uniquely identifies a given event
>> and determines the order of scheduling based on schedule type, the
>> uintptr_t holds a single object.
>>
>> Event devices also support burst mode with configurable dequeue
>depth,
>> i.e. each dequeue call would return multiple events and each event
>> might be at a different stage of the pipeline.
>> Having a burst of events belonging to different stages in a dequeue
>> burst is not only difficult to vectorize but also increases the scheduler
>> overhead and application overhead of pipelining events further.
>> Using event vectors we see a performance gain of ~628% as shown in
>[1].
>This is very impressive performance boost. Thanks so much for putting
>this patchset together! Just curious, was any performance
>measurement done for existing applications (non-vector)?
>>
>> By introducing event vectorization, each event will be capable of
>holding
>> multiple uintptr_t of the same flow thereby allowing applications
>> to vectorize their pipeline and reduce the complexity of pipelining
>> events across multiple stages. This also reduces the complexity of
>handling
>> enqueue and dequeue on an event device.
>>
>> Since event devices are transparent to the events they are scheduling
>> so the event producers such as eth_rx_adapter, crypto_adapter , etc..
>> are responsible for vectorizing the buffers of the same flow into a
>single
>> event.
>>
>> The series also breaks ABI in the patch [8/8] which is targetted to the
>> v21.11 release.
>>
>> The dpdk-test-eventdev application has been updated with options to
>test
>> multiple vector sizes and timeouts.
>>
>> [1]
>> As for performance improvement, with a ARM Cortex-A72 equivalent
>processer,
>> software event device (--vdev=event_sw0), single worker core, single
>stage
>> and using one service core for Rx adapter, Tx adapter, Scheduling.
>>
>> Without event vectorization:
>>     ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --
>vdev="event_sw0" --
>>          --prod_type_ethdev --nb_pkts=0 --verbose 2 --
>test=pipeline_queue
>>          --stlist=a --wlcores=20
>>     Port[0] using Rx adapter[0] configured
>>     Port[0] using Tx adapter[0] Configured
>>     4.728 mpps avg 4.728 mpps
>Is this number before the patchset? If so, it would help put similar
>number with the patchset but not using vectorization feature.

I don’t remember the exact clock frequency I was using when I ran 
the above test but with equal clocks:
1. Without the patchset applied
	5.071 mpps
2. With patchset applied w/o enabling vector
	5.123 mpps
3. With patchset applied with enabling vector
	vector_sz@256 42.715 mpps
	vector_sz@512 45.335 mpps
	
>>
>> With event vectorization:
>>     ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --
>vdev="event_sw0" --
>>         --prod_type_ethdev --nb_pkts=0 --verbose 2 --
>test=pipeline_queue
>>         --stlist=a --wlcores=20 --enable_vector --nb_eth_queues 1
>>         --vector_size 256
>>     Port[0] using Rx adapter[0] configured
>>     Port[0] using Tx adapter[0] Configured
>>     34.383 mpps avg 34.383 mpps
>>
>> Having dedicated service cores for each Rx queues and tweaking the
>vector,
>> dequeue burst size would further improve performance.
>>
>> API usage is shown below:
>>
>> Configuration:
>>
>> 	struct rte_event_eth_rx_adapter_event_vector_config
>vec_conf;
>>
>> 	vector_pool = rte_event_vector_pool_create("vector_pool",
>> 			nb_elem, 0, vector_size, socket_id);
>>
>> 	rte_event_eth_rx_adapter_create(id, event_id, &adptr_conf);
>> 	rte_event_eth_rx_adapter_queue_add(id, eth_id, -1,
>&queue_conf);
>> 	if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR)
>{
>> 		vec_conf.vector_sz = vector_size;
>> 		vec_conf.vector_timeout_ns = vector_tmo_nsec;
>> 		vec_conf.vector_mp = vector_pool;
>>
>	rte_event_eth_rx_adapter_queue_event_vector_config(id,
>> 				eth_id, -1, &vec_conf);
>> 	}
>>
>> Fastpath:
>>
>> 	num = rte_event_dequeue_burst(event_id, port_id, &ev, 1, 0);
>> 	if (!num)
>> 		continue;
>>
>> 	if (ev.event_type & RTE_EVENT_TYPE_VECTOR) {
>> 		switch (ev.event_type) {
>> 		case RTE_EVENT_TYPE_ETHDEV_VECTOR:
>> 		case RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR:
>> 			struct rte_mbuf **mbufs;
>>
>> 			mbufs = ev.vector_ev->mbufs;
>> 			for (i = 0; i < ev.vector_ev->nb_elem; i++)
>> 				//Process mbufs.
>> 			break;
>> 		case ...
>> 		}
>> 	}
>> 	...
>>
>> v5 Changes:
>> - Make `rte_event_vector_pool_create non-inline` to ease ABI
>stability.(Ray)
>> - Move `rte_event_eth_rx_adapter_queue_event_vector_config` and
>>   `rte_event_eth_rx_adapter_vector_limits_get` implementation to
>the patch
>>   where they are initially defined.(Ray)
>> - Multiple gramatical and style fixes.(Jerin)
>> - Add missing release notes.(Jerin)
>>
>> v4 Changes:
>> - Fix missing event vector structure in event structure.(Jay)
>>
>> v3 Changes:
>> - Fix unintended formatting changes.
>>
>> v2 Changes:
>> - Multiple gramatical and style fixes.(Jerin)
>> - Add parameter to define vector size in power of 2. (Jerin)
>> - Redo patch series w/o breaking ABI till the last patch.(David)
>> - Add deprication notice to announce ABI break in 21.11.(David)
>> - Add vector limits validation to app/test-eventdev.
>>
>> Pavan Nikhilesh (8):
>>   eventdev: introduce event vector capability
>>   eventdev: introduce event vector Rx capability
>>   eventdev: introduce event vector Tx capability
>>   eventdev: add Rx adapter event vector support
>>   eventdev: add Tx adapter event vector support
>>   app/eventdev: add event vector mode in pipeline test
>>   doc: announce event Rx adapter config changes
>>   eventdev: simplify Rx adapter event vector config
>>
>>  app/test-eventdev/evt_common.h                |   4 +
>>  app/test-eventdev/evt_options.c               |  52 +++
>>  app/test-eventdev/evt_options.h               |   4 +
>>  app/test-eventdev/test_pipeline_atq.c         | 310 +++++++++++++++--
>>  app/test-eventdev/test_pipeline_common.c      | 105 +++++-
>>  app/test-eventdev/test_pipeline_common.h      |  18 +
>>  app/test-eventdev/test_pipeline_queue.c       | 320
>++++++++++++++++--
>>  .../prog_guide/event_ethernet_rx_adapter.rst  |  38 +++
>>  .../prog_guide/event_ethernet_tx_adapter.rst  |  12 +
>>  doc/guides/prog_guide/eventdev.rst            |  36 +-
>>  doc/guides/rel_notes/deprecation.rst          |   9 +
>>  doc/guides/rel_notes/release_21_05.rst        |   8 +
>>  doc/guides/tools/testeventdev.rst             |  45 ++-
>>  lib/librte_eventdev/eventdev_pmd.h            |  31 +-
>>  .../rte_event_eth_rx_adapter.c                | 305 ++++++++++++++++-
>>  .../rte_event_eth_rx_adapter.h                |  78 +++++
>>  .../rte_event_eth_tx_adapter.c                |  66 +++-
>>  lib/librte_eventdev/rte_eventdev.c            |  53 ++-
>>  lib/librte_eventdev/rte_eventdev.h            | 113 ++++++-
>>  lib/librte_eventdev/version.map               |   4 +
>>  20 files changed, 1524 insertions(+), 87 deletions(-)
>>
>> --
>> 2.17.1
>
>Just a heads up. v5 patchset doesn't apply cleanly on HEAD
>(5f0849c1155849dfdbf950c91c52cdf9cd301f59). Although, it applies
>cleanly on app/eventdev: fix timeout accuracy
>(c33d48387dc8ccf1b432820f6e0cd4992ab486df).

This patchset is currently rebased on main branch, I will rebase it on 
dpdk-next-event in next version.



^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v5 0/8] Introduce event vectorization
  2021-03-24  5:05  4%       ` [dpdk-dev] [PATCH v5 " pbhagavatula
@ 2021-03-24  5:39  0%         ` Jayatheerthan, Jay
  2021-03-24  6:44  0%           ` Pavan Nikhilesh Bhagavatula
  2021-03-24 19:28  4%         ` [dpdk-dev] [PATCH v6 " pbhagavatula
  1 sibling, 1 reply; 200+ results
From: Jayatheerthan, Jay @ 2021-03-24  5:39 UTC (permalink / raw)
  To: pbhagavatula, jerinj, Carrillo, Erik G, Gujjar, Abhinandan S,
	McDaniel, Timothy, hemant.agrawal, Van Haaren, Harry,
	mattias.ronnblom, Ma, Liang J
  Cc: dev

> -----Original Message-----
> From: pbhagavatula@marvell.com <pbhagavatula@marvell.com>
> Sent: Wednesday, March 24, 2021 10:35 AM
> To: jerinj@marvell.com; Jayatheerthan, Jay <jay.jayatheerthan@intel.com>; Carrillo, Erik G <erik.g.carrillo@intel.com>; Gujjar, Abhinandan
> S <abhinandan.gujjar@intel.com>; McDaniel, Timothy <timothy.mcdaniel@intel.com>; hemant.agrawal@nxp.com; Van Haaren, Harry
> <harry.van.haaren@intel.com>; mattias.ronnblom <mattias.ronnblom@ericsson.com>; Ma, Liang J <liang.j.ma@intel.com>
> Cc: dev@dpdk.org; Pavan Nikhilesh <pbhagavatula@marvell.com>
> Subject: [dpdk-dev] [PATCH v5 0/8] Introduce event vectorization
> 
> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
> 
> In traditional event programming model, events are identified by a
> flow-id and a uintptr_t. The flow-id uniquely identifies a given event
> and determines the order of scheduling based on schedule type, the
> uintptr_t holds a single object.
> 
> Event devices also support burst mode with configurable dequeue depth,
> i.e. each dequeue call would return multiple events and each event
> might be at a different stage of the pipeline.
> Having a burst of events belonging to different stages in a dequeue
> burst is not only difficult to vectorize but also increases the scheduler
> overhead and application overhead of pipelining events further.
> Using event vectors we see a performance gain of ~628% as shown in [1].
This is very impressive performance boost. Thanks so much for putting this patchset together! Just curious, was any performance measurement done for existing applications (non-vector)?
> 
> By introducing event vectorization, each event will be capable of holding
> multiple uintptr_t of the same flow thereby allowing applications
> to vectorize their pipeline and reduce the complexity of pipelining
> events across multiple stages. This also reduces the complexity of handling
> enqueue and dequeue on an event device.
> 
> Since event devices are transparent to the events they are scheduling
> so the event producers such as eth_rx_adapter, crypto_adapter , etc..
> are responsible for vectorizing the buffers of the same flow into a single
> event.
> 
> The series also breaks ABI in the patch [8/8] which is targetted to the
> v21.11 release.
> 
> The dpdk-test-eventdev application has been updated with options to test
> multiple vector sizes and timeouts.
> 
> [1]
> As for performance improvement, with a ARM Cortex-A72 equivalent processer,
> software event device (--vdev=event_sw0), single worker core, single stage
> and using one service core for Rx adapter, Tx adapter, Scheduling.
> 
> Without event vectorization:
>     ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
>          --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
>          --stlist=a --wlcores=20
>     Port[0] using Rx adapter[0] configured
>     Port[0] using Tx adapter[0] Configured
>     4.728 mpps avg 4.728 mpps
Is this number before the patchset? If so, it would help put similar number with the patchset but not using vectorization feature.
> 
> With event vectorization:
>     ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
>         --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
>         --stlist=a --wlcores=20 --enable_vector --nb_eth_queues 1
>         --vector_size 256
>     Port[0] using Rx adapter[0] configured
>     Port[0] using Tx adapter[0] Configured
>     34.383 mpps avg 34.383 mpps
> 
> Having dedicated service cores for each Rx queues and tweaking the vector,
> dequeue burst size would further improve performance.
> 
> API usage is shown below:
> 
> Configuration:
> 
> 	struct rte_event_eth_rx_adapter_event_vector_config vec_conf;
> 
> 	vector_pool = rte_event_vector_pool_create("vector_pool",
> 			nb_elem, 0, vector_size, socket_id);
> 
> 	rte_event_eth_rx_adapter_create(id, event_id, &adptr_conf);
> 	rte_event_eth_rx_adapter_queue_add(id, eth_id, -1, &queue_conf);
> 	if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR) {
> 		vec_conf.vector_sz = vector_size;
> 		vec_conf.vector_timeout_ns = vector_tmo_nsec;
> 		vec_conf.vector_mp = vector_pool;
> 		rte_event_eth_rx_adapter_queue_event_vector_config(id,
> 				eth_id, -1, &vec_conf);
> 	}
> 
> Fastpath:
> 
> 	num = rte_event_dequeue_burst(event_id, port_id, &ev, 1, 0);
> 	if (!num)
> 		continue;
> 
> 	if (ev.event_type & RTE_EVENT_TYPE_VECTOR) {
> 		switch (ev.event_type) {
> 		case RTE_EVENT_TYPE_ETHDEV_VECTOR:
> 		case RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR:
> 			struct rte_mbuf **mbufs;
> 
> 			mbufs = ev.vector_ev->mbufs;
> 			for (i = 0; i < ev.vector_ev->nb_elem; i++)
> 				//Process mbufs.
> 			break;
> 		case ...
> 		}
> 	}
> 	...
> 
> v5 Changes:
> - Make `rte_event_vector_pool_create non-inline` to ease ABI stability.(Ray)
> - Move `rte_event_eth_rx_adapter_queue_event_vector_config` and
>   `rte_event_eth_rx_adapter_vector_limits_get` implementation to the patch
>   where they are initially defined.(Ray)
> - Multiple gramatical and style fixes.(Jerin)
> - Add missing release notes.(Jerin)
> 
> v4 Changes:
> - Fix missing event vector structure in event structure.(Jay)
> 
> v3 Changes:
> - Fix unintended formatting changes.
> 
> v2 Changes:
> - Multiple gramatical and style fixes.(Jerin)
> - Add parameter to define vector size in power of 2. (Jerin)
> - Redo patch series w/o breaking ABI till the last patch.(David)
> - Add deprication notice to announce ABI break in 21.11.(David)
> - Add vector limits validation to app/test-eventdev.
> 
> Pavan Nikhilesh (8):
>   eventdev: introduce event vector capability
>   eventdev: introduce event vector Rx capability
>   eventdev: introduce event vector Tx capability
>   eventdev: add Rx adapter event vector support
>   eventdev: add Tx adapter event vector support
>   app/eventdev: add event vector mode in pipeline test
>   doc: announce event Rx adapter config changes
>   eventdev: simplify Rx adapter event vector config
> 
>  app/test-eventdev/evt_common.h                |   4 +
>  app/test-eventdev/evt_options.c               |  52 +++
>  app/test-eventdev/evt_options.h               |   4 +
>  app/test-eventdev/test_pipeline_atq.c         | 310 +++++++++++++++--
>  app/test-eventdev/test_pipeline_common.c      | 105 +++++-
>  app/test-eventdev/test_pipeline_common.h      |  18 +
>  app/test-eventdev/test_pipeline_queue.c       | 320 ++++++++++++++++--
>  .../prog_guide/event_ethernet_rx_adapter.rst  |  38 +++
>  .../prog_guide/event_ethernet_tx_adapter.rst  |  12 +
>  doc/guides/prog_guide/eventdev.rst            |  36 +-
>  doc/guides/rel_notes/deprecation.rst          |   9 +
>  doc/guides/rel_notes/release_21_05.rst        |   8 +
>  doc/guides/tools/testeventdev.rst             |  45 ++-
>  lib/librte_eventdev/eventdev_pmd.h            |  31 +-
>  .../rte_event_eth_rx_adapter.c                | 305 ++++++++++++++++-
>  .../rte_event_eth_rx_adapter.h                |  78 +++++
>  .../rte_event_eth_tx_adapter.c                |  66 +++-
>  lib/librte_eventdev/rte_eventdev.c            |  53 ++-
>  lib/librte_eventdev/rte_eventdev.h            | 113 ++++++-
>  lib/librte_eventdev/version.map               |   4 +
>  20 files changed, 1524 insertions(+), 87 deletions(-)
> 
> --
> 2.17.1

Just a heads up. v5 patchset doesn't apply cleanly on HEAD (5f0849c1155849dfdbf950c91c52cdf9cd301f59). Although, it applies cleanly on app/eventdev: fix timeout accuracy (c33d48387dc8ccf1b432820f6e0cd4992ab486df).

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v5 0/8] Introduce event vectorization
  2021-03-19 20:57  4%     ` [dpdk-dev] [PATCH v4 " pbhagavatula
    2021-03-23 18:44  0%       ` [dpdk-dev] [PATCH v4 0/8] Introduce event vectorization Jerin Jacob
@ 2021-03-24  5:05  4%       ` pbhagavatula
  2021-03-24  5:39  0%         ` Jayatheerthan, Jay
  2021-03-24 19:28  4%         ` [dpdk-dev] [PATCH v6 " pbhagavatula
  2 siblings, 2 replies; 200+ results
From: pbhagavatula @ 2021-03-24  5:05 UTC (permalink / raw)
  To: jerinj, jay.jayatheerthan, erik.g.carrillo, abhinandan.gujjar,
	timothy.mcdaniel, hemant.agrawal, harry.van.haaren,
	mattias.ronnblom, liang.j.ma
  Cc: dev, Pavan Nikhilesh

From: Pavan Nikhilesh <pbhagavatula@marvell.com>

In traditional event programming model, events are identified by a
flow-id and a uintptr_t. The flow-id uniquely identifies a given event
and determines the order of scheduling based on schedule type, the
uintptr_t holds a single object.

Event devices also support burst mode with configurable dequeue depth,
i.e. each dequeue call would return multiple events and each event
might be at a different stage of the pipeline.
Having a burst of events belonging to different stages in a dequeue
burst is not only difficult to vectorize but also increases the scheduler
overhead and application overhead of pipelining events further.
Using event vectors we see a performance gain of ~628% as shown in [1].

By introducing event vectorization, each event will be capable of holding
multiple uintptr_t of the same flow thereby allowing applications
to vectorize their pipeline and reduce the complexity of pipelining
events across multiple stages. This also reduces the complexity of handling
enqueue and dequeue on an event device.

Since event devices are transparent to the events they are scheduling
so the event producers such as eth_rx_adapter, crypto_adapter , etc..
are responsible for vectorizing the buffers of the same flow into a single
event.

The series also breaks ABI in the patch [8/8] which is targetted to the
v21.11 release.

The dpdk-test-eventdev application has been updated with options to test
multiple vector sizes and timeouts.

[1]
As for performance improvement, with a ARM Cortex-A72 equivalent processer,
software event device (--vdev=event_sw0), single worker core, single stage
and using one service core for Rx adapter, Tx adapter, Scheduling.

Without event vectorization:
    ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
         --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
         --stlist=a --wlcores=20
    Port[0] using Rx adapter[0] configured
    Port[0] using Tx adapter[0] Configured
    4.728 mpps avg 4.728 mpps

With event vectorization:
    ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
        --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
        --stlist=a --wlcores=20 --enable_vector --nb_eth_queues 1
        --vector_size 256
    Port[0] using Rx adapter[0] configured
    Port[0] using Tx adapter[0] Configured
    34.383 mpps avg 34.383 mpps

Having dedicated service cores for each Rx queues and tweaking the vector,
dequeue burst size would further improve performance.

API usage is shown below:

Configuration:

	struct rte_event_eth_rx_adapter_event_vector_config vec_conf;

	vector_pool = rte_event_vector_pool_create("vector_pool",
			nb_elem, 0, vector_size, socket_id);

	rte_event_eth_rx_adapter_create(id, event_id, &adptr_conf);
	rte_event_eth_rx_adapter_queue_add(id, eth_id, -1, &queue_conf);
	if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR) {
		vec_conf.vector_sz = vector_size;
		vec_conf.vector_timeout_ns = vector_tmo_nsec;
		vec_conf.vector_mp = vector_pool;
		rte_event_eth_rx_adapter_queue_event_vector_config(id,
				eth_id, -1, &vec_conf);
	}

Fastpath:

	num = rte_event_dequeue_burst(event_id, port_id, &ev, 1, 0);
	if (!num)
		continue;

	if (ev.event_type & RTE_EVENT_TYPE_VECTOR) {
		switch (ev.event_type) {
		case RTE_EVENT_TYPE_ETHDEV_VECTOR:
		case RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR:
			struct rte_mbuf **mbufs;

			mbufs = ev.vector_ev->mbufs;
			for (i = 0; i < ev.vector_ev->nb_elem; i++)
				//Process mbufs.
			break;
		case ...
		}
	}
	...

v5 Changes:
- Make `rte_event_vector_pool_create non-inline` to ease ABI stability.(Ray)
- Move `rte_event_eth_rx_adapter_queue_event_vector_config` and
  `rte_event_eth_rx_adapter_vector_limits_get` implementation to the patch
  where they are initially defined.(Ray)
- Multiple gramatical and style fixes.(Jerin)
- Add missing release notes.(Jerin)

v4 Changes:
- Fix missing event vector structure in event structure.(Jay)

v3 Changes:
- Fix unintended formatting changes.

v2 Changes:
- Multiple gramatical and style fixes.(Jerin)
- Add parameter to define vector size in power of 2. (Jerin)
- Redo patch series w/o breaking ABI till the last patch.(David)
- Add deprication notice to announce ABI break in 21.11.(David)
- Add vector limits validation to app/test-eventdev.

Pavan Nikhilesh (8):
  eventdev: introduce event vector capability
  eventdev: introduce event vector Rx capability
  eventdev: introduce event vector Tx capability
  eventdev: add Rx adapter event vector support
  eventdev: add Tx adapter event vector support
  app/eventdev: add event vector mode in pipeline test
  doc: announce event Rx adapter config changes
  eventdev: simplify Rx adapter event vector config

 app/test-eventdev/evt_common.h                |   4 +
 app/test-eventdev/evt_options.c               |  52 +++
 app/test-eventdev/evt_options.h               |   4 +
 app/test-eventdev/test_pipeline_atq.c         | 310 +++++++++++++++--
 app/test-eventdev/test_pipeline_common.c      | 105 +++++-
 app/test-eventdev/test_pipeline_common.h      |  18 +
 app/test-eventdev/test_pipeline_queue.c       | 320 ++++++++++++++++--
 .../prog_guide/event_ethernet_rx_adapter.rst  |  38 +++
 .../prog_guide/event_ethernet_tx_adapter.rst  |  12 +
 doc/guides/prog_guide/eventdev.rst            |  36 +-
 doc/guides/rel_notes/deprecation.rst          |   9 +
 doc/guides/rel_notes/release_21_05.rst        |   8 +
 doc/guides/tools/testeventdev.rst             |  45 ++-
 lib/librte_eventdev/eventdev_pmd.h            |  31 +-
 .../rte_event_eth_rx_adapter.c                | 305 ++++++++++++++++-
 .../rte_event_eth_rx_adapter.h                |  78 +++++
 .../rte_event_eth_tx_adapter.c                |  66 +++-
 lib/librte_eventdev/rte_eventdev.c            |  53 ++-
 lib/librte_eventdev/rte_eventdev.h            | 113 ++++++-
 lib/librte_eventdev/version.map               |   4 +
 20 files changed, 1524 insertions(+), 87 deletions(-)

--
2.17.1


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v2] ethdev: introduce enable_driver_sdk to install driver headers
  2021-03-23 17:04  0%   ` Ferruh Yigit
@ 2021-03-24  4:32  3%     ` Tyler Retzlaff
  2021-03-24 11:27  0%       ` Ferruh Yigit
  0 siblings, 1 reply; 200+ results
From: Tyler Retzlaff @ 2021-03-24  4:32 UTC (permalink / raw)
  To: Ferruh Yigit
  Cc: dev, thomas, andrew.rybchenko, bruce.richardson, Shepard Siegel

On Tue, Mar 23, 2021 at 05:04:08PM +0000, Ferruh Yigit wrote:
> >diff --git a/lib/librte_ethdev/meson.build b/lib/librte_ethdev/meson.build
> >index c37b2e377..4353fa6b7 100644
> >--- a/lib/librte_ethdev/meson.build
> >+++ b/lib/librte_ethdev/meson.build
> >@@ -20,8 +20,14 @@ headers = files('rte_ethdev.h',
> >  	'rte_mtr_driver.h',
> >  	'rte_tm.h',
> >  	'rte_tm_driver.h')
> >+
> >  indirect_headers += files(
> >  	'rte_ethdev_core.h',
> >  	'rte_eth_ctrl.h')
> >+driver_sdk_headers += files(
> >+	'ethdev_driver.h',
> >+	'ethdev_pci.h',
> >+	'ethdev_vdev.h')
> >+
> >  deps += ['net', 'kvargs', 'meter', 'telemetry']
> 

i feel like i missed a reply here.  but just to clarify only ethdev will
be covered by this patch. inclusion of other driver headers was
discussed off list (sorry) and it emerged that it would result in
withdraw a number of driver api/abi that had not been marked as
__rte_internal.

for driver api that were being exported as 'stable' a deprecation notice
will need to be issued in order to make them part of the
driver_sdk_headers. for that reason only ethdev is being made available
under this option for now.

please ack/nack the patch as-is

thanks

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v4 0/8] Introduce event vectorization
  2021-03-19 20:57  4%     ` [dpdk-dev] [PATCH v4 " pbhagavatula
  @ 2021-03-23 18:44  0%       ` Jerin Jacob
  2021-03-24  5:05  4%       ` [dpdk-dev] [PATCH v5 " pbhagavatula
  2 siblings, 0 replies; 200+ results
From: Jerin Jacob @ 2021-03-23 18:44 UTC (permalink / raw)
  To: Pavan Nikhilesh
  Cc: Jerin Jacob, Jayatheerthan, Jay, Erik Gabriel Carrillo, Gujjar,
	Abhinandan S, McDaniel, Timothy, Hemant Agrawal, Van Haaren,
	Harry, Mattias Rönnblom, Liang Ma, dpdk-dev

On Sat, Mar 20, 2021 at 2:27 AM <pbhagavatula@marvell.com> wrote:
>
> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
>
> In traditional event programming model, events are identified by a
> flow-id and a uintptr_t. The flow-id uniquely identifies a given event
> and determines the order of scheduling based on schedule type, the
> uintptr_t holds a single object.
>
> Event devices also support burst mode with configurable dequeue depth,
> i.e. each dequeue call would return multiple events and each event
> might be at a different stage of the pipeline.
> Having a burst of events belonging to different stages in a dequeue
> burst is not only difficult to vectorize but also increases the scheduler
> overhead and application overhead of pipelining events further.
> Using event vectors we see a performance gain of ~628% as shown in [1].
>
> By introducing event vectorization, each event will be capable of holding
> multiple uintptr_t of the same flow thereby allowing applications
> to vectorize their pipeline and reduce the complexity of pipelining
> events across multiple stages. This also reduces the complexity of handling
> enqueue and dequeue on an event device.
>
> Since event devices are transparent to the events they are scheduling
> so the event producers such as eth_rx_adapter, crypto_adapter , etc..
> are responsible for vectorizing the buffers of the same flow into a single
> event.
>
> The series also breaks ABI in the patch [8/8] which is targetted to the
> v21.11 release.
>
> The dpdk-test-eventdev application has been updated with options to test
> multiple vector sizes and timeouts.
>
> [1]
> As for performance improvement, with a ARM Cortex-A72 equivalent processer,
> software event device (--vdev=event_sw0), single worker core, single stage
> and using one service core for Rx adapter, Tx adapter, Scheduling.
>
> Without event vectorization:
>     ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
>          --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
>          --stlist=a --wlcores=20
>     Port[0] using Rx adapter[0] configured
>     Port[0] using Tx adapter[0] Configured
>     4.728 mpps avg 4.728 mpps
>
> With event vectorization:
>     ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
>         --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
>         --stlist=a --wlcores=20 --enable_vector --nb_eth_queues 1
>         --vector_size 256
>     Port[0] using Rx adapter[0] configured
>     Port[0] using Tx adapter[0] Configured
>     34.383 mpps avg 34.383 mpps
>
> Having dedicated service cores for each Rx queues and tweaking the vector,
> dequeue burst size would further improve performance.
>
> API usage is shown below:
>
> Configuration:
>
>         struct rte_event_eth_rx_adapter_event_vector_config vec_conf;
>
>         vector_pool = rte_event_vector_pool_create("vector_pool",
>                         nb_elem, 0, vector_size, socket_id);
>
>         rte_event_eth_rx_adapter_create(id, event_id, &adptr_conf);
>         rte_event_eth_rx_adapter_queue_add(id, eth_id, -1, &queue_conf);
>         if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR) {
>                 vec_conf.vector_sz = vector_size;
>                 vec_conf.vector_timeout_ns = vector_tmo_nsec;
>                 vec_conf.vector_mp = vector_pool;
>                 rte_event_eth_rx_adapter_queue_event_vector_config(id,
>                                 eth_id, -1, &vec_conf);
>         }
>
> Fastpath:
>
>         num = rte_event_dequeue_burst(event_id, port_id, &ev, 1, 0);
>         if (!num)
>                 continue;
>
>         if (ev.event_type & RTE_EVENT_TYPE_VECTOR) {
>                 switch (ev.event_type) {
>                 case RTE_EVENT_TYPE_ETHDEV_VECTOR:
>                 case RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR:
>                         struct rte_mbuf **mbufs;
>
>                         mbufs = ev.vector_ev->mbufs;
>                         for (i = 0; i < ev.vector_ev->nb_elem; i++)
>                                 //Process mbufs.
>                         break;
>                 case ...
>                 }
>         }
>         ...
>
> v4 Changes:
> - Fix missing event vector structure in event structure.(Jay)
>
> v3 Changes:
> - Fix unintended formatting changes.
>
> v2 Changes:
> - Multiple gramatical and style fixes.(Jerin)
> - Add parameter to define vector size in power of 2. (Jerin)
> - Redo patch series w/o breaking ABI till the last patch.(David)
> - Add deprication notice to announce ABI break in 21.11.(David)
> - Add vector limits validation to app/test-eventdev.
>
> Pavan Nikhilesh (8):
>   eventdev: introduce event vector capability
>   eventdev: introduce event vector Rx capability
>   eventdev: introduce event vector Tx capability
>   eventdev: add Rx adapter event vector support
>   eventdev: add Tx adapter event vector support
>   app/eventdev: add event vector mode in pipeline test
>   doc: announce event Rx adapter config changes
>   eventdev: simplify Rx adapter event vector config
>
>  app/test-eventdev/evt_common.h                |   4 +
>  app/test-eventdev/evt_options.c               |  52 +++
>  app/test-eventdev/evt_options.h               |   4 +
>  app/test-eventdev/test_pipeline_atq.c         | 310 +++++++++++++++--
>  app/test-eventdev/test_pipeline_common.c      | 105 +++++-
>  app/test-eventdev/test_pipeline_common.h      |  18 +
>  app/test-eventdev/test_pipeline_queue.c       | 320 ++++++++++++++++--
>  .../prog_guide/event_ethernet_rx_adapter.rst  |  38 +++
>  .../prog_guide/event_ethernet_tx_adapter.rst  |  12 +
>  doc/guides/prog_guide/eventdev.rst            |  36 +-
>  doc/guides/rel_notes/deprecation.rst          |   9 +
>  doc/guides/tools/testeventdev.rst             |  28 ++
>  lib/librte_eventdev/eventdev_pmd.h            |  31 +-
>  .../rte_event_eth_rx_adapter.c                | 305 ++++++++++++++++-
>  .../rte_event_eth_rx_adapter.h                |  68 ++++
>  .../rte_event_eth_tx_adapter.c                |  66 +++-
>  lib/librte_eventdev/rte_eventdev.c            |  11 +-
>  lib/librte_eventdev/rte_eventdev.h            | 144 +++++++-
>  lib/librte_eventdev/version.map               |   4 +
>  19 files changed, 1479 insertions(+), 86 deletions(-)

Please update release notes(doc/guides/rel_notes/release_21_05.rst)
for this feature.

If there are no more comments on this series from others. IMO, Good to
merge the next series for RC1.

>
> --
> 2.17.1
>

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v2] ethdev: introduce enable_driver_sdk to install driver headers
  2021-03-12 22:20  3% ` [dpdk-dev] [PATCH v2] " Tyler Retzlaff
  2021-03-15 10:06  0%   ` Bruce Richardson
@ 2021-03-23 17:04  0%   ` Ferruh Yigit
  2021-03-24  4:32  3%     ` Tyler Retzlaff
  1 sibling, 1 reply; 200+ results
From: Ferruh Yigit @ 2021-03-23 17:04 UTC (permalink / raw)
  To: Tyler Retzlaff, dev, Ed Czeck
  Cc: thomas, andrew.rybchenko, bruce.richardson, Shepard Siegel

On 3/12/2021 10:20 PM, Tyler Retzlaff wrote:
> Introduce a meson option enable_driver_sdk when true installs internal
> driver headers for ethdev. this allows drivers that do not depend on
> stable api/abi to be built external to the dpdk source tree.
> 
> Signed-off-by: Tyler Retzlaff <roretzla@linux.microsoft.com>
> ---
>   lib/librte_ethdev/meson.build | 6 ++++++
>   lib/meson.build               | 4 ++++
>   meson_options.txt             | 2 ++
>   3 files changed, 12 insertions(+)
> 
> diff --git a/lib/librte_ethdev/meson.build b/lib/librte_ethdev/meson.build
> index c37b2e377..4353fa6b7 100644
> --- a/lib/librte_ethdev/meson.build
> +++ b/lib/librte_ethdev/meson.build
> @@ -20,8 +20,14 @@ headers = files('rte_ethdev.h',
>   	'rte_mtr_driver.h',
>   	'rte_tm.h',
>   	'rte_tm_driver.h')
> +
>   indirect_headers += files(
>   	'rte_ethdev_core.h',
>   	'rte_eth_ctrl.h')
>   
> +driver_sdk_headers += files(
> +	'ethdev_driver.h',
> +	'ethdev_pci.h',
> +	'ethdev_vdev.h')
> +
>   deps += ['net', 'kvargs', 'meter', 'telemetry']
> diff --git a/lib/meson.build b/lib/meson.build
> index 7712aa497..992ebdf63 100644
> --- a/lib/meson.build
> +++ b/lib/meson.build
> @@ -67,6 +67,7 @@ foreach l:libraries
>   	sources = []
>   	headers = []
>   	indirect_headers = [] # public headers not directly included by apps
> +	driver_sdk_headers = [] # public headers included by drivers
>   	includes = []
>   	cflags = default_cflags
>   	objs = [] # other object files to link against, used e.g. for
> @@ -105,6 +106,9 @@ foreach l:libraries
>   		dpdk_conf.set('RTE_LIB_' + name.to_upper(), 1)
>   		install_headers(headers)
>   		install_headers(indirect_headers)
> +		if get_option('enable_driver_sdk')
> +			install_headers(driver_sdk_headers)
> +		endif
>   		dpdk_chkinc_headers += headers
>   
>   		libname = 'rte_' + name
> diff --git a/meson_options.txt b/meson_options.txt
> index 6eff62e47..857874a19 100644
> --- a/meson_options.txt
> +++ b/meson_options.txt
> @@ -8,6 +8,8 @@ option('drivers_install_subdir', type: 'string', value: 'dpdk/pmds-<VERSION>',
>   	description: 'Subdirectory of libdir where to install PMDs. Defaults to using a versioned subdirectory.')
>   option('enable_docs', type: 'boolean', value: false,
>   	description: 'build documentation')
> +option('enable_driver_sdk', type: 'boolean', value: false,
> +	description: 'install internal driver plugin headers')
>   option('enable_kmods', type: 'boolean', value: false,
>   	description: 'build kernel modules')
>   option('examples', type: 'string', value: '',
> 

+Ed, who was looking way to install 'ark_ext.h' for Ark PMD.

Ed,
Can you please review the patch from your perspective?

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
  2021-03-23 10:13  0%               ` Ferruh Yigit
  2021-03-23 10:19  0%                 ` Ferruh Yigit
@ 2021-03-23 11:07  0%                 ` Ananyev, Konstantin
  1 sibling, 0 replies; 200+ results
From: Ananyev, Konstantin @ 2021-03-23 11:07 UTC (permalink / raw)
  To: Yigit, Ferruh, Andrew Rybchenko, Lijun Ou, thomas
  Cc: dev, linuxarm, Andrew Rybchenko, David Marchand, Ray Kinsella,
	Luca Boccassi, Ori Kam




> >>>>>>>>
> >>>>>>>> Note: The hairpin queue is not supported with above
> >>>>>>>> rte_eth_*x_queue_info_get, so the queue state could be
> >>>>>>>> RTE_ETH_QUEUE_STATE_STARTED or RTE_ETH_QUEUE_STATE_STOPPED.
> >>>>>>>> Note: After add queue_state field, the 'struct rte_eth_rxq_info' size
> >>>>>>>> remains 128B, and the 'struct rte_eth_txq_info' size remains 64B, so
> >>>>>>>> it could be ABI compatible.
> >>>>>>>>
> >>>>>>>> Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
> >>>>>>>> Signed-off-by: Lijun Ou <oulijun@huawei.com>
> >>>>>>>
> >>>>>>> <...>
> >>>>>>>
> >>>>>>>> diff --git a/lib/librte_ethdev/rte_ethdev.h
> >>>>>>>> b/lib/librte_ethdev/rte_ethdev.h
> >>>>>>>> index efda313..3b83c5a 100644
> >>>>>>>> --- a/lib/librte_ethdev/rte_ethdev.h
> >>>>>>>> +++ b/lib/librte_ethdev/rte_ethdev.h
> >>>>>>>> @@ -1591,6 +1591,8 @@ struct rte_eth_rxq_info {
> >>>>>>>>        uint8_t scattered_rx;       /**< scattered packets RX supported. */
> >>>>>>>>        uint16_t nb_desc;           /**< configured number of RXDs. */
> >>>>>>>>        uint16_t rx_buf_size;       /**< hardware receive buffer size. */
> >>>>>>>> +    /**< Queues state: STARTED(1) / STOPPED(0). */
> >>>>>>>> +    uint8_t queue_state;
> >>>>>>>>    } __rte_cache_min_aligned;
> >>>>>>>>      /**
> >>>>>>>> @@ -1600,6 +1602,8 @@ struct rte_eth_rxq_info {
> >>>>>>>>    struct rte_eth_txq_info {
> >>>>>>>>        struct rte_eth_txconf conf; /**< queue config parameters. */
> >>>>>>>>        uint16_t nb_desc;           /**< configured number of TXDs. */
> >>>>>>>> +    /**< Queues state: STARTED(1) / STOPPED(0). */
> >>>>>>>> +    uint8_t queue_state;
> >>>>>>>>    } __rte_cache_min_aligned;
> >>>>>>>>      /* Generic Burst mode flag definition, values can be ORed. */
> >>>>>>>>
> >>>>>>>
> >>>>>>> This is causing an ABI warning [1], but I guess it is safe since the
> >>>>>>> size of the struct is not changing (cache align). Adding a few more
> >>>>>>> people to comment.
> >>>>>>>
> >>>>>>>
> >>>>>>> [1]
> >>>>>>> https://travis-ci.com/github/ovsrobot/dpdk/builds/220497651
> >>>>>>
> >>>>>> Frankly speaking I dislike addition of queue_state as uint8_t.
> >>>>>> IMHO it should be either 'bool started' or enum to support more
> >>>>>> states in the future if we need.
> >>>>>
> >>>>> I think we already have set of defines for it:
> >>>>> lib/librte_ethdev/rte_ethdev_driver.h:925:#define RTE_ETH_QUEUE_STATE_STOPPED 0
> >>>>> lib/librte_ethdev/rte_ethdev_driver.h:926:#define RTE_ETH_QUEUE_STATE_STARTED 1
> >>>>> lib/librte_ethdev/rte_ethdev_driver.h:927:#define RTE_ETH_QUEUE_STATE_HAIRPIN 2
> >>>>>
> >>>>> If we want to publish it, then might be enough just move these macros to rte_ethdev.h or so.
> >>>>>
> >>>>> About uint8_t vs enum - yes, in principle enum would be a bit nicer,
> >>>>> but right now rte_eth_dev_data.(rx|tx)_queue_state[]  itself is an array of uint8_t.
> >>>>> So probably not much point to waste extra 3B in rte_eth_(rxq|txq)_info.
> >>>>> Unless in future will want to change it in struct rte_eth_dev_data too
> >>>>> (or even hide it inside dev private queue data).
> >>>>
> >>>> I forgot about hairpin and bitmask... If so, I think it is
> >>>> sufficient to fix absolutely misleading comment, say
> >>>> that it is a bit mask and think about removal of
> >>>> RTE_ETH_QUEUE_STATE_STOPPED (since it could be
> >>>> stopped+hairpin). May be consider to use uin16_t,
> >>>> since 8 bit is really small bitmask. It still fits in
> >>>> available hole.
> >>>
> >>> Hmm, as I can read the code - hairpin queue can't be started/stopped by SW,
> >>> and each of the states (stopped/started/hairpin) is mutually exclusive.
> >>> Is that not what was intended when hairpin queues were introduced?
> >>>
> >>
> >> Thanks, yes, you're right. My memory lies to me. If queue state
> >> is not a bit mask, it should be an enum from API point of view.
> >> Rx/Tx queue info structures are control path. I see no point to
> >> save bits here. Clear API is more important on control path.
> >> The only reason here to use uint8_t is to avoid ABI breakage.
> >> I can't judge if it is critical to wait or not.
> >
> > As alternate thought - introduce new API function,
> > something like:
> > int rte_eth_get_rxq_state(portid, queue_id);
> > Then rte_eth_dev_is_rx_hairpin_queue() probably can be deprecated
> > in favour of this new one.
> >
> >
> 
> The 'rte_eth_dev_is_rx_hairpin_queue()' is internal function, and it is not
> visible to the application, it should be OK to keep it.

What I am saying - we well have get-state() - PMDs can use the new one
instead of  rte_eth_dev_is_rx_hairpin_queue().
Or rte_eth_dev_is_rx_hairpin_queue() can be just a wrapper around get_rxq_state().

> 
> But 'STATE_HAIRPIN' should be kept internal, or should be available to the
> application?
> 
> The actual need is to know the start/stop state of the queue. That is for app to
> decide if 'rte_eth_tx_done_cleanup()' can be done or not an a queue:
> https://patches.dpdk.org/project/dpdk/patch/1614938252-62955-1-git-send-email-oulijun@huawei.com/

If we don't expose STATE_HAIRPIN what state we will report 
for hairpin queue back to the user?
Either STARTED or STOPPED are both invalid and misleading.
I  think we have to report all 3 supported states back to the user.

> 
> And normally I also prefer APIs with simple & clear responsibility, but this one
> seems very related to the existing '_queue_info_get()' ones, so I am fine with
> both options.


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
  2021-03-23 10:13  0%               ` Ferruh Yigit
@ 2021-03-23 10:19  0%                 ` Ferruh Yigit
  2021-03-23 11:07  0%                 ` Ananyev, Konstantin
  1 sibling, 0 replies; 200+ results
From: Ferruh Yigit @ 2021-03-23 10:19 UTC (permalink / raw)
  To: Ananyev, Konstantin, Andrew Rybchenko, Lijun Ou, thomas
  Cc: dev, linuxarm, Andrew Rybchenko, David Marchand, Ray Kinsella,
	Luca Boccassi, Ori Kam, jerinj, Bruce Richardson, Olivier Matz,
	Anatoly Burakov

On 3/23/2021 10:13 AM, Ferruh Yigit wrote:
> On 3/22/2021 6:53 PM, Ananyev, Konstantin wrote:
>>
>>
>>> -----Original Message-----
>>> From: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
>>> Sent: Monday, March 22, 2021 5:08 PM
>>> To: Ananyev, Konstantin <konstantin.ananyev@intel.com>; Yigit, Ferruh 
>>> <ferruh.yigit@intel.com>; Lijun Ou <oulijun@huawei.com>;
>>> thomas@monjalon.net
>>> Cc: dev@dpdk.org; linuxarm@openeuler.org; Andrew Rybchenko 
>>> <arybchenko@solarflare.com>; David Marchand
>>> <david.marchand@redhat.com>; Ray Kinsella <mdr@ashroe.eu>; Luca Boccassi 
>>> <bluca@debian.org>
>>> Subject: Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue 
>>> information
>>>
>>> On 3/22/21 7:53 PM, Ananyev, Konstantin wrote:
>>>>
>>>>
>>>>> -----Original Message-----
>>>>> From: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
>>>>> Sent: Monday, March 22, 2021 4:02 PM
>>>>> To: Ananyev, Konstantin <konstantin.ananyev@intel.com>; Yigit, Ferruh 
>>>>> <ferruh.yigit@intel.com>; Lijun Ou <oulijun@huawei.com>;
>>>>> thomas@monjalon.net
>>>>> Cc: dev@dpdk.org; linuxarm@openeuler.org; Andrew Rybchenko 
>>>>> <arybchenko@solarflare.com>; David Marchand
>>>>> <david.marchand@redhat.com>; Ray Kinsella <mdr@ashroe.eu>; Luca Boccassi 
>>>>> <bluca@debian.org>
>>>>> Subject: Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue 
>>>>> information
>>>>>
>>>>> On 3/22/21 6:45 PM, Ananyev, Konstantin wrote:
>>>>>>
>>>>>>
>>>>>>> -----Original Message-----
>>>>>>> From: dev <dev-bounces@dpdk.org> On Behalf Of Andrew Rybchenko
>>>>>>> Sent: Monday, March 22, 2021 2:49 PM
>>>>>>> To: Yigit, Ferruh <ferruh.yigit@intel.com>; Lijun Ou 
>>>>>>> <oulijun@huawei.com>; thomas@monjalon.net
>>>>>>> Cc: dev@dpdk.org; linuxarm@openeuler.org; Andrew Rybchenko 
>>>>>>> <arybchenko@solarflare.com>; David Marchand
>>>>>>> <david.marchand@redhat.com>; Ray Kinsella <mdr@ashroe.eu>; Luca Boccassi 
>>>>>>> <bluca@debian.org>
>>>>>>> Subject: Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve 
>>>>>>> queue information
>>>>>>>
>>>>>>> On 3/22/21 12:22 PM, Ferruh Yigit wrote:
>>>>>>>> On 3/18/2021 12:25 PM, Lijun Ou wrote:
>>>>>>>>> Currently, upper-layer application could get queue state only
>>>>>>>>> through pointers such as dev->data->tx_queue_state[queue_id],
>>>>>>>>> this is not the recommended way to access it. So this patch
>>>>>>>>> add get queue state when call rte_eth_rx_queue_info_get and
>>>>>>>>> rte_eth_tx_queue_info_get API.
>>>>>>>>>
>>>>>>>>> Note: The hairpin queue is not supported with above
>>>>>>>>> rte_eth_*x_queue_info_get, so the queue state could be
>>>>>>>>> RTE_ETH_QUEUE_STATE_STARTED or RTE_ETH_QUEUE_STATE_STOPPED.
>>>>>>>>> Note: After add queue_state field, the 'struct rte_eth_rxq_info' size
>>>>>>>>> remains 128B, and the 'struct rte_eth_txq_info' size remains 64B, so
>>>>>>>>> it could be ABI compatible.
>>>>>>>>>
>>>>>>>>> Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
>>>>>>>>> Signed-off-by: Lijun Ou <oulijun@huawei.com>
>>>>>>>>
>>>>>>>> <...>
>>>>>>>>
>>>>>>>>> diff --git a/lib/librte_ethdev/rte_ethdev.h
>>>>>>>>> b/lib/librte_ethdev/rte_ethdev.h
>>>>>>>>> index efda313..3b83c5a 100644
>>>>>>>>> --- a/lib/librte_ethdev/rte_ethdev.h
>>>>>>>>> +++ b/lib/librte_ethdev/rte_ethdev.h
>>>>>>>>> @@ -1591,6 +1591,8 @@ struct rte_eth_rxq_info {
>>>>>>>>>        uint8_t scattered_rx;       /**< scattered packets RX supported. */
>>>>>>>>>        uint16_t nb_desc;           /**< configured number of RXDs. */
>>>>>>>>>        uint16_t rx_buf_size;       /**< hardware receive buffer size. */
>>>>>>>>> +    /**< Queues state: STARTED(1) / STOPPED(0). */
>>>>>>>>> +    uint8_t queue_state;
>>>>>>>>>    } __rte_cache_min_aligned;
>>>>>>>>>      /**
>>>>>>>>> @@ -1600,6 +1602,8 @@ struct rte_eth_rxq_info {
>>>>>>>>>    struct rte_eth_txq_info {
>>>>>>>>>        struct rte_eth_txconf conf; /**< queue config parameters. */
>>>>>>>>>        uint16_t nb_desc;           /**< configured number of TXDs. */
>>>>>>>>> +    /**< Queues state: STARTED(1) / STOPPED(0). */
>>>>>>>>> +    uint8_t queue_state;
>>>>>>>>>    } __rte_cache_min_aligned;
>>>>>>>>>      /* Generic Burst mode flag definition, values can be ORed. */
>>>>>>>>>
>>>>>>>>
>>>>>>>> This is causing an ABI warning [1], but I guess it is safe since the
>>>>>>>> size of the struct is not changing (cache align). Adding a few more
>>>>>>>> people to comment.
>>>>>>>>
>>>>>>>>
>>>>>>>> [1]
>>>>>>>> https://travis-ci.com/github/ovsrobot/dpdk/builds/220497651
>>>>>>>
>>>>>>> Frankly speaking I dislike addition of queue_state as uint8_t.
>>>>>>> IMHO it should be either 'bool started' or enum to support more
>>>>>>> states in the future if we need.
>>>>>>
>>>>>> I think we already have set of defines for it:
>>>>>> lib/librte_ethdev/rte_ethdev_driver.h:925:#define 
>>>>>> RTE_ETH_QUEUE_STATE_STOPPED 0
>>>>>> lib/librte_ethdev/rte_ethdev_driver.h:926:#define 
>>>>>> RTE_ETH_QUEUE_STATE_STARTED 1
>>>>>> lib/librte_ethdev/rte_ethdev_driver.h:927:#define 
>>>>>> RTE_ETH_QUEUE_STATE_HAIRPIN 2
>>>>>>
>>>>>> If we want to publish it, then might be enough just move these macros to 
>>>>>> rte_ethdev.h or so.
>>>>>>
>>>>>> About uint8_t vs enum - yes, in principle enum would be a bit nicer,
>>>>>> but right now rte_eth_dev_data.(rx|tx)_queue_state[]  itself is an array 
>>>>>> of uint8_t.
>>>>>> So probably not much point to waste extra 3B in rte_eth_(rxq|txq)_info.
>>>>>> Unless in future will want to change it in struct rte_eth_dev_data too
>>>>>> (or even hide it inside dev private queue data).
>>>>>
>>>>> I forgot about hairpin and bitmask... If so, I think it is
>>>>> sufficient to fix absolutely misleading comment, say
>>>>> that it is a bit mask and think about removal of
>>>>> RTE_ETH_QUEUE_STATE_STOPPED (since it could be
>>>>> stopped+hairpin). May be consider to use uin16_t,
>>>>> since 8 bit is really small bitmask. It still fits in
>>>>> available hole.
>>>>
>>>> Hmm, as I can read the code - hairpin queue can't be started/stopped by SW,
>>>> and each of the states (stopped/started/hairpin) is mutually exclusive.
>>>> Is that not what was intended when hairpin queues were introduced?
>>>>
>>>
>>> Thanks, yes, you're right. My memory lies to me. If queue state
>>> is not a bit mask, it should be an enum from API point of view.
>>> Rx/Tx queue info structures are control path. I see no point to
>>> save bits here. Clear API is more important on control path.
>>> The only reason here to use uint8_t is to avoid ABI breakage.
>>> I can't judge if it is critical to wait or not.
>>
>> As alternate thought - introduce new API function,
>> something like:
>> int rte_eth_get_rxq_state(portid, queue_id);
>> Then rte_eth_dev_is_rx_hairpin_queue() probably can be deprecated
>> in favour of this new one.
>>
>>
> 
> The 'rte_eth_dev_is_rx_hairpin_queue()' is internal function, and it is not 
> visible to the application, it should be OK to keep it.
> 
> But 'STATE_HAIRPIN' should be kept internal, or should be available to the 
> application?
> 
> The actual need is to know the start/stop state of the queue. That is for app to 
> decide if 'rte_eth_tx_done_cleanup()' can be done or not an a queue:
> https://patches.dpdk.org/project/dpdk/patch/1614938252-62955-1-git-send-email-oulijun@huawei.com/ 
> 
> 
> And normally I also prefer APIs with simple & clear responsibility, but this one 
> seems very related to the existing '_queue_info_get()' ones, so I am fine with 
> both options.
> 

Another high-level discussion is, testpmd keeps lots of config/state itself, I 
assume that is because it is not possible to get all DPDK config/state from DPDK 
library, but not sure if this is a design decision.

Should we try to provide all config/state information via DPDK APIs, or should 
we push this responsibility to the application level?

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
  2021-03-22 18:53  0%             ` Ananyev, Konstantin
@ 2021-03-23 10:13  0%               ` Ferruh Yigit
  2021-03-23 10:19  0%                 ` Ferruh Yigit
  2021-03-23 11:07  0%                 ` Ananyev, Konstantin
  0 siblings, 2 replies; 200+ results
From: Ferruh Yigit @ 2021-03-23 10:13 UTC (permalink / raw)
  To: Ananyev, Konstantin, Andrew Rybchenko, Lijun Ou, thomas
  Cc: dev, linuxarm, Andrew Rybchenko, David Marchand, Ray Kinsella,
	Luca Boccassi, Ori Kam

On 3/22/2021 6:53 PM, Ananyev, Konstantin wrote:
> 
> 
>> -----Original Message-----
>> From: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
>> Sent: Monday, March 22, 2021 5:08 PM
>> To: Ananyev, Konstantin <konstantin.ananyev@intel.com>; Yigit, Ferruh <ferruh.yigit@intel.com>; Lijun Ou <oulijun@huawei.com>;
>> thomas@monjalon.net
>> Cc: dev@dpdk.org; linuxarm@openeuler.org; Andrew Rybchenko <arybchenko@solarflare.com>; David Marchand
>> <david.marchand@redhat.com>; Ray Kinsella <mdr@ashroe.eu>; Luca Boccassi <bluca@debian.org>
>> Subject: Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
>>
>> On 3/22/21 7:53 PM, Ananyev, Konstantin wrote:
>>>
>>>
>>>> -----Original Message-----
>>>> From: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
>>>> Sent: Monday, March 22, 2021 4:02 PM
>>>> To: Ananyev, Konstantin <konstantin.ananyev@intel.com>; Yigit, Ferruh <ferruh.yigit@intel.com>; Lijun Ou <oulijun@huawei.com>;
>>>> thomas@monjalon.net
>>>> Cc: dev@dpdk.org; linuxarm@openeuler.org; Andrew Rybchenko <arybchenko@solarflare.com>; David Marchand
>>>> <david.marchand@redhat.com>; Ray Kinsella <mdr@ashroe.eu>; Luca Boccassi <bluca@debian.org>
>>>> Subject: Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
>>>>
>>>> On 3/22/21 6:45 PM, Ananyev, Konstantin wrote:
>>>>>
>>>>>
>>>>>> -----Original Message-----
>>>>>> From: dev <dev-bounces@dpdk.org> On Behalf Of Andrew Rybchenko
>>>>>> Sent: Monday, March 22, 2021 2:49 PM
>>>>>> To: Yigit, Ferruh <ferruh.yigit@intel.com>; Lijun Ou <oulijun@huawei.com>; thomas@monjalon.net
>>>>>> Cc: dev@dpdk.org; linuxarm@openeuler.org; Andrew Rybchenko <arybchenko@solarflare.com>; David Marchand
>>>>>> <david.marchand@redhat.com>; Ray Kinsella <mdr@ashroe.eu>; Luca Boccassi <bluca@debian.org>
>>>>>> Subject: Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
>>>>>>
>>>>>> On 3/22/21 12:22 PM, Ferruh Yigit wrote:
>>>>>>> On 3/18/2021 12:25 PM, Lijun Ou wrote:
>>>>>>>> Currently, upper-layer application could get queue state only
>>>>>>>> through pointers such as dev->data->tx_queue_state[queue_id],
>>>>>>>> this is not the recommended way to access it. So this patch
>>>>>>>> add get queue state when call rte_eth_rx_queue_info_get and
>>>>>>>> rte_eth_tx_queue_info_get API.
>>>>>>>>
>>>>>>>> Note: The hairpin queue is not supported with above
>>>>>>>> rte_eth_*x_queue_info_get, so the queue state could be
>>>>>>>> RTE_ETH_QUEUE_STATE_STARTED or RTE_ETH_QUEUE_STATE_STOPPED.
>>>>>>>> Note: After add queue_state field, the 'struct rte_eth_rxq_info' size
>>>>>>>> remains 128B, and the 'struct rte_eth_txq_info' size remains 64B, so
>>>>>>>> it could be ABI compatible.
>>>>>>>>
>>>>>>>> Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
>>>>>>>> Signed-off-by: Lijun Ou <oulijun@huawei.com>
>>>>>>>
>>>>>>> <...>
>>>>>>>
>>>>>>>> diff --git a/lib/librte_ethdev/rte_ethdev.h
>>>>>>>> b/lib/librte_ethdev/rte_ethdev.h
>>>>>>>> index efda313..3b83c5a 100644
>>>>>>>> --- a/lib/librte_ethdev/rte_ethdev.h
>>>>>>>> +++ b/lib/librte_ethdev/rte_ethdev.h
>>>>>>>> @@ -1591,6 +1591,8 @@ struct rte_eth_rxq_info {
>>>>>>>>        uint8_t scattered_rx;       /**< scattered packets RX supported. */
>>>>>>>>        uint16_t nb_desc;           /**< configured number of RXDs. */
>>>>>>>>        uint16_t rx_buf_size;       /**< hardware receive buffer size. */
>>>>>>>> +    /**< Queues state: STARTED(1) / STOPPED(0). */
>>>>>>>> +    uint8_t queue_state;
>>>>>>>>    } __rte_cache_min_aligned;
>>>>>>>>      /**
>>>>>>>> @@ -1600,6 +1602,8 @@ struct rte_eth_rxq_info {
>>>>>>>>    struct rte_eth_txq_info {
>>>>>>>>        struct rte_eth_txconf conf; /**< queue config parameters. */
>>>>>>>>        uint16_t nb_desc;           /**< configured number of TXDs. */
>>>>>>>> +    /**< Queues state: STARTED(1) / STOPPED(0). */
>>>>>>>> +    uint8_t queue_state;
>>>>>>>>    } __rte_cache_min_aligned;
>>>>>>>>      /* Generic Burst mode flag definition, values can be ORed. */
>>>>>>>>
>>>>>>>
>>>>>>> This is causing an ABI warning [1], but I guess it is safe since the
>>>>>>> size of the struct is not changing (cache align). Adding a few more
>>>>>>> people to comment.
>>>>>>>
>>>>>>>
>>>>>>> [1]
>>>>>>> https://travis-ci.com/github/ovsrobot/dpdk/builds/220497651
>>>>>>
>>>>>> Frankly speaking I dislike addition of queue_state as uint8_t.
>>>>>> IMHO it should be either 'bool started' or enum to support more
>>>>>> states in the future if we need.
>>>>>
>>>>> I think we already have set of defines for it:
>>>>> lib/librte_ethdev/rte_ethdev_driver.h:925:#define RTE_ETH_QUEUE_STATE_STOPPED 0
>>>>> lib/librte_ethdev/rte_ethdev_driver.h:926:#define RTE_ETH_QUEUE_STATE_STARTED 1
>>>>> lib/librte_ethdev/rte_ethdev_driver.h:927:#define RTE_ETH_QUEUE_STATE_HAIRPIN 2
>>>>>
>>>>> If we want to publish it, then might be enough just move these macros to rte_ethdev.h or so.
>>>>>
>>>>> About uint8_t vs enum - yes, in principle enum would be a bit nicer,
>>>>> but right now rte_eth_dev_data.(rx|tx)_queue_state[]  itself is an array of uint8_t.
>>>>> So probably not much point to waste extra 3B in rte_eth_(rxq|txq)_info.
>>>>> Unless in future will want to change it in struct rte_eth_dev_data too
>>>>> (or even hide it inside dev private queue data).
>>>>
>>>> I forgot about hairpin and bitmask... If so, I think it is
>>>> sufficient to fix absolutely misleading comment, say
>>>> that it is a bit mask and think about removal of
>>>> RTE_ETH_QUEUE_STATE_STOPPED (since it could be
>>>> stopped+hairpin). May be consider to use uin16_t,
>>>> since 8 bit is really small bitmask. It still fits in
>>>> available hole.
>>>
>>> Hmm, as I can read the code - hairpin queue can't be started/stopped by SW,
>>> and each of the states (stopped/started/hairpin) is mutually exclusive.
>>> Is that not what was intended when hairpin queues were introduced?
>>>
>>
>> Thanks, yes, you're right. My memory lies to me. If queue state
>> is not a bit mask, it should be an enum from API point of view.
>> Rx/Tx queue info structures are control path. I see no point to
>> save bits here. Clear API is more important on control path.
>> The only reason here to use uint8_t is to avoid ABI breakage.
>> I can't judge if it is critical to wait or not.
> 
> As alternate thought - introduce new API function,
> something like:
> int rte_eth_get_rxq_state(portid, queue_id);
> Then rte_eth_dev_is_rx_hairpin_queue() probably can be deprecated
> in favour of this new one.
> 
> 

The 'rte_eth_dev_is_rx_hairpin_queue()' is internal function, and it is not 
visible to the application, it should be OK to keep it.

But 'STATE_HAIRPIN' should be kept internal, or should be available to the 
application?

The actual need is to know the start/stop state of the queue. That is for app to 
decide if 'rte_eth_tx_done_cleanup()' can be done or not an a queue:
https://patches.dpdk.org/project/dpdk/patch/1614938252-62955-1-git-send-email-oulijun@huawei.com/

And normally I also prefer APIs with simple & clear responsibility, but this one 
seems very related to the existing '_queue_info_get()' ones, so I am fine with 
both options.


^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v2 00/10] eal: Add new API for threading
    2021-03-18 15:48  5%   ` David Marchand
@ 2021-03-23  0:20  2%   ` Narcisa Ana Maria Vasile
  2021-03-25  3:46  2%     ` [dpdk-dev] [PATCH v3 " Narcisa Ana Maria Vasile
  1 sibling, 1 reply; 200+ results
From: Narcisa Ana Maria Vasile @ 2021-03-23  0:20 UTC (permalink / raw)
  To: dev, thomas, dmitry.kozliuk, khot, navasile, dmitrym, roretzla,
	talshn, ocardona
  Cc: bruce.richardson, david.marchand, pallavi.kadam

From: Narcisa Vasile <navasile@microsoft.com>

EAL thread API

**Problem Statement**
DPDK currently uses the pthread interface to create and manage threads.
Windows does not support the POSIX thread programming model, so it currently
relies on a header file that hides the Windows calls under
pthread matched interfaces. Given that EAL should isolate the environment
specifics from the applications and libraries and mediate
all the communication with the operating systems, a new EAL interface
is needed for thread management.

**Goals**
* Introduce a generic EAL API for threading support that will remove
  the current Windows pthread.h shim.
* Replace references to pthread_* across the DPDK codebase with the new
  RTE_THREAD_* API.
* Allow users to choose between using the RTE_THREAD_* API or a
  3rd party thread library through a configuration option.

**Design plan**
New API main files:
* rte_thread.h (librte_eal/include)
* rte_thread_types.h (librte_eal/include)
* rte_thread_windows_types.h (librte_eal/windows/include)
* rte_thread.c (librte_eal/windows)
* rte_thread.c (librte_eal/common)

For flexibility, the user is offered the option of either using the RTE_THREAD_* API or
a 3rd party thread library, through a meson flag “use_external_thread_lib”.
By default, this flag is set to FALSE, which means Windows libraries and applications
will use the RTE_THREAD_* API for managing threads.

If compiling on Windows and the “use_external_thread_lib” is *not* set,
the following files will be parsed: 
* include/rte_thread.h
* windows/include/rte_thread_windows_types.h
* windows/rte_thread.c
In all other cases, the compilation/parsing includes the following files:
* include/rte_thread.h 
* include/rte_thread_types.h
* common/rte_thread.c

**A schematic example of the design**
--------------------------------------------------
lib/librte_eal/include/rte_thread.h
int rte_thread_create();

lib/librte_eal/common/rte_thread.c
int rte_thread_create() 
{
	return pthread_create();
}

lib/librte_eal/windows/rte_thread.c
int rte_thread_create() 
{
	return CreateThread();
}

lib/librte_eal/windows/meson.build
if get_option('use_external_thread_lib')
	sources += 'librte_eal/common/rte_thread.c'
else
	sources += 'librte_eal/windows/rte_thread.c'
endif
-----------------------------------------------------

**Thread attributes**

When or after a thread is created, specific characteristics of the thread
can be adjusted. Given that the thread characteristics that are of interest
for DPDK applications are affinity and priority, the following structure
that represents thread attributes has been defined:

typedef struct
{
	enum rte_thread_priority priority;
	rte_cpuset_t cpuset;
} rte_thread_attr_t;

The *rte_thread_create()* function can optionally receive an rte_thread_attr_t
object that will cause the thread to be created with the affinity and priority
described by the attributes object. If no rte_thread_attr_t is passed
(parameter is NULL), the default affinity and priority are used.
An rte_thread_attr_t object can also be set to the default values
by calling *rte_thread_attr_init()*.

*Priority* is represented through an enum that currently advertises
two values for priority:
	- RTE_THREAD_PRIORITY_NORMAL
	- RTE_THREAD_PRIORITY_REALTIME_CRITICAL
The enum can be extended to allow for multiple priority levels.
rte_thread_set_priority      - sets the priority of a thread
rte_thread_attr_set_priority - updates an rte_thread_attr_t object
                               with a new value for priority

The user can choose thread priority through an EAL parameter,
when starting an application. The two options above are available:

 --thread-prio normal
 --thread-prio realtime
 
Example:
./dpdk-l2fwd -l 0-3 -n 4 –thread-prio normal -- -q 8 -p ffff

*Affinity* is described by the already known “rte_cpuset_t” type.
rte_thread_attr_set/get_affinity - sets/gets the affinity field in a
                                   rte_thread_attr_t object
rte_thread_set/get_affinity      – sets/gets the affinity of a thread

**Errors**
A translation function that maps Windows error codes to errno-style
error codes is provided. 

**Future work**
Note that this patchset was focused on introducing new API that will
remove the Windows pthread.h shim. In DPDK, there are still a few references
to pthread_* that were not implemented in the shim.
The long term plan is for EAL to provide full threading support:
* Adding support for conditional variables
* Additional functionality offered by pthread_* (such as pthread_setname_np, etc.)
* Static mutex initializers are not used on Windows. If we must continue
  using them, they need to be platform dependent and an implementation will
  need to be provided for Windows.

v2:
- revert changes that break ABI 
- break up changes into smaller patches
- fix coding style issues
- fix issues with errors
- fix parameter type in examples/kni.c

Narcisa Vasile (10):
  eal: add thread id and simple thread functions
  eal: add thread attributes
  windows/eal: translate Windows errors to errno-style errors
  eal: implement functions for thread affinity management
  eal: implement thread priority management functions
  eal: add thread lifetime management
  eal: implement functions for mutex management
  eal: implement functions for thread barrier management
  eal: add EAL argument for setting thread priority
  Enable the new EAL thread API

 app/test/process.h                            |   6 +-
 app/test/test_lcores.c                        |  16 +-
 app/test/test_link_bonding.c                  |  10 +-
 app/test/test_lpm_perf.c                      |  12 +-
 config/meson.build                            |   4 +
 drivers/bus/dpaa/base/qbman/bman_driver.c     |   6 +-
 drivers/bus/dpaa/base/qbman/dpaa_sys.c        |  14 +-
 drivers/bus/dpaa/base/qbman/process.c         |   6 +-
 drivers/bus/fslmc/portal/dpaa2_hw_dpio.c      |   6 +-
 drivers/compress/mlx5/mlx5_compress.c         |  10 +-
 drivers/event/dlb/pf/base/dlb_osdep.h         |   2 +-
 drivers/event/dlb2/pf/base/dlb2_osdep.h       |   2 +-
 drivers/net/af_xdp/rte_eth_af_xdp.c           |  18 +-
 drivers/net/ark/ark_ethdev.c                  |   4 +-
 drivers/net/atlantic/atl_ethdev.c             |   4 +-
 drivers/net/atlantic/atl_types.h              |   5 +-
 .../net/atlantic/hw_atl/hw_atl_utils_fw2x.c   |  24 +-
 drivers/net/axgbe/axgbe_dev.c                 |   8 +-
 drivers/net/axgbe/axgbe_ethdev.c              |   8 +-
 drivers/net/axgbe/axgbe_ethdev.h              |   8 +-
 drivers/net/axgbe/axgbe_i2c.c                 |   4 +-
 drivers/net/axgbe/axgbe_mdio.c                |   8 +-
 drivers/net/axgbe/axgbe_phy_impl.c            |   6 +-
 drivers/net/bnxt/bnxt.h                       |  16 +-
 drivers/net/bnxt/bnxt_cpr.c                   |   4 +-
 drivers/net/bnxt/bnxt_ethdev.c                |  54 +-
 drivers/net/bnxt/bnxt_irq.c                   |   8 +-
 drivers/net/bnxt/bnxt_reps.c                  |  10 +-
 drivers/net/bnxt/tf_ulp/bnxt_ulp.c            |  34 +-
 drivers/net/bnxt/tf_ulp/bnxt_ulp.h            |   4 +-
 drivers/net/bnxt/tf_ulp/ulp_fc_mgr.c          |  24 +-
 drivers/net/bnxt/tf_ulp/ulp_fc_mgr.h          |   2 +-
 drivers/net/ena/base/ena_plat_dpdk.h          |   8 +-
 drivers/net/enic/enic.h                       |   2 +-
 drivers/net/hns3/hns3_ethdev.h                |   2 +-
 drivers/net/hns3/hns3_ethdev_vf.c             |   2 +-
 drivers/net/hns3/hns3_mbx.c                   |   2 +-
 drivers/net/ice/ice_dcf_parent.c              |   4 +-
 drivers/net/ipn3ke/ipn3ke_representor.c       |   6 +-
 drivers/net/ixgbe/ixgbe_ethdev.c              |   2 +-
 drivers/net/ixgbe/ixgbe_ethdev.h              |   2 +-
 drivers/net/kni/rte_eth_kni.c                 |   6 +-
 drivers/net/mlx5/linux/mlx5_os.c              |   2 +-
 drivers/net/mlx5/mlx5.c                       |  20 +-
 drivers/net/mlx5/mlx5.h                       |   2 +-
 drivers/net/mlx5/mlx5_txpp.c                  |   8 +-
 drivers/net/mlx5/windows/mlx5_flow_os.c       |  10 +-
 drivers/net/mlx5/windows/mlx5_os.c            |   2 +-
 drivers/net/qede/base/bcm_osal.h              |   8 +-
 drivers/net/vhost/rte_eth_vhost.c             |  22 +-
 .../net/virtio/virtio_user/virtio_user_dev.c  |  30 +-
 .../net/virtio/virtio_user/virtio_user_dev.h  |   2 +-
 drivers/raw/ifpga/ifpga_rawdev.c              |   8 +-
 drivers/vdpa/ifc/ifcvf_vdpa.c                 |  36 +-
 drivers/vdpa/mlx5/mlx5_vdpa.c                 |  24 +-
 drivers/vdpa/mlx5/mlx5_vdpa.h                 |   6 +-
 drivers/vdpa/mlx5/mlx5_vdpa_event.c           |  55 +-
 examples/kni/main.c                           |   6 +-
 examples/vhost/main.c                         |   2 +-
 examples/vhost_blk/vhost_blk.c                |  10 +-
 lib/librte_eal/common/eal_common_options.c    |  36 +-
 lib/librte_eal/common/eal_common_proc.c       |  48 +-
 lib/librte_eal/common/eal_common_thread.c     |  43 +-
 lib/librte_eal/common/eal_common_trace.c      |   2 +-
 lib/librte_eal/common/eal_internal_cfg.h      |   2 +
 lib/librte_eal/common/eal_options.h           |   2 +
 lib/librte_eal/common/eal_private.h           |   2 +-
 lib/librte_eal/common/malloc_mp.c             |  32 +-
 lib/librte_eal/common/meson.build             |   1 +
 lib/librte_eal/common/rte_thread.c            | 342 ++++++++++++
 lib/librte_eal/freebsd/eal.c                  |  37 +-
 lib/librte_eal/freebsd/eal_alarm.c            |  12 +-
 lib/librte_eal/freebsd/eal_interrupts.c       |   4 +-
 lib/librte_eal/freebsd/eal_thread.c           |   8 +-
 lib/librte_eal/include/meson.build            |   1 +
 lib/librte_eal/include/rte_lcore.h            |   8 +-
 lib/librte_eal/include/rte_per_lcore.h        |   2 -
 lib/librte_eal/include/rte_thread.h           | 333 ++++++++++-
 lib/librte_eal/include/rte_thread_types.h     |  20 +
 lib/librte_eal/linux/eal.c                    |  42 +-
 lib/librte_eal/linux/eal_alarm.c              |  10 +-
 lib/librte_eal/linux/eal_interrupts.c         |   4 +-
 lib/librte_eal/linux/eal_thread.c             |   8 +-
 lib/librte_eal/linux/eal_timer.c              |   2 +-
 lib/librte_eal/rte_eal_exports.def            |  19 +
 lib/librte_eal/unix/meson.build               |   1 -
 lib/librte_eal/unix/rte_thread.c              |  86 ---
 lib/librte_eal/version.map                    |  21 +
 lib/librte_eal/windows/eal.c                  |  26 +-
 lib/librte_eal/windows/eal_interrupts.c       |   6 +-
 lib/librte_eal/windows/eal_lcore.c            | 170 ++++--
 lib/librte_eal/windows/eal_thread.c           |  24 +-
 lib/librte_eal/windows/eal_windows.h          |  20 +-
 lib/librte_eal/windows/include/meson.build    |   1 +
 lib/librte_eal/windows/include/pthread.h      | 186 -------
 .../include/rte_windows_thread_types.h        |  19 +
 lib/librte_eal/windows/include/sched.h        |   2 +-
 lib/librte_eal/windows/meson.build            |   7 +-
 lib/librte_eal/windows/rte_thread.c           | 516 +++++++++++++++++-
 lib/librte_ethdev/rte_ethdev.c                |   4 +-
 lib/librte_ethdev/rte_ethdev_core.h           |   3 +-
 lib/librte_ethdev/rte_flow.c                  |   4 +-
 .../rte_event_eth_rx_adapter.c                |   6 +-
 lib/librte_vhost/fd_man.c                     |  40 +-
 lib/librte_vhost/fd_man.h                     |   6 +-
 lib/librte_vhost/socket.c                     | 124 ++---
 lib/librte_vhost/vhost.c                      |  10 +-
 meson_options.txt                             |   2 +
 108 files changed, 2034 insertions(+), 906 deletions(-)
 create mode 100644 lib/librte_eal/common/rte_thread.c
 create mode 100644 lib/librte_eal/include/rte_thread_types.h
 delete mode 100644 lib/librte_eal/unix/rte_thread.c
 delete mode 100644 lib/librte_eal/windows/include/pthread.h
 create mode 100644 lib/librte_eal/windows/include/rte_windows_thread_types.h

-- 
2.30.0.vfs.0.2


^ permalink raw reply	[relevance 2%]

* Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
  2021-03-22 17:07  3%           ` Andrew Rybchenko
@ 2021-03-22 18:53  0%             ` Ananyev, Konstantin
  2021-03-23 10:13  0%               ` Ferruh Yigit
  0 siblings, 1 reply; 200+ results
From: Ananyev, Konstantin @ 2021-03-22 18:53 UTC (permalink / raw)
  To: Andrew Rybchenko, Yigit, Ferruh, Lijun Ou, thomas
  Cc: dev, linuxarm, Andrew Rybchenko, David Marchand, Ray Kinsella,
	Luca Boccassi



> -----Original Message-----
> From: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
> Sent: Monday, March 22, 2021 5:08 PM
> To: Ananyev, Konstantin <konstantin.ananyev@intel.com>; Yigit, Ferruh <ferruh.yigit@intel.com>; Lijun Ou <oulijun@huawei.com>;
> thomas@monjalon.net
> Cc: dev@dpdk.org; linuxarm@openeuler.org; Andrew Rybchenko <arybchenko@solarflare.com>; David Marchand
> <david.marchand@redhat.com>; Ray Kinsella <mdr@ashroe.eu>; Luca Boccassi <bluca@debian.org>
> Subject: Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
> 
> On 3/22/21 7:53 PM, Ananyev, Konstantin wrote:
> >
> >
> >> -----Original Message-----
> >> From: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
> >> Sent: Monday, March 22, 2021 4:02 PM
> >> To: Ananyev, Konstantin <konstantin.ananyev@intel.com>; Yigit, Ferruh <ferruh.yigit@intel.com>; Lijun Ou <oulijun@huawei.com>;
> >> thomas@monjalon.net
> >> Cc: dev@dpdk.org; linuxarm@openeuler.org; Andrew Rybchenko <arybchenko@solarflare.com>; David Marchand
> >> <david.marchand@redhat.com>; Ray Kinsella <mdr@ashroe.eu>; Luca Boccassi <bluca@debian.org>
> >> Subject: Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
> >>
> >> On 3/22/21 6:45 PM, Ananyev, Konstantin wrote:
> >>>
> >>>
> >>>> -----Original Message-----
> >>>> From: dev <dev-bounces@dpdk.org> On Behalf Of Andrew Rybchenko
> >>>> Sent: Monday, March 22, 2021 2:49 PM
> >>>> To: Yigit, Ferruh <ferruh.yigit@intel.com>; Lijun Ou <oulijun@huawei.com>; thomas@monjalon.net
> >>>> Cc: dev@dpdk.org; linuxarm@openeuler.org; Andrew Rybchenko <arybchenko@solarflare.com>; David Marchand
> >>>> <david.marchand@redhat.com>; Ray Kinsella <mdr@ashroe.eu>; Luca Boccassi <bluca@debian.org>
> >>>> Subject: Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
> >>>>
> >>>> On 3/22/21 12:22 PM, Ferruh Yigit wrote:
> >>>>> On 3/18/2021 12:25 PM, Lijun Ou wrote:
> >>>>>> Currently, upper-layer application could get queue state only
> >>>>>> through pointers such as dev->data->tx_queue_state[queue_id],
> >>>>>> this is not the recommended way to access it. So this patch
> >>>>>> add get queue state when call rte_eth_rx_queue_info_get and
> >>>>>> rte_eth_tx_queue_info_get API.
> >>>>>>
> >>>>>> Note: The hairpin queue is not supported with above
> >>>>>> rte_eth_*x_queue_info_get, so the queue state could be
> >>>>>> RTE_ETH_QUEUE_STATE_STARTED or RTE_ETH_QUEUE_STATE_STOPPED.
> >>>>>> Note: After add queue_state field, the 'struct rte_eth_rxq_info' size
> >>>>>> remains 128B, and the 'struct rte_eth_txq_info' size remains 64B, so
> >>>>>> it could be ABI compatible.
> >>>>>>
> >>>>>> Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
> >>>>>> Signed-off-by: Lijun Ou <oulijun@huawei.com>
> >>>>>
> >>>>> <...>
> >>>>>
> >>>>>> diff --git a/lib/librte_ethdev/rte_ethdev.h
> >>>>>> b/lib/librte_ethdev/rte_ethdev.h
> >>>>>> index efda313..3b83c5a 100644
> >>>>>> --- a/lib/librte_ethdev/rte_ethdev.h
> >>>>>> +++ b/lib/librte_ethdev/rte_ethdev.h
> >>>>>> @@ -1591,6 +1591,8 @@ struct rte_eth_rxq_info {
> >>>>>>       uint8_t scattered_rx;       /**< scattered packets RX supported. */
> >>>>>>       uint16_t nb_desc;           /**< configured number of RXDs. */
> >>>>>>       uint16_t rx_buf_size;       /**< hardware receive buffer size. */
> >>>>>> +    /**< Queues state: STARTED(1) / STOPPED(0). */
> >>>>>> +    uint8_t queue_state;
> >>>>>>   } __rte_cache_min_aligned;
> >>>>>>     /**
> >>>>>> @@ -1600,6 +1602,8 @@ struct rte_eth_rxq_info {
> >>>>>>   struct rte_eth_txq_info {
> >>>>>>       struct rte_eth_txconf conf; /**< queue config parameters. */
> >>>>>>       uint16_t nb_desc;           /**< configured number of TXDs. */
> >>>>>> +    /**< Queues state: STARTED(1) / STOPPED(0). */
> >>>>>> +    uint8_t queue_state;
> >>>>>>   } __rte_cache_min_aligned;
> >>>>>>     /* Generic Burst mode flag definition, values can be ORed. */
> >>>>>>
> >>>>>
> >>>>> This is causing an ABI warning [1], but I guess it is safe since the
> >>>>> size of the struct is not changing (cache align). Adding a few more
> >>>>> people to comment.
> >>>>>
> >>>>>
> >>>>> [1]
> >>>>> https://travis-ci.com/github/ovsrobot/dpdk/builds/220497651
> >>>>
> >>>> Frankly speaking I dislike addition of queue_state as uint8_t.
> >>>> IMHO it should be either 'bool started' or enum to support more
> >>>> states in the future if we need.
> >>>
> >>> I think we already have set of defines for it:
> >>> lib/librte_ethdev/rte_ethdev_driver.h:925:#define RTE_ETH_QUEUE_STATE_STOPPED 0
> >>> lib/librte_ethdev/rte_ethdev_driver.h:926:#define RTE_ETH_QUEUE_STATE_STARTED 1
> >>> lib/librte_ethdev/rte_ethdev_driver.h:927:#define RTE_ETH_QUEUE_STATE_HAIRPIN 2
> >>>
> >>> If we want to publish it, then might be enough just move these macros to rte_ethdev.h or so.
> >>>
> >>> About uint8_t vs enum - yes, in principle enum would be a bit nicer,
> >>> but right now rte_eth_dev_data.(rx|tx)_queue_state[]  itself is an array of uint8_t.
> >>> So probably not much point to waste extra 3B in rte_eth_(rxq|txq)_info.
> >>> Unless in future will want to change it in struct rte_eth_dev_data too
> >>> (or even hide it inside dev private queue data).
> >>
> >> I forgot about hairpin and bitmask... If so, I think it is
> >> sufficient to fix absolutely misleading comment, say
> >> that it is a bit mask and think about removal of
> >> RTE_ETH_QUEUE_STATE_STOPPED (since it could be
> >> stopped+hairpin). May be consider to use uin16_t,
> >> since 8 bit is really small bitmask. It still fits in
> >> available hole.
> >
> > Hmm, as I can read the code - hairpin queue can't be started/stopped by SW,
> > and each of the states (stopped/started/hairpin) is mutually exclusive.
> > Is that not what was intended when hairpin queues were introduced?
> >
> 
> Thanks, yes, you're right. My memory lies to me. If queue state
> is not a bit mask, it should be an enum from API point of view.
> Rx/Tx queue info structures are control path. I see no point to
> save bits here. Clear API is more important on control path.
> The only reason here to use uint8_t is to avoid ABI breakage.
> I can't judge if it is critical to wait or not.

As alternate thought - introduce new API function,
something like:
int rte_eth_get_rxq_state(portid, queue_id);
Then rte_eth_dev_is_rx_hairpin_queue() probably can be deprecated
in favour of this new one.  



^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
  2021-03-22 16:53  0%         ` Ananyev, Konstantin
@ 2021-03-22 17:07  3%           ` Andrew Rybchenko
  2021-03-22 18:53  0%             ` Ananyev, Konstantin
  0 siblings, 1 reply; 200+ results
From: Andrew Rybchenko @ 2021-03-22 17:07 UTC (permalink / raw)
  To: Ananyev, Konstantin, Yigit, Ferruh, Lijun Ou, thomas
  Cc: dev, linuxarm, Andrew Rybchenko, David Marchand, Ray Kinsella,
	Luca Boccassi

On 3/22/21 7:53 PM, Ananyev, Konstantin wrote:
> 
> 
>> -----Original Message-----
>> From: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
>> Sent: Monday, March 22, 2021 4:02 PM
>> To: Ananyev, Konstantin <konstantin.ananyev@intel.com>; Yigit, Ferruh <ferruh.yigit@intel.com>; Lijun Ou <oulijun@huawei.com>;
>> thomas@monjalon.net
>> Cc: dev@dpdk.org; linuxarm@openeuler.org; Andrew Rybchenko <arybchenko@solarflare.com>; David Marchand
>> <david.marchand@redhat.com>; Ray Kinsella <mdr@ashroe.eu>; Luca Boccassi <bluca@debian.org>
>> Subject: Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
>>
>> On 3/22/21 6:45 PM, Ananyev, Konstantin wrote:
>>>
>>>
>>>> -----Original Message-----
>>>> From: dev <dev-bounces@dpdk.org> On Behalf Of Andrew Rybchenko
>>>> Sent: Monday, March 22, 2021 2:49 PM
>>>> To: Yigit, Ferruh <ferruh.yigit@intel.com>; Lijun Ou <oulijun@huawei.com>; thomas@monjalon.net
>>>> Cc: dev@dpdk.org; linuxarm@openeuler.org; Andrew Rybchenko <arybchenko@solarflare.com>; David Marchand
>>>> <david.marchand@redhat.com>; Ray Kinsella <mdr@ashroe.eu>; Luca Boccassi <bluca@debian.org>
>>>> Subject: Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
>>>>
>>>> On 3/22/21 12:22 PM, Ferruh Yigit wrote:
>>>>> On 3/18/2021 12:25 PM, Lijun Ou wrote:
>>>>>> Currently, upper-layer application could get queue state only
>>>>>> through pointers such as dev->data->tx_queue_state[queue_id],
>>>>>> this is not the recommended way to access it. So this patch
>>>>>> add get queue state when call rte_eth_rx_queue_info_get and
>>>>>> rte_eth_tx_queue_info_get API.
>>>>>>
>>>>>> Note: The hairpin queue is not supported with above
>>>>>> rte_eth_*x_queue_info_get, so the queue state could be
>>>>>> RTE_ETH_QUEUE_STATE_STARTED or RTE_ETH_QUEUE_STATE_STOPPED.
>>>>>> Note: After add queue_state field, the 'struct rte_eth_rxq_info' size
>>>>>> remains 128B, and the 'struct rte_eth_txq_info' size remains 64B, so
>>>>>> it could be ABI compatible.
>>>>>>
>>>>>> Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
>>>>>> Signed-off-by: Lijun Ou <oulijun@huawei.com>
>>>>>
>>>>> <...>
>>>>>
>>>>>> diff --git a/lib/librte_ethdev/rte_ethdev.h
>>>>>> b/lib/librte_ethdev/rte_ethdev.h
>>>>>> index efda313..3b83c5a 100644
>>>>>> --- a/lib/librte_ethdev/rte_ethdev.h
>>>>>> +++ b/lib/librte_ethdev/rte_ethdev.h
>>>>>> @@ -1591,6 +1591,8 @@ struct rte_eth_rxq_info {
>>>>>>       uint8_t scattered_rx;       /**< scattered packets RX supported. */
>>>>>>       uint16_t nb_desc;           /**< configured number of RXDs. */
>>>>>>       uint16_t rx_buf_size;       /**< hardware receive buffer size. */
>>>>>> +    /**< Queues state: STARTED(1) / STOPPED(0). */
>>>>>> +    uint8_t queue_state;
>>>>>>   } __rte_cache_min_aligned;
>>>>>>     /**
>>>>>> @@ -1600,6 +1602,8 @@ struct rte_eth_rxq_info {
>>>>>>   struct rte_eth_txq_info {
>>>>>>       struct rte_eth_txconf conf; /**< queue config parameters. */
>>>>>>       uint16_t nb_desc;           /**< configured number of TXDs. */
>>>>>> +    /**< Queues state: STARTED(1) / STOPPED(0). */
>>>>>> +    uint8_t queue_state;
>>>>>>   } __rte_cache_min_aligned;
>>>>>>     /* Generic Burst mode flag definition, values can be ORed. */
>>>>>>
>>>>>
>>>>> This is causing an ABI warning [1], but I guess it is safe since the
>>>>> size of the struct is not changing (cache align). Adding a few more
>>>>> people to comment.
>>>>>
>>>>>
>>>>> [1]
>>>>> https://travis-ci.com/github/ovsrobot/dpdk/builds/220497651
>>>>
>>>> Frankly speaking I dislike addition of queue_state as uint8_t.
>>>> IMHO it should be either 'bool started' or enum to support more
>>>> states in the future if we need.
>>>
>>> I think we already have set of defines for it:
>>> lib/librte_ethdev/rte_ethdev_driver.h:925:#define RTE_ETH_QUEUE_STATE_STOPPED 0
>>> lib/librte_ethdev/rte_ethdev_driver.h:926:#define RTE_ETH_QUEUE_STATE_STARTED 1
>>> lib/librte_ethdev/rte_ethdev_driver.h:927:#define RTE_ETH_QUEUE_STATE_HAIRPIN 2
>>>
>>> If we want to publish it, then might be enough just move these macros to rte_ethdev.h or so.
>>>
>>> About uint8_t vs enum - yes, in principle enum would be a bit nicer,
>>> but right now rte_eth_dev_data.(rx|tx)_queue_state[]  itself is an array of uint8_t.
>>> So probably not much point to waste extra 3B in rte_eth_(rxq|txq)_info.
>>> Unless in future will want to change it in struct rte_eth_dev_data too
>>> (or even hide it inside dev private queue data).
>>
>> I forgot about hairpin and bitmask... If so, I think it is
>> sufficient to fix absolutely misleading comment, say
>> that it is a bit mask and think about removal of
>> RTE_ETH_QUEUE_STATE_STOPPED (since it could be
>> stopped+hairpin). May be consider to use uin16_t,
>> since 8 bit is really small bitmask. It still fits in
>> available hole.
> 
> Hmm, as I can read the code - hairpin queue can't be started/stopped by SW,
> and each of the states (stopped/started/hairpin) is mutually exclusive.
> Is that not what was intended when hairpin queues were introduced?
> 

Thanks, yes, you're right. My memory lies to me. If queue state
is not a bit mask, it should be an enum from API point of view.
Rx/Tx queue info structures are control path. I see no point to
save bits here. Clear API is more important on control path.
The only reason here to use uint8_t is to avoid ABI breakage.
I can't judge if it is critical to wait or not.

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
  2021-03-22 16:02  0%       ` Andrew Rybchenko
@ 2021-03-22 16:53  0%         ` Ananyev, Konstantin
  2021-03-22 17:07  3%           ` Andrew Rybchenko
  0 siblings, 1 reply; 200+ results
From: Ananyev, Konstantin @ 2021-03-22 16:53 UTC (permalink / raw)
  To: Andrew Rybchenko, Yigit, Ferruh, Lijun Ou, thomas
  Cc: dev, linuxarm, Andrew Rybchenko, David Marchand, Ray Kinsella,
	Luca Boccassi



> -----Original Message-----
> From: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
> Sent: Monday, March 22, 2021 4:02 PM
> To: Ananyev, Konstantin <konstantin.ananyev@intel.com>; Yigit, Ferruh <ferruh.yigit@intel.com>; Lijun Ou <oulijun@huawei.com>;
> thomas@monjalon.net
> Cc: dev@dpdk.org; linuxarm@openeuler.org; Andrew Rybchenko <arybchenko@solarflare.com>; David Marchand
> <david.marchand@redhat.com>; Ray Kinsella <mdr@ashroe.eu>; Luca Boccassi <bluca@debian.org>
> Subject: Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
> 
> On 3/22/21 6:45 PM, Ananyev, Konstantin wrote:
> >
> >
> >> -----Original Message-----
> >> From: dev <dev-bounces@dpdk.org> On Behalf Of Andrew Rybchenko
> >> Sent: Monday, March 22, 2021 2:49 PM
> >> To: Yigit, Ferruh <ferruh.yigit@intel.com>; Lijun Ou <oulijun@huawei.com>; thomas@monjalon.net
> >> Cc: dev@dpdk.org; linuxarm@openeuler.org; Andrew Rybchenko <arybchenko@solarflare.com>; David Marchand
> >> <david.marchand@redhat.com>; Ray Kinsella <mdr@ashroe.eu>; Luca Boccassi <bluca@debian.org>
> >> Subject: Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
> >>
> >> On 3/22/21 12:22 PM, Ferruh Yigit wrote:
> >>> On 3/18/2021 12:25 PM, Lijun Ou wrote:
> >>>> Currently, upper-layer application could get queue state only
> >>>> through pointers such as dev->data->tx_queue_state[queue_id],
> >>>> this is not the recommended way to access it. So this patch
> >>>> add get queue state when call rte_eth_rx_queue_info_get and
> >>>> rte_eth_tx_queue_info_get API.
> >>>>
> >>>> Note: The hairpin queue is not supported with above
> >>>> rte_eth_*x_queue_info_get, so the queue state could be
> >>>> RTE_ETH_QUEUE_STATE_STARTED or RTE_ETH_QUEUE_STATE_STOPPED.
> >>>> Note: After add queue_state field, the 'struct rte_eth_rxq_info' size
> >>>> remains 128B, and the 'struct rte_eth_txq_info' size remains 64B, so
> >>>> it could be ABI compatible.
> >>>>
> >>>> Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
> >>>> Signed-off-by: Lijun Ou <oulijun@huawei.com>
> >>>
> >>> <...>
> >>>
> >>>> diff --git a/lib/librte_ethdev/rte_ethdev.h
> >>>> b/lib/librte_ethdev/rte_ethdev.h
> >>>> index efda313..3b83c5a 100644
> >>>> --- a/lib/librte_ethdev/rte_ethdev.h
> >>>> +++ b/lib/librte_ethdev/rte_ethdev.h
> >>>> @@ -1591,6 +1591,8 @@ struct rte_eth_rxq_info {
> >>>>       uint8_t scattered_rx;       /**< scattered packets RX supported. */
> >>>>       uint16_t nb_desc;           /**< configured number of RXDs. */
> >>>>       uint16_t rx_buf_size;       /**< hardware receive buffer size. */
> >>>> +    /**< Queues state: STARTED(1) / STOPPED(0). */
> >>>> +    uint8_t queue_state;
> >>>>   } __rte_cache_min_aligned;
> >>>>     /**
> >>>> @@ -1600,6 +1602,8 @@ struct rte_eth_rxq_info {
> >>>>   struct rte_eth_txq_info {
> >>>>       struct rte_eth_txconf conf; /**< queue config parameters. */
> >>>>       uint16_t nb_desc;           /**< configured number of TXDs. */
> >>>> +    /**< Queues state: STARTED(1) / STOPPED(0). */
> >>>> +    uint8_t queue_state;
> >>>>   } __rte_cache_min_aligned;
> >>>>     /* Generic Burst mode flag definition, values can be ORed. */
> >>>>
> >>>
> >>> This is causing an ABI warning [1], but I guess it is safe since the
> >>> size of the struct is not changing (cache align). Adding a few more
> >>> people to comment.
> >>>
> >>>
> >>> [1]
> >>> https://travis-ci.com/github/ovsrobot/dpdk/builds/220497651
> >>
> >> Frankly speaking I dislike addition of queue_state as uint8_t.
> >> IMHO it should be either 'bool started' or enum to support more
> >> states in the future if we need.
> >
> > I think we already have set of defines for it:
> > lib/librte_ethdev/rte_ethdev_driver.h:925:#define RTE_ETH_QUEUE_STATE_STOPPED 0
> > lib/librte_ethdev/rte_ethdev_driver.h:926:#define RTE_ETH_QUEUE_STATE_STARTED 1
> > lib/librte_ethdev/rte_ethdev_driver.h:927:#define RTE_ETH_QUEUE_STATE_HAIRPIN 2
> >
> > If we want to publish it, then might be enough just move these macros to rte_ethdev.h or so.
> >
> > About uint8_t vs enum - yes, in principle enum would be a bit nicer,
> > but right now rte_eth_dev_data.(rx|tx)_queue_state[]  itself is an array of uint8_t.
> > So probably not much point to waste extra 3B in rte_eth_(rxq|txq)_info.
> > Unless in future will want to change it in struct rte_eth_dev_data too
> > (or even hide it inside dev private queue data).
> 
> I forgot about hairpin and bitmask... If so, I think it is
> sufficient to fix absolutely misleading comment, say
> that it is a bit mask and think about removal of
> RTE_ETH_QUEUE_STATE_STOPPED (since it could be
> stopped+hairpin). May be consider to use uin16_t,
> since 8 bit is really small bitmask. It still fits in
> available hole.

Hmm, as I can read the code - hairpin queue can't be started/stopped by SW,
and each of the states (stopped/started/hairpin) is mutually exclusive.
Is that not what was intended when hairpin queues were introduced?


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
  2021-03-22 15:45  0%     ` Ananyev, Konstantin
@ 2021-03-22 16:02  0%       ` Andrew Rybchenko
  2021-03-22 16:53  0%         ` Ananyev, Konstantin
  2021-03-25 10:01  0%       ` oulijun
  1 sibling, 1 reply; 200+ results
From: Andrew Rybchenko @ 2021-03-22 16:02 UTC (permalink / raw)
  To: Ananyev, Konstantin, Yigit, Ferruh, Lijun Ou, thomas
  Cc: dev, linuxarm, Andrew Rybchenko, David Marchand, Ray Kinsella,
	Luca Boccassi

On 3/22/21 6:45 PM, Ananyev, Konstantin wrote:
> 
> 
>> -----Original Message-----
>> From: dev <dev-bounces@dpdk.org> On Behalf Of Andrew Rybchenko
>> Sent: Monday, March 22, 2021 2:49 PM
>> To: Yigit, Ferruh <ferruh.yigit@intel.com>; Lijun Ou <oulijun@huawei.com>; thomas@monjalon.net
>> Cc: dev@dpdk.org; linuxarm@openeuler.org; Andrew Rybchenko <arybchenko@solarflare.com>; David Marchand
>> <david.marchand@redhat.com>; Ray Kinsella <mdr@ashroe.eu>; Luca Boccassi <bluca@debian.org>
>> Subject: Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
>>
>> On 3/22/21 12:22 PM, Ferruh Yigit wrote:
>>> On 3/18/2021 12:25 PM, Lijun Ou wrote:
>>>> Currently, upper-layer application could get queue state only
>>>> through pointers such as dev->data->tx_queue_state[queue_id],
>>>> this is not the recommended way to access it. So this patch
>>>> add get queue state when call rte_eth_rx_queue_info_get and
>>>> rte_eth_tx_queue_info_get API.
>>>>
>>>> Note: The hairpin queue is not supported with above
>>>> rte_eth_*x_queue_info_get, so the queue state could be
>>>> RTE_ETH_QUEUE_STATE_STARTED or RTE_ETH_QUEUE_STATE_STOPPED.
>>>> Note: After add queue_state field, the 'struct rte_eth_rxq_info' size
>>>> remains 128B, and the 'struct rte_eth_txq_info' size remains 64B, so
>>>> it could be ABI compatible.
>>>>
>>>> Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
>>>> Signed-off-by: Lijun Ou <oulijun@huawei.com>
>>>
>>> <...>
>>>
>>>> diff --git a/lib/librte_ethdev/rte_ethdev.h
>>>> b/lib/librte_ethdev/rte_ethdev.h
>>>> index efda313..3b83c5a 100644
>>>> --- a/lib/librte_ethdev/rte_ethdev.h
>>>> +++ b/lib/librte_ethdev/rte_ethdev.h
>>>> @@ -1591,6 +1591,8 @@ struct rte_eth_rxq_info {
>>>>       uint8_t scattered_rx;       /**< scattered packets RX supported. */
>>>>       uint16_t nb_desc;           /**< configured number of RXDs. */
>>>>       uint16_t rx_buf_size;       /**< hardware receive buffer size. */
>>>> +    /**< Queues state: STARTED(1) / STOPPED(0). */
>>>> +    uint8_t queue_state;
>>>>   } __rte_cache_min_aligned;
>>>>     /**
>>>> @@ -1600,6 +1602,8 @@ struct rte_eth_rxq_info {
>>>>   struct rte_eth_txq_info {
>>>>       struct rte_eth_txconf conf; /**< queue config parameters. */
>>>>       uint16_t nb_desc;           /**< configured number of TXDs. */
>>>> +    /**< Queues state: STARTED(1) / STOPPED(0). */
>>>> +    uint8_t queue_state;
>>>>   } __rte_cache_min_aligned;
>>>>     /* Generic Burst mode flag definition, values can be ORed. */
>>>>
>>>
>>> This is causing an ABI warning [1], but I guess it is safe since the
>>> size of the struct is not changing (cache align). Adding a few more
>>> people to comment.
>>>
>>>
>>> [1]
>>> https://travis-ci.com/github/ovsrobot/dpdk/builds/220497651
>>
>> Frankly speaking I dislike addition of queue_state as uint8_t.
>> IMHO it should be either 'bool started' or enum to support more
>> states in the future if we need.
> 
> I think we already have set of defines for it:
> lib/librte_ethdev/rte_ethdev_driver.h:925:#define RTE_ETH_QUEUE_STATE_STOPPED 0
> lib/librte_ethdev/rte_ethdev_driver.h:926:#define RTE_ETH_QUEUE_STATE_STARTED 1
> lib/librte_ethdev/rte_ethdev_driver.h:927:#define RTE_ETH_QUEUE_STATE_HAIRPIN 2
> 
> If we want to publish it, then might be enough just move these macros to rte_ethdev.h or so.
> 
> About uint8_t vs enum - yes, in principle enum would be a bit nicer,
> but right now rte_eth_dev_data.(rx|tx)_queue_state[]  itself is an array of uint8_t.
> So probably not much point to waste extra 3B in rte_eth_(rxq|txq)_info.
> Unless in future will want to change it in struct rte_eth_dev_data too
> (or even hide it inside dev private queue data). 

I forgot about hairpin and bitmask... If so, I think it is
sufficient to fix absolutely misleading comment, say
that it is a bit mask and think about removal of
RTE_ETH_QUEUE_STATE_STOPPED (since it could be
stopped+hairpin). May be consider to use uin16_t,
since 8 bit is really small bitmask. It still fits in
available hole.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
  2021-03-22 14:49  0%   ` Andrew Rybchenko
@ 2021-03-22 15:45  0%     ` Ananyev, Konstantin
  2021-03-22 16:02  0%       ` Andrew Rybchenko
  2021-03-25 10:01  0%       ` oulijun
  0 siblings, 2 replies; 200+ results
From: Ananyev, Konstantin @ 2021-03-22 15:45 UTC (permalink / raw)
  To: Andrew Rybchenko, Yigit, Ferruh, Lijun Ou, thomas
  Cc: dev, linuxarm, Andrew Rybchenko, David Marchand, Ray Kinsella,
	Luca Boccassi



> -----Original Message-----
> From: dev <dev-bounces@dpdk.org> On Behalf Of Andrew Rybchenko
> Sent: Monday, March 22, 2021 2:49 PM
> To: Yigit, Ferruh <ferruh.yigit@intel.com>; Lijun Ou <oulijun@huawei.com>; thomas@monjalon.net
> Cc: dev@dpdk.org; linuxarm@openeuler.org; Andrew Rybchenko <arybchenko@solarflare.com>; David Marchand
> <david.marchand@redhat.com>; Ray Kinsella <mdr@ashroe.eu>; Luca Boccassi <bluca@debian.org>
> Subject: Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
> 
> On 3/22/21 12:22 PM, Ferruh Yigit wrote:
> > On 3/18/2021 12:25 PM, Lijun Ou wrote:
> >> Currently, upper-layer application could get queue state only
> >> through pointers such as dev->data->tx_queue_state[queue_id],
> >> this is not the recommended way to access it. So this patch
> >> add get queue state when call rte_eth_rx_queue_info_get and
> >> rte_eth_tx_queue_info_get API.
> >>
> >> Note: The hairpin queue is not supported with above
> >> rte_eth_*x_queue_info_get, so the queue state could be
> >> RTE_ETH_QUEUE_STATE_STARTED or RTE_ETH_QUEUE_STATE_STOPPED.
> >> Note: After add queue_state field, the 'struct rte_eth_rxq_info' size
> >> remains 128B, and the 'struct rte_eth_txq_info' size remains 64B, so
> >> it could be ABI compatible.
> >>
> >> Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
> >> Signed-off-by: Lijun Ou <oulijun@huawei.com>
> >
> > <...>
> >
> >> diff --git a/lib/librte_ethdev/rte_ethdev.h
> >> b/lib/librte_ethdev/rte_ethdev.h
> >> index efda313..3b83c5a 100644
> >> --- a/lib/librte_ethdev/rte_ethdev.h
> >> +++ b/lib/librte_ethdev/rte_ethdev.h
> >> @@ -1591,6 +1591,8 @@ struct rte_eth_rxq_info {
> >>       uint8_t scattered_rx;       /**< scattered packets RX supported. */
> >>       uint16_t nb_desc;           /**< configured number of RXDs. */
> >>       uint16_t rx_buf_size;       /**< hardware receive buffer size. */
> >> +    /**< Queues state: STARTED(1) / STOPPED(0). */
> >> +    uint8_t queue_state;
> >>   } __rte_cache_min_aligned;
> >>     /**
> >> @@ -1600,6 +1602,8 @@ struct rte_eth_rxq_info {
> >>   struct rte_eth_txq_info {
> >>       struct rte_eth_txconf conf; /**< queue config parameters. */
> >>       uint16_t nb_desc;           /**< configured number of TXDs. */
> >> +    /**< Queues state: STARTED(1) / STOPPED(0). */
> >> +    uint8_t queue_state;
> >>   } __rte_cache_min_aligned;
> >>     /* Generic Burst mode flag definition, values can be ORed. */
> >>
> >
> > This is causing an ABI warning [1], but I guess it is safe since the
> > size of the struct is not changing (cache align). Adding a few more
> > people to comment.
> >
> >
> > [1]
> > https://travis-ci.com/github/ovsrobot/dpdk/builds/220497651
> 
> Frankly speaking I dislike addition of queue_state as uint8_t.
> IMHO it should be either 'bool started' or enum to support more
> states in the future if we need.

I think we already have set of defines for it:
lib/librte_ethdev/rte_ethdev_driver.h:925:#define RTE_ETH_QUEUE_STATE_STOPPED 0
lib/librte_ethdev/rte_ethdev_driver.h:926:#define RTE_ETH_QUEUE_STATE_STARTED 1
lib/librte_ethdev/rte_ethdev_driver.h:927:#define RTE_ETH_QUEUE_STATE_HAIRPIN 2

If we want to publish it, then might be enough just move these macros to rte_ethdev.h or so.

About uint8_t vs enum - yes, in principle enum would be a bit nicer,
but right now rte_eth_dev_data.(rx|tx)_queue_state[]  itself is an array of uint8_t.
So probably not much point to waste extra 3B in rte_eth_(rxq|txq)_info.
Unless in future will want to change it in struct rte_eth_dev_data too
(or even hide it inside dev private queue data). 
  



^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
  2021-03-22  9:22  3% ` Ferruh Yigit
  2021-03-22  9:38  0%   ` Kinsella, Ray
  2021-03-22  9:39  0%   ` oulijun
@ 2021-03-22 14:49  0%   ` Andrew Rybchenko
  2021-03-22 15:45  0%     ` Ananyev, Konstantin
  2 siblings, 1 reply; 200+ results
From: Andrew Rybchenko @ 2021-03-22 14:49 UTC (permalink / raw)
  To: Ferruh Yigit, Lijun Ou, thomas
  Cc: dev, linuxarm, Andrew Rybchenko, David Marchand, Ray Kinsella,
	Luca Boccassi

On 3/22/21 12:22 PM, Ferruh Yigit wrote:
> On 3/18/2021 12:25 PM, Lijun Ou wrote:
>> Currently, upper-layer application could get queue state only
>> through pointers such as dev->data->tx_queue_state[queue_id],
>> this is not the recommended way to access it. So this patch
>> add get queue state when call rte_eth_rx_queue_info_get and
>> rte_eth_tx_queue_info_get API.
>>
>> Note: The hairpin queue is not supported with above
>> rte_eth_*x_queue_info_get, so the queue state could be
>> RTE_ETH_QUEUE_STATE_STARTED or RTE_ETH_QUEUE_STATE_STOPPED.
>> Note: After add queue_state field, the 'struct rte_eth_rxq_info' size
>> remains 128B, and the 'struct rte_eth_txq_info' size remains 64B, so
>> it could be ABI compatible.
>>
>> Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
>> Signed-off-by: Lijun Ou <oulijun@huawei.com>
> 
> <...>
> 
>> diff --git a/lib/librte_ethdev/rte_ethdev.h
>> b/lib/librte_ethdev/rte_ethdev.h
>> index efda313..3b83c5a 100644
>> --- a/lib/librte_ethdev/rte_ethdev.h
>> +++ b/lib/librte_ethdev/rte_ethdev.h
>> @@ -1591,6 +1591,8 @@ struct rte_eth_rxq_info {
>>       uint8_t scattered_rx;       /**< scattered packets RX supported. */
>>       uint16_t nb_desc;           /**< configured number of RXDs. */
>>       uint16_t rx_buf_size;       /**< hardware receive buffer size. */
>> +    /**< Queues state: STARTED(1) / STOPPED(0). */
>> +    uint8_t queue_state;
>>   } __rte_cache_min_aligned;
>>     /**
>> @@ -1600,6 +1602,8 @@ struct rte_eth_rxq_info {
>>   struct rte_eth_txq_info {
>>       struct rte_eth_txconf conf; /**< queue config parameters. */
>>       uint16_t nb_desc;           /**< configured number of TXDs. */
>> +    /**< Queues state: STARTED(1) / STOPPED(0). */
>> +    uint8_t queue_state;
>>   } __rte_cache_min_aligned;
>>     /* Generic Burst mode flag definition, values can be ORed. */
>>
> 
> This is causing an ABI warning [1], but I guess it is safe since the
> size of the struct is not changing (cache align). Adding a few more
> people to comment.
> 
> 
> [1]
> https://travis-ci.com/github/ovsrobot/dpdk/builds/220497651

Frankly speaking I dislike addition of queue_state as uint8_t.
IMHO it should be either 'bool started' or enum to support more
states in the future if we need.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
  2021-03-22  9:22  3% ` Ferruh Yigit
  2021-03-22  9:38  0%   ` Kinsella, Ray
@ 2021-03-22  9:39  0%   ` oulijun
  2021-03-22 14:49  0%   ` Andrew Rybchenko
  2 siblings, 0 replies; 200+ results
From: oulijun @ 2021-03-22  9:39 UTC (permalink / raw)
  To: Ferruh Yigit, thomas
  Cc: dev, linuxarm, Andrew Rybchenko, David Marchand, Ray Kinsella,
	Luca Boccassi



在 2021/3/22 17:22, Ferruh Yigit 写道:
> On 3/18/2021 12:25 PM, Lijun Ou wrote:
>> Currently, upper-layer application could get queue state only
>> through pointers such as dev->data->tx_queue_state[queue_id],
>> this is not the recommended way to access it. So this patch
>> add get queue state when call rte_eth_rx_queue_info_get and
>> rte_eth_tx_queue_info_get API.
>>
>> Note: The hairpin queue is not supported with above
>> rte_eth_*x_queue_info_get, so the queue state could be
>> RTE_ETH_QUEUE_STATE_STARTED or RTE_ETH_QUEUE_STATE_STOPPED.
>> Note: After add queue_state field, the 'struct rte_eth_rxq_info' size
>> remains 128B, and the 'struct rte_eth_txq_info' size remains 64B, so
>> it could be ABI compatible.
>>
>> Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
>> Signed-off-by: Lijun Ou <oulijun@huawei.com>
> 
> <...>
> 
>> diff --git a/lib/librte_ethdev/rte_ethdev.h 
>> b/lib/librte_ethdev/rte_ethdev.h
>> index efda313..3b83c5a 100644
>> --- a/lib/librte_ethdev/rte_ethdev.h
>> +++ b/lib/librte_ethdev/rte_ethdev.h
>> @@ -1591,6 +1591,8 @@ struct rte_eth_rxq_info {
>>       uint8_t scattered_rx;       /**< scattered packets RX supported. */
>>       uint16_t nb_desc;           /**< configured number of RXDs. */
>>       uint16_t rx_buf_size;       /**< hardware receive buffer size. */
>> +    /**< Queues state: STARTED(1) / STOPPED(0). */
>> +    uint8_t queue_state;
>>   } __rte_cache_min_aligned;
>>   /**
>> @@ -1600,6 +1602,8 @@ struct rte_eth_rxq_info {
>>   struct rte_eth_txq_info {
>>       struct rte_eth_txconf conf; /**< queue config parameters. */
>>       uint16_t nb_desc;           /**< configured number of TXDs. */
>> +    /**< Queues state: STARTED(1) / STOPPED(0). */
>> +    uint8_t queue_state;
>>   } __rte_cache_min_aligned;
>>   /* Generic Burst mode flag definition, values can be ORed. */
>>
> 
> This is causing an ABI warning [1], but I guess it is safe since the 
> size of the struct is not changing (cache align). Adding a few more 
> people to comment.
> 
Yes, thanks.Because we've analyzed it internally.What about other 
people's opinions?
> 
> [1]
> https://travis-ci.com/github/ovsrobot/dpdk/builds/220497651
> .
> 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
  2021-03-22  9:22  3% ` Ferruh Yigit
@ 2021-03-22  9:38  0%   ` Kinsella, Ray
  2021-03-22  9:39  0%   ` oulijun
  2021-03-22 14:49  0%   ` Andrew Rybchenko
  2 siblings, 0 replies; 200+ results
From: Kinsella, Ray @ 2021-03-22  9:38 UTC (permalink / raw)
  To: Ferruh Yigit, Lijun Ou, thomas
  Cc: dev, linuxarm, Andrew Rybchenko, David Marchand, Luca Boccassi



On 22/03/2021 09:22, Ferruh Yigit wrote:
> On 3/18/2021 12:25 PM, Lijun Ou wrote:
>> Currently, upper-layer application could get queue state only
>> through pointers such as dev->data->tx_queue_state[queue_id],
>> this is not the recommended way to access it. So this patch
>> add get queue state when call rte_eth_rx_queue_info_get and
>> rte_eth_tx_queue_info_get API.
>>
>> Note: The hairpin queue is not supported with above
>> rte_eth_*x_queue_info_get, so the queue state could be
>> RTE_ETH_QUEUE_STATE_STARTED or RTE_ETH_QUEUE_STATE_STOPPED.
>> Note: After add queue_state field, the 'struct rte_eth_rxq_info' size
>> remains 128B, and the 'struct rte_eth_txq_info' size remains 64B, so
>> it could be ABI compatible.
>>
>> Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
>> Signed-off-by: Lijun Ou <oulijun@huawei.com>
> 
> <...>
> 
>> diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
>> index efda313..3b83c5a 100644
>> --- a/lib/librte_ethdev/rte_ethdev.h
>> +++ b/lib/librte_ethdev/rte_ethdev.h
>> @@ -1591,6 +1591,8 @@ struct rte_eth_rxq_info {
>>       uint8_t scattered_rx;       /**< scattered packets RX supported. */
>>       uint16_t nb_desc;           /**< configured number of RXDs. */
>>       uint16_t rx_buf_size;       /**< hardware receive buffer size. */
>> +    /**< Queues state: STARTED(1) / STOPPED(0). */
>> +    uint8_t queue_state;
>>   } __rte_cache_min_aligned;
>>     /**
>> @@ -1600,6 +1602,8 @@ struct rte_eth_rxq_info {
>>   struct rte_eth_txq_info {
>>       struct rte_eth_txconf conf; /**< queue config parameters. */
>>       uint16_t nb_desc;           /**< configured number of TXDs. */
>> +    /**< Queues state: STARTED(1) / STOPPED(0). */
>> +    uint8_t queue_state;
>>   } __rte_cache_min_aligned;
>>     /* Generic Burst mode flag definition, values can be ORed. */
>>
> 
> This is causing an ABI warning [1], but I guess it is safe since the size of the struct is not changing (cache align). Adding a few more people to comment.

Agreed, needs an amendment to libabigail.ignore to condone. 

> 
> [1]
> https://travis-ci.com/github/ovsrobot/dpdk/builds/220497651

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
  2021-03-18 12:25 13% [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information Lijun Ou
@ 2021-03-22  9:22  3% ` Ferruh Yigit
  2021-03-22  9:38  0%   ` Kinsella, Ray
                     ` (2 more replies)
  2021-03-25 11:09 13% ` [dpdk-dev] [PATCH V2] " Lijun Ou
  1 sibling, 3 replies; 200+ results
From: Ferruh Yigit @ 2021-03-22  9:22 UTC (permalink / raw)
  To: Lijun Ou, thomas
  Cc: dev, linuxarm, Andrew Rybchenko, David Marchand, Ray Kinsella,
	Luca Boccassi

On 3/18/2021 12:25 PM, Lijun Ou wrote:
> Currently, upper-layer application could get queue state only
> through pointers such as dev->data->tx_queue_state[queue_id],
> this is not the recommended way to access it. So this patch
> add get queue state when call rte_eth_rx_queue_info_get and
> rte_eth_tx_queue_info_get API.
> 
> Note: The hairpin queue is not supported with above
> rte_eth_*x_queue_info_get, so the queue state could be
> RTE_ETH_QUEUE_STATE_STARTED or RTE_ETH_QUEUE_STATE_STOPPED.
> Note: After add queue_state field, the 'struct rte_eth_rxq_info' size
> remains 128B, and the 'struct rte_eth_txq_info' size remains 64B, so
> it could be ABI compatible.
> 
> Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
> Signed-off-by: Lijun Ou <oulijun@huawei.com>

<...>

> diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
> index efda313..3b83c5a 100644
> --- a/lib/librte_ethdev/rte_ethdev.h
> +++ b/lib/librte_ethdev/rte_ethdev.h
> @@ -1591,6 +1591,8 @@ struct rte_eth_rxq_info {
>   	uint8_t scattered_rx;       /**< scattered packets RX supported. */
>   	uint16_t nb_desc;           /**< configured number of RXDs. */
>   	uint16_t rx_buf_size;       /**< hardware receive buffer size. */
> +	/**< Queues state: STARTED(1) / STOPPED(0). */
> +	uint8_t queue_state;
>   } __rte_cache_min_aligned;
>   
>   /**
> @@ -1600,6 +1602,8 @@ struct rte_eth_rxq_info {
>   struct rte_eth_txq_info {
>   	struct rte_eth_txconf conf; /**< queue config parameters. */
>   	uint16_t nb_desc;           /**< configured number of TXDs. */
> +	/**< Queues state: STARTED(1) / STOPPED(0). */
> +	uint8_t queue_state;
>   } __rte_cache_min_aligned;
>   
>   /* Generic Burst mode flag definition, values can be ORed. */
> 

This is causing an ABI warning [1], but I guess it is safe since the size of the 
struct is not changing (cache align). Adding a few more people to comment.


[1]
https://travis-ci.com/github/ovsrobot/dpdk/builds/220497651

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [EXT] Re: [PATCH v4 1/8] eventdev: introduce event vector capability
  2021-03-22  9:06  3%         ` Kinsella, Ray
@ 2021-03-22  9:10  0%           ` Pavan Nikhilesh Bhagavatula
  0 siblings, 0 replies; 200+ results
From: Pavan Nikhilesh Bhagavatula @ 2021-03-22  9:10 UTC (permalink / raw)
  To: Kinsella, Ray, Jerin Jacob Kollanukkaran, jay.jayatheerthan,
	erik.g.carrillo, abhinandan.gujjar, timothy.mcdaniel,
	hemant.agrawal, harry.van.haaren, mattias.ronnblom, liang.j.ma,
	Neil Horman
  Cc: dev

>On 19/03/2021 20:57, pbhagavatula@marvell.com wrote:
>> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
>>
>> Introduce rte_event_vector datastructure which is capable of holding
>> multiple uintptr_t of the same flow thereby allowing applications
>> to vectorize their pipeline and reducing the complexity of pipelining
>> the events across multiple stages.
>> This approach also reduces the scheduling overhead on a event
>device.
>>
>> Add a event vector mempool create handler to create mempools
>based on
>> the best mempool ops available on a given platform.
>>
>> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
>> ---
>>  doc/guides/prog_guide/eventdev.rst |  36 +++++++++-
>>  lib/librte_eventdev/rte_eventdev.h | 112
>++++++++++++++++++++++++++++-
>>  lib/librte_eventdev/version.map    |   3 +
>>  3 files changed, 148 insertions(+), 3 deletions(-)
>>
>
>[SNIP]
>
>>
>> diff --git a/lib/librte_eventdev/rte_eventdev.h
>b/lib/librte_eventdev/rte_eventdev.h
>> index ce1fc2ce0..5586a3f15 100644
>> --- a/lib/librte_eventdev/rte_eventdev.h
>> +++ b/lib/librte_eventdev/rte_eventdev.h
>> @@ -212,8 +212,10 @@ extern "C" {
>>
>>  #include <rte_common.h>
>>  #include <rte_config.h>
>> -#include <rte_memory.h>
>>  #include <rte_errno.h>
>> +#include <rte_mbuf_pool_ops.h>
>> +#include <rte_memory.h>
>> +#include <rte_mempool.h>
>>
>>  #include "rte_eventdev_trace_fp.h"
>>
>> @@ -913,6 +915,25 @@
>rte_event_dev_stop_flush_callback_register(uint8_t dev_id,
>>  int
>>  rte_event_dev_close(uint8_t dev_id);
>>
>> +/**
>> + * Event vector structure.
>> + */
>> +struct rte_event_vector {
>> +	uint64_t nb_elem : 16;
>> +	/**< Number of elements in this event vector. */
>> +	uint64_t rsvd : 48;
>> +	uint64_t impl_opaque;
>> +	union {
>> +		struct rte_mbuf *mbufs[0];
>> +		void *ptrs[0];
>> +		uint64_t *u64s[0];
>> +	} __rte_aligned(16);
>> +	/**< Start of the vector array union. Depending upon the event
>type the
>> +	 * vector array can be an array of mbufs or pointers or opaque
>u64
>> +	 * values.
>> +	 */
>> +};
>> +
>>  /* Scheduler type definitions */
>>  #define RTE_SCHED_TYPE_ORDERED          0
>>  /**< Ordered scheduling
>> @@ -986,6 +1007,21 @@ rte_event_dev_close(uint8_t dev_id);
>>   */
>>  #define RTE_EVENT_TYPE_ETH_RX_ADAPTER   0x4
>>  /**< The event generated from event eth Rx adapter */
>> +#define RTE_EVENT_TYPE_VECTOR           0x8
>> +/**< Indicates that event is a vector.
>> + * All vector event types should be an logical OR of
>EVENT_TYPE_VECTOR.
>> + * This simplifies the pipeline design as we can split processing the
>events
>> + * between vector events and normal event across event types.
>> + * Example:
>> + *	if (ev.event_type & RTE_EVENT_TYPE_VECTOR) {
>> + *		// Classify and handle vector event.
>> + *	} else {
>> + *		// Classify and handle event.
>> + *	}
>> + */
>> +#define RTE_EVENT_TYPE_CPU_VECTOR
>(RTE_EVENT_TYPE_VECTOR | RTE_EVENT_TYPE_CPU)
>> +/**< The event vector generated from cpu for pipelining. */
>> +
>>  #define RTE_EVENT_TYPE_MAX              0x10
>>  /**< Maximum number of event types */
>>
>> @@ -1108,6 +1144,8 @@ struct rte_event {
>>  		/**< Opaque event pointer */
>>  		struct rte_mbuf *mbuf;
>>  		/**< mbuf pointer if dequeued event is associated with
>mbuf */
>> +		struct rte_event_vector *vec;
>> +		/**< Event vector pointer. */
>>  	};
>>  };
>>
>> @@ -2023,6 +2061,78 @@ rte_event_dev_xstats_reset(uint8_t
>dev_id,
>>   */
>>  int rte_event_dev_selftest(uint8_t dev_id);
>>
>> +/**
>> + * Get the memory required per event vector based on the number of
>elements per
>> + * vector.
>> + * This should be used to create the mempool that holds the event
>vectors.
>> + *
>> + * @param name
>> + *   The name of the vector pool.
>> + * @param n
>> + *   The number of elements in the mbuf pool.
>> + * @param cache_size
>> + *   Size of the per-core object cache. See rte_mempool_create() for
>> + *   details.
>> + * @param nb_elem
>> + *   The number of elements then a single event vector should be
>able to hold.
>> + * @param socket_id
>> + *   The socket identifier where the memory should be allocated. The
>> + *   value can be *SOCKET_ID_ANY* if there is no NUMA constraint
>for the
>> + *   reserved zone
>> + *
>> + * @return
>> + *   The pointer to the newly allocated mempool, on success. NULL
>on error
>> + *   with rte_errno set appropriately. Possible rte_errno values
>include:
>> + *    - E_RTE_NO_CONFIG - function could not get pointer to
>rte_config structure
>> + *    - E_RTE_SECONDARY - function was called from a secondary
>process instance
>> + *    - EINVAL - cache size provided is too large, or priv_size is not
>aligned.
>> + *    - ENOSPC - the maximum number of memzones has already been
>allocated
>> + *    - EEXIST - a memzone with the same name already exists
>> + *    - ENOMEM - no appropriate memory area found in which to
>create memzone
>> + */
>> +__rte_experimental
>> +static inline struct rte_mempool *
>> +rte_event_vector_pool_create(const char *name, unsigned int n,
>> +			     unsigned int cache_size, uint16_t nb_elem,
>> +			     int socket_id)
>
>Handling in-lined function is tricky at best from an ABI stability PoV.
>
>Since this function is used at initialization time and I would suggest since
>performance is not issue here.
>There is no need for this function to be an inline.

Makes sense, I will move it to .c in the next version.

Thanks, 
Pavan.

>
>> +{
>> +	const char *mp_ops_name;
>> +	struct rte_mempool *mp;
>> +	unsigned int elt_sz;
>> +	int ret;
>> +
>> +	if (!nb_elem) {
>> +		RTE_LOG(ERR, EVENTDEV,
>> +			"Invalid number of elements=%d requested\n",
>nb_elem);
>> +		rte_errno = -EINVAL;
>> +		return NULL;
>> +	}
>> +
>> +	elt_sz =
>> +		sizeof(struct rte_event_vector) + (nb_elem *
>sizeof(uintptr_t));
>> +	mp = rte_mempool_create_empty(name, n, elt_sz, cache_size,
>0, socket_id,
>> +				      0);
>> +	if (mp == NULL)
>> +		return NULL;
>> +
>> +	mp_ops_name = rte_mbuf_best_mempool_ops();
>> +	ret = rte_mempool_set_ops_byname(mp, mp_ops_name,
>NULL);
>> +	if (ret != 0) {
>> +		RTE_LOG(ERR, EVENTDEV, "error setting mempool
>handler\n");
>> +		goto err;
>> +	}
>> +
>> +	ret = rte_mempool_populate_default(mp);
>> +	if (ret < 0)
>> +		goto err;
>> +
>> +	return mp;
>> +err:
>> +	rte_mempool_free(mp);
>> +	rte_errno = -ret;
>> +	return NULL;
>> +}
>> +
>>  #ifdef __cplusplus
>>  }
>>  #endif
>> diff --git a/lib/librte_eventdev/version.map
>b/lib/librte_eventdev/version.map
>> index 3e5c09cfd..a070ef56e 100644
>> --- a/lib/librte_eventdev/version.map
>> +++ b/lib/librte_eventdev/version.map
>> @@ -138,6 +138,9 @@ EXPERIMENTAL {
>>  	__rte_eventdev_trace_port_setup;
>>  	# added in 20.11
>>  	rte_event_pmd_pci_probe_named;
>> +
>> +	#added in 21.05
>> +	rte_event_vector_pool_create;
>>  };
>>
>>  INTERNAL {
>>

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v4 1/8] eventdev: introduce event vector capability
  @ 2021-03-22  9:06  3%         ` Kinsella, Ray
  2021-03-22  9:10  0%           ` [dpdk-dev] [EXT] " Pavan Nikhilesh Bhagavatula
  0 siblings, 1 reply; 200+ results
From: Kinsella, Ray @ 2021-03-22  9:06 UTC (permalink / raw)
  To: pbhagavatula, jerinj, jay.jayatheerthan, erik.g.carrillo,
	abhinandan.gujjar, timothy.mcdaniel, hemant.agrawal,
	harry.van.haaren, mattias.ronnblom, liang.j.ma, Neil Horman
  Cc: dev



On 19/03/2021 20:57, pbhagavatula@marvell.com wrote:
> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
> 
> Introduce rte_event_vector datastructure which is capable of holding
> multiple uintptr_t of the same flow thereby allowing applications
> to vectorize their pipeline and reducing the complexity of pipelining
> the events across multiple stages.
> This approach also reduces the scheduling overhead on a event device.
> 
> Add a event vector mempool create handler to create mempools based on
> the best mempool ops available on a given platform.
> 
> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
> ---
>  doc/guides/prog_guide/eventdev.rst |  36 +++++++++-
>  lib/librte_eventdev/rte_eventdev.h | 112 ++++++++++++++++++++++++++++-
>  lib/librte_eventdev/version.map    |   3 +
>  3 files changed, 148 insertions(+), 3 deletions(-)
> 

[SNIP]

>  
> diff --git a/lib/librte_eventdev/rte_eventdev.h b/lib/librte_eventdev/rte_eventdev.h
> index ce1fc2ce0..5586a3f15 100644
> --- a/lib/librte_eventdev/rte_eventdev.h
> +++ b/lib/librte_eventdev/rte_eventdev.h
> @@ -212,8 +212,10 @@ extern "C" {
>  
>  #include <rte_common.h>
>  #include <rte_config.h>
> -#include <rte_memory.h>
>  #include <rte_errno.h>
> +#include <rte_mbuf_pool_ops.h>
> +#include <rte_memory.h>
> +#include <rte_mempool.h>
>  
>  #include "rte_eventdev_trace_fp.h"
>  
> @@ -913,6 +915,25 @@ rte_event_dev_stop_flush_callback_register(uint8_t dev_id,
>  int
>  rte_event_dev_close(uint8_t dev_id);
>  
> +/**
> + * Event vector structure.
> + */
> +struct rte_event_vector {
> +	uint64_t nb_elem : 16;
> +	/**< Number of elements in this event vector. */
> +	uint64_t rsvd : 48;
> +	uint64_t impl_opaque;
> +	union {
> +		struct rte_mbuf *mbufs[0];
> +		void *ptrs[0];
> +		uint64_t *u64s[0];
> +	} __rte_aligned(16);
> +	/**< Start of the vector array union. Depending upon the event type the
> +	 * vector array can be an array of mbufs or pointers or opaque u64
> +	 * values.
> +	 */
> +};
> +
>  /* Scheduler type definitions */
>  #define RTE_SCHED_TYPE_ORDERED          0
>  /**< Ordered scheduling
> @@ -986,6 +1007,21 @@ rte_event_dev_close(uint8_t dev_id);
>   */
>  #define RTE_EVENT_TYPE_ETH_RX_ADAPTER   0x4
>  /**< The event generated from event eth Rx adapter */
> +#define RTE_EVENT_TYPE_VECTOR           0x8
> +/**< Indicates that event is a vector.
> + * All vector event types should be an logical OR of EVENT_TYPE_VECTOR.
> + * This simplifies the pipeline design as we can split processing the events
> + * between vector events and normal event across event types.
> + * Example:
> + *	if (ev.event_type & RTE_EVENT_TYPE_VECTOR) {
> + *		// Classify and handle vector event.
> + *	} else {
> + *		// Classify and handle event.
> + *	}
> + */
> +#define RTE_EVENT_TYPE_CPU_VECTOR (RTE_EVENT_TYPE_VECTOR | RTE_EVENT_TYPE_CPU)
> +/**< The event vector generated from cpu for pipelining. */
> +
>  #define RTE_EVENT_TYPE_MAX              0x10
>  /**< Maximum number of event types */
>  
> @@ -1108,6 +1144,8 @@ struct rte_event {
>  		/**< Opaque event pointer */
>  		struct rte_mbuf *mbuf;
>  		/**< mbuf pointer if dequeued event is associated with mbuf */
> +		struct rte_event_vector *vec;
> +		/**< Event vector pointer. */
>  	};
>  };
>  
> @@ -2023,6 +2061,78 @@ rte_event_dev_xstats_reset(uint8_t dev_id,
>   */
>  int rte_event_dev_selftest(uint8_t dev_id);
>  
> +/**
> + * Get the memory required per event vector based on the number of elements per
> + * vector.
> + * This should be used to create the mempool that holds the event vectors.
> + *
> + * @param name
> + *   The name of the vector pool.
> + * @param n
> + *   The number of elements in the mbuf pool.
> + * @param cache_size
> + *   Size of the per-core object cache. See rte_mempool_create() for
> + *   details.
> + * @param nb_elem
> + *   The number of elements then a single event vector should be able to hold.
> + * @param socket_id
> + *   The socket identifier where the memory should be allocated. The
> + *   value can be *SOCKET_ID_ANY* if there is no NUMA constraint for the
> + *   reserved zone
> + *
> + * @return
> + *   The pointer to the newly allocated mempool, on success. NULL on error
> + *   with rte_errno set appropriately. Possible rte_errno values include:
> + *    - E_RTE_NO_CONFIG - function could not get pointer to rte_config structure
> + *    - E_RTE_SECONDARY - function was called from a secondary process instance
> + *    - EINVAL - cache size provided is too large, or priv_size is not aligned.
> + *    - ENOSPC - the maximum number of memzones has already been allocated
> + *    - EEXIST - a memzone with the same name already exists
> + *    - ENOMEM - no appropriate memory area found in which to create memzone
> + */
> +__rte_experimental
> +static inline struct rte_mempool *
> +rte_event_vector_pool_create(const char *name, unsigned int n,
> +			     unsigned int cache_size, uint16_t nb_elem,
> +			     int socket_id)

Handling in-lined function is tricky at best from an ABI stability PoV. 

Since this function is used at initialization time and I would suggest since performance is not issue here.
There is no need for this function to be an inline. 

> +{
> +	const char *mp_ops_name;
> +	struct rte_mempool *mp;
> +	unsigned int elt_sz;
> +	int ret;
> +
> +	if (!nb_elem) {
> +		RTE_LOG(ERR, EVENTDEV,
> +			"Invalid number of elements=%d requested\n", nb_elem);
> +		rte_errno = -EINVAL;
> +		return NULL;
> +	}
> +
> +	elt_sz =
> +		sizeof(struct rte_event_vector) + (nb_elem * sizeof(uintptr_t));
> +	mp = rte_mempool_create_empty(name, n, elt_sz, cache_size, 0, socket_id,
> +				      0);
> +	if (mp == NULL)
> +		return NULL;
> +
> +	mp_ops_name = rte_mbuf_best_mempool_ops();
> +	ret = rte_mempool_set_ops_byname(mp, mp_ops_name, NULL);
> +	if (ret != 0) {
> +		RTE_LOG(ERR, EVENTDEV, "error setting mempool handler\n");
> +		goto err;
> +	}
> +
> +	ret = rte_mempool_populate_default(mp);
> +	if (ret < 0)
> +		goto err;
> +
> +	return mp;
> +err:
> +	rte_mempool_free(mp);
> +	rte_errno = -ret;
> +	return NULL;
> +}
> +
>  #ifdef __cplusplus
>  }
>  #endif
> diff --git a/lib/librte_eventdev/version.map b/lib/librte_eventdev/version.map
> index 3e5c09cfd..a070ef56e 100644
> --- a/lib/librte_eventdev/version.map
> +++ b/lib/librte_eventdev/version.map
> @@ -138,6 +138,9 @@ EXPERIMENTAL {
>  	__rte_eventdev_trace_port_setup;
>  	# added in 20.11
>  	rte_event_pmd_pci_probe_named;
> +
> +	#added in 21.05
> +	rte_event_vector_pool_create;
>  };
>  
>  INTERNAL {
> 

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v3 1/2] ethdev: replace callback getting filter operations
  @ 2021-03-21  9:00  1%   ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2021-03-21  9:00 UTC (permalink / raw)
  To: dev
  Cc: Ajit Khaparde, Haiyue Wang, Rosen Xu, Hemant Agrawal, Ori Kam,
	Somnath Kotur, Chas Williams, Min Hu (Connor),
	Rahul Lakkireddy, Sachin Saxena, Jeff Guo, John Daley,
	Hyong Youb Kim, Gaetan Rivet, Ziyang Xuan, Xiaoyun Wang,
	Guoyang Zhou, Yisen Zhuang, Lijun Ou, Beilei Xing, Jingjing Wu,
	Qiming Yang, Qi Zhang, Matan Azrad, Shahaf Shuler,
	Viacheslav Ovsiienko, Liron Himi, Jerin Jacob, Nithin Dabilpuram,
	Kiran Kumar K, Rasesh Mody, Shahed Shaikh, Andrew Rybchenko,
	Jasvinder Singh, Cristian Dumitrescu, Keith Wiles, Jiawen Wu,
	Jian Wang, Ferruh Yigit

Since rte_flow is the only API for filtering operations,
the legacy driver interface filter_ctrl was too much complicated
for the simple task of getting the struct rte_flow_ops.

The filter type RTE_ETH_FILTER_GENERIC and
the filter operarion RTE_ETH_FILTER_GET are removed.
The new driver callback flow_ops_get replaces filter_ctrl.

Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
Acked-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
Acked-by: Haiyue Wang <haiyue.wang@intel.com>
Acked-by: Rosen Xu <rosen.xu@intel.com>
Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
 doc/guides/nics/features.rst            |  4 +--
 doc/guides/prog_guide/rte_flow.rst      | 14 +-------
 drivers/net/bnxt/bnxt.h                 |  6 ++--
 drivers/net/bnxt/bnxt_ethdev.c          | 40 +++++++--------------
 drivers/net/bnxt/bnxt_reps.c            |  2 +-
 drivers/net/bonding/rte_eth_bond_pmd.c  | 13 +++----
 drivers/net/cxgbe/cxgbe_ethdev.c        |  2 +-
 drivers/net/cxgbe/cxgbe_flow.c          | 22 +++---------
 drivers/net/cxgbe/cxgbe_flow.h          |  7 ++--
 drivers/net/dpaa2/dpaa2_ethdev.c        | 44 +++--------------------
 drivers/net/dpaa2/dpaa2_flow.c          | 29 +++++----------
 drivers/net/e1000/igb_ethdev.c          | 31 ++++------------
 drivers/net/enic/enic_ethdev.c          | 30 +++++-----------
 drivers/net/enic/enic_vf_representor.c  | 33 ++++++-----------
 drivers/net/failsafe/failsafe_ops.c     | 16 +++------
 drivers/net/hinic/hinic_pmd_ethdev.c    | 36 ++++---------------
 drivers/net/hns3/hns3_ethdev.c          |  2 +-
 drivers/net/hns3/hns3_ethdev.h          |  5 ++-
 drivers/net/hns3/hns3_ethdev_vf.c       |  2 +-
 drivers/net/hns3/hns3_flow.c            | 30 ++++------------
 drivers/net/i40e/i40e_ethdev.c          | 32 ++++-------------
 drivers/net/iavf/iavf_ethdev.c          | 32 ++++-------------
 drivers/net/ice/ice_dcf_ethdev.c        | 27 +++-----------
 drivers/net/ice/ice_ethdev.c            | 32 ++++-------------
 drivers/net/igc/igc_ethdev.c            |  2 +-
 drivers/net/igc/igc_filter.c            | 23 +++---------
 drivers/net/igc/igc_filter.h            |  5 ++-
 drivers/net/ipn3ke/ipn3ke_representor.c | 28 ++++-----------
 drivers/net/ixgbe/ixgbe_ethdev.c        | 32 ++++-------------
 drivers/net/mlx4/mlx4.c                 |  2 +-
 drivers/net/mlx4/mlx4_flow.c            | 32 ++++-------------
 drivers/net/mlx4/mlx4_flow.h            |  5 +--
 drivers/net/mlx5/mlx5.c                 |  4 +--
 drivers/net/mlx5/mlx5.h                 |  5 +--
 drivers/net/mlx5/mlx5_flow.c            | 32 ++++-------------
 drivers/net/mvpp2/mrvl_ethdev.c         | 26 ++++----------
 drivers/net/octeontx2/otx2_ethdev.c     |  2 +-
 drivers/net/octeontx2/otx2_ethdev.h     |  5 ++-
 drivers/net/octeontx2/otx2_ethdev_ops.c | 21 +++--------
 drivers/net/qede/qede_ethdev.c          |  2 +-
 drivers/net/qede/qede_ethdev.h          |  7 ++--
 drivers/net/qede/qede_filter.c          | 27 ++++----------
 drivers/net/sfc/sfc_ethdev.c            | 31 +++-------------
 drivers/net/softnic/rte_eth_softnic.c   | 17 +++------
 drivers/net/tap/rte_eth_tap.c           |  2 +-
 drivers/net/tap/tap_flow.c              | 27 ++++----------
 drivers/net/tap/tap_flow.h              |  6 ++--
 drivers/net/txgbe/txgbe_ethdev.c        | 26 +++-----------
 lib/librte_ethdev/ethdev_driver.h       | 48 +++++++++++--------------
 lib/librte_ethdev/rte_eth_ctrl.h        |  2 +-
 lib/librte_ethdev/rte_flow.c            | 23 ++++++------
 lib/librte_ethdev/rte_flow_driver.h     | 25 -------------
 52 files changed, 238 insertions(+), 720 deletions(-)

diff --git a/doc/guides/nics/features.rst b/doc/guides/nics/features.rst
index dbca9a85b9..f6d30d0af3 100644
--- a/doc/guides/nics/features.rst
+++ b/doc/guides/nics/features.rst
@@ -402,9 +402,9 @@ Supports configuring link flow control.
 Flow API
 --------
 
-Supports the DPDK Flow API for generic filtering.
+Supports flow API family.
 
-* **[implements] eth_dev_ops**: ``filter_ctrl:RTE_ETH_FILTER_GENERIC``.
+* **[implements] eth_dev_ops**: ``flow_ops_get``.
 * **[implements] rte_flow_ops**: ``All``.
 
 
diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst
index 62a57919eb..aec2ba1ec0 100644
--- a/doc/guides/prog_guide/rte_flow.rst
+++ b/doc/guides/prog_guide/rte_flow.rst
@@ -22,11 +22,6 @@ defined in ``rte_flow.h``.
   queues, to virtual/physical device functions or ports, performing tunnel
   offloads, adding marks and so on.
 
-It is slightly higher-level than the legacy filtering framework which it
-encompasses and supersedes (including all functions and filter types) in
-order to expose a single interface with an unambiguous behavior that is
-common to all poll-mode drivers (PMDs).
-
 Flow rule
 ---------
 
@@ -3104,7 +3099,6 @@ port and may return errors such as ``ENOTSUP`` ("not supported"):
 - Configuring MAC addresses.
 - Configuring multicast addresses.
 - Configuring VLAN filters.
-- Configuring Rx filters through the legacy API (e.g. FDIR).
 - Configuring global RSS settings.
 
 .. code-block:: c
@@ -3331,13 +3325,7 @@ The PMD interface is defined in ``rte_flow_driver.h``. It is not subject to
 API/ABI versioning constraints as it is not exposed to applications and may
 evolve independently.
 
-It is currently implemented on top of the legacy filtering framework through
-filter type *RTE_ETH_FILTER_GENERIC* that accepts the single operation
-*RTE_ETH_FILTER_GET* to return PMD-specific *rte_flow* callbacks wrapped
-inside ``struct rte_flow_ops``.
-
-This overhead is temporarily necessary in order to keep compatibility with
-the legacy filtering framework, which should eventually disappear.
+The PMD interface is based on callbacks pointed by the ``struct rte_flow_ops``.
 
 - PMD callbacks implement exactly the interface described in `Rules
   management`_, except for the port ID argument which has already been
diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h
index b4370e5acd..a6c02d88aa 100644
--- a/drivers/net/bnxt/bnxt.h
+++ b/drivers/net/bnxt/bnxt.h
@@ -981,9 +981,7 @@ void bnxt_flow_cnt_alarm_cb(void *arg);
 int bnxt_flow_stats_req(struct bnxt *bp);
 int bnxt_flow_stats_cnt(struct bnxt *bp);
 uint32_t bnxt_get_speed_capabilities(struct bnxt *bp);
+int bnxt_flow_ops_get_op(struct rte_eth_dev *dev,
+			 const struct rte_flow_ops **ops);
 
-int
-bnxt_filter_ctrl_op(struct rte_eth_dev *dev,
-		    enum rte_filter_type filter_type,
-		    enum rte_filter_op filter_op, void *arg);
 #endif
diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index 9824cdb6d8..87d298804f 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -3086,9 +3086,8 @@ bnxt_tx_descriptor_status_op(void *tx_queue, uint16_t offset)
 }
 
 int
-bnxt_filter_ctrl_op(struct rte_eth_dev *dev,
-		    enum rte_filter_type filter_type,
-		    enum rte_filter_op filter_op, void *arg)
+bnxt_flow_ops_get_op(struct rte_eth_dev *dev,
+		     const struct rte_flow_ops **ops)
 {
 	struct bnxt *bp = dev->data->dev_private;
 	int ret = 0;
@@ -3101,10 +3100,8 @@ bnxt_filter_ctrl_op(struct rte_eth_dev *dev,
 		bp = vfr->parent_dev->data->dev_private;
 		/* parent is deleted while children are still valid */
 		if (!bp) {
-			PMD_DRV_LOG(DEBUG, "BNXT Port:%d VFR Error %d:%d\n",
-				    dev->data->port_id,
-				    filter_type,
-				    filter_op);
+			PMD_DRV_LOG(DEBUG, "BNXT Port:%d VFR Error\n",
+				    dev->data->port_id);
 			return -EIO;
 		}
 	}
@@ -3113,27 +3110,16 @@ bnxt_filter_ctrl_op(struct rte_eth_dev *dev,
 	if (ret)
 		return ret;
 
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
+	/* PMD supports thread-safe flow operations.  rte_flow API
+	 * functions can avoid mutex for multi-thread safety.
+	 */
+	dev->data->dev_flags |= RTE_ETH_DEV_FLOW_OPS_THREAD_SAFE;
 
-		/* PMD supports thread-safe flow operations.  rte_flow API
-		 * functions can avoid mutex for multi-thread safety.
-		 */
-		dev->data->dev_flags |= RTE_ETH_DEV_FLOW_OPS_THREAD_SAFE;
+	if (BNXT_TRUFLOW_EN(bp))
+		*ops = &bnxt_ulp_rte_flow_ops;
+	else
+		*ops = &bnxt_flow_ops;
 
-		if (BNXT_TRUFLOW_EN(bp))
-			*(const void **)arg = &bnxt_ulp_rte_flow_ops;
-		else
-			*(const void **)arg = &bnxt_flow_ops;
-		break;
-	default:
-		PMD_DRV_LOG(ERR,
-			"Filter type (%d) not supported", filter_type);
-		ret = -EINVAL;
-		break;
-	}
 	return ret;
 }
 
@@ -3644,7 +3630,7 @@ static const struct eth_dev_ops bnxt_dev_ops = {
 	.rx_queue_stop = bnxt_rx_queue_stop,
 	.tx_queue_start = bnxt_tx_queue_start,
 	.tx_queue_stop = bnxt_tx_queue_stop,
-	.filter_ctrl = bnxt_filter_ctrl_op,
+	.flow_ops_get = bnxt_flow_ops_get_op,
 	.dev_supported_ptypes_get = bnxt_dev_supported_ptypes_get_op,
 	.get_eeprom_length    = bnxt_get_eeprom_length_op,
 	.get_eeprom           = bnxt_get_eeprom_op,
diff --git a/drivers/net/bnxt/bnxt_reps.c b/drivers/net/bnxt/bnxt_reps.c
index d94874578e..b224a7d2c2 100644
--- a/drivers/net/bnxt/bnxt_reps.c
+++ b/drivers/net/bnxt/bnxt_reps.c
@@ -29,7 +29,7 @@ static const struct eth_dev_ops bnxt_rep_dev_ops = {
 	.dev_stop = bnxt_rep_dev_stop_op,
 	.stats_get = bnxt_rep_stats_get_op,
 	.stats_reset = bnxt_rep_stats_reset_op,
-	.filter_ctrl = bnxt_filter_ctrl_op
+	.flow_ops_get = bnxt_flow_ops_get_op
 };
 
 uint16_t
diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c
index 5241c60089..24e3cf3c2e 100644
--- a/drivers/net/bonding/rte_eth_bond_pmd.c
+++ b/drivers/net/bonding/rte_eth_bond_pmd.c
@@ -3108,14 +3108,11 @@ bond_ethdev_mac_address_set(struct rte_eth_dev *dev,
 }
 
 static int
-bond_filter_ctrl(struct rte_eth_dev *dev __rte_unused,
-		 enum rte_filter_type type, enum rte_filter_op op, void *arg)
+bond_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		  const struct rte_flow_ops **ops)
 {
-	if (type == RTE_ETH_FILTER_GENERIC && op == RTE_ETH_FILTER_GET) {
-		*(const void **)arg = &bond_flow_ops;
-		return 0;
-	}
-	return -ENOTSUP;
+	*ops = &bond_flow_ops;
+	return 0;
 }
 
 static int
@@ -3207,7 +3204,7 @@ const struct eth_dev_ops default_dev_ops = {
 	.mac_addr_set         = bond_ethdev_mac_address_set,
 	.mac_addr_add         = bond_ethdev_mac_addr_add,
 	.mac_addr_remove      = bond_ethdev_mac_addr_remove,
-	.filter_ctrl          = bond_filter_ctrl
+	.flow_ops_get         = bond_flow_ops_get
 };
 
 static int
diff --git a/drivers/net/cxgbe/cxgbe_ethdev.c b/drivers/net/cxgbe/cxgbe_ethdev.c
index bfa57c979d..e8a2de3ef3 100644
--- a/drivers/net/cxgbe/cxgbe_ethdev.c
+++ b/drivers/net/cxgbe/cxgbe_ethdev.c
@@ -1335,7 +1335,7 @@ static const struct eth_dev_ops cxgbe_eth_dev_ops = {
 	.rx_queue_start		= cxgbe_dev_rx_queue_start,
 	.rx_queue_stop		= cxgbe_dev_rx_queue_stop,
 	.rx_queue_release	= cxgbe_dev_rx_queue_release,
-	.filter_ctrl            = cxgbe_dev_filter_ctrl,
+	.flow_ops_get           = cxgbe_dev_flow_ops_get,
 	.stats_get		= cxgbe_dev_stats_get,
 	.stats_reset		= cxgbe_dev_stats_reset,
 	.flow_ctrl_get		= cxgbe_flow_ctrl_get,
diff --git a/drivers/net/cxgbe/cxgbe_flow.c b/drivers/net/cxgbe/cxgbe_flow.c
index 520a5a5c9a..edcbba9d7c 100644
--- a/drivers/net/cxgbe/cxgbe_flow.c
+++ b/drivers/net/cxgbe/cxgbe_flow.c
@@ -1448,23 +1448,9 @@ static const struct rte_flow_ops cxgbe_flow_ops = {
 };
 
 int
-cxgbe_dev_filter_ctrl(struct rte_eth_dev *dev,
-		      enum rte_filter_type filter_type,
-		      enum rte_filter_op filter_op,
-		      void *arg)
+cxgbe_dev_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		       const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
-	RTE_SET_USED(dev);
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &cxgbe_flow_ops;
-		break;
-	default:
-		ret = -ENOTSUP;
-		break;
-	}
-	return ret;
+	*ops = &cxgbe_flow_ops;
+	return 0;
 }
diff --git a/drivers/net/cxgbe/cxgbe_flow.h b/drivers/net/cxgbe/cxgbe_flow.h
index ec8e47aebe..9cf29550a9 100644
--- a/drivers/net/cxgbe/cxgbe_flow.h
+++ b/drivers/net/cxgbe/cxgbe_flow.h
@@ -35,10 +35,7 @@ struct rte_flow {
 	struct rte_eth_dev *dev;
 };
 
-int
-cxgbe_dev_filter_ctrl(struct rte_eth_dev *dev,
-		      enum rte_filter_type filter_type,
-		      enum rte_filter_op filter_op,
-		      void *arg);
+int cxgbe_dev_flow_ops_get(struct rte_eth_dev *dev,
+			   const struct rte_flow_ops **ops);
 
 #endif /* _CXGBE_FLOW_H_ */
diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c
index 0e7ebf4dc0..9011dcfc12 100644
--- a/drivers/net/dpaa2/dpaa2_ethdev.c
+++ b/drivers/net/dpaa2/dpaa2_ethdev.c
@@ -99,10 +99,6 @@ static const struct rte_dpaa2_xstats_name_off dpaa2_xstats_strings[] = {
 	{"cgr_reject_bytes", 4, 1},
 };
 
-static const enum rte_filter_op dpaa2_supported_filter_ops[] = {
-	RTE_ETH_FILTER_GET
-};
-
 static struct rte_dpaa2_driver rte_dpaa2_pmd;
 static int dpaa2_dev_link_update(struct rte_eth_dev *dev,
 				 int wait_to_complete);
@@ -2322,45 +2318,15 @@ int dpaa2_eth_eventq_detach(const struct rte_eth_dev *dev,
 	return ret;
 }
 
-static inline int
-dpaa2_dev_verify_filter_ops(enum rte_filter_op filter_op)
-{
-	unsigned int i;
-
-	for (i = 0; i < RTE_DIM(dpaa2_supported_filter_ops); i++) {
-		if (dpaa2_supported_filter_ops[i] == filter_op)
-			return 0;
-	}
-	return -ENOTSUP;
-}
-
 static int
-dpaa2_dev_flow_ctrl(struct rte_eth_dev *dev,
-		    enum rte_filter_type filter_type,
-				 enum rte_filter_op filter_op,
-				 void *arg)
+dpaa2_dev_flow_ops_get(struct rte_eth_dev *dev,
+		       const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
 	if (!dev)
 		return -ENODEV;
 
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (dpaa2_dev_verify_filter_ops(filter_op) < 0) {
-			ret = -ENOTSUP;
-			break;
-		}
-		*(const void **)arg = &dpaa2_flow_ops;
-		dpaa2_filter_type |= filter_type;
-		break;
-	default:
-		RTE_LOG(ERR, PMD, "Filter type (%d) not supported",
-			filter_type);
-		ret = -ENOTSUP;
-		break;
-	}
-	return ret;
+	*ops = &dpaa2_flow_ops;
+	return 0;
 }
 
 static void
@@ -2453,7 +2419,7 @@ static struct eth_dev_ops dpaa2_ethdev_ops = {
 	.mac_addr_set         = dpaa2_dev_set_mac_addr,
 	.rss_hash_update      = dpaa2_dev_rss_hash_update,
 	.rss_hash_conf_get    = dpaa2_dev_rss_hash_conf_get,
-	.filter_ctrl          = dpaa2_dev_flow_ctrl,
+	.flow_ops_get         = dpaa2_dev_flow_ops_get,
 	.rxq_info_get	      = dpaa2_rxq_info_get,
 	.txq_info_get	      = dpaa2_txq_info_get,
 	.tm_ops_get	      = dpaa2_tm_ops_get,
diff --git a/drivers/net/dpaa2/dpaa2_flow.c b/drivers/net/dpaa2/dpaa2_flow.c
index 29f1f2e654..bfe17c350a 100644
--- a/drivers/net/dpaa2/dpaa2_flow.c
+++ b/drivers/net/dpaa2/dpaa2_flow.c
@@ -89,8 +89,6 @@ enum rte_flow_action_type dpaa2_supported_action_type[] = {
 /* Max of enum rte_flow_item_type + 1, for both IPv4 and IPv6*/
 #define DPAA2_FLOW_ITEM_TYPE_GENERIC_IP (RTE_FLOW_ITEM_TYPE_META + 1)
 
-enum rte_filter_type dpaa2_filter_type = RTE_ETH_FILTER_NONE;
-
 #ifndef __cplusplus
 static const struct rte_flow_item_eth dpaa2_flow_item_eth_mask = {
 	.dst.addr_bytes = "\xff\xff\xff\xff\xff\xff",
@@ -3969,24 +3967,15 @@ struct rte_flow *dpaa2_flow_create(struct rte_eth_dev *dev,
 	flow->ipaddr_rule.fs_ipdst_offset =
 		IP_ADDRESS_OFFSET_INVALID;
 
-	switch (dpaa2_filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		ret = dpaa2_generic_flow_set(flow, dev, attr, pattern,
-					     actions, error);
-		if (ret < 0) {
-			if (error->type > RTE_FLOW_ERROR_TYPE_ACTION)
-				rte_flow_error_set(error, EPERM,
-						RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
-						attr, "unknown");
-			DPAA2_PMD_ERR(
-			"Failure to create flow, return code (%d)", ret);
-			goto creation_error;
-		}
-		break;
-	default:
-		DPAA2_PMD_ERR("Filter type (%d) not supported",
-		dpaa2_filter_type);
-		break;
+	ret = dpaa2_generic_flow_set(flow, dev, attr, pattern,
+			actions, error);
+	if (ret < 0) {
+		if (error->type > RTE_FLOW_ERROR_TYPE_ACTION)
+			rte_flow_error_set(error, EPERM,
+					RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
+					attr, "unknown");
+		DPAA2_PMD_ERR("Failure to create flow, return code (%d)", ret);
+		goto creation_error;
 	}
 
 	return flow;
diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c
index 1716d6b904..17ee6e91a0 100644
--- a/drivers/net/e1000/igb_ethdev.c
+++ b/drivers/net/e1000/igb_ethdev.c
@@ -194,10 +194,8 @@ static int igb_add_5tuple_filter_82576(struct rte_eth_dev *dev,
 			struct rte_eth_ntuple_filter *ntuple_filter);
 static int igb_remove_5tuple_filter_82576(struct rte_eth_dev *dev,
 			struct rte_eth_ntuple_filter *ntuple_filter);
-static int eth_igb_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg);
+static int eth_igb_flow_ops_get(struct rte_eth_dev *dev,
+				const struct rte_flow_ops **ops);
 static int eth_igb_get_reg_length(struct rte_eth_dev *dev);
 static int eth_igb_get_regs(struct rte_eth_dev *dev,
 		struct rte_dev_reg_info *regs);
@@ -374,7 +372,7 @@ static const struct eth_dev_ops eth_igb_ops = {
 	.reta_query           = eth_igb_rss_reta_query,
 	.rss_hash_update      = eth_igb_rss_hash_update,
 	.rss_hash_conf_get    = eth_igb_rss_hash_conf_get,
-	.filter_ctrl          = eth_igb_filter_ctrl,
+	.flow_ops_get         = eth_igb_flow_ops_get,
 	.set_mc_addr_list     = eth_igb_set_mc_addr_list,
 	.rxq_info_get         = igb_rxq_info_get,
 	.txq_info_get         = igb_txq_info_get,
@@ -4583,26 +4581,11 @@ igb_add_del_ethertype_filter(struct rte_eth_dev *dev,
 }
 
 static int
-eth_igb_filter_ctrl(struct rte_eth_dev *dev __rte_unused,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg)
+eth_igb_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		     const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &igb_flow_ops;
-		break;
-	default:
-		PMD_DRV_LOG(WARNING, "Filter type (%d) not supported",
-							filter_type);
-		break;
-	}
-
-	return ret;
+	*ops = &igb_flow_ops;
+	return 0;
 }
 
 static int
diff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c
index b3f441c8f7..38da5e8ce4 100644
--- a/drivers/net/enic/enic_ethdev.c
+++ b/drivers/net/enic/enic_ethdev.c
@@ -74,13 +74,10 @@ static const struct vic_speed_capa {
 RTE_LOG_REGISTER(enic_pmd_logtype, pmd.net.enic, INFO);
 
 static int
-enicpmd_dev_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg)
+enicpmd_dev_flow_ops_get(struct rte_eth_dev *dev,
+			 const struct rte_flow_ops **ops)
 {
 	struct enic *enic = pmd_priv(dev);
-	int ret = 0;
 
 	ENICPMD_FUNC_TRACE();
 
@@ -90,23 +87,12 @@ enicpmd_dev_filter_ctrl(struct rte_eth_dev *dev,
 	 */
 	if (enic->geneve_opt_enabled)
 		return -ENOTSUP;
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		if (enic->flow_filter_mode == FILTER_FLOWMAN)
-			*(const void **)arg = &enic_fm_flow_ops;
-		else
-			*(const void **)arg = &enic_flow_ops;
-		break;
-	default:
-		dev_warning(enic, "Filter type (%d) not supported",
-			filter_type);
-		ret = -EINVAL;
-		break;
-	}
 
-	return ret;
+	if (enic->flow_filter_mode == FILTER_FLOWMAN)
+		*ops = &enic_fm_flow_ops;
+	else
+		*ops = &enic_flow_ops;
+	return 0;
 }
 
 static void enicpmd_dev_tx_queue_release(void *txq)
@@ -1121,7 +1107,7 @@ static const struct eth_dev_ops enicpmd_eth_dev_ops = {
 	.mac_addr_remove      = enicpmd_remove_mac_addr,
 	.mac_addr_set         = enicpmd_set_mac_addr,
 	.set_mc_addr_list     = enicpmd_set_mc_addr_list,
-	.filter_ctrl          = enicpmd_dev_filter_ctrl,
+	.flow_ops_get         = enicpmd_dev_flow_ops_get,
 	.reta_query           = enicpmd_dev_rss_reta_query,
 	.reta_update          = enicpmd_dev_rss_reta_update,
 	.rss_hash_conf_get    = enicpmd_dev_rss_hash_conf_get,
diff --git a/drivers/net/enic/enic_vf_representor.c b/drivers/net/enic/enic_vf_representor.c
index f7b79c1c4e..79dd6e5640 100644
--- a/drivers/net/enic/enic_vf_representor.c
+++ b/drivers/net/enic/enic_vf_representor.c
@@ -377,34 +377,21 @@ static const struct rte_flow_ops enic_vf_flow_ops = {
 };
 
 static int
-enic_vf_filter_ctrl(struct rte_eth_dev *eth_dev,
-		    enum rte_filter_type filter_type,
-		    enum rte_filter_op filter_op,
-		    void *arg)
+enic_vf_flow_ops_get(struct rte_eth_dev *eth_dev,
+		     const struct rte_flow_ops **ops)
 {
 	struct enic_vf_representor *vf;
-	int ret = 0;
 
 	ENICPMD_FUNC_TRACE();
 	vf = eth_dev->data->dev_private;
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		if (vf->enic.flow_filter_mode == FILTER_FLOWMAN) {
-			*(const void **)arg = &enic_vf_flow_ops;
-		} else {
-			ENICPMD_LOG(WARNING, "VF representors require flowman support for rte_flow API");
-			ret = -EINVAL;
-		}
-		break;
-	default:
-		ENICPMD_LOG(WARNING, "Filter type (%d) not supported",
-			    filter_type);
-		ret = -EINVAL;
-		break;
+	if (vf->enic.flow_filter_mode != FILTER_FLOWMAN) {
+		ENICPMD_LOG(WARNING,
+				"VF representors require flowman support for rte_flow API");
+		return -EINVAL;
 	}
-	return ret;
+
+	*ops = &enic_vf_flow_ops;
+	return 0;
 }
 
 static int enic_vf_link_update(struct rte_eth_dev *eth_dev,
@@ -566,7 +553,7 @@ static const struct eth_dev_ops enic_vf_representor_dev_ops = {
 	.dev_start            = enic_vf_dev_start,
 	.dev_stop             = enic_vf_dev_stop,
 	.dev_close            = enic_vf_dev_close,
-	.filter_ctrl          = enic_vf_filter_ctrl,
+	.flow_ops_get         = enic_vf_flow_ops_get,
 	.link_update          = enic_vf_link_update,
 	.promiscuous_enable   = enic_vf_promiscuous_enable,
 	.promiscuous_disable  = enic_vf_promiscuous_disable,
diff --git a/drivers/net/failsafe/failsafe_ops.c b/drivers/net/failsafe/failsafe_ops.c
index 1343777d61..5ff33e03e0 100644
--- a/drivers/net/failsafe/failsafe_ops.c
+++ b/drivers/net/failsafe/failsafe_ops.c
@@ -1514,17 +1514,11 @@ fs_rss_hash_update(struct rte_eth_dev *dev,
 }
 
 static int
-fs_filter_ctrl(struct rte_eth_dev *dev __rte_unused,
-		enum rte_filter_type type,
-		enum rte_filter_op op,
-		void *arg)
+fs_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		const struct rte_flow_ops **ops)
 {
-	if (type == RTE_ETH_FILTER_GENERIC &&
-	    op == RTE_ETH_FILTER_GET) {
-		*(const void **)arg = &fs_flow_ops;
-		return 0;
-	}
-	return -ENOTSUP;
+	*ops = &fs_flow_ops;
+	return 0;
 }
 
 const struct eth_dev_ops failsafe_ops = {
@@ -1565,5 +1559,5 @@ const struct eth_dev_ops failsafe_ops = {
 	.mac_addr_set = fs_mac_addr_set,
 	.set_mc_addr_list = fs_set_mc_addr_list,
 	.rss_hash_update = fs_rss_hash_update,
-	.filter_ctrl = fs_filter_ctrl,
+	.flow_ops_get = fs_flow_ops_get,
 };
diff --git a/drivers/net/hinic/hinic_pmd_ethdev.c b/drivers/net/hinic/hinic_pmd_ethdev.c
index 1d6b710c9f..2352dd1615 100644
--- a/drivers/net/hinic/hinic_pmd_ethdev.c
+++ b/drivers/net/hinic/hinic_pmd_ethdev.c
@@ -2504,42 +2504,20 @@ static int hinic_set_mc_addr_list(struct rte_eth_dev *dev,
 }
 
 /**
- * DPDK callback to manage filter control operations
+ * DPDK callback to get flow operations
  *
  * @param dev
  *   Pointer to Ethernet device structure.
- * @param filter_type
- *   Filter type, which just supports generic type.
- * @param filter_op
- *   Filter operation to perform.
- * @param arg
+ * @param ops
  *   Pointer to operation-specific structure.
  *
  * @return
  *   0 on success, negative error value otherwise.
  */
-static int hinic_dev_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg)
+static int hinic_dev_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+				  const struct rte_flow_ops **ops)
 {
-	struct hinic_nic_dev *nic_dev = HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev);
-	int func_id = hinic_global_func_id(nic_dev->hwdev);
-
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &hinic_flow_ops;
-		break;
-	default:
-		PMD_DRV_LOG(INFO, "Filter type (%d) not supported",
-			filter_type);
-		return -EINVAL;
-	}
-
-	PMD_DRV_LOG(INFO, "Set filter_ctrl succeed, func_id: 0x%x, filter_type: 0x%x,"
-			"filter_op: 0x%x.", func_id, filter_type, filter_op);
+	*ops = &hinic_flow_ops;
 	return 0;
 }
 
@@ -3047,7 +3025,7 @@ static const struct eth_dev_ops hinic_pmd_ops = {
 	.mac_addr_remove               = hinic_mac_addr_remove,
 	.mac_addr_add                  = hinic_mac_addr_add,
 	.set_mc_addr_list              = hinic_set_mc_addr_list,
-	.filter_ctrl                   = hinic_dev_filter_ctrl,
+	.flow_ops_get                  = hinic_dev_flow_ops_get,
 };
 
 static const struct eth_dev_ops hinic_pmd_vf_ops = {
@@ -3082,7 +3060,7 @@ static const struct eth_dev_ops hinic_pmd_vf_ops = {
 	.mac_addr_remove               = hinic_mac_addr_remove,
 	.mac_addr_add                  = hinic_mac_addr_add,
 	.set_mc_addr_list              = hinic_set_mc_addr_list,
-	.filter_ctrl                   = hinic_dev_filter_ctrl,
+	.flow_ops_get                  = hinic_dev_flow_ops_get,
 };
 
 static int hinic_func_init(struct rte_eth_dev *eth_dev)
diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c
index 9cbcc13de8..f6d47369b2 100644
--- a/drivers/net/hns3/hns3_ethdev.c
+++ b/drivers/net/hns3/hns3_ethdev.c
@@ -6550,7 +6550,7 @@ static const struct eth_dev_ops hns3_eth_dev_ops = {
 	.rss_hash_conf_get      = hns3_dev_rss_hash_conf_get,
 	.reta_update            = hns3_dev_rss_reta_update,
 	.reta_query             = hns3_dev_rss_reta_query,
-	.filter_ctrl            = hns3_dev_filter_ctrl,
+	.flow_ops_get           = hns3_dev_flow_ops_get,
 	.vlan_filter_set        = hns3_vlan_filter_set,
 	.vlan_tpid_set          = hns3_vlan_tpid_set,
 	.vlan_offload_set       = hns3_vlan_offload_set,
diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h
index 932600d05b..d180dc1e7f 100644
--- a/drivers/net/hns3/hns3_ethdev.h
+++ b/drivers/net/hns3/hns3_ethdev.h
@@ -963,9 +963,8 @@ hns3_test_and_clear_bit(unsigned int nr, volatile uint64_t *addr)
 }
 
 int hns3_buffer_alloc(struct hns3_hw *hw);
-int hns3_dev_filter_ctrl(struct rte_eth_dev *dev,
-			 enum rte_filter_type filter_type,
-			 enum rte_filter_op filter_op, void *arg);
+int hns3_dev_flow_ops_get(struct rte_eth_dev *dev,
+			  const struct rte_flow_ops **ops);
 bool hns3_is_reset_pending(struct hns3_adapter *hns);
 bool hns3vf_is_reset_pending(struct hns3_adapter *hns);
 void hns3_update_link_status_and_event(struct hns3_hw *hw);
diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c
index fd20c522dc..a35e1d9aad 100644
--- a/drivers/net/hns3/hns3_ethdev_vf.c
+++ b/drivers/net/hns3/hns3_ethdev_vf.c
@@ -2769,7 +2769,7 @@ static const struct eth_dev_ops hns3vf_eth_dev_ops = {
 	.rss_hash_conf_get  = hns3_dev_rss_hash_conf_get,
 	.reta_update        = hns3_dev_rss_reta_update,
 	.reta_query         = hns3_dev_rss_reta_query,
-	.filter_ctrl        = hns3_dev_filter_ctrl,
+	.flow_ops_get       = hns3_dev_flow_ops_get,
 	.vlan_filter_set    = hns3vf_vlan_filter_set,
 	.vlan_offload_set   = hns3vf_vlan_offload_set,
 	.get_reg            = hns3_get_regs,
diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c
index a016857aa5..0c4e91109c 100644
--- a/drivers/net/hns3/hns3_flow.c
+++ b/drivers/net/hns3/hns3_flow.c
@@ -2001,34 +2001,16 @@ static const struct rte_flow_ops hns3_flow_ops = {
 	.isolate = NULL,
 };
 
-/*
- * The entry of flow API.
- * @param dev
- *   Pointer to Ethernet device.
- * @return
- *   0 on success, a negative errno value otherwise is set.
- */
 int
-hns3_dev_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op, void *arg)
+hns3_dev_flow_ops_get(struct rte_eth_dev *dev,
+		      const struct rte_flow_ops **ops)
 {
 	struct hns3_hw *hw;
-	int ret = 0;
 
 	hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		if (hw->adapter_state >= HNS3_NIC_CLOSED)
-			return -ENODEV;
-		*(const void **)arg = &hns3_flow_ops;
-		break;
-	default:
-		hns3_err(hw, "Filter type (%d) not supported", filter_type);
-		ret = -EOPNOTSUPP;
-		break;
-	}
+	if (hw->adapter_state >= HNS3_NIC_CLOSED)
+		return -ENODEV;
 
-	return ret;
+	*ops = &hns3_flow_ops;
+	return 0;
 }
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index d7cd049891..e8634755f2 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -319,10 +319,8 @@ static int i40e_dev_udp_tunnel_port_add(struct rte_eth_dev *dev,
 static int i40e_dev_udp_tunnel_port_del(struct rte_eth_dev *dev,
 					struct rte_eth_udp_tunnel *udp_tunnel);
 static void i40e_filter_input_set_init(struct i40e_pf *pf);
-static int i40e_dev_filter_ctrl(struct rte_eth_dev *dev,
-				enum rte_filter_type filter_type,
-				enum rte_filter_op filter_op,
-				void *arg);
+static int i40e_dev_flow_ops_get(struct rte_eth_dev *dev,
+				 const struct rte_flow_ops **ops);
 static int i40e_dev_get_dcb_info(struct rte_eth_dev *dev,
 				  struct rte_eth_dcb_info *dcb_info);
 static int i40e_dev_sync_phy_type(struct i40e_hw *hw);
@@ -484,7 +482,7 @@ static const struct eth_dev_ops i40e_eth_dev_ops = {
 	.rss_hash_conf_get            = i40e_dev_rss_hash_conf_get,
 	.udp_tunnel_port_add          = i40e_dev_udp_tunnel_port_add,
 	.udp_tunnel_port_del          = i40e_dev_udp_tunnel_port_del,
-	.filter_ctrl                  = i40e_dev_filter_ctrl,
+	.flow_ops_get                 = i40e_dev_flow_ops_get,
 	.rxq_info_get                 = i40e_rxq_info_get,
 	.txq_info_get                 = i40e_txq_info_get,
 	.rx_burst_mode_get            = i40e_rx_burst_mode_get,
@@ -9785,30 +9783,14 @@ i40e_ethertype_filter_set(struct i40e_pf *pf,
 }
 
 static int
-i40e_dev_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg)
+i40e_dev_flow_ops_get(struct rte_eth_dev *dev,
+		      const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
 	if (dev == NULL)
 		return -EINVAL;
 
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &i40e_flow_ops;
-		break;
-	default:
-		PMD_DRV_LOG(WARNING, "Filter type (%d) not supported",
-							filter_type);
-		ret = -EINVAL;
-		break;
-	}
-
-	return ret;
+	*ops = &i40e_flow_ops;
+	return 0;
 }
 
 /*
diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c
index 4d37722022..e3933cde26 100644
--- a/drivers/net/iavf/iavf_ethdev.c
+++ b/drivers/net/iavf/iavf_ethdev.c
@@ -117,10 +117,8 @@ static int iavf_dev_rx_queue_intr_enable(struct rte_eth_dev *dev,
 					uint16_t queue_id);
 static int iavf_dev_rx_queue_intr_disable(struct rte_eth_dev *dev,
 					 uint16_t queue_id);
-static int iavf_dev_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg);
+static int iavf_dev_flow_ops_get(struct rte_eth_dev *dev,
+				 const struct rte_flow_ops **ops);
 static int iavf_set_mc_addr_list(struct rte_eth_dev *dev,
 			struct rte_ether_addr *mc_addrs,
 			uint32_t mc_addrs_num);
@@ -195,7 +193,7 @@ static const struct eth_dev_ops iavf_eth_dev_ops = {
 	.mtu_set                    = iavf_dev_mtu_set,
 	.rx_queue_intr_enable       = iavf_dev_rx_queue_intr_enable,
 	.rx_queue_intr_disable      = iavf_dev_rx_queue_intr_disable,
-	.filter_ctrl                = iavf_dev_filter_ctrl,
+	.flow_ops_get               = iavf_dev_flow_ops_get,
 	.tx_done_cleanup	    = iavf_dev_tx_done_cleanup,
 };
 
@@ -2070,30 +2068,14 @@ iavf_dev_interrupt_handler(void *param)
 }
 
 static int
-iavf_dev_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg)
+iavf_dev_flow_ops_get(struct rte_eth_dev *dev,
+		      const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
 	if (!dev)
 		return -EINVAL;
 
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &iavf_flow_ops;
-		break;
-	default:
-		PMD_DRV_LOG(WARNING, "Filter type (%d) not supported",
-			    filter_type);
-		ret = -EINVAL;
-		break;
-	}
-
-	return ret;
+	*ops = &iavf_flow_ops;
+	return 0;
 }
 
 static void
diff --git a/drivers/net/ice/ice_dcf_ethdev.c b/drivers/net/ice/ice_dcf_ethdev.c
index e0772295e9..86600959f8 100644
--- a/drivers/net/ice/ice_dcf_ethdev.c
+++ b/drivers/net/ice/ice_dcf_ethdev.c
@@ -743,31 +743,14 @@ ice_dcf_dev_allmulticast_disable(__rte_unused struct rte_eth_dev *dev)
 }
 
 static int
-ice_dcf_dev_filter_ctrl(struct rte_eth_dev *dev,
-			enum rte_filter_type filter_type,
-			enum rte_filter_op filter_op,
-			void *arg)
+ice_dcf_dev_flow_ops_get(struct rte_eth_dev *dev,
+			 const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
 	if (!dev)
 		return -EINVAL;
 
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &ice_flow_ops;
-		break;
-
-	default:
-		PMD_DRV_LOG(WARNING, "Filter type (%d) not supported",
-			    filter_type);
-		ret = -EINVAL;
-		break;
-	}
-
-	return ret;
+	*ops = &ice_flow_ops;
+	return 0;
 }
 
 #define ICE_DCF_32_BIT_WIDTH (CHAR_BIT * 4)
@@ -984,7 +967,7 @@ static const struct eth_dev_ops ice_dcf_eth_dev_ops = {
 	.promiscuous_disable     = ice_dcf_dev_promiscuous_disable,
 	.allmulticast_enable     = ice_dcf_dev_allmulticast_enable,
 	.allmulticast_disable    = ice_dcf_dev_allmulticast_disable,
-	.filter_ctrl             = ice_dcf_dev_filter_ctrl,
+	.flow_ops_get            = ice_dcf_dev_flow_ops_get,
 	.udp_tunnel_port_add	 = ice_dcf_dev_udp_tunnel_port_add,
 	.udp_tunnel_port_del	 = ice_dcf_dev_udp_tunnel_port_del,
 };
diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c
index 8999d441ac..3d1c32247a 100644
--- a/drivers/net/ice/ice_ethdev.c
+++ b/drivers/net/ice/ice_ethdev.c
@@ -129,10 +129,8 @@ static int ice_xstats_get(struct rte_eth_dev *dev,
 static int ice_xstats_get_names(struct rte_eth_dev *dev,
 				struct rte_eth_xstat_name *xstats_names,
 				unsigned int limit);
-static int ice_dev_filter_ctrl(struct rte_eth_dev *dev,
-			enum rte_filter_type filter_type,
-			enum rte_filter_op filter_op,
-			void *arg);
+static int ice_dev_flow_ops_get(struct rte_eth_dev *dev,
+				const struct rte_flow_ops **ops);
 static int ice_dev_udp_tunnel_port_add(struct rte_eth_dev *dev,
 			struct rte_eth_udp_tunnel *udp_tunnel);
 static int ice_dev_udp_tunnel_port_del(struct rte_eth_dev *dev,
@@ -215,7 +213,7 @@ static const struct eth_dev_ops ice_eth_dev_ops = {
 	.xstats_get                   = ice_xstats_get,
 	.xstats_get_names             = ice_xstats_get_names,
 	.xstats_reset                 = ice_stats_reset,
-	.filter_ctrl                  = ice_dev_filter_ctrl,
+	.flow_ops_get                 = ice_dev_flow_ops_get,
 	.udp_tunnel_port_add          = ice_dev_udp_tunnel_port_add,
 	.udp_tunnel_port_del          = ice_dev_udp_tunnel_port_del,
 	.tx_done_cleanup              = ice_tx_done_cleanup,
@@ -5255,30 +5253,14 @@ static int ice_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
 }
 
 static int
-ice_dev_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg)
+ice_dev_flow_ops_get(struct rte_eth_dev *dev,
+		     const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
 	if (!dev)
 		return -EINVAL;
 
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &ice_flow_ops;
-		break;
-	default:
-		PMD_DRV_LOG(WARNING, "Filter type (%d) not supported",
-					filter_type);
-		ret = -EINVAL;
-		break;
-	}
-
-	return ret;
+	*ops = &ice_flow_ops;
+	return 0;
 }
 
 /* Add UDP tunneling port */
diff --git a/drivers/net/igc/igc_ethdev.c b/drivers/net/igc/igc_ethdev.c
index 0ea6e2a045..56d1024af6 100644
--- a/drivers/net/igc/igc_ethdev.c
+++ b/drivers/net/igc/igc_ethdev.c
@@ -297,7 +297,7 @@ static const struct eth_dev_ops eth_igc_ops = {
 	.vlan_offload_set	= eth_igc_vlan_offload_set,
 	.vlan_tpid_set		= eth_igc_vlan_tpid_set,
 	.vlan_strip_queue_set	= eth_igc_vlan_strip_queue_set,
-	.filter_ctrl		= eth_igc_filter_ctrl,
+	.flow_ops_get		= eth_igc_flow_ops_get,
 };
 
 /*
diff --git a/drivers/net/igc/igc_filter.c b/drivers/net/igc/igc_filter.c
index 836621d4c1..51fcabfb59 100644
--- a/drivers/net/igc/igc_filter.c
+++ b/drivers/net/igc/igc_filter.c
@@ -369,24 +369,9 @@ igc_clear_all_filter(struct rte_eth_dev *dev)
 }
 
 int
-eth_igc_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type,
-		enum rte_filter_op filter_op, void *arg)
+eth_igc_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		     const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
-	RTE_SET_USED(dev);
-
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &igc_flow_ops;
-		break;
-	default:
-		PMD_DRV_LOG(WARNING, "Filter type (%d) not supported",
-							filter_type);
-		ret = -EINVAL;
-	}
-
-	return ret;
+	*ops = &igc_flow_ops;
+	return 0;
 }
diff --git a/drivers/net/igc/igc_filter.h b/drivers/net/igc/igc_filter.h
index df8516bc40..781d270def 100644
--- a/drivers/net/igc/igc_filter.h
+++ b/drivers/net/igc/igc_filter.h
@@ -29,9 +29,8 @@ int igc_set_syn_filter(struct rte_eth_dev *dev,
 		const struct igc_syn_filter *filter);
 void igc_clear_syn_filter(struct rte_eth_dev *dev);
 void igc_clear_all_filter(struct rte_eth_dev *dev);
-int
-eth_igc_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type,
-		enum rte_filter_op filter_op, void *arg);
+int eth_igc_flow_ops_get(struct rte_eth_dev *dev,
+			 const struct rte_flow_ops **ops);
 
 #ifdef __cplusplus
 }
diff --git a/drivers/net/ipn3ke/ipn3ke_representor.c b/drivers/net/ipn3ke/ipn3ke_representor.c
index 856d21ef9b..589d9fa587 100644
--- a/drivers/net/ipn3ke/ipn3ke_representor.c
+++ b/drivers/net/ipn3ke/ipn3ke_representor.c
@@ -2821,11 +2821,9 @@ ipn3ke_rpst_mtu_set(struct rte_eth_dev *ethdev, uint16_t mtu)
 }
 
 static int
-ipn3ke_afu_filter_ctrl(struct rte_eth_dev *ethdev,
-	enum rte_filter_type filter_type, enum rte_filter_op filter_op,
-	void *arg)
+ipn3ke_afu_flow_ops_get(struct rte_eth_dev *ethdev,
+			const struct rte_flow_ops **ops)
 {
-	int ret = 0;
 	struct ipn3ke_hw *hw;
 	struct ipn3ke_rpst *rpst;
 
@@ -2836,27 +2834,13 @@ ipn3ke_afu_filter_ctrl(struct rte_eth_dev *ethdev,
 	rpst = IPN3KE_DEV_PRIVATE_TO_RPST(ethdev);
 
 	if (hw->acc_flow)
-		switch (filter_type) {
-		case RTE_ETH_FILTER_GENERIC:
-			if (filter_op != RTE_ETH_FILTER_GET)
-				return -EINVAL;
-			*(const void **)arg = &ipn3ke_flow_ops;
-			break;
-		default:
-			IPN3KE_AFU_PMD_WARN("Filter type (%d) not supported",
-					filter_type);
-			ret = -EINVAL;
-			break;
-		}
+		*ops = &ipn3ke_flow_ops;
 	else if (rpst->i40e_pf_eth)
-		(*rpst->i40e_pf_eth->dev_ops->filter_ctrl)(ethdev,
-							filter_type,
-							filter_op,
-							arg);
+		(*rpst->i40e_pf_eth->dev_ops->flow_ops_get)(ethdev, ops);
 	else
 		return -EINVAL;
 
-	return ret;
+	return 0;
 }
 
 static const struct eth_dev_ops ipn3ke_rpst_dev_ops = {
@@ -2874,7 +2858,7 @@ static const struct eth_dev_ops ipn3ke_rpst_dev_ops = {
 	.stats_reset          = ipn3ke_rpst_stats_reset,
 	.xstats_reset         = ipn3ke_rpst_stats_reset,
 
-	.filter_ctrl          = ipn3ke_afu_filter_ctrl,
+	.flow_ops_get         = ipn3ke_afu_flow_ops_get,
 
 	.rx_queue_start       = ipn3ke_rpst_rx_queue_start,
 	.rx_queue_stop        = ipn3ke_rpst_rx_queue_stop,
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index 761a0f26bb..d5581a243a 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -304,10 +304,8 @@ static int ixgbe_add_5tuple_filter(struct rte_eth_dev *dev,
 			struct ixgbe_5tuple_filter *filter);
 static void ixgbe_remove_5tuple_filter(struct rte_eth_dev *dev,
 			struct ixgbe_5tuple_filter *filter);
-static int ixgbe_dev_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg);
+static int ixgbe_dev_flow_ops_get(struct rte_eth_dev *dev,
+				  const struct rte_flow_ops **ops);
 static int ixgbevf_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu);
 
 static int ixgbe_dev_set_mc_addr_list(struct rte_eth_dev *dev,
@@ -538,7 +536,7 @@ static const struct eth_dev_ops ixgbe_eth_dev_ops = {
 	.reta_query           = ixgbe_dev_rss_reta_query,
 	.rss_hash_update      = ixgbe_dev_rss_hash_update,
 	.rss_hash_conf_get    = ixgbe_dev_rss_hash_conf_get,
-	.filter_ctrl          = ixgbe_dev_filter_ctrl,
+	.flow_ops_get         = ixgbe_dev_flow_ops_get,
 	.set_mc_addr_list     = ixgbe_dev_set_mc_addr_list,
 	.rxq_info_get         = ixgbe_rxq_info_get,
 	.txq_info_get         = ixgbe_txq_info_get,
@@ -6798,27 +6796,11 @@ ixgbe_add_del_ethertype_filter(struct rte_eth_dev *dev,
 }
 
 static int
-ixgbe_dev_filter_ctrl(__rte_unused struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg)
+ixgbe_dev_flow_ops_get(__rte_unused struct rte_eth_dev *dev,
+		       const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &ixgbe_flow_ops;
-		break;
-	default:
-		PMD_DRV_LOG(WARNING, "Filter type (%d) not supported",
-							filter_type);
-		ret = -EINVAL;
-		break;
-	}
-
-	return ret;
+	*ops = &ixgbe_flow_ops;
+	return 0;
 }
 
 static u8 *
diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c
index 041c1934f5..d048d21033 100644
--- a/drivers/net/mlx4/mlx4.c
+++ b/drivers/net/mlx4/mlx4.c
@@ -437,7 +437,7 @@ static const struct eth_dev_ops mlx4_dev_ops = {
 	.flow_ctrl_get = mlx4_flow_ctrl_get,
 	.flow_ctrl_set = mlx4_flow_ctrl_set,
 	.mtu_set = mlx4_mtu_set,
-	.filter_ctrl = mlx4_filter_ctrl,
+	.flow_ops_get = mlx4_flow_ops_get,
 	.rx_queue_intr_enable = mlx4_rx_intr_enable,
 	.rx_queue_intr_disable = mlx4_rx_intr_disable,
 	.is_removed = mlx4_is_removed,
diff --git a/drivers/net/mlx4/mlx4_flow.c b/drivers/net/mlx4/mlx4_flow.c
index b8ecfa829b..43a65abcc0 100644
--- a/drivers/net/mlx4/mlx4_flow.c
+++ b/drivers/net/mlx4/mlx4_flow.c
@@ -1590,37 +1590,19 @@ static const struct rte_flow_ops mlx4_flow_ops = {
 };
 
 /**
- * Manage filter operations.
+ * Get rte_flow callbacks.
  *
  * @param dev
  *   Pointer to Ethernet device structure.
- * @param filter_type
- *   Filter type.
- * @param filter_op
- *   Operation to perform.
- * @param arg
+ * @param ops
  *   Pointer to operation-specific structure.
  *
- * @return
- *   0 on success, negative errno value otherwise and rte_errno is set.
+ * @return 0
  */
 int
-mlx4_filter_ctrl(struct rte_eth_dev *dev,
-		 enum rte_filter_type filter_type,
-		 enum rte_filter_op filter_op,
-		 void *arg)
+mlx4_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		  const struct rte_flow_ops **ops)
 {
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			break;
-		*(const void **)arg = &mlx4_flow_ops;
-		return 0;
-	default:
-		ERROR("%p: filter type (%d) not supported",
-		      (void *)dev, filter_type);
-		break;
-	}
-	rte_errno = ENOTSUP;
-	return -rte_errno;
+	*ops = &mlx4_flow_ops;
+	return 0;
 }
diff --git a/drivers/net/mlx4/mlx4_flow.h b/drivers/net/mlx4/mlx4_flow.h
index e4366f28bb..5e82df6bd6 100644
--- a/drivers/net/mlx4/mlx4_flow.h
+++ b/drivers/net/mlx4/mlx4_flow.h
@@ -51,9 +51,6 @@ uint64_t mlx4_conv_rss_types(struct mlx4_priv *priv, uint64_t types,
 			     int verbs_to_dpdk);
 int mlx4_flow_sync(struct mlx4_priv *priv, struct rte_flow_error *error);
 void mlx4_flow_clean(struct mlx4_priv *priv);
-int mlx4_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg);
+int mlx4_flow_ops_get(struct rte_eth_dev *dev, const struct rte_flow_ops **ops);
 
 #endif /* RTE_PMD_MLX4_FLOW_H_ */
diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
index abd7ff70df..d9372f0a00 100644
--- a/drivers/net/mlx5/mlx5.c
+++ b/drivers/net/mlx5/mlx5.c
@@ -1477,7 +1477,7 @@ const struct eth_dev_ops mlx5_dev_ops = {
 	.reta_query = mlx5_dev_rss_reta_query,
 	.rss_hash_update = mlx5_rss_hash_update,
 	.rss_hash_conf_get = mlx5_rss_hash_conf_get,
-	.filter_ctrl = mlx5_dev_filter_ctrl,
+	.flow_ops_get = mlx5_flow_ops_get,
 	.rxq_info_get = mlx5_rxq_info_get,
 	.txq_info_get = mlx5_txq_info_get,
 	.rx_burst_mode_get = mlx5_rx_burst_mode_get,
@@ -1562,7 +1562,7 @@ const struct eth_dev_ops mlx5_dev_ops_isolate = {
 	.mtu_set = mlx5_dev_set_mtu,
 	.vlan_strip_queue_set = mlx5_vlan_strip_queue_set,
 	.vlan_offload_set = mlx5_vlan_offload_set,
-	.filter_ctrl = mlx5_dev_filter_ctrl,
+	.flow_ops_get = mlx5_flow_ops_get,
 	.rxq_info_get = mlx5_rxq_info_get,
 	.txq_info_get = mlx5_txq_info_get,
 	.rx_burst_mode_get = mlx5_rx_burst_mode_get,
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index a281fd20ea..24aff0beab 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -1192,10 +1192,7 @@ int mlx5_flow_query(struct rte_eth_dev *dev, struct rte_flow *flow,
 		    struct rte_flow_error *error);
 int mlx5_flow_isolate(struct rte_eth_dev *dev, int enable,
 		      struct rte_flow_error *error);
-int mlx5_dev_filter_ctrl(struct rte_eth_dev *dev,
-			 enum rte_filter_type filter_type,
-			 enum rte_filter_op filter_op,
-			 void *arg);
+int mlx5_flow_ops_get(struct rte_eth_dev *dev, const struct rte_flow_ops **ops);
 int mlx5_flow_start_default(struct rte_eth_dev *dev);
 void mlx5_flow_stop_default(struct rte_eth_dev *dev);
 int mlx5_flow_verify(struct rte_eth_dev *dev);
diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c
index ab5be3dacc..ca09d1ede9 100644
--- a/drivers/net/mlx5/mlx5_flow.c
+++ b/drivers/net/mlx5/mlx5_flow.c
@@ -6492,40 +6492,20 @@ mlx5_flow_query(struct rte_eth_dev *dev,
 }
 
 /**
- * Manage filter operations.
+ * Get rte_flow callbacks.
  *
  * @param dev
  *   Pointer to Ethernet device structure.
- * @param filter_type
- *   Filter type.
- * @param filter_op
- *   Operation to perform.
- * @param arg
+ * @param ops
  *   Pointer to operation-specific structure.
  *
- * @return
- *   0 on success, a negative errno value otherwise and rte_errno is set.
+ * @return 0
  */
 int
-mlx5_dev_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg)
+mlx5_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		  const struct rte_flow_ops **ops)
 {
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET) {
-			rte_errno = EINVAL;
-			return -rte_errno;
-		}
-		*(const void **)arg = &mlx5_flow_ops;
-		return 0;
-	default:
-		DRV_LOG(ERR, "port %u filter type (%d) not supported",
-			dev->data->port_id, filter_type);
-		rte_errno = ENOTSUP;
-		return -rte_errno;
-	}
+	*ops = &mlx5_flow_ops;
 	return 0;
 }
 
diff --git a/drivers/net/mvpp2/mrvl_ethdev.c b/drivers/net/mvpp2/mrvl_ethdev.c
index e119952340..1d41788974 100644
--- a/drivers/net/mvpp2/mrvl_ethdev.c
+++ b/drivers/net/mvpp2/mrvl_ethdev.c
@@ -2340,32 +2340,18 @@ mrvl_rss_hash_conf_get(struct rte_eth_dev *dev,
  *
  * @param dev
  *   Pointer to the device structure.
- * @param filer_type
- *   Flow filter type.
- * @param filter_op
- *   Flow filter operation.
- * @param arg
+ * @param ops
  *   Pointer to pass the flow ops.
  *
  * @return
  *   0 on success, negative error value otherwise.
  */
 static int
-mrvl_eth_filter_ctrl(struct rte_eth_dev *dev __rte_unused,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op, void *arg)
+mrvl_eth_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		      const struct rte_flow_ops **ops)
 {
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &mrvl_flow_ops;
-		return 0;
-	default:
-		MRVL_LOG(WARNING, "Filter type (%d) not supported",
-				filter_type);
-		return -EINVAL;
-	}
+	*ops = &mrvl_flow_ops;
+	return 0;
 }
 
 /**
@@ -2443,7 +2429,7 @@ static const struct eth_dev_ops mrvl_ops = {
 	.flow_ctrl_set = mrvl_flow_ctrl_set,
 	.rss_hash_update = mrvl_rss_hash_update,
 	.rss_hash_conf_get = mrvl_rss_hash_conf_get,
-	.filter_ctrl = mrvl_eth_filter_ctrl,
+	.flow_ops_get = mrvl_eth_flow_ops_get,
 	.mtr_ops_get = mrvl_mtr_ops_get,
 	.tm_ops_get = mrvl_tm_ops_get,
 };
diff --git a/drivers/net/octeontx2/otx2_ethdev.c b/drivers/net/octeontx2/otx2_ethdev.c
index e9fbbca4da..bacf180a6d 100644
--- a/drivers/net/octeontx2/otx2_ethdev.c
+++ b/drivers/net/octeontx2/otx2_ethdev.c
@@ -2322,7 +2322,7 @@ static const struct eth_dev_ops otx2_eth_dev_ops = {
 	.tx_done_cleanup          = otx2_nix_tx_done_cleanup,
 	.set_queue_rate_limit     = otx2_nix_tm_set_queue_rate_limit,
 	.pool_ops_supported       = otx2_nix_pool_ops_supported,
-	.filter_ctrl              = otx2_nix_dev_filter_ctrl,
+	.flow_ops_get             = otx2_nix_dev_flow_ops_get,
 	.get_module_info          = otx2_nix_get_module_info,
 	.get_module_eeprom        = otx2_nix_get_module_eeprom,
 	.fw_version_get           = otx2_nix_fw_version_get,
diff --git a/drivers/net/octeontx2/otx2_ethdev.h b/drivers/net/octeontx2/otx2_ethdev.h
index 99f0469d89..7391f09b8a 100644
--- a/drivers/net/octeontx2/otx2_ethdev.h
+++ b/drivers/net/octeontx2/otx2_ethdev.h
@@ -396,9 +396,8 @@ otx2_eth_pmd_priv(struct rte_eth_dev *eth_dev)
 /* Ops */
 int otx2_nix_info_get(struct rte_eth_dev *eth_dev,
 		      struct rte_eth_dev_info *dev_info);
-int otx2_nix_dev_filter_ctrl(struct rte_eth_dev *eth_dev,
-			     enum rte_filter_type filter_type,
-			     enum rte_filter_op filter_op, void *arg);
+int otx2_nix_dev_flow_ops_get(struct rte_eth_dev *eth_dev,
+			      const struct rte_flow_ops **ops);
 int otx2_nix_fw_version_get(struct rte_eth_dev *eth_dev, char *fw_version,
 			    size_t fw_size);
 int otx2_nix_get_module_info(struct rte_eth_dev *eth_dev,
diff --git a/drivers/net/octeontx2/otx2_ethdev_ops.c b/drivers/net/octeontx2/otx2_ethdev_ops.c
index 963cc285ed..9e3f80937d 100644
--- a/drivers/net/octeontx2/otx2_ethdev_ops.c
+++ b/drivers/net/octeontx2/otx2_ethdev_ops.c
@@ -471,24 +471,11 @@ otx2_nix_pool_ops_supported(struct rte_eth_dev *eth_dev, const char *pool)
 }
 
 int
-otx2_nix_dev_filter_ctrl(struct rte_eth_dev *eth_dev,
-			 enum rte_filter_type filter_type,
-			 enum rte_filter_op filter_op, void *arg)
+otx2_nix_dev_flow_ops_get(struct rte_eth_dev *eth_dev __rte_unused,
+			  const struct rte_flow_ops **ops)
 {
-	RTE_SET_USED(eth_dev);
-
-	if (filter_type != RTE_ETH_FILTER_GENERIC) {
-		otx2_err("Unsupported filter type %d", filter_type);
-		return -ENOTSUP;
-	}
-
-	if (filter_op == RTE_ETH_FILTER_GET) {
-		*(const void **)arg = &otx2_flow_ops;
-		return 0;
-	}
-
-	otx2_err("Invalid filter_op %d", filter_op);
-	return -EINVAL;
+	*ops = &otx2_flow_ops;
+	return 0;
 }
 
 static struct cgx_fw_data *
diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c
index ab5f5b1065..ff4b9255c4 100644
--- a/drivers/net/qede/qede_ethdev.c
+++ b/drivers/net/qede/qede_ethdev.c
@@ -2434,7 +2434,7 @@ static const struct eth_dev_ops qede_eth_dev_ops = {
 	.reta_update  = qede_rss_reta_update,
 	.reta_query  = qede_rss_reta_query,
 	.mtu_set = qede_set_mtu,
-	.filter_ctrl = qede_dev_filter_ctrl,
+	.flow_ops_get = qede_dev_flow_ops_get,
 	.udp_tunnel_port_add = qede_udp_dst_port_add,
 	.udp_tunnel_port_del = qede_udp_dst_port_del,
 	.fw_version_get = qede_fw_version_get,
diff --git a/drivers/net/qede/qede_ethdev.h b/drivers/net/qede/qede_ethdev.h
index da4b87f5e2..a38b701183 100644
--- a/drivers/net/qede/qede_ethdev.h
+++ b/drivers/net/qede/qede_ethdev.h
@@ -285,11 +285,8 @@ int qede_dev_set_link_state(struct rte_eth_dev *eth_dev, bool link_up);
 int qede_link_update(struct rte_eth_dev *eth_dev,
 		     __rte_unused int wait_to_complete);
 
-int qede_dev_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type type,
-			 enum rte_filter_op op, void *arg);
-
-int qede_ntuple_filter_conf(struct rte_eth_dev *eth_dev,
-			    enum rte_filter_op filter_op, void *arg);
+int qede_dev_flow_ops_get(struct rte_eth_dev *dev,
+			  const struct rte_flow_ops **ops);
 
 int qede_check_fdir_support(struct rte_eth_dev *eth_dev);
 
diff --git a/drivers/net/qede/qede_filter.c b/drivers/net/qede/qede_filter.c
index df5c07dfe5..c756594bfc 100644
--- a/drivers/net/qede/qede_filter.c
+++ b/drivers/net/qede/qede_filter.c
@@ -1050,31 +1050,18 @@ const struct rte_flow_ops qede_flow_ops = {
 	.flush = qede_flow_flush,
 };
 
-int qede_dev_filter_ctrl(struct rte_eth_dev *eth_dev,
-			 enum rte_filter_type filter_type,
-			 enum rte_filter_op filter_op,
-			 void *arg)
+int
+qede_dev_flow_ops_get(struct rte_eth_dev *eth_dev,
+		      const struct rte_flow_ops **ops)
 {
 	struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
 	struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
 
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (ECORE_IS_CMT(edev)) {
-			DP_ERR(edev, "flowdir is not supported in 100G mode\n");
-			return -ENOTSUP;
-		}
-
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-
-		*(const void **)arg = &qede_flow_ops;
-		return 0;
-	default:
-		DP_ERR(edev, "Unsupported filter type %d\n",
-			filter_type);
-		return -EINVAL;
+	if (ECORE_IS_CMT(edev)) {
+		DP_ERR(edev, "flowdir is not supported in 100G mode\n");
+		return -ENOTSUP;
 	}
 
+	*ops = &qede_flow_ops;
 	return 0;
 }
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 479b4f4df6..d72df2e13b 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -1751,32 +1751,11 @@ sfc_dev_rss_reta_update(struct rte_eth_dev *dev,
 }
 
 static int
-sfc_dev_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type,
-		    enum rte_filter_op filter_op,
-		    void *arg)
+sfc_dev_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		     const struct rte_flow_ops **ops)
 {
-	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
-	int rc = ENOTSUP;
-
-	sfc_log_init(sa, "entry");
-
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET) {
-			rc = EINVAL;
-		} else {
-			*(const void **)arg = &sfc_flow_ops;
-			rc = 0;
-		}
-		break;
-	default:
-		sfc_err(sa, "Unknown filter type %u", filter_type);
-		break;
-	}
-
-	sfc_log_init(sa, "exit: %d", -rc);
-	SFC_ASSERT(rc >= 0);
-	return -rc;
+	*ops = &sfc_flow_ops;
+	return 0;
 }
 
 static int
@@ -1859,7 +1838,7 @@ static const struct eth_dev_ops sfc_eth_dev_ops = {
 	.reta_query			= sfc_dev_rss_reta_query,
 	.rss_hash_update		= sfc_dev_rss_hash_update,
 	.rss_hash_conf_get		= sfc_dev_rss_hash_conf_get,
-	.filter_ctrl			= sfc_dev_filter_ctrl,
+	.flow_ops_get			= sfc_dev_flow_ops_get,
 	.set_mc_addr_list		= sfc_set_mc_addr_list,
 	.rxq_info_get			= sfc_rx_queue_info_get,
 	.txq_info_get			= sfc_tx_queue_info_get,
diff --git a/drivers/net/softnic/rte_eth_softnic.c b/drivers/net/softnic/rte_eth_softnic.c
index 99d8468c94..0c2a79a7d2 100644
--- a/drivers/net/softnic/rte_eth_softnic.c
+++ b/drivers/net/softnic/rte_eth_softnic.c
@@ -248,18 +248,11 @@ pmd_link_update(struct rte_eth_dev *dev __rte_unused,
 }
 
 static int
-pmd_filter_ctrl(struct rte_eth_dev *dev __rte_unused,
-		enum rte_filter_type filter_type,
-		enum rte_filter_op filter_op,
-		void *arg)
+pmd_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		 const struct rte_flow_ops **ops)
 {
-	if (filter_type == RTE_ETH_FILTER_GENERIC &&
-			filter_op == RTE_ETH_FILTER_GET) {
-		*(const void **)arg = &pmd_flow_ops;
-		return 0;
-	}
-
-	return -ENOTSUP;
+	*ops = &pmd_flow_ops;
+	return 0;
 }
 
 static int
@@ -287,7 +280,7 @@ static const struct eth_dev_ops pmd_ops = {
 	.dev_infos_get = pmd_dev_infos_get,
 	.rx_queue_setup = pmd_rx_queue_setup,
 	.tx_queue_setup = pmd_tx_queue_setup,
-	.filter_ctrl = pmd_filter_ctrl,
+	.flow_ops_get = pmd_flow_ops_get,
 	.tm_ops_get = pmd_tm_ops_get,
 	.mtr_ops_get = pmd_mtr_ops_get,
 };
diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c
index c36d4bf76e..68baa18523 100644
--- a/drivers/net/tap/rte_eth_tap.c
+++ b/drivers/net/tap/rte_eth_tap.c
@@ -1890,7 +1890,7 @@ static const struct eth_dev_ops ops = {
 	.stats_reset            = tap_stats_reset,
 	.dev_supported_ptypes_get = tap_dev_supported_ptypes_get,
 	.rss_hash_update        = tap_rss_hash_update,
-	.filter_ctrl            = tap_dev_filter_ctrl,
+	.flow_ops_get           = tap_dev_flow_ops_get,
 };
 
 static int
diff --git a/drivers/net/tap/tap_flow.c b/drivers/net/tap/tap_flow.c
index 1538349e9c..1ee6fb30ab 100644
--- a/drivers/net/tap/tap_flow.c
+++ b/drivers/net/tap/tap_flow.c
@@ -2160,35 +2160,20 @@ static int rss_add_actions(struct rte_flow *flow, struct pmd_internals *pmd,
 }
 
 /**
- * Manage filter operations.
+ * Get rte_flow operations.
  *
  * @param dev
  *   Pointer to Ethernet device structure.
- * @param filter_type
- *   Filter type.
- * @param filter_op
- *   Operation to perform.
- * @param arg
+ * @param ops
  *   Pointer to operation-specific structure.
  *
  * @return
  *   0 on success, negative errno value on failure.
  */
 int
-tap_dev_filter_ctrl(struct rte_eth_dev *dev,
-		    enum rte_filter_type filter_type,
-		    enum rte_filter_op filter_op,
-		    void *arg)
+tap_dev_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		     const struct rte_flow_ops **ops)
 {
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &tap_flow_ops;
-		return 0;
-	default:
-		TAP_LOG(ERR, "%p: filter type (%d) not supported",
-			dev, filter_type);
-	}
-	return -EINVAL;
+	*ops = &tap_flow_ops;
+	return 0;
 }
diff --git a/drivers/net/tap/tap_flow.h b/drivers/net/tap/tap_flow.h
index ac60a9ae20..240fbc3dfa 100644
--- a/drivers/net/tap/tap_flow.h
+++ b/drivers/net/tap/tap_flow.h
@@ -46,10 +46,8 @@ enum bpf_fd_idx {
 	SEC_MAX,
 };
 
-int tap_dev_filter_ctrl(struct rte_eth_dev *dev,
-			enum rte_filter_type filter_type,
-			enum rte_filter_op filter_op,
-			void *arg);
+int tap_dev_flow_ops_get(struct rte_eth_dev *dev,
+			 const struct rte_flow_ops **ops);
 int tap_flow_flush(struct rte_eth_dev *dev, struct rte_flow_error *error);
 
 int tap_flow_implicit_create(struct pmd_internals *pmd,
diff --git a/drivers/net/txgbe/txgbe_ethdev.c b/drivers/net/txgbe/txgbe_ethdev.c
index 1ab8d2cded..be45ba9177 100644
--- a/drivers/net/txgbe/txgbe_ethdev.c
+++ b/drivers/net/txgbe/txgbe_ethdev.c
@@ -4078,27 +4078,11 @@ txgbe_add_del_ethertype_filter(struct rte_eth_dev *dev,
 }
 
 static int
-txgbe_dev_filter_ctrl(__rte_unused struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg)
+txgbe_dev_flow_ops_get(__rte_unused struct rte_eth_dev *dev,
+		       const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &txgbe_flow_ops;
-		break;
-	default:
-		PMD_DRV_LOG(WARNING, "Filter type (%d) not supported",
-							filter_type);
-		ret = -EINVAL;
-		break;
-	}
-
-	return ret;
+	*ops = &txgbe_flow_ops;
+	return 0;
 }
 
 static u8 *
@@ -5208,7 +5192,7 @@ static const struct eth_dev_ops txgbe_eth_dev_ops = {
 	.reta_query                 = txgbe_dev_rss_reta_query,
 	.rss_hash_update            = txgbe_dev_rss_hash_update,
 	.rss_hash_conf_get          = txgbe_dev_rss_hash_conf_get,
-	.filter_ctrl                = txgbe_dev_filter_ctrl,
+	.flow_ops_get               = txgbe_dev_flow_ops_get,
 	.set_mc_addr_list           = txgbe_dev_set_mc_addr_list,
 	.rxq_info_get               = txgbe_rxq_info_get,
 	.txq_info_get               = txgbe_txq_info_get,
diff --git a/lib/librte_ethdev/ethdev_driver.h b/lib/librte_ethdev/ethdev_driver.h
index 57fdedaa1a..d9b1a580d7 100644
--- a/lib/librte_ethdev/ethdev_driver.h
+++ b/lib/librte_ethdev/ethdev_driver.h
@@ -465,34 +465,16 @@ typedef int (*eth_get_module_eeprom_t)(struct rte_eth_dev *dev,
 				       struct rte_dev_eeprom_info *info);
 /**< @internal Retrieve plugin module eeprom data */
 
+struct rte_flow_ops;
 /**
- * Feature filter types
+ * @internal
+ * Get flow operations.
+ *
+ * If the flow API is not supported for the specified device,
+ * the driver can return NULL.
  */
-enum rte_filter_type {
-	RTE_ETH_FILTER_NONE = 0,
-	RTE_ETH_FILTER_ETHERTYPE,
-	RTE_ETH_FILTER_FLEXIBLE,
-	RTE_ETH_FILTER_SYN,
-	RTE_ETH_FILTER_NTUPLE,
-	RTE_ETH_FILTER_TUNNEL,
-	RTE_ETH_FILTER_FDIR,
-	RTE_ETH_FILTER_HASH,
-	RTE_ETH_FILTER_L2_TUNNEL,
-	RTE_ETH_FILTER_GENERIC,
-};
-
-/**
- * Generic operations on filters
- */
-enum rte_filter_op {
-	RTE_ETH_FILTER_GET,      /**< get flow API ops */
-};
-
-typedef int (*eth_filter_ctrl_t)(struct rte_eth_dev *dev,
-				 enum rte_filter_type filter_type,
-				 enum rte_filter_op filter_op,
-				 void *arg);
-/**< @internal Take operations to assigned filter type on an Ethernet device */
+typedef int (*eth_flow_ops_get_t)(struct rte_eth_dev *dev,
+				  const struct rte_flow_ops **ops);
 
 typedef int (*eth_tm_ops_get_t)(struct rte_eth_dev *dev, void *ops);
 /**< @internal Get Traffic Management (TM) operations on an Ethernet device */
@@ -880,7 +862,7 @@ struct eth_dev_ops {
 	eth_get_module_eeprom_t    get_module_eeprom;
 	/** Get plugin module eeprom data. */
 
-	eth_filter_ctrl_t          filter_ctrl; /**< common filter control. */
+	eth_flow_ops_get_t         flow_ops_get; /**< Get flow operations. */
 
 	eth_get_dcb_info           get_dcb_info; /** Get DCB information. */
 
@@ -1377,6 +1359,18 @@ rte_eth_hairpin_queue_peer_unbind(uint16_t cur_port, uint16_t cur_queue,
  * Legacy ethdev API used internally by drivers.
  */
 
+enum rte_filter_type {
+	RTE_ETH_FILTER_NONE = 0,
+	RTE_ETH_FILTER_ETHERTYPE,
+	RTE_ETH_FILTER_FLEXIBLE,
+	RTE_ETH_FILTER_SYN,
+	RTE_ETH_FILTER_NTUPLE,
+	RTE_ETH_FILTER_TUNNEL,
+	RTE_ETH_FILTER_FDIR,
+	RTE_ETH_FILTER_HASH,
+	RTE_ETH_FILTER_L2_TUNNEL,
+};
+
 /**
  * Define all structures for Ethertype Filter type.
  */
diff --git a/lib/librte_ethdev/rte_eth_ctrl.h b/lib/librte_ethdev/rte_eth_ctrl.h
index 8a50dbfef9..42652f9cce 100644
--- a/lib/librte_ethdev/rte_eth_ctrl.h
+++ b/lib/librte_ethdev/rte_eth_ctrl.h
@@ -339,7 +339,7 @@ struct rte_eth_fdir_action {
 };
 
 /**
- * A structure used to define the flow director filter entry by filter_ctrl API.
+ * A structure used to define the flow director filter entry.
  */
 struct rte_eth_fdir_filter {
 	uint32_t soft_id;
diff --git a/lib/librte_ethdev/rte_flow.c b/lib/librte_ethdev/rte_flow.c
index 241af6c4ca..e07e617d74 100644
--- a/lib/librte_ethdev/rte_flow.c
+++ b/lib/librte_ethdev/rte_flow.c
@@ -255,18 +255,21 @@ rte_flow_ops_get(uint16_t port_id, struct rte_flow_error *error)
 
 	if (unlikely(!rte_eth_dev_is_valid_port(port_id)))
 		code = ENODEV;
-	else if (unlikely(!dev->dev_ops->filter_ctrl ||
-			  dev->dev_ops->filter_ctrl(dev,
-						    RTE_ETH_FILTER_GENERIC,
-						    RTE_ETH_FILTER_GET,
-						    &ops) ||
-			  !ops))
+	else if (unlikely(dev->dev_ops->flow_ops_get == NULL))
+		/* flow API not supported with this driver dev_ops */
 		code = ENOSYS;
 	else
-		return ops;
-	rte_flow_error_set(error, code, RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
-			   NULL, rte_strerror(code));
-	return NULL;
+		code = dev->dev_ops->flow_ops_get(dev, &ops);
+	if (code == 0 && ops == NULL)
+		/* flow API not supported with this device */
+		code = ENOSYS;
+
+	if (code != 0) {
+		rte_flow_error_set(error, code, RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
+				   NULL, rte_strerror(code));
+		return NULL;
+	}
+	return ops;
 }
 
 /* Check whether a flow rule can be created on a given port. */
diff --git a/lib/librte_ethdev/rte_flow_driver.h b/lib/librte_ethdev/rte_flow_driver.h
index dabd819d10..da594d9256 100644
--- a/lib/librte_ethdev/rte_flow_driver.h
+++ b/lib/librte_ethdev/rte_flow_driver.h
@@ -28,31 +28,6 @@ extern "C" {
 /**
  * Generic flow operations structure implemented and returned by PMDs.
  *
- * To implement this API, PMDs must handle the RTE_ETH_FILTER_GENERIC filter
- * type in their .filter_ctrl callback function (struct eth_dev_ops) as well
- * as the RTE_ETH_FILTER_GET filter operation.
- *
- * If successful, this operation must result in a pointer to a PMD-specific
- * struct rte_flow_ops written to the argument address as described below:
- *
- * \code
- *
- * // PMD filter_ctrl callback
- *
- * static const struct rte_flow_ops pmd_flow_ops = { ... };
- *
- * switch (filter_type) {
- * case RTE_ETH_FILTER_GENERIC:
- *     if (filter_op != RTE_ETH_FILTER_GET)
- *         return -EINVAL;
- *     *(const void **)arg = &pmd_flow_ops;
- *     return 0;
- * }
- *
- * \endcode
- *
- * See also rte_flow_ops_get().
- *
  * These callback functions are not supposed to be used by applications
  * directly, which must rely on the API defined in rte_flow.h.
  *
-- 
2.30.1


^ permalink raw reply	[relevance 1%]

* [dpdk-dev] [PATCH v4 0/8] Introduce event vectorization
  2021-03-16 20:01  4%   ` [dpdk-dev] [PATCH v3 " pbhagavatula
@ 2021-03-19 20:57  4%     ` pbhagavatula
                           ` (2 more replies)
  0 siblings, 3 replies; 200+ results
From: pbhagavatula @ 2021-03-19 20:57 UTC (permalink / raw)
  To: jerinj, jay.jayatheerthan, erik.g.carrillo, abhinandan.gujjar,
	timothy.mcdaniel, hemant.agrawal, harry.van.haaren,
	mattias.ronnblom, liang.j.ma
  Cc: dev, Pavan Nikhilesh

From: Pavan Nikhilesh <pbhagavatula@marvell.com>

In traditional event programming model, events are identified by a
flow-id and a uintptr_t. The flow-id uniquely identifies a given event
and determines the order of scheduling based on schedule type, the
uintptr_t holds a single object.

Event devices also support burst mode with configurable dequeue depth,
i.e. each dequeue call would return multiple events and each event
might be at a different stage of the pipeline.
Having a burst of events belonging to different stages in a dequeue
burst is not only difficult to vectorize but also increases the scheduler
overhead and application overhead of pipelining events further.
Using event vectors we see a performance gain of ~628% as shown in [1].

By introducing event vectorization, each event will be capable of holding
multiple uintptr_t of the same flow thereby allowing applications
to vectorize their pipeline and reduce the complexity of pipelining
events across multiple stages. This also reduces the complexity of handling
enqueue and dequeue on an event device.

Since event devices are transparent to the events they are scheduling
so the event producers such as eth_rx_adapter, crypto_adapter , etc..
are responsible for vectorizing the buffers of the same flow into a single
event.

The series also breaks ABI in the patch [8/8] which is targetted to the
v21.11 release.

The dpdk-test-eventdev application has been updated with options to test
multiple vector sizes and timeouts.

[1]
As for performance improvement, with a ARM Cortex-A72 equivalent processer,
software event device (--vdev=event_sw0), single worker core, single stage
and using one service core for Rx adapter, Tx adapter, Scheduling.

Without event vectorization:
    ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
         --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
         --stlist=a --wlcores=20
    Port[0] using Rx adapter[0] configured
    Port[0] using Tx adapter[0] Configured
    4.728 mpps avg 4.728 mpps

With event vectorization:
    ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
        --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
        --stlist=a --wlcores=20 --enable_vector --nb_eth_queues 1
        --vector_size 256
    Port[0] using Rx adapter[0] configured
    Port[0] using Tx adapter[0] Configured
    34.383 mpps avg 34.383 mpps

Having dedicated service cores for each Rx queues and tweaking the vector,
dequeue burst size would further improve performance.

API usage is shown below:

Configuration:

	struct rte_event_eth_rx_adapter_event_vector_config vec_conf;

	vector_pool = rte_event_vector_pool_create("vector_pool",
			nb_elem, 0, vector_size, socket_id);

	rte_event_eth_rx_adapter_create(id, event_id, &adptr_conf);
	rte_event_eth_rx_adapter_queue_add(id, eth_id, -1, &queue_conf);
	if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR) {
		vec_conf.vector_sz = vector_size;
		vec_conf.vector_timeout_ns = vector_tmo_nsec;
		vec_conf.vector_mp = vector_pool;
		rte_event_eth_rx_adapter_queue_event_vector_config(id,
				eth_id, -1, &vec_conf);
	}

Fastpath:

	num = rte_event_dequeue_burst(event_id, port_id, &ev, 1, 0);
	if (!num)
		continue;

	if (ev.event_type & RTE_EVENT_TYPE_VECTOR) {
		switch (ev.event_type) {
		case RTE_EVENT_TYPE_ETHDEV_VECTOR:
		case RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR:
			struct rte_mbuf **mbufs;

			mbufs = ev.vector_ev->mbufs;
			for (i = 0; i < ev.vector_ev->nb_elem; i++)
				//Process mbufs.
			break;
		case ...
		}
	}
	...

v4 Changes:
- Fix missing event vector structure in event structure.(Jay)

v3 Changes:
- Fix unintended formatting changes.

v2 Changes:
- Multiple gramatical and style fixes.(Jerin)
- Add parameter to define vector size in power of 2. (Jerin)
- Redo patch series w/o breaking ABI till the last patch.(David)
- Add deprication notice to announce ABI break in 21.11.(David)
- Add vector limits validation to app/test-eventdev.

Pavan Nikhilesh (8):
  eventdev: introduce event vector capability
  eventdev: introduce event vector Rx capability
  eventdev: introduce event vector Tx capability
  eventdev: add Rx adapter event vector support
  eventdev: add Tx adapter event vector support
  app/eventdev: add event vector mode in pipeline test
  doc: announce event Rx adapter config changes
  eventdev: simplify Rx adapter event vector config

 app/test-eventdev/evt_common.h                |   4 +
 app/test-eventdev/evt_options.c               |  52 +++
 app/test-eventdev/evt_options.h               |   4 +
 app/test-eventdev/test_pipeline_atq.c         | 310 +++++++++++++++--
 app/test-eventdev/test_pipeline_common.c      | 105 +++++-
 app/test-eventdev/test_pipeline_common.h      |  18 +
 app/test-eventdev/test_pipeline_queue.c       | 320 ++++++++++++++++--
 .../prog_guide/event_ethernet_rx_adapter.rst  |  38 +++
 .../prog_guide/event_ethernet_tx_adapter.rst  |  12 +
 doc/guides/prog_guide/eventdev.rst            |  36 +-
 doc/guides/rel_notes/deprecation.rst          |   9 +
 doc/guides/tools/testeventdev.rst             |  28 ++
 lib/librte_eventdev/eventdev_pmd.h            |  31 +-
 .../rte_event_eth_rx_adapter.c                | 305 ++++++++++++++++-
 .../rte_event_eth_rx_adapter.h                |  68 ++++
 .../rte_event_eth_tx_adapter.c                |  66 +++-
 lib/librte_eventdev/rte_eventdev.c            |  11 +-
 lib/librte_eventdev/rte_eventdev.h            | 144 +++++++-
 lib/librte_eventdev/version.map               |   4 +
 19 files changed, 1479 insertions(+), 86 deletions(-)

--
2.17.1


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v2] bus/pci: fix Windows kernel driver categories
  2021-03-18 22:07  0%   ` Ranjit Menon
@ 2021-03-19 15:24  0%     ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2021-03-19 15:24 UTC (permalink / raw)
  To: dev
  Cc: dmitry.kozliuk, stable, Tal Shnaiderman, Narcisa Vasile,
	Pallavi Kadam, John Alexander, Ranjit Menon

18/03/2021 23:07, Ranjit Menon:
> On 3/18/2021 3:48 AM, Thomas Monjalon wrote:
> > In Windows probing, the value RTE_PCI_KDRV_NONE was used
> > instead of RTE_PCI_KDRV_UNKNOWN.
> > This value covers the mlx case where the kernel driver is in place,
> > offering a bifurcated mode to the userspace driver.
> > When the kernel driver is listed as unknown,
> > there is no special treatment in DPDK probing, contrary to UIO modes.
> >
> > The value RTE_PCI_KDRV_NIC_UIO (FreeBSD) was re-used
> > instead of having a new RTE_PCI_KDRV_NET_UIO for Windows NetUIO.
> > While adding the new value RTE_PCI_KDRV_NET_UIO
> > (at the end for ABI compatibility),
> > the enum of kernel driver categories is annotated.
> >
> > Fixes: b762221ac24f ("bus/pci: support Windows with bifurcated drivers")
> > Fixes: c76ec01b4591 ("bus/pci: support netuio on Windows")
> > Cc: stable@dpdk.org
> >
> > Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> > Acked-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
> Acked-by: Tal Shnaiderman <talshn@nvidia.com>
> Acked-by: Ranjit Menon <ranjit.menon@intel.com>

Applied



^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] eal: mark version parts API as experimental
  2021-03-18 12:29  0% ` Bruce Richardson
@ 2021-03-19 15:21  0%   ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2021-03-19 15:21 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: dev, stable, David Marchand, Ray Kinsella

18/03/2021 13:29, Bruce Richardson:
> On Wed, Mar 17, 2021 at 04:15:35PM +0100, Thomas Monjalon wrote:
> > Some functions were introduced in DPDK 21.05 to query the version parts
> > (prefix, year, month, minor, suffix, release) at runtime.
> > Per guidelines, these new public functions must be marked with
> > __rte_experimental and ABI versioned as EXPERIMENTAL.
> > 
> > Fixes: 5b637a848195 ("eal: fix querying DPDK version at runtime")
> > Cc: stable@dpdk.org
> > 
> > Suggested-by: David Marchand <david.marchand@redhat.com>
> > Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> > ---
> Acked-by: Bruce Richardson <bruce.richardson@intel.com>

Applied



^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [RFC 3/5] eal: lcore state FINISHED is not required
  @ 2021-03-19 13:42  3%         ` Ananyev, Konstantin
  2021-03-30  2:54  0%           ` Honnappa Nagarahalli
  0 siblings, 1 reply; 200+ results
From: Ananyev, Konstantin @ 2021-03-19 13:42 UTC (permalink / raw)
  To: Honnappa Nagarahalli, thomas, Feifei Wang, david.marchand
  Cc: hemant.agrawal, Nipun.gupta@nxp.com, jerinj, Van Haaren, Harry,
	Richardson, Bruce, dmitry.kozliuk, navasile, dmitrym, Kadam,
	Pallavi, dev, Ruifeng Wang, nd, nd


Hi everyone,

> <snip>
> 
> > >
> > > > > Subject: [RFC 3/5] eal: lcore state FINISHED is not required
> > > > >
> > > > > FINISHED state seems to be used to indicate that the worker's
> > > > > update of the 'state' is not visible to other threads. There seems
> > > > > to be no requirement to have such a state.
> > > >
> > > > I am not sure "FINISHED" is necessary to be removed, and I propose
> > > > some of my profiles for discussion.
> > > >  There are three states for lcore now:
> > > > "WAIT": indicate lcore can start working
> > > > "RUNNING": indicate lcore is working
> > > > "FINISHED": indicate lcore has finished its working and wait to be
> > > > reset
> > > If you look at the definitions of "WAIT" and "FINISHED" states, they look
> > similar, except for "wait to be reset" in "FINISHED" state . The code really does
> > not do anything to reset the lcore. It just changes the state to "WAIT".


I agree that 3 states here seems excessive.
Just 2 (RUNNING/IDLE) seems enough.
Though we can't just remove FINISHED here - it will be an Abi breakage.
Might be deprecate FINISHED now and remove in 21.11.

Also need to decide what rte_eal_wait_lcore() should return in that case?
Always zero, or always status of last function called?

> > >
> > > >
> > > > From the description above, we can find "FINISHED" is different from
> > > > "WAIT", it can shows that lcore has done the work and finished it.
> > > > Thus, if we remove "FINISHED", maybe we will not know whether the
> > > > lcore finishes its work or just doesn't start, because this two state has the
> > same tag "WAIT".
> > > Looking at "eal_thread_loop", the worker thread sets the state to "RUNNING"
> > before sending the ack back to main core. After that it is guaranteed that the
> > worker will run the assigned function. Only case where it will not run the
> > assigned function is when the 'write' syscall fails, in which case it results in a
> > panic.
> >
> > Quick note: it should not panic.
> > We must find a way to return an error
> > without crashing the whole application.
> The syscalls are being used to communicate the status back to the main thread. If they fail, it is not possible to communicate the status.
> May be it is better to panic.
> We could change the implementation using shared variables, but it would require polling the memory. May be the syscalls are being used to
> avoid polling. However, this polling would happen during init time (or similar) for a short duration.

AFAIK we use read and write not for status communication, but sort of sleep/ack point.
Though I agree if we can't do read/write from the system pipe then something is totally wrong,
and probably there is no much point to continue. 
 
> >
> >
> > > > Furthermore, consider such a scenario:
> > > > Core 1 need to monitor Core 2 state, if Core 2 finishes one task,
> > > > Core 1 can start its working.
> > > > However, if there is only  one tag "WAIT", Core 1 maybe  start its
> > > > work at the wrong time, when Core 2 still does not start its task at state
> > "WAIT".
> > > > This is just my guess, and at present, there is no similar
> > > > application scenario in dpdk.
> > > To be able to do this effectively, core 1 needs to observe the state change
> > from WAIT->RUNNING->FINISHED. This requires that core 1 should be calling
> > rte_eal_remote_launch and rte_eal_wait_lcore functions. It is not possible to
> > observe this state transition from a 3rd core (for ex: a worker might go from
> > RUNNING->FINISHED->WAIT->RUNNING which a 3rd core might not be able to
> > observe).
> > >
> > > >
> > > > On the other hand, if we decide to remove "FINISHED", please
> > > > consider the following files:
> > > > 1. lib/librte_eal/linux/eal_thread.c: line 31
> > > >     lib/librte_eal/windows/eal_thread.c: line 22
> > > >     lib/librte_eal/freebsd/eal_thread.c: line 31
> > > I have looked at these lines, they do not capture "why" FINISHED state is
> > required.
> > >
> > >  2.
> > > > lib/librte_eal/include/rte_launch.h: line 24, 44, 121, 123, 131 3.
> > > > examples/l2fwd-
> > > > keepalive/main.c: line 510
> > > > rte_eal_wait_lcore(id_core) can be removed. Because the core state
> > > > has been checked as "WAIT", this is a redundant operation
> >
> >


^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v2] bus/pci: fix Windows kernel driver categories
  2021-03-18 10:48  3% ` [dpdk-dev] [PATCH v2] " Thomas Monjalon
  2021-03-18 12:00  0%   ` Tal Shnaiderman
@ 2021-03-18 22:07  0%   ` Ranjit Menon
  2021-03-19 15:24  0%     ` Thomas Monjalon
  1 sibling, 1 reply; 200+ results
From: Ranjit Menon @ 2021-03-18 22:07 UTC (permalink / raw)
  To: Thomas Monjalon, dev
  Cc: dmitry.kozliuk, stable, Tal Shnaiderman, Narcisa Vasile,
	Pallavi Kadam, John Alexander

On 3/18/2021 3:48 AM, Thomas Monjalon wrote:
> In Windows probing, the value RTE_PCI_KDRV_NONE was used
> instead of RTE_PCI_KDRV_UNKNOWN.
> This value covers the mlx case where the kernel driver is in place,
> offering a bifurcated mode to the userspace driver.
> When the kernel driver is listed as unknown,
> there is no special treatment in DPDK probing, contrary to UIO modes.
>
> The value RTE_PCI_KDRV_NIC_UIO (FreeBSD) was re-used
> instead of having a new RTE_PCI_KDRV_NET_UIO for Windows NetUIO.
> While adding the new value RTE_PCI_KDRV_NET_UIO
> (at the end for ABI compatibility),
> the enum of kernel driver categories is annotated.
>
> Fixes: b762221ac24f ("bus/pci: support Windows with bifurcated drivers")
> Fixes: c76ec01b4591 ("bus/pci: support netuio on Windows")
> Cc: stable@dpdk.org
>
> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> Acked-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
> ---
> v2: improve comments and commit message
> ---
>   drivers/bus/pci/rte_bus_pci.h | 13 +++++++------
>   drivers/bus/pci/windows/pci.c | 14 +++++++-------
>   2 files changed, 14 insertions(+), 13 deletions(-)
>
Acked-by: Ranjit Menon <ranjit.menon@intel.com>

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] bus/pci: fix Windows kernel driver categories
  2021-03-18  7:49  3%   ` Thomas Monjalon
@ 2021-03-18 22:00  0%     ` Ranjit Menon
  0 siblings, 0 replies; 200+ results
From: Ranjit Menon @ 2021-03-18 22:00 UTC (permalink / raw)
  To: Thomas Monjalon
  Cc: dev, dmitry.kozliuk, stable, Tal Shnaiderman, Narcisa Vasile,
	John Alexander, Pallavi Kadam, matan, viacheslavo


On 3/18/2021 12:49 AM, Thomas Monjalon wrote:
> 18/03/2021 00:17, Ranjit Menon:
>> Hi Thomas,
>>
>> On 3/16/2021 4:11 PM, Thomas Monjalon wrote:
>>> In Windows probing, the value RTE_PCI_KDRV_NONE was used
>>> instead of RTE_PCI_KDRV_UNKNOWN (mlx case),
>>> and RTE_PCI_KDRV_NIC_UIO (FreeBSD) was re-used
>>> instead of having a new RTE_PCI_KDRV_NET_UIO for Windows NetUIO.
>> Shouldn't the mlx case actually remain RTE_PCI_KDRV_NONE?
>>
>> mlx does not require a UIO-like kernel driver...No? And NONE implies that no kernel driver is used/required.
>> Not sure what is correct here.
> No this is a bifurcated model, meaning kernel and userland
> work together. The PCI device is bound to the kernel driver,
> but the driver is not listed because no special treatment is required.
>
>>> While adding the new value RTE_PCI_KDRV_NET_UIO,
>>> the enum of kernel driver categories is annotated.
>>>
>>> Fixes: b762221ac24f ("bus/pci: support Windows with bifurcated drivers")
>>> Fixes: c76ec01b4591 ("bus/pci: support netuio on Windows")
>>> Cc: stable@dpdk.org
>>>
>>> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
>>> ---
>>>    drivers/bus/pci/rte_bus_pci.h | 13 +++++++------
>>>    drivers/bus/pci/windows/pci.c | 14 +++++++-------
>>>    2 files changed, 14 insertions(+), 13 deletions(-)
>>>
>>> diff --git a/drivers/bus/pci/rte_bus_pci.h b/drivers/bus/pci/rte_bus_pci.h
>>> index fdda046515..3d009cc74b 100644
>>> --- a/drivers/bus/pci/rte_bus_pci.h
>>> +++ b/drivers/bus/pci/rte_bus_pci.h
>>> @@ -52,12 +52,13 @@ TAILQ_HEAD(rte_pci_driver_list, rte_pci_driver);
>>>    struct rte_devargs;
>>>    
>>>    enum rte_pci_kernel_driver {
>>> -	RTE_PCI_KDRV_UNKNOWN = 0,
>>> -	RTE_PCI_KDRV_IGB_UIO,
>>> -	RTE_PCI_KDRV_VFIO,
>>> -	RTE_PCI_KDRV_UIO_GENERIC,
>>> -	RTE_PCI_KDRV_NIC_UIO,
>>> -	RTE_PCI_KDRV_NONE,
>>> +	RTE_PCI_KDRV_UNKNOWN = 0,  /* not listed - may be a bifurcated driver */
>>> +	RTE_PCI_KDRV_IGB_UIO,      /* igb_uio for Linux */
>>> +	RTE_PCI_KDRV_VFIO,         /* VFIO for Linux */
>>> +	RTE_PCI_KDRV_UIO_GENERIC,  /* uio_generic for Linux */
>>> +	RTE_PCI_KDRV_NIC_UIO,      /* nic_uio for FreeBSD */
>>> +	RTE_PCI_KDRV_NONE,         /* error */
>>> +	RTE_PCI_KDRV_NET_UIO,      /* NetUIO for Windows */
>>>    };
>>>    
>> Any chance we can re-order the enums, so that _NONE and _UNKNOWN are at
>> the top?
> No, it would break the ABI.
>
>> This will change the value, and break code where this value was
>> hard-coded. But how likely is that...?
> The problem is when loading the new PCI bus driver with an old device driver.
>
>
>
OK. Thanks for the explanation, Thomas.

ranjit m.


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 1/3] Add EAL threads API
  2021-03-18 15:48  5%   ` David Marchand
@ 2021-03-18 19:40  4%     ` Narcisa Ana Maria Vasile
  0 siblings, 0 replies; 200+ results
From: Narcisa Ana Maria Vasile @ 2021-03-18 19:40 UTC (permalink / raw)
  To: David Marchand
  Cc: dev, Thomas Monjalon, Dmitry Kozlyuk, Khoa To, navasile,
	Dmitry Malloy (MESHCHANINOV),
	roretzla, Omar Cardona, Bruce Richardson, Pallavi Kadam

On Thu, Mar 18, 2021 at 04:48:49PM +0100, David Marchand wrote:
> On Thu, Mar 18, 2021 at 2:01 AM Narcisa Ana Maria Vasile
> <navasile@linux.microsoft.com> wrote:
> > diff --git a/lib/librte_eal/common/eal_common_thread.c b/lib/librte_eal/common/eal_common_thread.c
> > index 73a055902..5219e783e 100644
> > --- a/lib/librte_eal/common/eal_common_thread.c
> 
> rte_thread_*et_affinity() are stable.
> This breaks the ABI (which is bad) and this API change was not
> announced previously.
> 
  Thank you David, I will revert the renaming of the stable
  functions to fix the ABI break.

  Given that the original functions only operate on the current thread
  (using the _thread_self()), changing their names to 
  rte_thread_self_*et_affinity() brings more clarity to the purpose of
  the functions. We will propose an ABI change to rename
  them in the next release (following the proper ABI changes procedures).

> -- 
> David Marchand

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH 1/3] Add EAL threads API
  @ 2021-03-18 15:48  5%   ` David Marchand
  2021-03-18 19:40  4%     ` Narcisa Ana Maria Vasile
  2021-03-23  0:20  2%   ` [dpdk-dev] [PATCH v2 00/10] eal: Add new API for threading Narcisa Ana Maria Vasile
  1 sibling, 1 reply; 200+ results
From: David Marchand @ 2021-03-18 15:48 UTC (permalink / raw)
  To: Narcisa Ana Maria Vasile
  Cc: dev, Thomas Monjalon, Dmitry Kozlyuk, Khoa To, navasile,
	Dmitry Malloy (MESHCHANINOV),
	roretzla, Omar Cardona, Bruce Richardson, Pallavi Kadam

On Thu, Mar 18, 2021 at 2:01 AM Narcisa Ana Maria Vasile
<navasile@linux.microsoft.com> wrote:
> diff --git a/lib/librte_eal/common/eal_common_thread.c b/lib/librte_eal/common/eal_common_thread.c
> index 73a055902..5219e783e 100644
> --- a/lib/librte_eal/common/eal_common_thread.c
> +++ b/lib/librte_eal/common/eal_common_thread.c
> @@ -84,7 +84,7 @@ thread_update_affinity(rte_cpuset_t *cpusetp)
>  }
>
>  int
> -rte_thread_set_affinity(rte_cpuset_t *cpusetp)
> +rte_thread_self_set_affinity(rte_cpuset_t *cpusetp)
>  {
>         if (pthread_setaffinity_np(pthread_self(), sizeof(rte_cpuset_t),
>                         cpusetp) != 0) {

[snip]

> diff --git a/lib/librte_eal/include/rte_thread.h b/lib/librte_eal/include/rte_thread.h
> index e640ea185..66b112bc4 100644
> --- a/lib/librte_eal/include/rte_thread.h
> +++ b/lib/librte_eal/include/rte_thread.h

[snip]

> +/**
> + * Set the affinity of thread 'thread_id' to the cpu set
> + * specified by 'cpuset'.
> + *
> + * @param thread_id
> + *    Id of the thread for which to set the affinity.
> + *
> + * @param cpuset_size
> + *
> + * @param cpuset
> + *   Pointer to CPU affinity to set.
> + *
> + * @return
> + *   On success, return 0.
> + *   On failure, return nonzero.
> + */
> +__rte_experimental
> +int rte_thread_set_affinity(rte_thread_t thread_id, size_t cpuset_size,
> +                           const rte_cpuset_t *cpuset);
> +

[snip]

> @@ -34,7 +353,7 @@ typedef struct eal_tls_key *rte_tls_key;
>   * @return
>   *   On success, return 0; otherwise return -1;
>   */
> -int rte_thread_set_affinity(rte_cpuset_t *cpusetp);
> +int rte_thread_self_set_affinity(rte_cpuset_t *cpusetp);
>
>  /**
>   * Get core affinity of the current thread.

rte_thread_*et_affinity() are stable.
This breaks the ABI (which is bad) and this API change was not
announced previously.

The ABI check will catch it for you if you stop at this patch (the
patch 3 actually makes the check go silent because of a wrong
version.map update with duplicate symbols).

$ DPDK_ABI_REF_VERSION=v21.02 ./devtools/test-meson-builds.sh
...
[2502/2502] Linking target drivers/librte_event_octeontx2.so.21.2
Error: ABI issue reported for 'abidiff --suppr
/home/dmarchan/dpdk/devtools/../devtools/libabigail.abignore
--no-added-syms --headers-dir1
/home/dmarchan/abi/v21.02/build-gcc-shared/usr/local/include
--headers-dir2 /home/dmarchan/builds/build-gcc-shared/install/usr/local/include
/home/dmarchan/abi/v21.02/build-gcc-shared/dump/librte_eal.dump
/home/dmarchan/builds/build-gcc-shared/install/dump/librte_eal.dump'
ABIDIFF_ABI_CHANGE, this change requires a review (abidiff flagged
this as a potential issue).
ABIDIFF_ABI_INCOMPATIBLE_CHANGE, this change breaks the ABI.

$ abidiff --suppr
/home/dmarchan/dpdk/devtools/../devtools/libabigail.abignore
--no-added-syms --headers-dir1
/home/dmarchan/abi/v21.02/build-gcc-shared/usr/local/include
--headers-dir2 /home/dmarchan/builds/build-gcc-shared/install/usr/local/include
/home/dmarchan/abi/v21.02/build-gcc-shared/dump/librte_eal.dump
/home/dmarchan/builds/build-gcc-shared/install/dump/librte_eal.dump
Functions changes summary: 2 Removed, 0 Changed, 0 Added (6 filtered
out) functions
Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
Variable symbols changes summary: 0 Removed, 0 Added variable symbol
not referenced by debug info

2 Removed functions:

  [D] 'function void rte_thread_get_affinity(rte_cpuset_t*)'
{rte_thread_get_affinity@@DPDK_21}
  [D] 'function int rte_thread_set_affinity(rte_cpuset_t*)'
{rte_thread_set_affinity@@DPDK_21}


-- 
David Marchand


^ permalink raw reply	[relevance 5%]

* Re: [dpdk-dev] [PATCH] eal: fix version macro
  2021-03-18 14:41  0%       ` Thomas Monjalon
@ 2021-03-18 15:45  0%         ` Bruce Richardson
  0 siblings, 0 replies; 200+ results
From: Bruce Richardson @ 2021-03-18 15:45 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: David Marchand, dev, dpdk stable

On Thu, Mar 18, 2021 at 03:41:35PM +0100, Thomas Monjalon wrote:
> 18/03/2021 13:28, Bruce Richardson:
> > On Wed, Mar 17, 2021 at 11:01:25AM +0100, Thomas Monjalon wrote:
> > > 17/03/2021 10:48, David Marchand:
> > > > On Wed, Mar 17, 2021 at 10:31 AM Thomas Monjalon <thomas@monjalon.net> wrote:
> > > > >
> > > > > The macro RTE_VERSION is broken since updated with function calls.
> > > > > It is a build-time version number, and must be built with macros.
> > > > > For a run-time version number, there is the function rte_version().
> > > > >
> > > > > Fixes: 5b637a848195 ("eal: fix querying DPDK version at runtime")
> > > > > Cc: stable@dpdk.org
> > > > >
> > > > > Reported-by: David Marchand <david.marchand@redhat.com>
> > > > > Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> > > > > ---
> > > > >  lib/librte_eal/include/rte_version.h | 8 ++++----
> > > > >  1 file changed, 4 insertions(+), 4 deletions(-)
> > > > >
> > > > > diff --git a/lib/librte_eal/include/rte_version.h b/lib/librte_eal/include/rte_version.h
> > > > > index 2f3f727b46..736c5703be 100644
> > > > > --- a/lib/librte_eal/include/rte_version.h
> > > > > +++ b/lib/librte_eal/include/rte_version.h
> > > > > @@ -28,10 +28,10 @@ extern "C" {
> > > > >   * All version numbers in one to compare with RTE_VERSION_NUM()
> > > > >   */
> > > > >  #define RTE_VERSION RTE_VERSION_NUM( \
> > > > > -                       rte_version_year(), \
> > > > > -                       rte_version_month(), \
> > > > > -                       rte_version_minor(), \
> > > > > -                       rte_version_release())
> > > > > +                       RTE_VER_YEAR, \
> > > > > +                       RTE_VER_MONTH, \
> > > > > +                       RTE_VER_MINOR, \
> > > > > +                       RTE_VER_RELEASE)
> > > > >
> > > > >  /**
> > > > >   * Function to return DPDK version prefix string
> > > > 
> > > > The original patch wanted to fix rte_version() at runtime.
> > > > I don't see the need to keep the rte_version_XXX exports now that
> > > > RTE_VERSION is reverted.
> > > 
> > > I think it may help to query the version numbers at runtime,
> > > in "if" condition. Is there another way I'm missing?
> > > We may argue that the runtime version number should not be used
> > > to decide how to behave in an application.
> > > 
> > I would also tend toward keeping them, for the same reason that runtime is
> > definitely to be preferred over build time, and they are not like to be
> > much of a maintenance burden.
> > 
> > Also, next time we have an ABI break, I wonder if the existing macros
> > should be renamed to have an RTE_BUILD_VER_ prefix, to make it clear that
> > it's the build version only that is being reported rather than the version
> > actually being used. Similarly the functions could be renamed to have
> > rte_runtime_ prefix, ensuring that in all cases the user is clear whether
> > they are getting the build version or the runtime version.
> 
> I am fine with such rename,
> but that's already quite clear that a macro is at build time,
> and a function is usually evaluated at runtime.
> 

If we take the existing rte_version function, without checking the source
code, one has no way of checking if that is resolved at runtime (as it is
now) or at compile-time (as it was). However, if we assume that that is a
bug and that all such functions should be run-time operations, then
there is no difficulty.

/Bruce

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] eal: fix version macro
  2021-03-18 12:28  3%     ` Bruce Richardson
@ 2021-03-18 14:41  0%       ` Thomas Monjalon
  2021-03-18 15:45  0%         ` Bruce Richardson
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2021-03-18 14:41 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: David Marchand, dev, dpdk stable

18/03/2021 13:28, Bruce Richardson:
> On Wed, Mar 17, 2021 at 11:01:25AM +0100, Thomas Monjalon wrote:
> > 17/03/2021 10:48, David Marchand:
> > > On Wed, Mar 17, 2021 at 10:31 AM Thomas Monjalon <thomas@monjalon.net> wrote:
> > > >
> > > > The macro RTE_VERSION is broken since updated with function calls.
> > > > It is a build-time version number, and must be built with macros.
> > > > For a run-time version number, there is the function rte_version().
> > > >
> > > > Fixes: 5b637a848195 ("eal: fix querying DPDK version at runtime")
> > > > Cc: stable@dpdk.org
> > > >
> > > > Reported-by: David Marchand <david.marchand@redhat.com>
> > > > Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> > > > ---
> > > >  lib/librte_eal/include/rte_version.h | 8 ++++----
> > > >  1 file changed, 4 insertions(+), 4 deletions(-)
> > > >
> > > > diff --git a/lib/librte_eal/include/rte_version.h b/lib/librte_eal/include/rte_version.h
> > > > index 2f3f727b46..736c5703be 100644
> > > > --- a/lib/librte_eal/include/rte_version.h
> > > > +++ b/lib/librte_eal/include/rte_version.h
> > > > @@ -28,10 +28,10 @@ extern "C" {
> > > >   * All version numbers in one to compare with RTE_VERSION_NUM()
> > > >   */
> > > >  #define RTE_VERSION RTE_VERSION_NUM( \
> > > > -                       rte_version_year(), \
> > > > -                       rte_version_month(), \
> > > > -                       rte_version_minor(), \
> > > > -                       rte_version_release())
> > > > +                       RTE_VER_YEAR, \
> > > > +                       RTE_VER_MONTH, \
> > > > +                       RTE_VER_MINOR, \
> > > > +                       RTE_VER_RELEASE)
> > > >
> > > >  /**
> > > >   * Function to return DPDK version prefix string
> > > 
> > > The original patch wanted to fix rte_version() at runtime.
> > > I don't see the need to keep the rte_version_XXX exports now that
> > > RTE_VERSION is reverted.
> > 
> > I think it may help to query the version numbers at runtime,
> > in "if" condition. Is there another way I'm missing?
> > We may argue that the runtime version number should not be used
> > to decide how to behave in an application.
> > 
> I would also tend toward keeping them, for the same reason that runtime is
> definitely to be preferred over build time, and they are not like to be
> much of a maintenance burden.
> 
> Also, next time we have an ABI break, I wonder if the existing macros
> should be renamed to have an RTE_BUILD_VER_ prefix, to make it clear that
> it's the build version only that is being reported rather than the version
> actually being used. Similarly the functions could be renamed to have
> rte_runtime_ prefix, ensuring that in all cases the user is clear whether
> they are getting the build version or the runtime version.

I am fine with such rename,
but that's already quite clear that a macro is at build time,
and a function is usually evaluated at runtime.



^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] eal: mark version parts API as experimental
  2021-03-17 15:15  3% [dpdk-dev] [PATCH] eal: mark version parts API as experimental Thomas Monjalon
@ 2021-03-18 12:29  0% ` Bruce Richardson
  2021-03-19 15:21  0%   ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Bruce Richardson @ 2021-03-18 12:29 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev, stable, David Marchand, Ray Kinsella, Neil Horman

On Wed, Mar 17, 2021 at 04:15:35PM +0100, Thomas Monjalon wrote:
> Some functions were introduced in DPDK 21.05 to query the version parts
> (prefix, year, month, minor, suffix, release) at runtime.
> Per guidelines, these new public functions must be marked with
> __rte_experimental and ABI versioned as EXPERIMENTAL.
> 
> Fixes: 5b637a848195 ("eal: fix querying DPDK version at runtime")
> Cc: stable@dpdk.org
> 
> Suggested-by: David Marchand <david.marchand@redhat.com>
> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> ---
Acked-by: Bruce Richardson <bruce.richardson@intel.com>

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] eal: fix version macro
  @ 2021-03-18 12:28  3%     ` Bruce Richardson
  2021-03-18 14:41  0%       ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Bruce Richardson @ 2021-03-18 12:28 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: David Marchand, dev, dpdk stable

On Wed, Mar 17, 2021 at 11:01:25AM +0100, Thomas Monjalon wrote:
> 17/03/2021 10:48, David Marchand:
> > On Wed, Mar 17, 2021 at 10:31 AM Thomas Monjalon <thomas@monjalon.net> wrote:
> > >
> > > The macro RTE_VERSION is broken since updated with function calls.
> > > It is a build-time version number, and must be built with macros.
> > > For a run-time version number, there is the function rte_version().
> > >
> > > Fixes: 5b637a848195 ("eal: fix querying DPDK version at runtime")
> > > Cc: stable@dpdk.org
> > >
> > > Reported-by: David Marchand <david.marchand@redhat.com>
> > > Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> > > ---
> > >  lib/librte_eal/include/rte_version.h | 8 ++++----
> > >  1 file changed, 4 insertions(+), 4 deletions(-)
> > >
> > > diff --git a/lib/librte_eal/include/rte_version.h b/lib/librte_eal/include/rte_version.h
> > > index 2f3f727b46..736c5703be 100644
> > > --- a/lib/librte_eal/include/rte_version.h
> > > +++ b/lib/librte_eal/include/rte_version.h
> > > @@ -28,10 +28,10 @@ extern "C" {
> > >   * All version numbers in one to compare with RTE_VERSION_NUM()
> > >   */
> > >  #define RTE_VERSION RTE_VERSION_NUM( \
> > > -                       rte_version_year(), \
> > > -                       rte_version_month(), \
> > > -                       rte_version_minor(), \
> > > -                       rte_version_release())
> > > +                       RTE_VER_YEAR, \
> > > +                       RTE_VER_MONTH, \
> > > +                       RTE_VER_MINOR, \
> > > +                       RTE_VER_RELEASE)
> > >
> > >  /**
> > >   * Function to return DPDK version prefix string
> > 
> > The original patch wanted to fix rte_version() at runtime.
> > I don't see the need to keep the rte_version_XXX exports now that
> > RTE_VERSION is reverted.
> 
> I think it may help to query the version numbers at runtime,
> in "if" condition. Is there another way I'm missing?
> We may argue that the runtime version number should not be used
> to decide how to behave in an application.
> 
I would also tend toward keeping them, for the same reason that runtime is
definitely to be preferred over build time, and they are not like to be
much of a maintenance burden.

Also, next time we have an ABI break, I wonder if the existing macros
should be renamed to have an RTE_BUILD_VER_ prefix, to make it clear that
it's the build version only that is being reported rather than the version
actually being used. Similarly the functions could be renamed to have
rte_runtime_ prefix, ensuring that in all cases the user is clear whether
they are getting the build version or the runtime version.

/Bruce

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information
@ 2021-03-18 12:25 13% Lijun Ou
  2021-03-22  9:22  3% ` Ferruh Yigit
  2021-03-25 11:09 13% ` [dpdk-dev] [PATCH V2] " Lijun Ou
  0 siblings, 2 replies; 200+ results
From: Lijun Ou @ 2021-03-18 12:25 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev, linuxarm

Currently, upper-layer application could get queue state only
through pointers such as dev->data->tx_queue_state[queue_id],
this is not the recommended way to access it. So this patch
add get queue state when call rte_eth_rx_queue_info_get and
rte_eth_tx_queue_info_get API.

Note: The hairpin queue is not supported with above
rte_eth_*x_queue_info_get, so the queue state could be
RTE_ETH_QUEUE_STATE_STARTED or RTE_ETH_QUEUE_STATE_STOPPED.
Note: After add queue_state field, the 'struct rte_eth_rxq_info' size
remains 128B, and the 'struct rte_eth_txq_info' size remains 64B, so
it could be ABI compatible.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
Signed-off-by: Lijun Ou <oulijun@huawei.com>
---
 doc/guides/rel_notes/release_21_05.rst | 6 ++++++
 lib/librte_ethdev/rte_ethdev.c         | 3 +++
 lib/librte_ethdev/rte_ethdev.h         | 4 ++++
 3 files changed, 13 insertions(+)

diff --git a/doc/guides/rel_notes/release_21_05.rst b/doc/guides/rel_notes/release_21_05.rst
index 43063e3..165b5f7 100644
--- a/doc/guides/rel_notes/release_21_05.rst
+++ b/doc/guides/rel_notes/release_21_05.rst
@@ -156,6 +156,12 @@ ABI Changes
 
 * No ABI change that would break compatibility with 20.11.
 
+* Added new field ``queue_state`` to ``rte_eth_rxq_info`` structure
+  to provide indicated rxq queue state.
+
+* Added new field ``queue_state`` to ``rte_eth_txq_info`` structure
+  to provide indicated txq queue state.
+
 
 Known Issues
 ------------
diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
index 3059aa5..fbd10b2 100644
--- a/lib/librte_ethdev/rte_ethdev.c
+++ b/lib/librte_ethdev/rte_ethdev.c
@@ -5042,6 +5042,8 @@ rte_eth_rx_queue_info_get(uint16_t port_id, uint16_t queue_id,
 
 	memset(qinfo, 0, sizeof(*qinfo));
 	dev->dev_ops->rxq_info_get(dev, queue_id, qinfo);
+	qinfo->queue_state = dev->data->rx_queue_state[queue_id];
+
 	return 0;
 }
 
@@ -5082,6 +5084,7 @@ rte_eth_tx_queue_info_get(uint16_t port_id, uint16_t queue_id,
 
 	memset(qinfo, 0, sizeof(*qinfo));
 	dev->dev_ops->txq_info_get(dev, queue_id, qinfo);
+	qinfo->queue_state = dev->data->tx_queue_state[queue_id];
 
 	return 0;
 }
diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
index efda313..3b83c5a 100644
--- a/lib/librte_ethdev/rte_ethdev.h
+++ b/lib/librte_ethdev/rte_ethdev.h
@@ -1591,6 +1591,8 @@ struct rte_eth_rxq_info {
 	uint8_t scattered_rx;       /**< scattered packets RX supported. */
 	uint16_t nb_desc;           /**< configured number of RXDs. */
 	uint16_t rx_buf_size;       /**< hardware receive buffer size. */
+	/**< Queues state: STARTED(1) / STOPPED(0). */
+	uint8_t queue_state;
 } __rte_cache_min_aligned;
 
 /**
@@ -1600,6 +1602,8 @@ struct rte_eth_rxq_info {
 struct rte_eth_txq_info {
 	struct rte_eth_txconf conf; /**< queue config parameters. */
 	uint16_t nb_desc;           /**< configured number of TXDs. */
+	/**< Queues state: STARTED(1) / STOPPED(0). */
+	uint8_t queue_state;
 } __rte_cache_min_aligned;
 
 /* Generic Burst mode flag definition, values can be ORed. */
-- 
2.7.4


^ permalink raw reply	[relevance 13%]

* Re: [dpdk-dev] [PATCH v2] bus/pci: fix Windows kernel driver categories
  2021-03-18 10:48  3% ` [dpdk-dev] [PATCH v2] " Thomas Monjalon
@ 2021-03-18 12:00  0%   ` Tal Shnaiderman
  2021-03-18 22:07  0%   ` Ranjit Menon
  1 sibling, 0 replies; 200+ results
From: Tal Shnaiderman @ 2021-03-18 12:00 UTC (permalink / raw)
  To: NBU-Contact-Thomas Monjalon, dev
  Cc: dmitry.kozliuk, stable, Ranjit Menon, Narcisa Vasile,
	Pallavi Kadam, John Alexander

> Subject: [PATCH v2] bus/pci: fix Windows kernel driver categories
> 
> In Windows probing, the value RTE_PCI_KDRV_NONE was used instead of
> RTE_PCI_KDRV_UNKNOWN.
> This value covers the mlx case where the kernel driver is in place, offering a
> bifurcated mode to the userspace driver.
> When the kernel driver is listed as unknown, there is no special treatment in
> DPDK probing, contrary to UIO modes.
> 
> The value RTE_PCI_KDRV_NIC_UIO (FreeBSD) was re-used instead of having
> a new RTE_PCI_KDRV_NET_UIO for Windows NetUIO.
> While adding the new value RTE_PCI_KDRV_NET_UIO (at the end for ABI
> compatibility), the enum of kernel driver categories is annotated.
> 
> Fixes: b762221ac24f ("bus/pci: support Windows with bifurcated drivers")
> Fixes: c76ec01b4591 ("bus/pci: support netuio on Windows")
> Cc: stable@dpdk.org
> 
> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> Acked-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
> ---
> v2: improve comments and commit message
> ---
>  drivers/bus/pci/rte_bus_pci.h | 13 +++++++------
> drivers/bus/pci/windows/pci.c | 14 +++++++-------
>  2 files changed, 14 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/bus/pci/rte_bus_pci.h b/drivers/bus/pci/rte_bus_pci.h
> index fdda046515..876abddefb 100644
> --- a/drivers/bus/pci/rte_bus_pci.h
> +++ b/drivers/bus/pci/rte_bus_pci.h
> @@ -52,12 +52,13 @@ TAILQ_HEAD(rte_pci_driver_list, rte_pci_driver);
> struct rte_devargs;
> 
>  enum rte_pci_kernel_driver {
> -	RTE_PCI_KDRV_UNKNOWN = 0,
> -	RTE_PCI_KDRV_IGB_UIO,
> -	RTE_PCI_KDRV_VFIO,
> -	RTE_PCI_KDRV_UIO_GENERIC,
> -	RTE_PCI_KDRV_NIC_UIO,
> -	RTE_PCI_KDRV_NONE,
> +	RTE_PCI_KDRV_UNKNOWN = 0,  /* may be misc UIO or bifurcated
> driver */
> +	RTE_PCI_KDRV_IGB_UIO,      /* igb_uio for Linux */
> +	RTE_PCI_KDRV_VFIO,         /* VFIO for Linux */
> +	RTE_PCI_KDRV_UIO_GENERIC,  /* uio_pci_generic for Linux */
> +	RTE_PCI_KDRV_NIC_UIO,      /* nic_uio for FreeBSD */
> +	RTE_PCI_KDRV_NONE,         /* no attached driver */
> +	RTE_PCI_KDRV_NET_UIO,      /* NetUIO for Windows */
>  };
> 
>  /**
> diff --git a/drivers/bus/pci/windows/pci.c b/drivers/bus/pci/windows/pci.c
> index 8f906097f4..d39a7748b8 100644
> --- a/drivers/bus/pci/windows/pci.c
> +++ b/drivers/bus/pci/windows/pci.c
> @@ -38,7 +38,7 @@ rte_pci_map_device(struct rte_pci_device *dev)
>  	 * Devices that are bound to netuio are mapped at
>  	 * the bus probing stage.
>  	 */
> -	if (dev->kdrv == RTE_PCI_KDRV_NIC_UIO)
> +	if (dev->kdrv == RTE_PCI_KDRV_NET_UIO)
>  		return 0;
>  	else
>  		return -1;
> @@ -207,14 +207,14 @@ get_device_resource_info(HDEVINFO dev_info,
>  	int ret;
> 
>  	switch (dev->kdrv) {
> -	case RTE_PCI_KDRV_NONE:
> -		/* mem_resource - Unneeded for RTE_PCI_KDRV_NONE */
> +	case RTE_PCI_KDRV_UNKNOWN:
> +		/* bifurcated driver case - mem_resource is unneeded */
>  		dev->mem_resource[0].phys_addr = 0;
>  		dev->mem_resource[0].len = 0;
>  		dev->mem_resource[0].addr = NULL;
>  		break;
> -	case RTE_PCI_KDRV_NIC_UIO:
> -		/* get device info from netuio kernel driver */
> +	case RTE_PCI_KDRV_NET_UIO:
> +		/* get device info from NetUIO kernel driver */
>  		ret = get_netuio_device_info(dev_info, dev_info_data,
> dev);
>  		if (ret != 0) {
>  			RTE_LOG(DEBUG, EAL,
> @@ -323,9 +323,9 @@ set_kernel_driver_type(PSP_DEVINFO_DATA
> device_info_data,  {
>  	/* set kernel driver type based on device class */
>  	if (IsEqualGUID(&(device_info_data->ClassGuid),
> &GUID_DEVCLASS_NETUIO))
> -		dev->kdrv = RTE_PCI_KDRV_NIC_UIO;
> +		dev->kdrv = RTE_PCI_KDRV_NET_UIO;
>  	else
> -		dev->kdrv = RTE_PCI_KDRV_NONE;
> +		dev->kdrv = RTE_PCI_KDRV_UNKNOWN;
>  }
> 
>  static int
> --
> 2.30.1

Acked-by: Tal Shnaiderman <talshn@nvidia.com>

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v2] bus/pci: fix Windows kernel driver categories
    @ 2021-03-18 10:48  3% ` Thomas Monjalon
  2021-03-18 12:00  0%   ` Tal Shnaiderman
  2021-03-18 22:07  0%   ` Ranjit Menon
  1 sibling, 2 replies; 200+ results
From: Thomas Monjalon @ 2021-03-18 10:48 UTC (permalink / raw)
  To: dev
  Cc: dmitry.kozliuk, stable, Tal Shnaiderman, Ranjit Menon,
	Narcisa Vasile, Pallavi Kadam, John Alexander

In Windows probing, the value RTE_PCI_KDRV_NONE was used
instead of RTE_PCI_KDRV_UNKNOWN.
This value covers the mlx case where the kernel driver is in place,
offering a bifurcated mode to the userspace driver.
When the kernel driver is listed as unknown,
there is no special treatment in DPDK probing, contrary to UIO modes.

The value RTE_PCI_KDRV_NIC_UIO (FreeBSD) was re-used
instead of having a new RTE_PCI_KDRV_NET_UIO for Windows NetUIO.
While adding the new value RTE_PCI_KDRV_NET_UIO
(at the end for ABI compatibility),
the enum of kernel driver categories is annotated.

Fixes: b762221ac24f ("bus/pci: support Windows with bifurcated drivers")
Fixes: c76ec01b4591 ("bus/pci: support netuio on Windows")
Cc: stable@dpdk.org

Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
Acked-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
---
v2: improve comments and commit message
---
 drivers/bus/pci/rte_bus_pci.h | 13 +++++++------
 drivers/bus/pci/windows/pci.c | 14 +++++++-------
 2 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/drivers/bus/pci/rte_bus_pci.h b/drivers/bus/pci/rte_bus_pci.h
index fdda046515..876abddefb 100644
--- a/drivers/bus/pci/rte_bus_pci.h
+++ b/drivers/bus/pci/rte_bus_pci.h
@@ -52,12 +52,13 @@ TAILQ_HEAD(rte_pci_driver_list, rte_pci_driver);
 struct rte_devargs;
 
 enum rte_pci_kernel_driver {
-	RTE_PCI_KDRV_UNKNOWN = 0,
-	RTE_PCI_KDRV_IGB_UIO,
-	RTE_PCI_KDRV_VFIO,
-	RTE_PCI_KDRV_UIO_GENERIC,
-	RTE_PCI_KDRV_NIC_UIO,
-	RTE_PCI_KDRV_NONE,
+	RTE_PCI_KDRV_UNKNOWN = 0,  /* may be misc UIO or bifurcated driver */
+	RTE_PCI_KDRV_IGB_UIO,      /* igb_uio for Linux */
+	RTE_PCI_KDRV_VFIO,         /* VFIO for Linux */
+	RTE_PCI_KDRV_UIO_GENERIC,  /* uio_pci_generic for Linux */
+	RTE_PCI_KDRV_NIC_UIO,      /* nic_uio for FreeBSD */
+	RTE_PCI_KDRV_NONE,         /* no attached driver */
+	RTE_PCI_KDRV_NET_UIO,      /* NetUIO for Windows */
 };
 
 /**
diff --git a/drivers/bus/pci/windows/pci.c b/drivers/bus/pci/windows/pci.c
index 8f906097f4..d39a7748b8 100644
--- a/drivers/bus/pci/windows/pci.c
+++ b/drivers/bus/pci/windows/pci.c
@@ -38,7 +38,7 @@ rte_pci_map_device(struct rte_pci_device *dev)
 	 * Devices that are bound to netuio are mapped at
 	 * the bus probing stage.
 	 */
-	if (dev->kdrv == RTE_PCI_KDRV_NIC_UIO)
+	if (dev->kdrv == RTE_PCI_KDRV_NET_UIO)
 		return 0;
 	else
 		return -1;
@@ -207,14 +207,14 @@ get_device_resource_info(HDEVINFO dev_info,
 	int ret;
 
 	switch (dev->kdrv) {
-	case RTE_PCI_KDRV_NONE:
-		/* mem_resource - Unneeded for RTE_PCI_KDRV_NONE */
+	case RTE_PCI_KDRV_UNKNOWN:
+		/* bifurcated driver case - mem_resource is unneeded */
 		dev->mem_resource[0].phys_addr = 0;
 		dev->mem_resource[0].len = 0;
 		dev->mem_resource[0].addr = NULL;
 		break;
-	case RTE_PCI_KDRV_NIC_UIO:
-		/* get device info from netuio kernel driver */
+	case RTE_PCI_KDRV_NET_UIO:
+		/* get device info from NetUIO kernel driver */
 		ret = get_netuio_device_info(dev_info, dev_info_data, dev);
 		if (ret != 0) {
 			RTE_LOG(DEBUG, EAL,
@@ -323,9 +323,9 @@ set_kernel_driver_type(PSP_DEVINFO_DATA device_info_data,
 {
 	/* set kernel driver type based on device class */
 	if (IsEqualGUID(&(device_info_data->ClassGuid), &GUID_DEVCLASS_NETUIO))
-		dev->kdrv = RTE_PCI_KDRV_NIC_UIO;
+		dev->kdrv = RTE_PCI_KDRV_NET_UIO;
 	else
-		dev->kdrv = RTE_PCI_KDRV_NONE;
+		dev->kdrv = RTE_PCI_KDRV_UNKNOWN;
 }
 
 static int
-- 
2.30.1


^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v2 2/5] devargs: refactor scratch buffer storage
  @ 2021-03-18  9:14  3%   ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2021-03-18  9:14 UTC (permalink / raw)
  To: Xueming Li
  Cc: Ferruh Yigit, Andrew Rybchenko, Olivier Matz, dev,
	Viacheslav Ovsiienko, Asaf Penso, david.marchand,
	bruce.richardson

18/01/2021 16:16, Xueming Li:
> In current design, legacy parser rte_devargs_parse() saved scratch
> buffer to devargs.args while new parser rte_devargs_layers_parse() saved
> to devargs.data. Code using devargs had to know the difference and
> cleaned up memory accordingly - error prone.
> 
> This patch unifies data the dedicate scratch buffer, introduces
> rte_devargs_free() function to wrap the memory memory clean up.
> 
> Signed-off-by: Xueming Li <xuemingl@nvidia.com>
> ---
> --- a/lib/librte_eal/include/rte_devargs.h
> +++ b/lib/librte_eal/include/rte_devargs.h
> @@ -60,16 +60,16 @@ struct rte_devargs {
>  	/** Name of the device. */
>  	char name[RTE_DEV_NAME_MAX_LEN];
>  	RTE_STD_C11
> -	union {
> -	/** Arguments string as given by user or "" for no argument. */
> -		char *args;
> +	union { /**< driver-related part of device string. */
> +		const char *args; /**< legacy name. */
>  		const char *drv_str;
>  	};
>  	struct rte_bus *bus; /**< bus handle. */
>  	struct rte_class *cls; /**< class handle. */
>  	const char *bus_str; /**< bus-related part of device string. */
>  	const char *cls_str; /**< class-related part of device string. */
> -	const char *data; /**< Device string storage. */
> +	char *data; /**< Scratch buffer. */
> +	const char *src; /**< Arguments given by user. */

Adding a field changes the size of the struct, which is an ABI break.
We need to plan this change for DPDK 21.11.
Let's think what can be done in the meantime.



^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH] bus/pci: fix Windows kernel driver categories
  @ 2021-03-18  7:49  3%   ` Thomas Monjalon
  2021-03-18 22:00  0%     ` Ranjit Menon
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2021-03-18  7:49 UTC (permalink / raw)
  To: Ranjit Menon
  Cc: dev, dmitry.kozliuk, stable, Tal Shnaiderman, Narcisa Vasile,
	John Alexander, Pallavi Kadam, matan, viacheslavo

18/03/2021 00:17, Ranjit Menon:
> Hi Thomas,
> 
> On 3/16/2021 4:11 PM, Thomas Monjalon wrote:
> > In Windows probing, the value RTE_PCI_KDRV_NONE was used
> > instead of RTE_PCI_KDRV_UNKNOWN (mlx case),
> > and RTE_PCI_KDRV_NIC_UIO (FreeBSD) was re-used
> > instead of having a new RTE_PCI_KDRV_NET_UIO for Windows NetUIO.
> Shouldn't the mlx case actually remain RTE_PCI_KDRV_NONE?
> 
> mlx does not require a UIO-like kernel driver...No? And NONE implies that no kernel driver is used/required.
> Not sure what is correct here.

No this is a bifurcated model, meaning kernel and userland
work together. The PCI device is bound to the kernel driver,
but the driver is not listed because no special treatment is required.

> > While adding the new value RTE_PCI_KDRV_NET_UIO,
> > the enum of kernel driver categories is annotated.
> >
> > Fixes: b762221ac24f ("bus/pci: support Windows with bifurcated drivers")
> > Fixes: c76ec01b4591 ("bus/pci: support netuio on Windows")
> > Cc: stable@dpdk.org
> >
> > Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> > ---
> >   drivers/bus/pci/rte_bus_pci.h | 13 +++++++------
> >   drivers/bus/pci/windows/pci.c | 14 +++++++-------
> >   2 files changed, 14 insertions(+), 13 deletions(-)
> >
> > diff --git a/drivers/bus/pci/rte_bus_pci.h b/drivers/bus/pci/rte_bus_pci.h
> > index fdda046515..3d009cc74b 100644
> > --- a/drivers/bus/pci/rte_bus_pci.h
> > +++ b/drivers/bus/pci/rte_bus_pci.h
> > @@ -52,12 +52,13 @@ TAILQ_HEAD(rte_pci_driver_list, rte_pci_driver);
> >   struct rte_devargs;
> >   
> >   enum rte_pci_kernel_driver {
> > -	RTE_PCI_KDRV_UNKNOWN = 0,
> > -	RTE_PCI_KDRV_IGB_UIO,
> > -	RTE_PCI_KDRV_VFIO,
> > -	RTE_PCI_KDRV_UIO_GENERIC,
> > -	RTE_PCI_KDRV_NIC_UIO,
> > -	RTE_PCI_KDRV_NONE,
> > +	RTE_PCI_KDRV_UNKNOWN = 0,  /* not listed - may be a bifurcated driver */
> > +	RTE_PCI_KDRV_IGB_UIO,      /* igb_uio for Linux */
> > +	RTE_PCI_KDRV_VFIO,         /* VFIO for Linux */
> > +	RTE_PCI_KDRV_UIO_GENERIC,  /* uio_generic for Linux */
> > +	RTE_PCI_KDRV_NIC_UIO,      /* nic_uio for FreeBSD */
> > +	RTE_PCI_KDRV_NONE,         /* error */
> > +	RTE_PCI_KDRV_NET_UIO,      /* NetUIO for Windows */
> >   };
> >   
> 
> Any chance we can re-order the enums, so that _NONE and _UNKNOWN are at 
> the top?

No, it would break the ABI.

> This will change the value, and break code where this value was 
> hard-coded. But how likely is that...?

The problem is when loading the new PCI bus driver with an old device driver.




^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH] eal: mark version parts API as experimental
@ 2021-03-17 15:15  3% Thomas Monjalon
  2021-03-18 12:29  0% ` Bruce Richardson
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2021-03-17 15:15 UTC (permalink / raw)
  To: dev; +Cc: stable, David Marchand, Ray Kinsella, Neil Horman, Bruce Richardson

Some functions were introduced in DPDK 21.05 to query the version parts
(prefix, year, month, minor, suffix, release) at runtime.
Per guidelines, these new public functions must be marked with
__rte_experimental and ABI versioned as EXPERIMENTAL.

Fixes: 5b637a848195 ("eal: fix querying DPDK version at runtime")
Cc: stable@dpdk.org

Suggested-by: David Marchand <david.marchand@redhat.com>
Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
---
 lib/librte_eal/include/rte_version.h |  7 +++++++
 lib/librte_eal/version.map           | 14 ++++++++------
 2 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/lib/librte_eal/include/rte_version.h b/lib/librte_eal/include/rte_version.h
index 736c5703be..b06a62e7a2 100644
--- a/lib/librte_eal/include/rte_version.h
+++ b/lib/librte_eal/include/rte_version.h
@@ -18,6 +18,7 @@ extern "C" {
 #include <string.h>
 #include <stdio.h>
 #include <rte_common.h>
+#include <rte_compat.h>
 
 /**
  * Macro to compute a version number usable for comparisons
@@ -36,31 +37,37 @@ extern "C" {
 /**
  * Function to return DPDK version prefix string
  */
+__rte_experimental
 const char *rte_version_prefix(void);
 
 /**
  * Function to return DPDK version year
  */
+__rte_experimental
 unsigned int rte_version_year(void);
 
 /**
  * Function to return DPDK version month
  */
+__rte_experimental
 unsigned int rte_version_month(void);
 
 /**
  * Function to return DPDK minor version number
  */
+__rte_experimental
 unsigned int rte_version_minor(void);
 
 /**
  * Function to return DPDK version suffix for any release candidates
  */
+__rte_experimental
 const char *rte_version_suffix(void);
 
 /**
  * Function to return DPDK version release candidate value
  */
+__rte_experimental
 unsigned int rte_version_release(void);
 
 /**
diff --git a/lib/librte_eal/version.map b/lib/librte_eal/version.map
index 756c60ed1d..48a2b55d57 100644
--- a/lib/librte_eal/version.map
+++ b/lib/librte_eal/version.map
@@ -200,12 +200,6 @@ DPDK_21 {
 	rte_uuid_parse;
 	rte_uuid_unparse;
 	rte_version;
-	rte_version_minor;
-	rte_version_month;
-	rte_version_prefix;
-	rte_version_release;
-	rte_version_suffix;
-	rte_version_year;
 	rte_vfio_clear_group;
 	rte_vfio_container_create;
 	rte_vfio_container_destroy;
@@ -419,6 +413,14 @@ EXPERIMENTAL {
 	rte_thread_tls_key_delete;
 	rte_thread_tls_value_get;
 	rte_thread_tls_value_set;
+
+	# added in 21.05
+	rte_version_minor;
+	rte_version_month;
+	rte_version_prefix;
+	rte_version_release;
+	rte_version_suffix;
+	rte_version_year;
 };
 
 INTERNAL {
-- 
2.30.1


^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v3 0/8] Introduce event vectorization
  2021-03-16 15:48  4% ` [dpdk-dev] [PATCH v2 0/8] " pbhagavatula
@ 2021-03-16 20:01  4%   ` pbhagavatula
  2021-03-19 20:57  4%     ` [dpdk-dev] [PATCH v4 " pbhagavatula
  0 siblings, 1 reply; 200+ results
From: pbhagavatula @ 2021-03-16 20:01 UTC (permalink / raw)
  To: jerinj, jay.jayatheerthan, erik.g.carrillo, abhinandan.gujjar,
	timothy.mcdaniel, hemant.agrawal, harry.van.haaren,
	mattias.ronnblom, liang.j.ma
  Cc: dev, Pavan Nikhilesh

From: Pavan Nikhilesh <pbhagavatula@marvell.com>

In traditional event programming model, events are identified by a
flow-id and a uintptr_t. The flow-id uniquely identifies a given event
and determines the order of scheduling based on schedule type, the
uintptr_t holds a single object.

Event devices also support burst mode with configurable dequeue depth,
i.e. each dequeue call would return multiple events and each event
might be at a different stage of the pipeline.
Having a burst of events belonging to different stages in a dequeue
burst is not only difficult to vectorize but also increases the scheduler
overhead and application overhead of pipelining events further.
Using event vectors we see a performance gain of ~628% as shown in [1].

By introducing event vectorization, each event will be capable of holding
multiple uintptr_t of the same flow thereby allowing applications
to vectorize their pipeline and reduce the complexity of pipelining
events across multiple stages. This also reduces the complexity of handling
enqueue and dequeue on an event device.

Since event devices are transparent to the events they are scheduling
so the event producers such as eth_rx_adapter, crypto_adapter , etc..
are responsible for vectorizing the buffers of the same flow into a single
event.

The series also breaks ABI in the patch [8/8] which is targetted to the
v21.11 release.

The dpdk-test-eventdev application has been updated with options to test
multiple vector sizes and timeouts.

[1]
As for performance improvement, with a ARM Cortex-A72 equivalent processer,
software event device (--vdev=event_sw0), single worker core, single stage
and using one service core for Rx adapter, Tx adapter, Scheduling.

Without event vectorization:
    ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
         --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
         --stlist=a --wlcores=20
    Port[0] using Rx adapter[0] configured
    Port[0] using Tx adapter[0] Configured
    4.728 mpps avg 4.728 mpps

With event vectorization:
    ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
        --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
        --stlist=a --wlcores=20 --enable_vector --nb_eth_queues 1
        --vector_size 256
    Port[0] using Rx adapter[0] configured
    Port[0] using Tx adapter[0] Configured
    34.383 mpps avg 34.383 mpps

Having dedicated service cores for each Rx queues and tweaking the vector,
dequeue burst size would further improve performance.

API usage is shown below:

Configuration:

	struct rte_event_eth_rx_adapter_event_vector_config vec_conf;

	vector_pool = rte_event_vector_pool_create("vector_pool",
			nb_elem, 0, vector_size, socket_id);

	rte_event_eth_rx_adapter_create(id, event_id, &adptr_conf);
	rte_event_eth_rx_adapter_queue_add(id, eth_id, -1, &queue_conf);
	if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR) {
		vec_conf.vector_sz = vector_size;
		vec_conf.vector_timeout_ns = vector_tmo_nsec;
		vec_conf.vector_mp = vector_pool;
		rte_event_eth_rx_adapter_queue_event_vector_config(id,
				eth_id, -1, &vec_conf);
	}

Fastpath:

	num = rte_event_dequeue_burst(event_id, port_id, &ev, 1, 0);
	if (!num)
		continue;

	if (ev.event_type & RTE_EVENT_TYPE_VECTOR) {
		switch (ev.event_type) {
		case RTE_EVENT_TYPE_ETHDEV_VECTOR:
		case RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR:
			struct rte_mbuf **mbufs;

			mbufs = ev.vector_ev->mbufs;
			for (i = 0; i < ev.vector_ev->nb_elem; i++)
				//Process mbufs.
			break;
		case ...
		}
	}
	...

v3 Changes:
- Fix unintended formatting changes.

v2 Changes:
- Multiple gramatical and style fixes.(Jerin)
- Add parameter to define vector size in power of 2. (Jerin)
- Redo patch series w/o breaking ABI till the last patch.(David)
- Add deprication notice to announce ABI break in 21.11.(David)
- Add vector limits validation to app/test-eventdev.

Pavan Nikhilesh (8):
  eventdev: introduce event vector capability
  eventdev: introduce event vector Rx capability
  eventdev: introduce event vector Tx capability
  eventdev: add Rx adapter event vector support
  eventdev: add Tx adapter event vector support
  app/eventdev: add event vector mode in pipeline test
  doc: announce event Rx adapter config changes
  eventdev: simplify Rx adapter event vector config

 app/test-eventdev/evt_common.h                |   4 +
 app/test-eventdev/evt_options.c               |  52 +++
 app/test-eventdev/evt_options.h               |   4 +
 app/test-eventdev/test_pipeline_atq.c         | 310 +++++++++++++++--
 app/test-eventdev/test_pipeline_common.c      | 105 +++++-
 app/test-eventdev/test_pipeline_common.h      |  18 +
 app/test-eventdev/test_pipeline_queue.c       | 320 ++++++++++++++++--
 .../prog_guide/event_ethernet_rx_adapter.rst  |  38 +++
 .../prog_guide/event_ethernet_tx_adapter.rst  |  12 +
 doc/guides/prog_guide/eventdev.rst            |  36 +-
 doc/guides/rel_notes/deprecation.rst          |   9 +
 doc/guides/tools/testeventdev.rst             |  28 ++
 lib/librte_eventdev/eventdev_pmd.h            |  31 +-
 .../rte_event_eth_rx_adapter.c                | 305 ++++++++++++++++-
 .../rte_event_eth_rx_adapter.h                |  68 ++++
 .../rte_event_eth_tx_adapter.c                |  66 +++-
 lib/librte_eventdev/rte_eventdev.c            |  11 +-
 lib/librte_eventdev/rte_eventdev.h            | 142 +++++++-
 lib/librte_eventdev/version.map               |   4 +
 19 files changed, 1477 insertions(+), 86 deletions(-)

--
2.17.1


^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v2 0/8] Introduce event vectorization
  2021-02-20 22:09  3% [dpdk-dev] [PATCH 0/7] Introduce event vectorization pbhagavatula
  2021-02-20 22:09  5% ` [dpdk-dev] [PATCH 7/7] eventdev: fix ABI breakage due to event vector pbhagavatula
  2021-03-08 16:41  0% ` [dpdk-dev] [PATCH 0/7] Introduce event vectorization Jerin Jacob
@ 2021-03-16 15:48  4% ` pbhagavatula
  2021-03-16 20:01  4%   ` [dpdk-dev] [PATCH v3 " pbhagavatula
  2 siblings, 1 reply; 200+ results
From: pbhagavatula @ 2021-03-16 15:48 UTC (permalink / raw)
  To: jerinj, jay.jayatheerthan, erik.g.carrillo, abhinandan.gujjar,
	timothy.mcdaniel, hemant.agrawal, harry.van.haaren,
	mattias.ronnblom, liang.j.ma
  Cc: dev, Pavan Nikhilesh

From: Pavan Nikhilesh <pbhagavatula@marvell.com>

In traditional event programming model, events are identified by a
flow-id and a uintptr_t. The flow-id uniquely identifies a given event
and determines the order of scheduling based on schedule type, the
uintptr_t holds a single object.

Event devices also support burst mode with configurable dequeue depth,
i.e. each dequeue call would return multiple events and each event
might be at a different stage of the pipeline.
Having a burst of events belonging to different stages in a dequeue
burst is not only difficult to vectorize but also increases the scheduler
overhead and application overhead of pipelining events further.
Using event vectors we see a performance gain of ~628% as shown in [1].

By introducing event vectorization, each event will be capable of holding
multiple uintptr_t of the same flow thereby allowing applications
to vectorize their pipeline and reduce the complexity of pipelining
events across multiple stages. This also reduces the complexity of handling
enqueue and dequeue on an event device.

Since event devices are transparent to the events they are scheduling
so the event producers such as eth_rx_adapter, crypto_adapter , etc..
are responsible for vectorizing the buffers of the same flow into a single
event.

The series also breaks ABI in the patch [8/8] which is targetted to the
v21.11 release.

The dpdk-test-eventdev application has been updated with options to test
multiple vector sizes and timeouts.

[1]
As for performance improvement, with a ARM Cortex-A72 equivalent processer,
software event device (--vdev=event_sw0), single worker core, single stage
and using one service core for Rx adapter, Tx adapter, Scheduling.

Without event vectorization:
    ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
         --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
         --stlist=a --wlcores=20
    Port[0] using Rx adapter[0] configured
    Port[0] using Tx adapter[0] Configured
    4.728 mpps avg 4.728 mpps

With event vectorization:
    ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
        --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
        --stlist=a --wlcores=20 --enable_vector --nb_eth_queues 1
        --vector_size 256
    Port[0] using Rx adapter[0] configured
    Port[0] using Tx adapter[0] Configured
    34.383 mpps avg 34.383 mpps

Having dedicated service cores for each Rx queues and tweaking the vector,
dequeue burst size would further improve performance.

API usage is shown below:

Configuration:

	struct rte_event_eth_rx_adapter_event_vector_config vec_conf;

	vector_pool = rte_event_vector_pool_create("vector_pool",
			nb_elem, 0, vector_size, socket_id);

	rte_event_eth_rx_adapter_create(id, event_id, &adptr_conf);
	rte_event_eth_rx_adapter_queue_add(id, eth_id, -1, &queue_conf);
	if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR) {
		vec_conf.vector_sz = vector_size;
		vec_conf.vector_timeout_ns = vector_tmo_nsec;
		vec_conf.vector_mp = vector_pool;
		rte_event_eth_rx_adapter_queue_event_vector_config(id,
				eth_id, -1, &vec_conf);
	}

Fastpath:

	num = rte_event_dequeue_burst(event_id, port_id, &ev, 1, 0);
	if (!num)
		continue;

	if (ev.event_type & RTE_EVENT_TYPE_VECTOR) {
		switch (ev.event_type) {
		case RTE_EVENT_TYPE_ETHDEV_VECTOR:
		case RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR:
			struct rte_mbuf **mbufs;

			mbufs = ev.vector_ev->mbufs;
			for (i = 0; i < ev.vector_ev->nb_elem; i++)
				//Process mbufs.
			break;
		case ...
		}
	}
	...

v2 Changes:
- Multiple gramatical and style fixes.(Jerin)
- Add parameter to define vector size in power of 2. (Jerin)
- Redo patch series w/o breaking ABI till the last patch.(David)
- Add deprication notice to announce ABI break in 21.11.(David)
- Add vector limits validation to app/test-eventdev.

Pavan Nikhilesh (8):
  eventdev: introduce event vector capability
  eventdev: introduce event vector Rx capability
  eventdev: introduce event vector Tx capability
  eventdev: add Rx adapter event vector support
  eventdev: add Tx adapter event vector support
  app/eventdev: add event vector mode in pipeline test
  doc: announce event Rx adapter config changes
  eventdev: simplify Rx adapter event vector config

 app/test-eventdev/evt_common.h                |   4 +
 app/test-eventdev/evt_options.c               |  52 +++
 app/test-eventdev/evt_options.h               |   4 +
 app/test-eventdev/test_pipeline_atq.c         | 310 ++++++++++++-
 app/test-eventdev/test_pipeline_common.c      |  69 ++-
 app/test-eventdev/test_pipeline_common.h      |  18 +
 app/test-eventdev/test_pipeline_queue.c       | 320 ++++++++++++-
 .../prog_guide/event_ethernet_rx_adapter.rst  |  38 ++
 .../prog_guide/event_ethernet_tx_adapter.rst  |  12 +
 doc/guides/prog_guide/eventdev.rst            |  36 +-
 doc/guides/rel_notes/deprecation.rst          |   9 +
 doc/guides/tools/testeventdev.rst             |  28 ++
 lib/librte_eventdev/eventdev_pmd.h            |  31 +-
 .../rte_event_eth_rx_adapter.c                | 305 ++++++++++++-
 .../rte_event_eth_rx_adapter.h                |  68 +++
 .../rte_event_eth_tx_adapter.c                |  66 ++-
 lib/librte_eventdev/rte_eventdev.c            |  11 +-
 lib/librte_eventdev/rte_eventdev.h            | 428 +++++++++++-------
 lib/librte_eventdev/version.map               |   4 +
 19 files changed, 1568 insertions(+), 245 deletions(-)

--
2.17.1


^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v6 2/2] eal: rename key opaque pointer and functions in TLS API
  2021-03-16 13:28  3% ` [dpdk-dev] [PATCH v6 0/2] EAL Thread TLS API enhancements Tal Shnaiderman
@ 2021-03-16 13:28  3%   ` Tal Shnaiderman
  2021-03-26  8:24  0%   ` [dpdk-dev] [PATCH v6 0/2] EAL Thread TLS API enhancements Thomas Monjalon
  1 sibling, 0 replies; 200+ results
From: Tal Shnaiderman @ 2021-03-16 13:28 UTC (permalink / raw)
  To: dev
  Cc: thomas, pallavi.kadam, dmitry.kozliuk, navasile, dmitrym,
	david.marchand, anatoly.burakov, vladimir.medvedkin, mb

rename the key opaque pointer from rte_tls_key to
rte_thread_key to avoid confusion with transport layer security.

Also rename and remove the "_tls" term from the following
functions to avoid redundancy:

rte_thread_tls_key_create
rte_thread_tls_key_delete
rte_thread_tls_value_set
rte_thread_tls_value_get

Suggested-by: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
Suggested-by: Morten Brørup <mb@smartsharesystems.com>
Signed-off-by: Tal Shnaiderman <talshn@nvidia.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
---
 doc/guides/rel_notes/release_21_05.rst  |  4 ++++
 drivers/net/mlx5/linux/mlx5_flow_os.c   | 10 +++++-----
 drivers/net/mlx5/windows/mlx5_flow_os.c | 12 ++++++------
 lib/librte_eal/include/rte_thread.h     | 19 ++++++++++---------
 lib/librte_eal/rte_eal_exports.def      |  8 ++++----
 lib/librte_eal/unix/rte_thread.c        |  8 ++++----
 lib/librte_eal/version.map              |  8 ++++----
 lib/librte_eal/windows/rte_thread.c     |  8 ++++----
 8 files changed, 41 insertions(+), 36 deletions(-)

diff --git a/doc/guides/rel_notes/release_21_05.rst b/doc/guides/rel_notes/release_21_05.rst
index 21dc6d2342..4ab5404794 100644
--- a/doc/guides/rel_notes/release_21_05.rst
+++ b/doc/guides/rel_notes/release_21_05.rst
@@ -112,6 +112,10 @@ API Changes
    Also, make sure to start the actual text at the margin.
    =======================================================
 
+* eal: The experimental TLS API added in ``rte_thread.h`` has been renamed
+  from ``rte_thread_tls_*`` to ``rte_thread_*`` to avoid naming redundancy
+  and confusion with the transport layer security term.
+
 
 ABI Changes
 -----------
diff --git a/drivers/net/mlx5/linux/mlx5_flow_os.c b/drivers/net/mlx5/linux/mlx5_flow_os.c
index 732b1b2dd8..893f00b824 100644
--- a/drivers/net/mlx5/linux/mlx5_flow_os.c
+++ b/drivers/net/mlx5/linux/mlx5_flow_os.c
@@ -7,12 +7,12 @@
 #include <rte_thread.h>
 
 /* Key of thread specific flow workspace data. */
-static rte_tls_key key_workspace;
+static rte_thread_key key_workspace;
 
 int
 mlx5_flow_os_init_workspace_once(void)
 {
-	if (rte_thread_tls_key_create(&key_workspace, flow_release_workspace)) {
+	if (rte_thread_key_create(&key_workspace, flow_release_workspace)) {
 		DRV_LOG(ERR, "Can't create flow workspace data thread key.");
 		return -ENOMEM;
 	}
@@ -22,17 +22,17 @@ mlx5_flow_os_init_workspace_once(void)
 void *
 mlx5_flow_os_get_specific_workspace(void)
 {
-	return rte_thread_tls_value_get(key_workspace);
+	return rte_thread_value_get(key_workspace);
 }
 
 int
 mlx5_flow_os_set_specific_workspace(struct mlx5_flow_workspace *data)
 {
-	return rte_thread_tls_value_set(key_workspace, data);
+	return rte_thread_value_set(key_workspace, data);
 }
 
 void
 mlx5_flow_os_release_workspace(void)
 {
-	rte_thread_tls_key_delete(key_workspace);
+	rte_thread_key_delete(key_workspace);
 }
diff --git a/drivers/net/mlx5/windows/mlx5_flow_os.c b/drivers/net/mlx5/windows/mlx5_flow_os.c
index 2cc02df322..c4d5790726 100644
--- a/drivers/net/mlx5/windows/mlx5_flow_os.c
+++ b/drivers/net/mlx5/windows/mlx5_flow_os.c
@@ -252,7 +252,7 @@ struct mlx5_workspace_thread {
  */
 static struct mlx5_workspace_thread *curr;
 static struct mlx5_workspace_thread *first;
-rte_tls_key ws_tls_index;
+rte_thread_key ws_tls_index;
 static pthread_mutex_t lock_thread_list;
 
 static bool
@@ -329,7 +329,7 @@ mlx5_flow_os_release_workspace(void)
 		flow_release_workspace(first->mlx5_ws);
 		free(first);
 	}
-	rte_thread_tls_key_delete(ws_tls_index);
+	rte_thread_key_delete(ws_tls_index);
 	pthread_mutex_destroy(&lock_thread_list);
 }
 
@@ -368,7 +368,7 @@ mlx5_add_workspace_to_list(struct mlx5_flow_workspace *data)
 int
 mlx5_flow_os_init_workspace_once(void)
 {
-	int err = rte_thread_tls_key_create(&ws_tls_index, NULL);
+	int err = rte_thread_key_create(&ws_tls_index, NULL);
 
 	if (err) {
 		DRV_LOG(ERR, "Can't create flow workspace data thread key.");
@@ -381,7 +381,7 @@ mlx5_flow_os_init_workspace_once(void)
 void *
 mlx5_flow_os_get_specific_workspace(void)
 {
-	return rte_thread_tls_value_get(ws_tls_index);
+	return rte_thread_value_get(ws_tls_index);
 }
 
 int
@@ -391,7 +391,7 @@ mlx5_flow_os_set_specific_workspace(struct mlx5_flow_workspace *data)
 	int old_err = rte_errno;
 
 	rte_errno = 0;
-	if (!rte_thread_tls_value_get(ws_tls_index)) {
+	if (!rte_thread_value_get(ws_tls_index)) {
 		if (rte_errno) {
 			DRV_LOG(ERR, "Failed checking specific workspace.");
 			rte_errno = old_err;
@@ -409,7 +409,7 @@ mlx5_flow_os_set_specific_workspace(struct mlx5_flow_workspace *data)
 			return -1;
 		}
 	}
-	if (rte_thread_tls_value_set(ws_tls_index, data)) {
+	if (rte_thread_value_set(ws_tls_index, data)) {
 		DRV_LOG(ERR, "Failed setting specific workspace.");
 		err = -1;
 	}
diff --git a/lib/librte_eal/include/rte_thread.h b/lib/librte_eal/include/rte_thread.h
index c77ad6d7c4..a75476edcc 100644
--- a/lib/librte_eal/include/rte_thread.h
+++ b/lib/librte_eal/include/rte_thread.h
@@ -23,7 +23,7 @@ extern "C" {
 /**
  * TLS key type, an opaque pointer.
  */
-typedef struct eal_tls_key *rte_tls_key;
+typedef struct eal_tls_key *rte_thread_key;
 
 /**
  * Set core affinity of the current thread.
@@ -65,13 +65,14 @@ void rte_thread_get_affinity(rte_cpuset_t *cpusetp);
  */
 
 __rte_experimental
-int rte_thread_tls_key_create(rte_tls_key *key, void (*destructor)(void *));
+int rte_thread_key_create(rte_thread_key *key,
+			void (*destructor)(void *));
 
 /**
  * Delete a TLS data key visible to all threads in the process.
  *
  * @param key
- *   The key allocated by rte_thread_tls_key_create().
+ *   The key allocated by rte_thread_key_create().
  *
  * @return
  *   On success, zero.
@@ -80,15 +81,15 @@ int rte_thread_tls_key_create(rte_tls_key *key, void (*destructor)(void *));
  *                     ENOEXEC - Specific OS error.
  */
 __rte_experimental
-int rte_thread_tls_key_delete(rte_tls_key key);
+int rte_thread_key_delete(rte_thread_key key);
 
 /**
  * Set value bound to the TLS key on behalf of the calling thread.
  *
  * @param key
- *   The key allocated by rte_thread_tls_key_create().
+ *   The key allocated by rte_thread_key_create().
  * @param value
- *   The value bound to the rte_tls_key key for the calling thread.
+ *   The value bound to the rte_thread_key key for the calling thread.
  *
  * @return
  *   On success, zero.
@@ -97,13 +98,13 @@ int rte_thread_tls_key_delete(rte_tls_key key);
  *                     ENOEXEC - Specific OS error.
  */
 __rte_experimental
-int rte_thread_tls_value_set(rte_tls_key key, const void *value);
+int rte_thread_value_set(rte_thread_key key, const void *value);
 
 /**
  * Get value bound to the TLS key on behalf of the calling thread.
  *
  * @param key
- *   The key allocated by rte_thread_tls_key_create().
+ *   The key allocated by rte_thread_key_create().
  *
  * @return
  *   On success, value data pointer (can also be NULL).
@@ -112,7 +113,7 @@ int rte_thread_tls_value_set(rte_tls_key key, const void *value);
  *                     ENOEXEC - Specific OS error.
  */
 __rte_experimental
-void *rte_thread_tls_value_get(rte_tls_key key);
+void *rte_thread_value_get(rte_thread_key key);
 
 #ifdef __cplusplus
 }
diff --git a/lib/librte_eal/rte_eal_exports.def b/lib/librte_eal/rte_eal_exports.def
index 474cf123fa..c320077547 100644
--- a/lib/librte_eal/rte_eal_exports.def
+++ b/lib/librte_eal/rte_eal_exports.def
@@ -325,10 +325,10 @@ EXPORTS
 	rte_vect_get_max_simd_bitwidth
 	rte_vect_set_max_simd_bitwidth
 
-	rte_thread_tls_key_create
-	rte_thread_tls_key_delete
-	rte_thread_tls_value_get
-	rte_thread_tls_value_set
+	rte_thread_key_create
+	rte_thread_key_delete
+	rte_thread_value_get
+	rte_thread_value_set
 
 	rte_mem_lock
 	rte_mem_map
diff --git a/lib/librte_eal/unix/rte_thread.c b/lib/librte_eal/unix/rte_thread.c
index b187c69a4c..c72d619ec1 100644
--- a/lib/librte_eal/unix/rte_thread.c
+++ b/lib/librte_eal/unix/rte_thread.c
@@ -17,7 +17,7 @@ struct eal_tls_key {
 };
 
 int
-rte_thread_tls_key_create(rte_tls_key *key, void (*destructor)(void *))
+rte_thread_key_create(rte_thread_key *key, void (*destructor)(void *))
 {
 	int err;
 
@@ -39,7 +39,7 @@ rte_thread_tls_key_create(rte_tls_key *key, void (*destructor)(void *))
 }
 
 int
-rte_thread_tls_key_delete(rte_tls_key key)
+rte_thread_key_delete(rte_thread_key key)
 {
 	int err;
 
@@ -61,7 +61,7 @@ rte_thread_tls_key_delete(rte_tls_key key)
 }
 
 int
-rte_thread_tls_value_set(rte_tls_key key, const void *value)
+rte_thread_value_set(rte_thread_key key, const void *value)
 {
 	int err;
 
@@ -81,7 +81,7 @@ rte_thread_tls_value_set(rte_tls_key key, const void *value)
 }
 
 void *
-rte_thread_tls_value_get(rte_tls_key key)
+rte_thread_value_get(rte_thread_key key)
 {
 	if (!key) {
 		RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n");
diff --git a/lib/librte_eal/version.map b/lib/librte_eal/version.map
index fce90a112f..c07aab176c 100644
--- a/lib/librte_eal/version.map
+++ b/lib/librte_eal/version.map
@@ -408,10 +408,10 @@ EXPERIMENTAL {
 	rte_power_monitor;
 	rte_power_monitor_wakeup;
 	rte_power_pause;
-	rte_thread_tls_key_create;
-	rte_thread_tls_key_delete;
-	rte_thread_tls_value_get;
-	rte_thread_tls_value_set;
+	rte_thread_key_create;
+	rte_thread_key_delete;
+	rte_thread_value_get;
+	rte_thread_value_set;
 };
 
 INTERNAL {
diff --git a/lib/librte_eal/windows/rte_thread.c b/lib/librte_eal/windows/rte_thread.c
index fa9e360855..667287c387 100644
--- a/lib/librte_eal/windows/rte_thread.c
+++ b/lib/librte_eal/windows/rte_thread.c
@@ -12,7 +12,7 @@ struct eal_tls_key {
 };
 
 int
-rte_thread_tls_key_create(rte_tls_key *key,
+rte_thread_key_create(rte_thread_key *key,
 		__rte_unused void (*destructor)(void *))
 {
 	*key = malloc(sizeof(**key));
@@ -32,7 +32,7 @@ rte_thread_tls_key_create(rte_tls_key *key,
 }
 
 int
-rte_thread_tls_key_delete(rte_tls_key key)
+rte_thread_key_delete(rte_thread_key key)
 {
 	if (!key) {
 		RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n");
@@ -50,7 +50,7 @@ rte_thread_tls_key_delete(rte_tls_key key)
 }
 
 int
-rte_thread_tls_value_set(rte_tls_key key, const void *value)
+rte_thread_value_set(rte_thread_key key, const void *value)
 {
 	char *p;
 
@@ -70,7 +70,7 @@ rte_thread_tls_value_set(rte_tls_key key, const void *value)
 }
 
 void *
-rte_thread_tls_value_get(rte_tls_key key)
+rte_thread_value_get(rte_thread_key key)
 {
 	void *output;
 
-- 
2.16.1.windows.4


^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v6 0/2] EAL Thread TLS API enhancements
  @ 2021-03-16 13:28  3% ` Tal Shnaiderman
  2021-03-16 13:28  3%   ` [dpdk-dev] [PATCH v6 2/2] eal: rename key opaque pointer and functions in TLS API Tal Shnaiderman
  2021-03-26  8:24  0%   ` [dpdk-dev] [PATCH v6 0/2] EAL Thread TLS API enhancements Thomas Monjalon
  0 siblings, 2 replies; 200+ results
From: Tal Shnaiderman @ 2021-03-16 13:28 UTC (permalink / raw)
  To: dev
  Cc: thomas, pallavi.kadam, dmitry.kozliuk, navasile, dmitrym,
	david.marchand, anatoly.burakov, vladimir.medvedkin, mb

---
v6: fix misalignment in comment fix from v5 and missing NL in RN [Thomas]
v5: shorten docu comment on rte_errno and add ABI change info to release note [Thomas]
v4: replace errno EOTHER with ENOEXEC as EOTHER is undefined in unix.
v3: -Unify rte_errno values to a generic errno for OS compatibility [DmitryK]
	-Rename the TLS function to avoid redundancy[MortenB].
v2: Rename key to avoid redundancy[MortenB].
---

Tal Shnaiderman (2):
  eal: error number enhancement for thread TLS API
  eal: rename key opaque pointer and functions in TLS API

 doc/guides/rel_notes/release_21_05.rst  |  4 ++++
 drivers/net/mlx5/linux/mlx5_flow_os.c   | 10 +++++-----
 drivers/net/mlx5/windows/mlx5_flow_os.c | 12 ++++++------
 lib/librte_eal/include/rte_thread.h     | 33 +++++++++++++++++++++------------
 lib/librte_eal/rte_eal_exports.def      |  8 ++++----
 lib/librte_eal/unix/rte_thread.c        | 14 ++++++++++----
 lib/librte_eal/version.map              |  8 ++++----
 lib/librte_eal/windows/rte_thread.c     | 14 ++++++++++----
 8 files changed, 64 insertions(+), 39 deletions(-)

-- 
2.16.1.windows.4


^ permalink raw reply	[relevance 3%]

* [dpdk-dev] cryptodev: change raw data path dequeue API
@ 2021-03-16 11:14  9% Fan Zhang
  2021-03-31 17:20  4% ` [dpdk-dev] [dpdk-dev v2] " Fan Zhang
  0 siblings, 1 reply; 200+ results
From: Fan Zhang @ 2021-03-16 11:14 UTC (permalink / raw)
  To: dev; +Cc: gakhil, Fan Zhang

This patch changes the experimental raw data path dequeue burst API.
Originally the API enforces the user to provide callback function
to get maximum dequeue count. This change gives the user one more
option to pass directly the expected dequeue count.

Signed-off-by: Fan Zhang <roy.fan.zhang@intel.com>
---
 app/test/test_cryptodev.c              | 8 +-------
 doc/guides/rel_notes/release_21_05.rst | 2 ++
 drivers/crypto/qat/qat_sym_hw_dp.c     | 4 +++-
 lib/librte_cryptodev/rte_cryptodev.c   | 5 +++--
 lib/librte_cryptodev/rte_cryptodev.h   | 8 ++++++++
 5 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/app/test/test_cryptodev.c b/app/test/test_cryptodev.c
index f91debc16..a91054742 100644
--- a/app/test/test_cryptodev.c
+++ b/app/test/test_cryptodev.c
@@ -162,12 +162,6 @@ ceil_byte_length(uint32_t num_bits)
 		return (num_bits >> 3);
 }
 
-static uint32_t
-get_raw_dp_dequeue_count(void *user_data __rte_unused)
-{
-	return 1;
-}
-
 static void
 post_process_raw_dp_op(void *user_data,	uint32_t index __rte_unused,
 		uint8_t is_op_success)
@@ -345,7 +339,7 @@ process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,
 	n = n_success = 0;
 	while (count++ < MAX_RAW_DEQUEUE_COUNT && n == 0) {
 		n = rte_cryptodev_raw_dequeue_burst(ctx,
-			get_raw_dp_dequeue_count, post_process_raw_dp_op,
+			NULL, 1, post_process_raw_dp_op,
 				(void **)&ret_op, 0, &n_success,
 				&dequeue_status);
 		if (dequeue_status < 0) {
diff --git a/doc/guides/rel_notes/release_21_05.rst b/doc/guides/rel_notes/release_21_05.rst
index 21dc6d234..b9ca0cc30 100644
--- a/doc/guides/rel_notes/release_21_05.rst
+++ b/doc/guides/rel_notes/release_21_05.rst
@@ -130,6 +130,8 @@ ABI Changes
 
 * No ABI change that would break compatibility with 20.11.
 
+* cryptodev: the function ``rte_cryptodev_raw_dequeue_burst`` is added a
+  parameter ``max_nb_to_dequeue`` to give user a more flexible dequeue control.
 
 Known Issues
 ------------
diff --git a/drivers/crypto/qat/qat_sym_hw_dp.c b/drivers/crypto/qat/qat_sym_hw_dp.c
index 01afb883e..e075f3ec2 100644
--- a/drivers/crypto/qat/qat_sym_hw_dp.c
+++ b/drivers/crypto/qat/qat_sym_hw_dp.c
@@ -707,6 +707,7 @@ qat_sym_dp_enqueue_chain_jobs(void *qp_data, uint8_t *drv_ctx,
 static __rte_always_inline uint32_t
 qat_sym_dp_dequeue_burst(void *qp_data, uint8_t *drv_ctx,
 	rte_cryptodev_raw_get_dequeue_count_t get_dequeue_count,
+	uint32_t max_nb_to_dequeue,
 	rte_cryptodev_raw_post_dequeue_t post_dequeue,
 	void **out_user_data, uint8_t is_user_data_array,
 	uint32_t *n_success_jobs, int *return_status)
@@ -736,7 +737,8 @@ qat_sym_dp_dequeue_burst(void *qp_data, uint8_t *drv_ctx,
 
 	resp_opaque = (void *)(uintptr_t)resp->opaque_data;
 	/* get the dequeue count */
-	n = get_dequeue_count(resp_opaque);
+	n = get_dequeue_count != NULL ? get_dequeue_count(resp_opaque) :
+		max_nb_to_dequeue;
 	if (unlikely(n == 0))
 		return 0;
 
diff --git a/lib/librte_cryptodev/rte_cryptodev.c b/lib/librte_cryptodev/rte_cryptodev.c
index 40f55a3cd..0c16b04f8 100644
--- a/lib/librte_cryptodev/rte_cryptodev.c
+++ b/lib/librte_cryptodev/rte_cryptodev.c
@@ -2232,13 +2232,14 @@ rte_cryptodev_raw_enqueue_done(struct rte_crypto_raw_dp_ctx *ctx,
 uint32_t
 rte_cryptodev_raw_dequeue_burst(struct rte_crypto_raw_dp_ctx *ctx,
 	rte_cryptodev_raw_get_dequeue_count_t get_dequeue_count,
+	uint32_t max_nb_to_dequeue,
 	rte_cryptodev_raw_post_dequeue_t post_dequeue,
 	void **out_user_data, uint8_t is_user_data_array,
 	uint32_t *n_success_jobs, int *status)
 {
 	return (*ctx->dequeue_burst)(ctx->qp_data, ctx->drv_ctx_data,
-		get_dequeue_count, post_dequeue, out_user_data,
-		is_user_data_array, n_success_jobs, status);
+		get_dequeue_count, max_nb_to_dequeue, post_dequeue,
+		out_user_data, is_user_data_array, n_success_jobs, status);
 }
 
 int
diff --git a/lib/librte_cryptodev/rte_cryptodev.h b/lib/librte_cryptodev/rte_cryptodev.h
index ae34f33f6..b2a125511 100644
--- a/lib/librte_cryptodev/rte_cryptodev.h
+++ b/lib/librte_cryptodev/rte_cryptodev.h
@@ -1546,6 +1546,9 @@ typedef void (*rte_cryptodev_raw_post_dequeue_t)(void *user_data,
  * @param	drv_ctx			Driver specific context data.
  * @param	get_dequeue_count	User provided callback function to
  *					obtain dequeue operation count.
+ * @param	max_nb_to_dequeue	When get_dequeue_count is NULL this
+ *					value is used to pass the maximum
+ *					number of operations to be dequeued.
  * @param	post_dequeue		User provided callback function to
  *					post-process a dequeued operation.
  * @param	out_user_data		User data pointer array to be retrieve
@@ -1580,6 +1583,7 @@ typedef void (*rte_cryptodev_raw_post_dequeue_t)(void *user_data,
 typedef uint32_t (*cryptodev_sym_raw_dequeue_burst_t)(void *qp,
 	uint8_t *drv_ctx,
 	rte_cryptodev_raw_get_dequeue_count_t get_dequeue_count,
+	uint32_t max_nb_to_dequeue,
 	rte_cryptodev_raw_post_dequeue_t post_dequeue,
 	void **out_user_data, uint8_t is_user_data_array,
 	uint32_t *n_success, int *dequeue_status);
@@ -1747,6 +1751,9 @@ rte_cryptodev_raw_enqueue_done(struct rte_crypto_raw_dp_ctx *ctx,
  *					data.
  * @param	get_dequeue_count	User provided callback function to
  *					obtain dequeue operation count.
+ * @param	max_nb_to_dequeue	When get_dequeue_count is NULL this
+ *					value is used to pass the maximum
+ *					number of operations to be dequeued.
  * @param	post_dequeue		User provided callback function to
  *					post-process a dequeued operation.
  * @param	out_user_data		User data pointer array to be retrieve
@@ -1782,6 +1789,7 @@ __rte_experimental
 uint32_t
 rte_cryptodev_raw_dequeue_burst(struct rte_crypto_raw_dp_ctx *ctx,
 	rte_cryptodev_raw_get_dequeue_count_t get_dequeue_count,
+	uint32_t max_nb_to_dequeue,
 	rte_cryptodev_raw_post_dequeue_t post_dequeue,
 	void **out_user_data, uint8_t is_user_data_array,
 	uint32_t *n_success, int *dequeue_status);
-- 
2.25.1


^ permalink raw reply	[relevance 9%]

* [dpdk-dev] [PATCH v5 0/2] EAL Thread TLS API enhancements
  @ 2021-03-16  9:15  3% ` Tal Shnaiderman
  2021-03-16  9:15  3%   ` [dpdk-dev] [PATCH v5 2/2] eal: rename key opaque pointer and functions in TLS API Tal Shnaiderman
  0 siblings, 1 reply; 200+ results
From: Tal Shnaiderman @ 2021-03-16  9:15 UTC (permalink / raw)
  To: dev
  Cc: thomas, pallavi.kadam, dmitry.kozliuk, navasile, dmitrym,
	david.marchand, anatoly.burakov, vladimir.medvedkin, mb

---
v5: shorten docu comment on rte_errno and add ABI change info to release note [Thomas]
v4: replace errno EOTHER with ENOEXEC as EOTHER is undefined in unix.
v3: -Unify rte_errno values to a generic errno for OS compatibility [DmitryK]
	-Rename the TLS function to avoid redundancy[MortenB].
v2: Rename key to avoid redundancy[MortenB].
---

Tal Shnaiderman (2):
  eal: error number enhancement for thread TLS API
  eal: rename key opaque pointer and functions in TLS API

 doc/guides/rel_notes/release_21_05.rst  |  3 +++
 drivers/net/mlx5/linux/mlx5_flow_os.c   | 10 +++++-----
 drivers/net/mlx5/windows/mlx5_flow_os.c | 12 ++++++------
 lib/librte_eal/include/rte_thread.h     | 33 +++++++++++++++++++++------------
 lib/librte_eal/rte_eal_exports.def      |  8 ++++----
 lib/librte_eal/unix/rte_thread.c        | 14 ++++++++++----
 lib/librte_eal/version.map              |  8 ++++----
 lib/librte_eal/windows/rte_thread.c     | 14 ++++++++++----
 8 files changed, 63 insertions(+), 39 deletions(-)

-- 
2.16.1.windows.4


^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v5 2/2] eal: rename key opaque pointer and functions in TLS API
  2021-03-16  9:15  3% ` [dpdk-dev] [PATCH v5 0/2] EAL Thread TLS API enhancements Tal Shnaiderman
@ 2021-03-16  9:15  3%   ` Tal Shnaiderman
  0 siblings, 0 replies; 200+ results
From: Tal Shnaiderman @ 2021-03-16  9:15 UTC (permalink / raw)
  To: dev
  Cc: thomas, pallavi.kadam, dmitry.kozliuk, navasile, dmitrym,
	david.marchand, anatoly.burakov, vladimir.medvedkin, mb

rename the key opaque pointer from rte_tls_key to
rte_thread_key to avoid confusion with transport layer security.

Also rename and remove the "_tls" term from the following
functions to avoid redundancy:

rte_thread_tls_key_create
rte_thread_tls_key_delete
rte_thread_tls_value_set
rte_thread_tls_value_get

Suggested-by: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
Suggested-by: Morten Brørup <mb@smartsharesystems.com>
Signed-off-by: Tal Shnaiderman <talshn@nvidia.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
---
 doc/guides/rel_notes/release_21_05.rst  |  3 +++
 drivers/net/mlx5/linux/mlx5_flow_os.c   | 10 +++++-----
 drivers/net/mlx5/windows/mlx5_flow_os.c | 12 ++++++------
 lib/librte_eal/include/rte_thread.h     | 19 ++++++++++---------
 lib/librte_eal/rte_eal_exports.def      |  8 ++++----
 lib/librte_eal/unix/rte_thread.c        |  8 ++++----
 lib/librte_eal/version.map              |  8 ++++----
 lib/librte_eal/windows/rte_thread.c     |  8 ++++----
 8 files changed, 40 insertions(+), 36 deletions(-)

diff --git a/doc/guides/rel_notes/release_21_05.rst b/doc/guides/rel_notes/release_21_05.rst
index 21dc6d2342..914b176793 100644
--- a/doc/guides/rel_notes/release_21_05.rst
+++ b/doc/guides/rel_notes/release_21_05.rst
@@ -112,6 +112,9 @@ API Changes
    Also, make sure to start the actual text at the margin.
    =======================================================
 
+* eal: The experimental TLS API added in ``rte_thread.h`` has been renamed
+  from ``rte_thread_tls_*`` to ``rte_thread_*`` to avoid naming redundancy
+  and confusion with the transport layer security term.
 
 ABI Changes
 -----------
diff --git a/drivers/net/mlx5/linux/mlx5_flow_os.c b/drivers/net/mlx5/linux/mlx5_flow_os.c
index 732b1b2dd8..893f00b824 100644
--- a/drivers/net/mlx5/linux/mlx5_flow_os.c
+++ b/drivers/net/mlx5/linux/mlx5_flow_os.c
@@ -7,12 +7,12 @@
 #include <rte_thread.h>
 
 /* Key of thread specific flow workspace data. */
-static rte_tls_key key_workspace;
+static rte_thread_key key_workspace;
 
 int
 mlx5_flow_os_init_workspace_once(void)
 {
-	if (rte_thread_tls_key_create(&key_workspace, flow_release_workspace)) {
+	if (rte_thread_key_create(&key_workspace, flow_release_workspace)) {
 		DRV_LOG(ERR, "Can't create flow workspace data thread key.");
 		return -ENOMEM;
 	}
@@ -22,17 +22,17 @@ mlx5_flow_os_init_workspace_once(void)
 void *
 mlx5_flow_os_get_specific_workspace(void)
 {
-	return rte_thread_tls_value_get(key_workspace);
+	return rte_thread_value_get(key_workspace);
 }
 
 int
 mlx5_flow_os_set_specific_workspace(struct mlx5_flow_workspace *data)
 {
-	return rte_thread_tls_value_set(key_workspace, data);
+	return rte_thread_value_set(key_workspace, data);
 }
 
 void
 mlx5_flow_os_release_workspace(void)
 {
-	rte_thread_tls_key_delete(key_workspace);
+	rte_thread_key_delete(key_workspace);
 }
diff --git a/drivers/net/mlx5/windows/mlx5_flow_os.c b/drivers/net/mlx5/windows/mlx5_flow_os.c
index 2cc02df322..c4d5790726 100644
--- a/drivers/net/mlx5/windows/mlx5_flow_os.c
+++ b/drivers/net/mlx5/windows/mlx5_flow_os.c
@@ -252,7 +252,7 @@ struct mlx5_workspace_thread {
  */
 static struct mlx5_workspace_thread *curr;
 static struct mlx5_workspace_thread *first;
-rte_tls_key ws_tls_index;
+rte_thread_key ws_tls_index;
 static pthread_mutex_t lock_thread_list;
 
 static bool
@@ -329,7 +329,7 @@ mlx5_flow_os_release_workspace(void)
 		flow_release_workspace(first->mlx5_ws);
 		free(first);
 	}
-	rte_thread_tls_key_delete(ws_tls_index);
+	rte_thread_key_delete(ws_tls_index);
 	pthread_mutex_destroy(&lock_thread_list);
 }
 
@@ -368,7 +368,7 @@ mlx5_add_workspace_to_list(struct mlx5_flow_workspace *data)
 int
 mlx5_flow_os_init_workspace_once(void)
 {
-	int err = rte_thread_tls_key_create(&ws_tls_index, NULL);
+	int err = rte_thread_key_create(&ws_tls_index, NULL);
 
 	if (err) {
 		DRV_LOG(ERR, "Can't create flow workspace data thread key.");
@@ -381,7 +381,7 @@ mlx5_flow_os_init_workspace_once(void)
 void *
 mlx5_flow_os_get_specific_workspace(void)
 {
-	return rte_thread_tls_value_get(ws_tls_index);
+	return rte_thread_value_get(ws_tls_index);
 }
 
 int
@@ -391,7 +391,7 @@ mlx5_flow_os_set_specific_workspace(struct mlx5_flow_workspace *data)
 	int old_err = rte_errno;
 
 	rte_errno = 0;
-	if (!rte_thread_tls_value_get(ws_tls_index)) {
+	if (!rte_thread_value_get(ws_tls_index)) {
 		if (rte_errno) {
 			DRV_LOG(ERR, "Failed checking specific workspace.");
 			rte_errno = old_err;
@@ -409,7 +409,7 @@ mlx5_flow_os_set_specific_workspace(struct mlx5_flow_workspace *data)
 			return -1;
 		}
 	}
-	if (rte_thread_tls_value_set(ws_tls_index, data)) {
+	if (rte_thread_value_set(ws_tls_index, data)) {
 		DRV_LOG(ERR, "Failed setting specific workspace.");
 		err = -1;
 	}
diff --git a/lib/librte_eal/include/rte_thread.h b/lib/librte_eal/include/rte_thread.h
index e8f9365953..2d1aaeedf4 100644
--- a/lib/librte_eal/include/rte_thread.h
+++ b/lib/librte_eal/include/rte_thread.h
@@ -23,7 +23,7 @@ extern "C" {
 /**
  * TLS key type, an opaque pointer.
  */
-typedef struct eal_tls_key *rte_tls_key;
+typedef struct eal_tls_key *rte_thread_key;
 
 /**
  * Set core affinity of the current thread.
@@ -65,13 +65,14 @@ void rte_thread_get_affinity(rte_cpuset_t *cpusetp);
  */
 
 __rte_experimental
-int rte_thread_tls_key_create(rte_tls_key *key, void (*destructor)(void *));
+int rte_thread_key_create(rte_thread_key *key,
+			void (*destructor)(void *));
 
 /**
  * Delete a TLS data key visible to all threads in the process.
  *
  * @param key
- *   The key allocated by rte_thread_tls_key_create().
+ *   The key allocated by rte_thread_key_create().
  *
  * @return
  *   On success, zero.
@@ -80,15 +81,15 @@ int rte_thread_tls_key_create(rte_tls_key *key, void (*destructor)(void *));
  *                            ENOEXEC - Specific OS error.
  */
 __rte_experimental
-int rte_thread_tls_key_delete(rte_tls_key key);
+int rte_thread_key_delete(rte_thread_key key);
 
 /**
  * Set value bound to the TLS key on behalf of the calling thread.
  *
  * @param key
- *   The key allocated by rte_thread_tls_key_create().
+ *   The key allocated by rte_thread_key_create().
  * @param value
- *   The value bound to the rte_tls_key key for the calling thread.
+ *   The value bound to the rte_thread_key key for the calling thread.
  *
  * @return
  *   On success, zero.
@@ -97,13 +98,13 @@ int rte_thread_tls_key_delete(rte_tls_key key);
  *                            ENOEXEC - Specific OS error.
  */
 __rte_experimental
-int rte_thread_tls_value_set(rte_tls_key key, const void *value);
+int rte_thread_value_set(rte_thread_key key, const void *value);
 
 /**
  * Get value bound to the TLS key on behalf of the calling thread.
  *
  * @param key
- *   The key allocated by rte_thread_tls_key_create().
+ *   The key allocated by rte_thread_key_create().
  *
  * @return
  *   On success, value data pointer (can also be NULL).
@@ -112,7 +113,7 @@ int rte_thread_tls_value_set(rte_tls_key key, const void *value);
  *                            ENOEXEC - Specific OS error.
  */
 __rte_experimental
-void *rte_thread_tls_value_get(rte_tls_key key);
+void *rte_thread_value_get(rte_thread_key key);
 
 #ifdef __cplusplus
 }
diff --git a/lib/librte_eal/rte_eal_exports.def b/lib/librte_eal/rte_eal_exports.def
index 474cf123fa..c320077547 100644
--- a/lib/librte_eal/rte_eal_exports.def
+++ b/lib/librte_eal/rte_eal_exports.def
@@ -325,10 +325,10 @@ EXPORTS
 	rte_vect_get_max_simd_bitwidth
 	rte_vect_set_max_simd_bitwidth
 
-	rte_thread_tls_key_create
-	rte_thread_tls_key_delete
-	rte_thread_tls_value_get
-	rte_thread_tls_value_set
+	rte_thread_key_create
+	rte_thread_key_delete
+	rte_thread_value_get
+	rte_thread_value_set
 
 	rte_mem_lock
 	rte_mem_map
diff --git a/lib/librte_eal/unix/rte_thread.c b/lib/librte_eal/unix/rte_thread.c
index b187c69a4c..c72d619ec1 100644
--- a/lib/librte_eal/unix/rte_thread.c
+++ b/lib/librte_eal/unix/rte_thread.c
@@ -17,7 +17,7 @@ struct eal_tls_key {
 };
 
 int
-rte_thread_tls_key_create(rte_tls_key *key, void (*destructor)(void *))
+rte_thread_key_create(rte_thread_key *key, void (*destructor)(void *))
 {
 	int err;
 
@@ -39,7 +39,7 @@ rte_thread_tls_key_create(rte_tls_key *key, void (*destructor)(void *))
 }
 
 int
-rte_thread_tls_key_delete(rte_tls_key key)
+rte_thread_key_delete(rte_thread_key key)
 {
 	int err;
 
@@ -61,7 +61,7 @@ rte_thread_tls_key_delete(rte_tls_key key)
 }
 
 int
-rte_thread_tls_value_set(rte_tls_key key, const void *value)
+rte_thread_value_set(rte_thread_key key, const void *value)
 {
 	int err;
 
@@ -81,7 +81,7 @@ rte_thread_tls_value_set(rte_tls_key key, const void *value)
 }
 
 void *
-rte_thread_tls_value_get(rte_tls_key key)
+rte_thread_value_get(rte_thread_key key)
 {
 	if (!key) {
 		RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n");
diff --git a/lib/librte_eal/version.map b/lib/librte_eal/version.map
index fce90a112f..c07aab176c 100644
--- a/lib/librte_eal/version.map
+++ b/lib/librte_eal/version.map
@@ -408,10 +408,10 @@ EXPERIMENTAL {
 	rte_power_monitor;
 	rte_power_monitor_wakeup;
 	rte_power_pause;
-	rte_thread_tls_key_create;
-	rte_thread_tls_key_delete;
-	rte_thread_tls_value_get;
-	rte_thread_tls_value_set;
+	rte_thread_key_create;
+	rte_thread_key_delete;
+	rte_thread_value_get;
+	rte_thread_value_set;
 };
 
 INTERNAL {
diff --git a/lib/librte_eal/windows/rte_thread.c b/lib/librte_eal/windows/rte_thread.c
index fa9e360855..667287c387 100644
--- a/lib/librte_eal/windows/rte_thread.c
+++ b/lib/librte_eal/windows/rte_thread.c
@@ -12,7 +12,7 @@ struct eal_tls_key {
 };
 
 int
-rte_thread_tls_key_create(rte_tls_key *key,
+rte_thread_key_create(rte_thread_key *key,
 		__rte_unused void (*destructor)(void *))
 {
 	*key = malloc(sizeof(**key));
@@ -32,7 +32,7 @@ rte_thread_tls_key_create(rte_tls_key *key,
 }
 
 int
-rte_thread_tls_key_delete(rte_tls_key key)
+rte_thread_key_delete(rte_thread_key key)
 {
 	if (!key) {
 		RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n");
@@ -50,7 +50,7 @@ rte_thread_tls_key_delete(rte_tls_key key)
 }
 
 int
-rte_thread_tls_value_set(rte_tls_key key, const void *value)
+rte_thread_value_set(rte_thread_key key, const void *value)
 {
 	char *p;
 
@@ -70,7 +70,7 @@ rte_thread_tls_value_set(rte_tls_key key, const void *value)
 }
 
 void *
-rte_thread_tls_value_get(rte_tls_key key)
+rte_thread_value_get(rte_thread_key key)
 {
 	void *output;
 
-- 
2.16.1.windows.4


^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [EXT] Re: [PATCH 7/7] eventdev: fix ABI breakage due to event vector
  2021-03-12 14:28  9%     ` David Marchand
@ 2021-03-16  5:54  7%       ` Pavan Nikhilesh Bhagavatula
  0 siblings, 0 replies; 200+ results
From: Pavan Nikhilesh Bhagavatula @ 2021-03-16  5:54 UTC (permalink / raw)
  To: David Marchand, Jerin Jacob
  Cc: Jerin Jacob Kollanukkaran, Jayatheerthan, Jay,
	Erik Gabriel Carrillo, Gujjar, Abhinandan S, McDaniel, Timothy,
	Hemant Agrawal, Van Haaren, Harry, Mattias Rönnblom,
	Liang Ma, Ray Kinsella, Neil Horman, dpdk-dev, Thomas Monjalon

>On Mon, Mar 8, 2021 at 7:44 PM Jerin Jacob <jerinjacobk@gmail.com>
>wrote:
>> Summary:
>> 1)  Ideal way of adding this feature is to add elements in the
>> existing structure as mentioned
>> in  ("eventdev: introduce event vector Rx capability") in this series.
>> 2) Since this breaking ABI, Introducing a new structure to fix this. I
>> think, we can remove this
>> limitation in 21.11 as that time we can change ABI as required.
>>
>> So, Is this patch needs to be squashed to  ("eventdev: introduce event
>> vector Rx capability") to avoid
>> ABI compatibility between patches? Or Is it OK to break the ABI
>> compatibility in a patch in the series
>> and later fix it in the same series?(This is for more readability as
>> we can revert this patch in 21.11).
>
>What matters is not to break compilation between patches, so that
>bisecting is always possible.
>For ABI checks... I don't see the need to enforce such a requirement.
>
>
>Yet, it is more straightforward to not break the 20.11 ABI at all.
>You can announce the intended ABI change in the release notes /
>deprecation notices, not sure I saw it in this series.
>
>If you still want to share the final state intended for v21.11, you
>can send the patch at the end of the series with something in the
>title like "for v21.11" and mark it deferred in patchwork.
>

Ack, I will rework the series without breaking the ABI till the last patch.

Pavan.

>
>--
>David Marchand


^ permalink raw reply	[relevance 7%]

* Re: [dpdk-dev] [PATCH v2] ethdev: introduce enable_driver_sdk to install driver headers
  2021-03-12 22:20  3% ` [dpdk-dev] [PATCH v2] " Tyler Retzlaff
@ 2021-03-15 10:06  0%   ` Bruce Richardson
  2021-03-23 17:04  0%   ` Ferruh Yigit
  1 sibling, 0 replies; 200+ results
From: Bruce Richardson @ 2021-03-15 10:06 UTC (permalink / raw)
  To: Tyler Retzlaff; +Cc: dev, thomas, ferruh.yigit, andrew.rybchenko

On Fri, Mar 12, 2021 at 02:20:06PM -0800, Tyler Retzlaff wrote:
> Introduce a meson option enable_driver_sdk when true installs internal
> driver headers for ethdev. this allows drivers that do not depend on
> stable api/abi to be built external to the dpdk source tree.
> 
> Signed-off-by: Tyler Retzlaff <roretzla@linux.microsoft.com>
> ---
>  lib/librte_ethdev/meson.build | 6 ++++++
>  lib/meson.build               | 4 ++++
>  meson_options.txt             | 2 ++
>  3 files changed, 12 insertions(+)
> 
The infrastructure looks good to me. However, you need to add change to the
cryptodev, eventdev, etc. to add the headers from there too.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 7/7] eventdev: fix ABI breakage due to event vector
  2021-03-08 18:44  9%   ` Jerin Jacob
  2021-03-12 14:28  9%     ` David Marchand
@ 2021-03-15 10:01  7%     ` Kinsella, Ray
  1 sibling, 0 replies; 200+ results
From: Kinsella, Ray @ 2021-03-15 10:01 UTC (permalink / raw)
  To: Jerin Jacob, Pavan Nikhilesh
  Cc: Jerin Jacob, Jayatheerthan, Jay, Erik Gabriel Carrillo, Gujjar,
	Abhinandan S, McDaniel, Timothy, Hemant Agrawal, Van Haaren,
	Harry, Mattias Rönnblom, Liang Ma, Neil Horman, dpdk-dev,
	Thomas Monjalon, David Marchand



On 08/03/2021 18:44, Jerin Jacob wrote:
> On Sun, Feb 21, 2021 at 3:41 AM <pbhagavatula@marvell.com> wrote:
>>
>> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
>>
>> Fix ABI breakage due to event vector configuration by moving
>> the vector configuration into a new structure and having a separate
>> function for enabling the vector config on a given ethernet device and
>> queue pair.
>> This vector config and function can be merged to queue config in
>> v21.11.
>>
>> Fixes: 44c81670cf0a ("eventdev: introduce event vector Rx capability")
> 
> Hi @Ray Kinsella @Neil Horman @Thomas Monjalon @David Marchand
> 
> Is the ABI breakage contract between release to release. Right? i.e it
> is not between each patch. Right?
> 
> Summary:
> 1)  Ideal way of adding this feature is to add elements in the
> existing structure as mentioned
> in  ("eventdev: introduce event vector Rx capability") in this series.
> 2) Since this breaking ABI, Introducing a new structure to fix this. I
> think, we can remove this
> limitation in 21.11 as that time we can change ABI as required.
> 
> So, Is this patch needs to be squashed to  ("eventdev: introduce event
> vector Rx capability") to avoid
> ABI compatibility between patches? Or Is it OK to break the ABI
> compatibility in a patch in the series
> and later fix it in the same series?(This is for more readability as
> we can revert this patch in 21.11).

You are essentially writing it as you want it to appear in 21.11, 
you then add one patch at the end to fix ABI compability until then.
You then only have one patch to revert in the 21.11 cycle. 

Agree with David, I like the approach. 

+1 from me. 

> 
> 
> 
>>
>> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
>> ---
>>  app/test-eventdev/test_pipeline_common.c      |  16 +-
>>  lib/librte_eventdev/eventdev_pmd.h            |  29 +++
>>  .../rte_event_eth_rx_adapter.c                | 168 ++++++++++++------
>>  .../rte_event_eth_rx_adapter.h                |  27 +++
>>  lib/librte_eventdev/version.map               |   1 +
>>  5 files changed, 184 insertions(+), 57 deletions(-)
>>
>> diff --git a/app/test-eventdev/test_pipeline_common.c b/app/test-eventdev/test_pipeline_common.c
>> index 89f73be86..9aeefdd5f 100644
>> --- a/app/test-eventdev/test_pipeline_common.c
>> +++ b/app/test-eventdev/test_pipeline_common.c
>> @@ -331,6 +331,7 @@ pipeline_event_rx_adapter_setup(struct evt_options *opt, uint8_t stride,
>>         uint16_t prod;
>>         struct rte_mempool *vector_pool = NULL;
>>         struct rte_event_eth_rx_adapter_queue_conf queue_conf;
>> +       struct rte_event_eth_rx_adapter_event_vector_config vec_conf;
>>
>>         memset(&queue_conf, 0,
>>                         sizeof(struct rte_event_eth_rx_adapter_queue_conf));
>> @@ -360,12 +361,8 @@ pipeline_event_rx_adapter_setup(struct evt_options *opt, uint8_t stride,
>>                 }
>>                 if (opt->ena_vector) {
>>                         if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR) {
>> -                               queue_conf.vector_sz = opt->vector_size;
>> -                               queue_conf.vector_timeout_ns =
>> -                                       opt->vector_tmo_nsec;
>>                                 queue_conf.rx_queue_flags |=
>>                                 RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR;
>> -                               queue_conf.vector_mp = vector_pool;
>>                         } else {
>>                                 evt_err("Rx adapter doesn't support event vector");
>>                                 return -EINVAL;
>> @@ -385,6 +382,17 @@ pipeline_event_rx_adapter_setup(struct evt_options *opt, uint8_t stride,
>>                         return ret;
>>                 }
>>
>> +               if (opt->ena_vector) {
>> +                       vec_conf.vector_sz = opt->vector_size;
>> +                       vec_conf.vector_timeout_ns = opt->vector_tmo_nsec;
>> +                       vec_conf.vector_mp = vector_pool;
>> +                       if (rte_event_eth_rx_adapter_queue_event_vector_config(
>> +                                   prod, prod, -1, &vec_conf) < 0) {
>> +                               evt_err("Failed to configure event vectorization for Rx adapter");
>> +                               return -EINVAL;
>> +                       }
>> +               }
>> +
>>                 if (!(cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_INTERNAL_PORT)) {
>>                         uint32_t service_id = -1U;
>>
>> diff --git a/lib/librte_eventdev/eventdev_pmd.h b/lib/librte_eventdev/eventdev_pmd.h
>> index 60bfaebc0..d79dfd612 100644
>> --- a/lib/librte_eventdev/eventdev_pmd.h
>> +++ b/lib/librte_eventdev/eventdev_pmd.h
>> @@ -667,6 +667,32 @@ typedef int (*eventdev_eth_rx_adapter_vector_limits_get_t)(
>>         const struct rte_eventdev *dev, const struct rte_eth_dev *eth_dev,
>>         struct rte_event_eth_rx_adapter_vector_limits *limits);
>>
>> +struct rte_event_eth_rx_adapter_event_vector_config;
>> +/**
>> + * Enable event vector on an given Rx queue of a ethernet devices belonging to
>> + * the Rx adapter.
>> + *
>> + * @param dev
>> + *   Event device pointer
>> + *
>> + * @param eth_dev
>> + *   Ethernet device pointer
>> + *
>> + * @param rx_queue_id
>> + *   The Rx queue identifier
>> + *
>> + * @param config
>> + *   Pointer to the event vector configuration structure.
>> + *
>> + * @return
>> + *   - 0: Success.
>> + *   - <0: Error code returned by the driver function.
>> + */
>> +typedef int (*eventdev_eth_rx_adapter_event_vector_config_t)(
>> +       const struct rte_eventdev *dev, const struct rte_eth_dev *eth_dev,
>> +       int32_t rx_queue_id,
>> +       const struct rte_event_eth_rx_adapter_event_vector_config *config);
>> +
>>  typedef uint32_t rte_event_pmd_selftest_seqn_t;
>>  extern int rte_event_pmd_selftest_seqn_dynfield_offset;
>>
>> @@ -1092,6 +1118,9 @@ struct rte_eventdev_ops {
>>         eventdev_eth_rx_adapter_vector_limits_get_t
>>                 eth_rx_adapter_vector_limits_get;
>>         /**< Get event vector limits for the Rx adapter */
>> +       eventdev_eth_rx_adapter_event_vector_config_t
>> +               eth_rx_adapter_event_vector_config;
>> +       /**< Configure Rx adapter with event vector */
>>
>>         eventdev_timer_adapter_caps_get_t timer_adapter_caps_get;
>>         /**< Get timer adapter capabilities */
>> diff --git a/lib/librte_eventdev/rte_event_eth_rx_adapter.c b/lib/librte_eventdev/rte_event_eth_rx_adapter.c
>> index a1990637f..c71990078 100644
>> --- a/lib/librte_eventdev/rte_event_eth_rx_adapter.c
>> +++ b/lib/librte_eventdev/rte_event_eth_rx_adapter.c
>> @@ -1882,25 +1882,6 @@ rxa_add_queue(struct rte_event_eth_rx_adapter *rx_adapter,
>>         } else
>>                 qi_ev->flow_id = 0;
>>
>> -       if (conf->rx_queue_flags &
>> -           RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR) {
>> -               queue_info->ena_vector = 1;
>> -               qi_ev->event_type = RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR;
>> -               rxa_set_vector_data(queue_info, conf->vector_sz,
>> -                                   conf->vector_timeout_ns, conf->vector_mp,
>> -                                   rx_queue_id, dev_info->dev->data->port_id);
>> -               rx_adapter->ena_vector = 1;
>> -               rx_adapter->vector_tmo_ticks =
>> -                       rx_adapter->vector_tmo_ticks
>> -                               ? RTE_MIN(queue_info->vector_data
>> -                                                 .vector_timeout_ticks,
>> -                                         rx_adapter->vector_tmo_ticks)
>> -                               : queue_info->vector_data.vector_timeout_ticks;
>> -               rx_adapter->vector_tmo_ticks <<= 1;
>> -               TAILQ_INIT(&rx_adapter->vector_list);
>> -               rx_adapter->prev_expiry_ts = 0;
>> -       }
>> -
>>         rxa_update_queue(rx_adapter, dev_info, rx_queue_id, 1);
>>         if (rxa_polled_queue(dev_info, rx_queue_id)) {
>>                 rx_adapter->num_rx_polled += !pollq;
>> @@ -1926,6 +1907,44 @@ rxa_add_queue(struct rte_event_eth_rx_adapter *rx_adapter,
>>         }
>>  }
>>
>> +static void
>> +rxa_sw_event_vector_configure(
>> +       struct rte_event_eth_rx_adapter *rx_adapter, uint16_t eth_dev_id,
>> +       int rx_queue_id,
>> +       const struct rte_event_eth_rx_adapter_event_vector_config *config)
>> +{
>> +       struct eth_device_info *dev_info = &rx_adapter->eth_devices[eth_dev_id];
>> +       struct eth_rx_queue_info *queue_info;
>> +       struct rte_event *qi_ev;
>> +
>> +       if (rx_queue_id == -1) {
>> +               uint16_t nb_rx_queues;
>> +               uint16_t i;
>> +
>> +               nb_rx_queues = dev_info->dev->data->nb_rx_queues;
>> +               for (i = 0; i < nb_rx_queues; i++)
>> +                       rxa_sw_event_vector_configure(rx_adapter, eth_dev_id, i,
>> +                                                     config);
>> +               return;
>> +       }
>> +
>> +       queue_info = &dev_info->rx_queue[rx_queue_id];
>> +       qi_ev = (struct rte_event *)&queue_info->event;
>> +       queue_info->ena_vector = 1;
>> +       qi_ev->event_type = RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR;
>> +       rxa_set_vector_data(queue_info, config->vector_sz,
>> +                           config->vector_timeout_ns, config->vector_mp,
>> +                           rx_queue_id, dev_info->dev->data->port_id);
>> +       rx_adapter->ena_vector = 1;
>> +       rx_adapter->vector_tmo_ticks =
>> +               rx_adapter->vector_tmo_ticks ?
>> +                             RTE_MIN(config->vector_timeout_ns << 1,
>> +                                     rx_adapter->vector_tmo_ticks) :
>> +                             config->vector_timeout_ns << 1;
>> +       rx_adapter->prev_expiry_ts = 0;
>> +       TAILQ_INIT(&rx_adapter->vector_list);
>> +}
>> +
>>  static int rxa_sw_add(struct rte_event_eth_rx_adapter *rx_adapter,
>>                 uint16_t eth_dev_id,
>>                 int rx_queue_id,
>> @@ -2239,7 +2258,6 @@ rte_event_eth_rx_adapter_queue_add(uint8_t id,
>>         struct rte_event_eth_rx_adapter *rx_adapter;
>>         struct rte_eventdev *dev;
>>         struct eth_device_info *dev_info;
>> -       struct rte_event_eth_rx_adapter_vector_limits limits;
>>
>>         RTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_ERR_RET(id, -EINVAL);
>>         RTE_ETH_VALID_PORTID_OR_ERR_RET(eth_dev_id, -EINVAL);
>> @@ -2276,39 +2294,6 @@ rte_event_eth_rx_adapter_queue_add(uint8_t id,
>>                 return -EINVAL;
>>         }
>>
>> -       if (queue_conf->rx_queue_flags &
>> -           RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR) {
>> -               ret = rte_event_eth_rx_adapter_vector_limits_get(
>> -                       rx_adapter->eventdev_id, eth_dev_id, &limits);
>> -               if (ret < 0) {
>> -                       RTE_EDEV_LOG_ERR("Failed to get event device vector limits,"
>> -                                        " eth port: %" PRIu16
>> -                                        " adapter id: %" PRIu8,
>> -                                        eth_dev_id, id);
>> -                       return -EINVAL;
>> -               }
>> -               if (queue_conf->vector_sz < limits.min_sz ||
>> -                   queue_conf->vector_sz > limits.max_sz ||
>> -                   queue_conf->vector_timeout_ns < limits.min_timeout_ns ||
>> -                   queue_conf->vector_timeout_ns > limits.max_timeout_ns ||
>> -                   queue_conf->vector_mp == NULL) {
>> -                       RTE_EDEV_LOG_ERR("Invalid event vector configuration,"
>> -                                        " eth port: %" PRIu16
>> -                                        " adapter id: %" PRIu8,
>> -                                        eth_dev_id, id);
>> -                       return -EINVAL;
>> -               }
>> -               if (queue_conf->vector_mp->elt_size <
>> -                   (sizeof(struct rte_event_vector) +
>> -                    (sizeof(uintptr_t) * queue_conf->vector_sz))) {
>> -                       RTE_EDEV_LOG_ERR("Invalid event vector configuration,"
>> -                                        " eth port: %" PRIu16
>> -                                        " adapter id: %" PRIu8,
>> -                                        eth_dev_id, id);
>> -                       return -EINVAL;
>> -               }
>> -       }
>> -
>>         if ((cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_MULTI_EVENTQ) == 0 &&
>>                 (rx_queue_id != -1)) {
>>                 RTE_EDEV_LOG_ERR("Rx queues can only be connected to single "
>> @@ -2502,6 +2487,83 @@ rte_event_eth_rx_adapter_queue_del(uint8_t id, uint16_t eth_dev_id,
>>         return ret;
>>  }
>>
>> +int
>> +rte_event_eth_rx_adapter_queue_event_vector_config(
>> +       uint8_t id, uint16_t eth_dev_id, int32_t rx_queue_id,
>> +       struct rte_event_eth_rx_adapter_event_vector_config *config)
>> +{
>> +       struct rte_event_eth_rx_adapter_vector_limits limits;
>> +       struct rte_event_eth_rx_adapter *rx_adapter;
>> +       struct rte_eventdev *dev;
>> +       uint32_t cap;
>> +       int ret;
>> +
>> +       RTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_ERR_RET(id, -EINVAL);
>> +       RTE_ETH_VALID_PORTID_OR_ERR_RET(eth_dev_id, -EINVAL);
>> +
>> +       rx_adapter = rxa_id_to_adapter(id);
>> +       if ((rx_adapter == NULL) || (config == NULL))
>> +               return -EINVAL;
>> +
>> +       dev = &rte_eventdevs[rx_adapter->eventdev_id];
>> +       ret = rte_event_eth_rx_adapter_caps_get(rx_adapter->eventdev_id,
>> +                                               eth_dev_id, &cap);
>> +       if (ret) {
>> +               RTE_EDEV_LOG_ERR("Failed to get adapter caps edev %" PRIu8
>> +                                "eth port %" PRIu16,
>> +                                id, eth_dev_id);
>> +               return ret;
>> +       }
>> +
>> +       if (!(cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR)) {
>> +               RTE_EDEV_LOG_ERR("Event vectorization is not supported,"
>> +                                " eth port: %" PRIu16 " adapter id: %" PRIu8,
>> +                                eth_dev_id, id);
>> +               return -EINVAL;
>> +       }
>> +
>> +       ret = rte_event_eth_rx_adapter_vector_limits_get(
>> +               rx_adapter->eventdev_id, eth_dev_id, &limits);
>> +       if (ret) {
>> +               RTE_EDEV_LOG_ERR("Failed to get vector limits edev %" PRIu8
>> +                                "eth port %" PRIu16,
>> +                                rx_adapter->eventdev_id, eth_dev_id);
>> +               return ret;
>> +       }
>> +
>> +       if (config->vector_sz < limits.min_sz ||
>> +           config->vector_sz > limits.max_sz ||
>> +           config->vector_timeout_ns < limits.min_timeout_ns ||
>> +           config->vector_timeout_ns > limits.max_timeout_ns ||
>> +           config->vector_mp == NULL) {
>> +               RTE_EDEV_LOG_ERR("Invalid event vector configuration,"
>> +                                " eth port: %" PRIu16 " adapter id: %" PRIu8,
>> +                                eth_dev_id, id);
>> +               return -EINVAL;
>> +       }
>> +       if (config->vector_mp->elt_size <
>> +           (sizeof(struct rte_event_vector) +
>> +            (sizeof(uintptr_t) * config->vector_sz))) {
>> +               RTE_EDEV_LOG_ERR("Invalid event vector configuration,"
>> +                                " eth port: %" PRIu16 " adapter id: %" PRIu8,
>> +                                eth_dev_id, id);
>> +               return -EINVAL;
>> +       }
>> +
>> +       if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_INTERNAL_PORT) {
>> +               RTE_FUNC_PTR_OR_ERR_RET(
>> +                       *dev->dev_ops->eth_rx_adapter_event_vector_config,
>> +                       -ENOTSUP);
>> +               ret = dev->dev_ops->eth_rx_adapter_event_vector_config(
>> +                       dev, &rte_eth_devices[eth_dev_id], rx_queue_id, config);
>> +       } else {
>> +               rxa_sw_event_vector_configure(rx_adapter, eth_dev_id,
>> +                                             rx_queue_id, config);
>> +       }
>> +
>> +       return ret;
>> +}
>> +
>>  int
>>  rte_event_eth_rx_adapter_vector_limits_get(
>>         uint8_t dev_id, uint16_t eth_port_id,
>> diff --git a/lib/librte_eventdev/rte_event_eth_rx_adapter.h b/lib/librte_eventdev/rte_event_eth_rx_adapter.h
>> index 4bdb38f08..ceef6d565 100644
>> --- a/lib/librte_eventdev/rte_event_eth_rx_adapter.h
>> +++ b/lib/librte_eventdev/rte_event_eth_rx_adapter.h
>> @@ -171,6 +171,9 @@ struct rte_event_eth_rx_adapter_queue_conf {
>>          * The event adapter sets ev.event_type to RTE_EVENT_TYPE_ETHDEV in the
>>          * enqueued event.
>>          */
>> +};
>> +
>> +struct rte_event_eth_rx_adapter_event_vector_config {
>>         uint16_t vector_sz;
>>         /**<
>>          * Indicates the maximum number for mbufs to combine and form a vector.
>> @@ -418,6 +421,30 @@ int rte_event_eth_rx_adapter_queue_add(uint8_t id,
>>  int rte_event_eth_rx_adapter_queue_del(uint8_t id, uint16_t eth_dev_id,
>>                                        int32_t rx_queue_id);
>>
>> +/**
>> + * Configure event vectorization for a given ethernet device queue, that has
>> + * been added to a event eth Rx adapter.
>> + *
>> + * @param id
>> + *  The identifier of the ethernet Rx event adapter.
>> + *
>> + * @param eth_dev_id
>> + *  The identifier of the ethernet device.
>> + *
>> + * @param rx_queue_id
>> + *  Ethernet device receive queue index.
>> + *  If rx_queue_id is -1, then all Rx queues configured for the ethernet device
>> + *  are configured with event vectorization.
>> + *
>> + * @return
>> + *  - 0: Success, Receive queue configured correctly.
>> + *  - <0: Error code on failure.
>> + */
>> +__rte_experimental
>> +int rte_event_eth_rx_adapter_queue_event_vector_config(
>> +       uint8_t id, uint16_t eth_dev_id, int32_t rx_queue_id,
>> +       struct rte_event_eth_rx_adapter_event_vector_config *config);
>> +
>>  /**
>>   * Start ethernet Rx event adapter
>>   *
>> diff --git a/lib/librte_eventdev/version.map b/lib/librte_eventdev/version.map
>> index 34c1c830e..902df0ae3 100644
>> --- a/lib/librte_eventdev/version.map
>> +++ b/lib/librte_eventdev/version.map
>> @@ -142,6 +142,7 @@ EXPERIMENTAL {
>>         #added in 21.05
>>         rte_event_vector_pool_create;
>>         rte_event_eth_rx_adapter_vector_limits_get;
>> +       rte_event_eth_rx_adapter_queue_event_vector_config;
>>  };
>>
>>  INTERNAL {
>> --
>> 2.17.1
>>

^ permalink raw reply	[relevance 7%]

* [dpdk-dev] [PATCH v2] ethdev: introduce enable_driver_sdk to install driver headers
  2021-03-11 19:27  3% [dpdk-dev] [PATCH] ethdev: introduce enable_driver_sdk to install driver headers Tyler Retzlaff
  2021-03-12 15:19  0% ` Ferruh Yigit
@ 2021-03-12 22:20  3% ` Tyler Retzlaff
  2021-03-15 10:06  0%   ` Bruce Richardson
  2021-03-23 17:04  0%   ` Ferruh Yigit
  1 sibling, 2 replies; 200+ results
From: Tyler Retzlaff @ 2021-03-12 22:20 UTC (permalink / raw)
  To: dev; +Cc: thomas, ferruh.yigit, andrew.rybchenko, bruce.richardson

Introduce a meson option enable_driver_sdk when true installs internal
driver headers for ethdev. this allows drivers that do not depend on
stable api/abi to be built external to the dpdk source tree.

Signed-off-by: Tyler Retzlaff <roretzla@linux.microsoft.com>
---
 lib/librte_ethdev/meson.build | 6 ++++++
 lib/meson.build               | 4 ++++
 meson_options.txt             | 2 ++
 3 files changed, 12 insertions(+)

diff --git a/lib/librte_ethdev/meson.build b/lib/librte_ethdev/meson.build
index c37b2e377..4353fa6b7 100644
--- a/lib/librte_ethdev/meson.build
+++ b/lib/librte_ethdev/meson.build
@@ -20,8 +20,14 @@ headers = files('rte_ethdev.h',
 	'rte_mtr_driver.h',
 	'rte_tm.h',
 	'rte_tm_driver.h')
+
 indirect_headers += files(
 	'rte_ethdev_core.h',
 	'rte_eth_ctrl.h')
 
+driver_sdk_headers += files(
+	'ethdev_driver.h',
+	'ethdev_pci.h',
+	'ethdev_vdev.h')
+
 deps += ['net', 'kvargs', 'meter', 'telemetry']
diff --git a/lib/meson.build b/lib/meson.build
index 7712aa497..992ebdf63 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -67,6 +67,7 @@ foreach l:libraries
 	sources = []
 	headers = []
 	indirect_headers = [] # public headers not directly included by apps
+	driver_sdk_headers = [] # public headers included by drivers
 	includes = []
 	cflags = default_cflags
 	objs = [] # other object files to link against, used e.g. for
@@ -105,6 +106,9 @@ foreach l:libraries
 		dpdk_conf.set('RTE_LIB_' + name.to_upper(), 1)
 		install_headers(headers)
 		install_headers(indirect_headers)
+		if get_option('enable_driver_sdk')
+			install_headers(driver_sdk_headers)
+		endif
 		dpdk_chkinc_headers += headers
 
 		libname = 'rte_' + name
diff --git a/meson_options.txt b/meson_options.txt
index 6eff62e47..857874a19 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -8,6 +8,8 @@ option('drivers_install_subdir', type: 'string', value: 'dpdk/pmds-<VERSION>',
 	description: 'Subdirectory of libdir where to install PMDs. Defaults to using a versioned subdirectory.')
 option('enable_docs', type: 'boolean', value: false,
 	description: 'build documentation')
+option('enable_driver_sdk', type: 'boolean', value: false,
+	description: 'install internal driver plugin headers')
 option('enable_kmods', type: 'boolean', value: false,
 	description: 'build kernel modules')
 option('examples', type: 'string', value: '',
-- 
2.30.0.vfs.0.2


^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH] librte_eal/common: fix return type of rte_bsf64
  2021-03-12 18:24  0%       ` Tyler Retzlaff
@ 2021-03-12 21:13  0%         ` Morten Brørup
  0 siblings, 0 replies; 200+ results
From: Morten Brørup @ 2021-03-12 21:13 UTC (permalink / raw)
  To: Tyler Retzlaff
  Cc: Stephen Hemminger, dev, anatoly.burakov, Ray Kinsella, Neil Horman

> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Tyler Retzlaff
> Sent: Friday, March 12, 2021 7:24 PM
> 
> On Fri, Mar 12, 2021 at 08:34:50AM +0100, Morten Brørup wrote:
> > CC: ABI Policy maintainers. You might have an opinion. Or not. :-)
> >
> >
> > Please also update the similar math functions in rte_common.h, so the
> return type is consistent across these functions:
> > - rte_bsf32()
> > - rte_bsf32_safe()
> > - rte_fls_u32()
> > - rte_bsf64()
> > - rte_fls_u64()
> > - rte_log2_u32()
> > - rte_log2_u64()
> 
> agreed, happy to review the whole set and deal with it all at once.

Ups. I should have omitted rte_bsf32_safe() from the list. It returns a Boolean.

> 
> >
> > They should all return either int or uint32_t.
> >
> > Standard C conventions would have them all return int (probably due to
> C's default type promotion to int when used in calculations), which is also
> the type returned by their underlying implementation.
> 
> yes, i suspect gcc builtins return int because of the default type
> promotion. probably historical be interesting to get an old gcc hand to
> tell us a story.
> 
> >
> > For some unknown reason, DPDK often uses uint32_t where you would
> normally use int. I guess it was inspired by MISRA C (for embedded
> systems); but it is not a documented conventions, and often deviated from.
> 
> horses for courses, if it doesn't make sense to interpret as signed then
> i don't see a lot of value in using signed and it can open up avenues of
> exploit.

I agree with you on this. The best return type is determined by considering how the return value is going to be used.

I could argue that these are mathematical functions, so they can be used for any kind of math, including math involving negative numbers. On the other hand, DPDK generally uses uint32_t for positive integers; and this also seems to be the original author's intention.

> 
> >
> > I don't have a personal preference for int or uint32_t here. But at least
> follow the same convention in the same header file.
> 
> agree completely, consistency.

Looking closer at it, uint32_t is probably closer to general DPDK consistency.

> 
> >
> > (Please note that the functions returning a Boolean value as an int type
> should keep doing that.)
> 
> i'm not planning on changing int -> _Bool. but i am curious about your
> comment. stdbool.h is already used in the code base is there a compiler
> in use that does not support _Bool. this is purely my interest, i don't
> propose any change.

I only mentioned this to ensure that you don't change the Boolean return values from int to uint32_t.

For arguments sate, they could be changed to bool, which is an acceptable type in DPDK, ref.:
https://elixir.bootlin.com/dpdk/latest/C/ident/bool

However, I agree with you to not propose any change here!


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] librte_eal/common: fix return type of rte_bsf64
  2021-03-12  7:34  3%     ` Morten Brørup
  2021-03-12 11:46  0%       ` Kinsella, Ray
@ 2021-03-12 18:24  0%       ` Tyler Retzlaff
  2021-03-12 21:13  0%         ` Morten Brørup
  1 sibling, 1 reply; 200+ results
From: Tyler Retzlaff @ 2021-03-12 18:24 UTC (permalink / raw)
  To: Morten Brørup
  Cc: Stephen Hemminger, dev, anatoly.burakov, Ray Kinsella, Neil Horman

On Fri, Mar 12, 2021 at 08:34:50AM +0100, Morten Brørup wrote:
> CC: ABI Policy maintainers. You might have an opinion. Or not. :-)
> 
> 
> Please also update the similar math functions in rte_common.h, so the return type is consistent across these functions:
> - rte_bsf32()
> - rte_bsf32_safe()
> - rte_fls_u32()
> - rte_bsf64()
> - rte_fls_u64()
> - rte_log2_u32()
> - rte_log2_u64()

agreed, happy to review the whole set and deal with it all at once.

> 
> They should all return either int or uint32_t.
> 
> Standard C conventions would have them all return int (probably due to C's default type promotion to int when used in calculations), which is also the type returned by their underlying implementation.

yes, i suspect gcc builtins return int because of the default type promotion. probably historical be interesting to get an old gcc hand to tell us a story.

> 
> For some unknown reason, DPDK often uses uint32_t where you would normally use int. I guess it was inspired by MISRA C (for embedded systems); but it is not a documented conventions, and often deviated from.

horses for courses, if it doesn't make sense to interpret as signed then
i don't see a lot of value in using signed and it can open up avenues of
exploit.

> 
> I don't have a personal preference for int or uint32_t here. But at least follow the same convention in the same header file.

agree completely, consistency.

> 
> (Please note that the functions returning a Boolean value as an int type should keep doing that.)

i'm not planning on changing int -> _Bool. but i am curious about your
comment. stdbool.h is already used in the code base is there a compiler
in use that does not support _Bool. this is purely my interest, i don't
propose any change.

> 
> 
> Med venlig hilsen / kind regards
> - Morten Brørup
> 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] librte_eal/common: fix return type of rte_bsf64
  2021-03-12 11:46  0%       ` Kinsella, Ray
@ 2021-03-12 18:10  3%         ` Tyler Retzlaff
  0 siblings, 0 replies; 200+ results
From: Tyler Retzlaff @ 2021-03-12 18:10 UTC (permalink / raw)
  To: Kinsella, Ray
  Cc: Morten Brørup, Stephen Hemminger, dev, anatoly.burakov, Neil Horman

On Fri, Mar 12, 2021 at 11:46:39AM +0000, Kinsella, Ray wrote:
> 
> 
> On 12/03/2021 07:34, Morten Brørup wrote:
> > CC: ABI Policy maintainers. You might have an opinion. Or not. :-)
> 
> My 2c is that this is affecting inlined functions from include/rte_common.h.
> Although not ideal, the practical effect on Binary Compatibility is therefore likely to be _nil_.
> 
> Just a small comment - when Steve points out "The cast is no longer needed, it should be removed."
> I think Tyler _may_ have mis-understood his point when he said 
> 
> "it's not so much about making it compile. it's about making it correct
> with respect to original author intent, consistent with the rte_bsf32
> declaration ... "
> 
> My interpretation of what Steve said, is that once you change the return type
> to uint32_t ... there is no need for the cast any more, that is all. 

yes, but saying it to what end if not to imply that should be the change
made? or are you suggesting it was just a passive observation? in this
instance it could have been formed as a question instead of a statement.

  "why not just remove the cast?"

based on the context of the patch in isolation i would agree but proper
due-diligence (review of commit history and usage) gives weight to the
alternative patch supplied.

For example:

1. Removed bsf64 function from testpmd.c. Original return type was
   uint32_t

// copy from testpmd.c
-static inline uint32_t
-bsf64(uint64_t v)
-{
-       return (uint32_t)__builtin_ctzll(v);
-}
-

2. Removed bsf64 function from eal_memalloc.c. Original return type was
   uint32_t

-static inline uint32_t
-bsf64(uint64_t v)
-{
-       return (uint32_t)__builtin_ctzll(v);
-}
-

3. Existing usage adapted to rte_bsf64 inline function. Return type is
   assumed to be uint32_t.

 static inline uint32_t
 log2_u64(uint64_t v)
 {
        if (v == 0)
                return 0;
        v = rte_align64pow2(v);
-       return bsf64(v);
+       return rte_bsf64(v);
 }


4. Existing usage adapted to rte_bsf64 inline function. Return type is
   assumed to be uint32_t.

 static inline uint32_t
 log2_u64(uint64_t v)
 {
        if (v == 0)
                return 0;
        v = rte_align64pow2(v);
-       return bsf64(v);
+       return rte_bsf64(v);
 }

5. Existing usage adapted to rte_bsf64 inline function. Return type is
   assumed to be uint32_t.

@@ -502,7 +543,7 @@ rte_bsf64_safe(uint64_t v, uint32_t *pos)
        if (v == 0)
                return 0;

-       *pos = __builtin_ctzll(v);
+       *pos = rte_bsf64(v);
        return 1;
 }

6. I will also concede that the test code _does_ use explicit casts to
   uint32_t but i evaluated their use to be the likely product of cut &
   paste because people get bored writing test code. Further, the cast
   for the test code on the rte_bsf32 is completely superfluous.

In addition to the commit history.

7. Does it make any sense for the value to be represented as signed? I
   would argue no. Additionally, the function as implemented does not
   attempt to report failure which would necessitate overloading the return
   value with -1 sentinel to indicate failure.

Based on these items it is difficult for me to believe that just
discarding the cast is correct.  Instead it feels more like papering
over a problem to avoid breaking API (ABI is not impacted).

> 
> > 
> >> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Tyler Retzlaff
> >> Sent: Wednesday, March 10, 2021 11:53 PM
> >>
> >> On Wed, Mar 10, 2021 at 10:49:42AM -0800, Stephen Hemminger wrote:
> >>> On Tue,  9 Mar 2021 22:41:06 -0800
> >>> Tyler Retzlaff <roretzla@linux.microsoft.com> wrote:
> >>>
> >>>> based on the original commit and the usage of rte_bsf64 it appears
> >> the
> >>>> function should always have returned uint32_t instead of int which
> >> is
> >>>> consistent with the cast introduced in the return statement.
> >>>>
> >>>> Fixes: 4e261f551986 ("eal: add 64-bit bsf and 32-bit safe bsf
> >>>> functions")
> >>>> Cc: anatoly.burakov@intel.com
> >>>>
> >>>> Signed-off-by: Tyler Retzlaff <roretzla@linux.microsoft.com>
> >>>> ---
> >>>>  lib/librte_eal/include/rte_common.h | 2 +-
> >>>>  1 file changed, 1 insertion(+), 1 deletion(-)
> >>>>
> >>>> diff --git a/lib/librte_eal/include/rte_common.h
> >> b/lib/librte_eal/include/rte_common.h
> >>>> index 1b630baf1..5e70ee7a8 100644
> >>>> --- a/lib/librte_eal/include/rte_common.h
> >>>> +++ b/lib/librte_eal/include/rte_common.h
> >>>> @@ -679,7 +679,7 @@ rte_fls_u32(uint32_t x)
> >>>>   * @return
> >>>>   *     least significant set bit in the input parameter.
> >>>>   */
> >>>> -static inline int
> >>>> +static inline uint32_t
> >>>>  rte_bsf64(uint64_t v)
> >>>>  {
> >>>>  	return (uint32_t)__builtin_ctzll(v);
> >>>
> >>> The cast is no longer needed, it should be removed.
> >>
> >> it's not so much about making it compile. it's about making it correct
> >> with respect to original author intent, consistent with the rte_bsf32
> >> declaration, other consumers of the inline function inside rte_common.h
> >> and whether or not it makes sense to have a function that returns a
> >> count of bits signed. based on those factors i'm asserting that the
> >> cast is actually correct and it is the return type that is wrong.
> >>
> >> your suggestion however would avoid having to deal with the downside of
> >> changing the return type which is that an api change is necessary since
> >> the function is exposed to applications. but even for something small
> >> like this i think it is best to pursue the correct change rather than
> >> sprinkle casts to (uint32_t) at various call-sites.
> >>
> >> i'm in the process of sending the proposal to deprecate/change the
> >> return type unless others feel the above evaluation missed the mark.
> >>
> >> thanks!
> > 
> > Please also update the similar math functions in rte_common.h, so the return type is consistent across these functions:
> > - rte_bsf32()
> > - rte_bsf32_safe()
> > - rte_fls_u32()
> > - rte_bsf64()
> > - rte_fls_u64()
> > - rte_log2_u32()
> > - rte_log2_u64()
> > 
> > They should all return either int or uint32_t.
> > 
> > Standard C conventions would have them all return int (probably due to C's default type promotion to int when used in calculations), which is also the type returned by their underlying implementation.
> > 
> > For some unknown reason, DPDK often uses uint32_t where you would normally use int. I guess it was inspired by MISRA C (for embedded systems); but it is not a documented conventions, and often deviated from.
> > 
> > I don't have a personal preference for int or uint32_t here. But at least follow the same convention in the same header file.
> > 
> > (Please note that the functions returning a Boolean value as an int type should keep doing that.)
> > 
> > 
> > Med venlig hilsen / kind regards
> > - Morten Brørup
> > 

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v2 1/2] ethdev: replace callback getting filter operations
  @ 2021-03-12 17:46  1%   ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2021-03-12 17:46 UTC (permalink / raw)
  To: dev
  Cc: Ori Kam, Ajit Khaparde, Somnath Kotur, Chas Williams,
	Min Hu (Connor),
	Rahul Lakkireddy, Hemant Agrawal, Sachin Saxena, Jeff Guo,
	Haiyue Wang, John Daley, Hyong Youb Kim, Gaetan Rivet,
	Ziyang Xuan, Xiaoyun Wang, Guoyang Zhou, Yisen Zhuang, Lijun Ou,
	Beilei Xing, Jingjing Wu, Qiming Yang, Qi Zhang, Rosen Xu,
	Matan Azrad, Shahaf Shuler, Viacheslav Ovsiienko, Liron Himi,
	Jerin Jacob, Nithin Dabilpuram, Kiran Kumar K, Rasesh Mody,
	Shahed Shaikh, Andrew Rybchenko, Jasvinder Singh,
	Cristian Dumitrescu, Keith Wiles, Jiawen Wu, Jian Wang,
	Ferruh Yigit

Since rte_flow is the only API for filtering operations,
the legacy driver interface filter_ctrl was too much complicated
for the simple task of getting the struct rte_flow_ops.

The filter type RTE_ETH_FILTER_GENERIC and
the filter operarion RTE_ETH_FILTER_GET are removed.
The new driver callback flow_ops_get replaces filter_ctrl.

Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
---
 doc/guides/nics/features.rst            |  4 +--
 doc/guides/prog_guide/rte_flow.rst      | 14 +-------
 drivers/net/bnxt/bnxt.h                 |  6 ++--
 drivers/net/bnxt/bnxt_ethdev.c          | 40 +++++++--------------
 drivers/net/bnxt/bnxt_reps.c            |  2 +-
 drivers/net/bonding/rte_eth_bond_pmd.c  | 13 +++----
 drivers/net/cxgbe/cxgbe_ethdev.c        |  2 +-
 drivers/net/cxgbe/cxgbe_flow.c          | 22 +++---------
 drivers/net/cxgbe/cxgbe_flow.h          |  7 ++--
 drivers/net/dpaa2/dpaa2_ethdev.c        | 44 +++--------------------
 drivers/net/dpaa2/dpaa2_flow.c          | 29 +++++-----------
 drivers/net/e1000/igb_ethdev.c          | 31 ++++-------------
 drivers/net/enic/enic_ethdev.c          | 30 +++++-----------
 drivers/net/enic/enic_vf_representor.c  | 33 ++++++------------
 drivers/net/failsafe/failsafe_ops.c     | 16 +++------
 drivers/net/hinic/hinic_pmd_ethdev.c    | 36 ++++---------------
 drivers/net/hns3/hns3_ethdev.c          |  2 +-
 drivers/net/hns3/hns3_ethdev.h          |  5 ++-
 drivers/net/hns3/hns3_ethdev_vf.c       |  2 +-
 drivers/net/hns3/hns3_flow.c            | 30 ++++------------
 drivers/net/i40e/i40e_ethdev.c          | 32 ++++-------------
 drivers/net/iavf/iavf_ethdev.c          | 32 ++++-------------
 drivers/net/ice/ice_dcf_ethdev.c        | 27 +++------------
 drivers/net/ice/ice_ethdev.c            | 32 ++++-------------
 drivers/net/igc/igc_ethdev.c            |  2 +-
 drivers/net/igc/igc_filter.c            | 23 +++----------
 drivers/net/igc/igc_filter.h            |  5 ++-
 drivers/net/ipn3ke/ipn3ke_representor.c | 28 ++++-----------
 drivers/net/ixgbe/ixgbe_ethdev.c        | 32 ++++-------------
 drivers/net/mlx4/mlx4.c                 |  2 +-
 drivers/net/mlx4/mlx4_flow.c            | 32 ++++-------------
 drivers/net/mlx4/mlx4_flow.h            |  5 +--
 drivers/net/mlx5/mlx5.c                 |  4 +--
 drivers/net/mlx5/mlx5.h                 |  5 +--
 drivers/net/mlx5/mlx5_flow.c            | 32 ++++-------------
 drivers/net/mvpp2/mrvl_ethdev.c         | 26 ++++----------
 drivers/net/octeontx2/otx2_ethdev.c     |  2 +-
 drivers/net/octeontx2/otx2_ethdev.h     |  5 ++-
 drivers/net/octeontx2/otx2_ethdev_ops.c | 21 +++--------
 drivers/net/qede/qede_ethdev.c          |  2 +-
 drivers/net/qede/qede_ethdev.h          |  7 ++--
 drivers/net/qede/qede_filter.c          | 27 ++++-----------
 drivers/net/sfc/sfc_ethdev.c            | 31 +++--------------
 drivers/net/softnic/rte_eth_softnic.c   | 17 +++------
 drivers/net/tap/rte_eth_tap.c           |  2 +-
 drivers/net/tap/tap_flow.c              | 27 ++++-----------
 drivers/net/tap/tap_flow.h              |  6 ++--
 drivers/net/txgbe/txgbe_ethdev.c        | 26 +++-----------
 lib/librte_ethdev/ethdev_driver.h       | 46 +++++++++----------------
 lib/librte_ethdev/rte_eth_ctrl.h        |  2 +-
 lib/librte_ethdev/rte_flow.c            | 23 +++++++------
 lib/librte_ethdev/rte_flow_driver.h     | 25 --------------
 52 files changed, 233 insertions(+), 723 deletions(-)

diff --git a/doc/guides/nics/features.rst b/doc/guides/nics/features.rst
index dbca9a85b9..f6d30d0af3 100644
--- a/doc/guides/nics/features.rst
+++ b/doc/guides/nics/features.rst
@@ -402,9 +402,9 @@ Supports configuring link flow control.
 Flow API
 --------
 
-Supports the DPDK Flow API for generic filtering.
+Supports flow API family.
 
-* **[implements] eth_dev_ops**: ``filter_ctrl:RTE_ETH_FILTER_GENERIC``.
+* **[implements] eth_dev_ops**: ``flow_ops_get``.
 * **[implements] rte_flow_ops**: ``All``.
 
 
diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst
index 62a57919eb..aec2ba1ec0 100644
--- a/doc/guides/prog_guide/rte_flow.rst
+++ b/doc/guides/prog_guide/rte_flow.rst
@@ -22,11 +22,6 @@ defined in ``rte_flow.h``.
   queues, to virtual/physical device functions or ports, performing tunnel
   offloads, adding marks and so on.
 
-It is slightly higher-level than the legacy filtering framework which it
-encompasses and supersedes (including all functions and filter types) in
-order to expose a single interface with an unambiguous behavior that is
-common to all poll-mode drivers (PMDs).
-
 Flow rule
 ---------
 
@@ -3104,7 +3099,6 @@ port and may return errors such as ``ENOTSUP`` ("not supported"):
 - Configuring MAC addresses.
 - Configuring multicast addresses.
 - Configuring VLAN filters.
-- Configuring Rx filters through the legacy API (e.g. FDIR).
 - Configuring global RSS settings.
 
 .. code-block:: c
@@ -3331,13 +3325,7 @@ The PMD interface is defined in ``rte_flow_driver.h``. It is not subject to
 API/ABI versioning constraints as it is not exposed to applications and may
 evolve independently.
 
-It is currently implemented on top of the legacy filtering framework through
-filter type *RTE_ETH_FILTER_GENERIC* that accepts the single operation
-*RTE_ETH_FILTER_GET* to return PMD-specific *rte_flow* callbacks wrapped
-inside ``struct rte_flow_ops``.
-
-This overhead is temporarily necessary in order to keep compatibility with
-the legacy filtering framework, which should eventually disappear.
+The PMD interface is based on callbacks pointed by the ``struct rte_flow_ops``.
 
 - PMD callbacks implement exactly the interface described in `Rules
   management`_, except for the port ID argument which has already been
diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h
index b4370e5acd..a6c02d88aa 100644
--- a/drivers/net/bnxt/bnxt.h
+++ b/drivers/net/bnxt/bnxt.h
@@ -981,9 +981,7 @@ void bnxt_flow_cnt_alarm_cb(void *arg);
 int bnxt_flow_stats_req(struct bnxt *bp);
 int bnxt_flow_stats_cnt(struct bnxt *bp);
 uint32_t bnxt_get_speed_capabilities(struct bnxt *bp);
+int bnxt_flow_ops_get_op(struct rte_eth_dev *dev,
+			 const struct rte_flow_ops **ops);
 
-int
-bnxt_filter_ctrl_op(struct rte_eth_dev *dev,
-		    enum rte_filter_type filter_type,
-		    enum rte_filter_op filter_op, void *arg);
 #endif
diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index 9824cdb6d8..87d298804f 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -3086,9 +3086,8 @@ bnxt_tx_descriptor_status_op(void *tx_queue, uint16_t offset)
 }
 
 int
-bnxt_filter_ctrl_op(struct rte_eth_dev *dev,
-		    enum rte_filter_type filter_type,
-		    enum rte_filter_op filter_op, void *arg)
+bnxt_flow_ops_get_op(struct rte_eth_dev *dev,
+		     const struct rte_flow_ops **ops)
 {
 	struct bnxt *bp = dev->data->dev_private;
 	int ret = 0;
@@ -3101,10 +3100,8 @@ bnxt_filter_ctrl_op(struct rte_eth_dev *dev,
 		bp = vfr->parent_dev->data->dev_private;
 		/* parent is deleted while children are still valid */
 		if (!bp) {
-			PMD_DRV_LOG(DEBUG, "BNXT Port:%d VFR Error %d:%d\n",
-				    dev->data->port_id,
-				    filter_type,
-				    filter_op);
+			PMD_DRV_LOG(DEBUG, "BNXT Port:%d VFR Error\n",
+				    dev->data->port_id);
 			return -EIO;
 		}
 	}
@@ -3113,27 +3110,16 @@ bnxt_filter_ctrl_op(struct rte_eth_dev *dev,
 	if (ret)
 		return ret;
 
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
+	/* PMD supports thread-safe flow operations.  rte_flow API
+	 * functions can avoid mutex for multi-thread safety.
+	 */
+	dev->data->dev_flags |= RTE_ETH_DEV_FLOW_OPS_THREAD_SAFE;
 
-		/* PMD supports thread-safe flow operations.  rte_flow API
-		 * functions can avoid mutex for multi-thread safety.
-		 */
-		dev->data->dev_flags |= RTE_ETH_DEV_FLOW_OPS_THREAD_SAFE;
+	if (BNXT_TRUFLOW_EN(bp))
+		*ops = &bnxt_ulp_rte_flow_ops;
+	else
+		*ops = &bnxt_flow_ops;
 
-		if (BNXT_TRUFLOW_EN(bp))
-			*(const void **)arg = &bnxt_ulp_rte_flow_ops;
-		else
-			*(const void **)arg = &bnxt_flow_ops;
-		break;
-	default:
-		PMD_DRV_LOG(ERR,
-			"Filter type (%d) not supported", filter_type);
-		ret = -EINVAL;
-		break;
-	}
 	return ret;
 }
 
@@ -3644,7 +3630,7 @@ static const struct eth_dev_ops bnxt_dev_ops = {
 	.rx_queue_stop = bnxt_rx_queue_stop,
 	.tx_queue_start = bnxt_tx_queue_start,
 	.tx_queue_stop = bnxt_tx_queue_stop,
-	.filter_ctrl = bnxt_filter_ctrl_op,
+	.flow_ops_get = bnxt_flow_ops_get_op,
 	.dev_supported_ptypes_get = bnxt_dev_supported_ptypes_get_op,
 	.get_eeprom_length    = bnxt_get_eeprom_length_op,
 	.get_eeprom           = bnxt_get_eeprom_op,
diff --git a/drivers/net/bnxt/bnxt_reps.c b/drivers/net/bnxt/bnxt_reps.c
index d94874578e..b224a7d2c2 100644
--- a/drivers/net/bnxt/bnxt_reps.c
+++ b/drivers/net/bnxt/bnxt_reps.c
@@ -29,7 +29,7 @@ static const struct eth_dev_ops bnxt_rep_dev_ops = {
 	.dev_stop = bnxt_rep_dev_stop_op,
 	.stats_get = bnxt_rep_stats_get_op,
 	.stats_reset = bnxt_rep_stats_reset_op,
-	.filter_ctrl = bnxt_filter_ctrl_op
+	.flow_ops_get = bnxt_flow_ops_get_op
 };
 
 uint16_t
diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c
index 5241c60089..24e3cf3c2e 100644
--- a/drivers/net/bonding/rte_eth_bond_pmd.c
+++ b/drivers/net/bonding/rte_eth_bond_pmd.c
@@ -3108,14 +3108,11 @@ bond_ethdev_mac_address_set(struct rte_eth_dev *dev,
 }
 
 static int
-bond_filter_ctrl(struct rte_eth_dev *dev __rte_unused,
-		 enum rte_filter_type type, enum rte_filter_op op, void *arg)
+bond_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		  const struct rte_flow_ops **ops)
 {
-	if (type == RTE_ETH_FILTER_GENERIC && op == RTE_ETH_FILTER_GET) {
-		*(const void **)arg = &bond_flow_ops;
-		return 0;
-	}
-	return -ENOTSUP;
+	*ops = &bond_flow_ops;
+	return 0;
 }
 
 static int
@@ -3207,7 +3204,7 @@ const struct eth_dev_ops default_dev_ops = {
 	.mac_addr_set         = bond_ethdev_mac_address_set,
 	.mac_addr_add         = bond_ethdev_mac_addr_add,
 	.mac_addr_remove      = bond_ethdev_mac_addr_remove,
-	.filter_ctrl          = bond_filter_ctrl
+	.flow_ops_get         = bond_flow_ops_get
 };
 
 static int
diff --git a/drivers/net/cxgbe/cxgbe_ethdev.c b/drivers/net/cxgbe/cxgbe_ethdev.c
index bfa57c979d..e8a2de3ef3 100644
--- a/drivers/net/cxgbe/cxgbe_ethdev.c
+++ b/drivers/net/cxgbe/cxgbe_ethdev.c
@@ -1335,7 +1335,7 @@ static const struct eth_dev_ops cxgbe_eth_dev_ops = {
 	.rx_queue_start		= cxgbe_dev_rx_queue_start,
 	.rx_queue_stop		= cxgbe_dev_rx_queue_stop,
 	.rx_queue_release	= cxgbe_dev_rx_queue_release,
-	.filter_ctrl            = cxgbe_dev_filter_ctrl,
+	.flow_ops_get           = cxgbe_dev_flow_ops_get,
 	.stats_get		= cxgbe_dev_stats_get,
 	.stats_reset		= cxgbe_dev_stats_reset,
 	.flow_ctrl_get		= cxgbe_flow_ctrl_get,
diff --git a/drivers/net/cxgbe/cxgbe_flow.c b/drivers/net/cxgbe/cxgbe_flow.c
index 520a5a5c9a..edcbba9d7c 100644
--- a/drivers/net/cxgbe/cxgbe_flow.c
+++ b/drivers/net/cxgbe/cxgbe_flow.c
@@ -1448,23 +1448,9 @@ static const struct rte_flow_ops cxgbe_flow_ops = {
 };
 
 int
-cxgbe_dev_filter_ctrl(struct rte_eth_dev *dev,
-		      enum rte_filter_type filter_type,
-		      enum rte_filter_op filter_op,
-		      void *arg)
+cxgbe_dev_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		       const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
-	RTE_SET_USED(dev);
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &cxgbe_flow_ops;
-		break;
-	default:
-		ret = -ENOTSUP;
-		break;
-	}
-	return ret;
+	*ops = &cxgbe_flow_ops;
+	return 0;
 }
diff --git a/drivers/net/cxgbe/cxgbe_flow.h b/drivers/net/cxgbe/cxgbe_flow.h
index ec8e47aebe..9cf29550a9 100644
--- a/drivers/net/cxgbe/cxgbe_flow.h
+++ b/drivers/net/cxgbe/cxgbe_flow.h
@@ -35,10 +35,7 @@ struct rte_flow {
 	struct rte_eth_dev *dev;
 };
 
-int
-cxgbe_dev_filter_ctrl(struct rte_eth_dev *dev,
-		      enum rte_filter_type filter_type,
-		      enum rte_filter_op filter_op,
-		      void *arg);
+int cxgbe_dev_flow_ops_get(struct rte_eth_dev *dev,
+			   const struct rte_flow_ops **ops);
 
 #endif /* _CXGBE_FLOW_H_ */
diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c
index 0e7ebf4dc0..9011dcfc12 100644
--- a/drivers/net/dpaa2/dpaa2_ethdev.c
+++ b/drivers/net/dpaa2/dpaa2_ethdev.c
@@ -99,10 +99,6 @@ static const struct rte_dpaa2_xstats_name_off dpaa2_xstats_strings[] = {
 	{"cgr_reject_bytes", 4, 1},
 };
 
-static const enum rte_filter_op dpaa2_supported_filter_ops[] = {
-	RTE_ETH_FILTER_GET
-};
-
 static struct rte_dpaa2_driver rte_dpaa2_pmd;
 static int dpaa2_dev_link_update(struct rte_eth_dev *dev,
 				 int wait_to_complete);
@@ -2322,45 +2318,15 @@ int dpaa2_eth_eventq_detach(const struct rte_eth_dev *dev,
 	return ret;
 }
 
-static inline int
-dpaa2_dev_verify_filter_ops(enum rte_filter_op filter_op)
-{
-	unsigned int i;
-
-	for (i = 0; i < RTE_DIM(dpaa2_supported_filter_ops); i++) {
-		if (dpaa2_supported_filter_ops[i] == filter_op)
-			return 0;
-	}
-	return -ENOTSUP;
-}
-
 static int
-dpaa2_dev_flow_ctrl(struct rte_eth_dev *dev,
-		    enum rte_filter_type filter_type,
-				 enum rte_filter_op filter_op,
-				 void *arg)
+dpaa2_dev_flow_ops_get(struct rte_eth_dev *dev,
+		       const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
 	if (!dev)
 		return -ENODEV;
 
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (dpaa2_dev_verify_filter_ops(filter_op) < 0) {
-			ret = -ENOTSUP;
-			break;
-		}
-		*(const void **)arg = &dpaa2_flow_ops;
-		dpaa2_filter_type |= filter_type;
-		break;
-	default:
-		RTE_LOG(ERR, PMD, "Filter type (%d) not supported",
-			filter_type);
-		ret = -ENOTSUP;
-		break;
-	}
-	return ret;
+	*ops = &dpaa2_flow_ops;
+	return 0;
 }
 
 static void
@@ -2453,7 +2419,7 @@ static struct eth_dev_ops dpaa2_ethdev_ops = {
 	.mac_addr_set         = dpaa2_dev_set_mac_addr,
 	.rss_hash_update      = dpaa2_dev_rss_hash_update,
 	.rss_hash_conf_get    = dpaa2_dev_rss_hash_conf_get,
-	.filter_ctrl          = dpaa2_dev_flow_ctrl,
+	.flow_ops_get         = dpaa2_dev_flow_ops_get,
 	.rxq_info_get	      = dpaa2_rxq_info_get,
 	.txq_info_get	      = dpaa2_txq_info_get,
 	.tm_ops_get	      = dpaa2_tm_ops_get,
diff --git a/drivers/net/dpaa2/dpaa2_flow.c b/drivers/net/dpaa2/dpaa2_flow.c
index 29f1f2e654..bfe17c350a 100644
--- a/drivers/net/dpaa2/dpaa2_flow.c
+++ b/drivers/net/dpaa2/dpaa2_flow.c
@@ -89,8 +89,6 @@ enum rte_flow_action_type dpaa2_supported_action_type[] = {
 /* Max of enum rte_flow_item_type + 1, for both IPv4 and IPv6*/
 #define DPAA2_FLOW_ITEM_TYPE_GENERIC_IP (RTE_FLOW_ITEM_TYPE_META + 1)
 
-enum rte_filter_type dpaa2_filter_type = RTE_ETH_FILTER_NONE;
-
 #ifndef __cplusplus
 static const struct rte_flow_item_eth dpaa2_flow_item_eth_mask = {
 	.dst.addr_bytes = "\xff\xff\xff\xff\xff\xff",
@@ -3969,24 +3967,15 @@ struct rte_flow *dpaa2_flow_create(struct rte_eth_dev *dev,
 	flow->ipaddr_rule.fs_ipdst_offset =
 		IP_ADDRESS_OFFSET_INVALID;
 
-	switch (dpaa2_filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		ret = dpaa2_generic_flow_set(flow, dev, attr, pattern,
-					     actions, error);
-		if (ret < 0) {
-			if (error->type > RTE_FLOW_ERROR_TYPE_ACTION)
-				rte_flow_error_set(error, EPERM,
-						RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
-						attr, "unknown");
-			DPAA2_PMD_ERR(
-			"Failure to create flow, return code (%d)", ret);
-			goto creation_error;
-		}
-		break;
-	default:
-		DPAA2_PMD_ERR("Filter type (%d) not supported",
-		dpaa2_filter_type);
-		break;
+	ret = dpaa2_generic_flow_set(flow, dev, attr, pattern,
+			actions, error);
+	if (ret < 0) {
+		if (error->type > RTE_FLOW_ERROR_TYPE_ACTION)
+			rte_flow_error_set(error, EPERM,
+					RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
+					attr, "unknown");
+		DPAA2_PMD_ERR("Failure to create flow, return code (%d)", ret);
+		goto creation_error;
 	}
 
 	return flow;
diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c
index 395dc3f5aa..7c0451ebe2 100644
--- a/drivers/net/e1000/igb_ethdev.c
+++ b/drivers/net/e1000/igb_ethdev.c
@@ -194,10 +194,8 @@ static int igb_add_5tuple_filter_82576(struct rte_eth_dev *dev,
 			struct rte_eth_ntuple_filter *ntuple_filter);
 static int igb_remove_5tuple_filter_82576(struct rte_eth_dev *dev,
 			struct rte_eth_ntuple_filter *ntuple_filter);
-static int eth_igb_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg);
+static int eth_igb_flow_ops_get(struct rte_eth_dev *dev,
+				const struct rte_flow_ops **ops);
 static int eth_igb_get_reg_length(struct rte_eth_dev *dev);
 static int eth_igb_get_regs(struct rte_eth_dev *dev,
 		struct rte_dev_reg_info *regs);
@@ -374,7 +372,7 @@ static const struct eth_dev_ops eth_igb_ops = {
 	.reta_query           = eth_igb_rss_reta_query,
 	.rss_hash_update      = eth_igb_rss_hash_update,
 	.rss_hash_conf_get    = eth_igb_rss_hash_conf_get,
-	.filter_ctrl          = eth_igb_filter_ctrl,
+	.flow_ops_get         = eth_igb_flow_ops_get,
 	.set_mc_addr_list     = eth_igb_set_mc_addr_list,
 	.rxq_info_get         = igb_rxq_info_get,
 	.txq_info_get         = igb_txq_info_get,
@@ -4579,26 +4577,11 @@ igb_add_del_ethertype_filter(struct rte_eth_dev *dev,
 }
 
 static int
-eth_igb_filter_ctrl(struct rte_eth_dev *dev __rte_unused,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg)
+eth_igb_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		     const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &igb_flow_ops;
-		break;
-	default:
-		PMD_DRV_LOG(WARNING, "Filter type (%d) not supported",
-							filter_type);
-		break;
-	}
-
-	return ret;
+	*ops = &igb_flow_ops;
+	return 0;
 }
 
 static int
diff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c
index b3f441c8f7..38da5e8ce4 100644
--- a/drivers/net/enic/enic_ethdev.c
+++ b/drivers/net/enic/enic_ethdev.c
@@ -74,13 +74,10 @@ static const struct vic_speed_capa {
 RTE_LOG_REGISTER(enic_pmd_logtype, pmd.net.enic, INFO);
 
 static int
-enicpmd_dev_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg)
+enicpmd_dev_flow_ops_get(struct rte_eth_dev *dev,
+			 const struct rte_flow_ops **ops)
 {
 	struct enic *enic = pmd_priv(dev);
-	int ret = 0;
 
 	ENICPMD_FUNC_TRACE();
 
@@ -90,23 +87,12 @@ enicpmd_dev_filter_ctrl(struct rte_eth_dev *dev,
 	 */
 	if (enic->geneve_opt_enabled)
 		return -ENOTSUP;
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		if (enic->flow_filter_mode == FILTER_FLOWMAN)
-			*(const void **)arg = &enic_fm_flow_ops;
-		else
-			*(const void **)arg = &enic_flow_ops;
-		break;
-	default:
-		dev_warning(enic, "Filter type (%d) not supported",
-			filter_type);
-		ret = -EINVAL;
-		break;
-	}
 
-	return ret;
+	if (enic->flow_filter_mode == FILTER_FLOWMAN)
+		*ops = &enic_fm_flow_ops;
+	else
+		*ops = &enic_flow_ops;
+	return 0;
 }
 
 static void enicpmd_dev_tx_queue_release(void *txq)
@@ -1121,7 +1107,7 @@ static const struct eth_dev_ops enicpmd_eth_dev_ops = {
 	.mac_addr_remove      = enicpmd_remove_mac_addr,
 	.mac_addr_set         = enicpmd_set_mac_addr,
 	.set_mc_addr_list     = enicpmd_set_mc_addr_list,
-	.filter_ctrl          = enicpmd_dev_filter_ctrl,
+	.flow_ops_get         = enicpmd_dev_flow_ops_get,
 	.reta_query           = enicpmd_dev_rss_reta_query,
 	.reta_update          = enicpmd_dev_rss_reta_update,
 	.rss_hash_conf_get    = enicpmd_dev_rss_hash_conf_get,
diff --git a/drivers/net/enic/enic_vf_representor.c b/drivers/net/enic/enic_vf_representor.c
index f7b79c1c4e..79dd6e5640 100644
--- a/drivers/net/enic/enic_vf_representor.c
+++ b/drivers/net/enic/enic_vf_representor.c
@@ -377,34 +377,21 @@ static const struct rte_flow_ops enic_vf_flow_ops = {
 };
 
 static int
-enic_vf_filter_ctrl(struct rte_eth_dev *eth_dev,
-		    enum rte_filter_type filter_type,
-		    enum rte_filter_op filter_op,
-		    void *arg)
+enic_vf_flow_ops_get(struct rte_eth_dev *eth_dev,
+		     const struct rte_flow_ops **ops)
 {
 	struct enic_vf_representor *vf;
-	int ret = 0;
 
 	ENICPMD_FUNC_TRACE();
 	vf = eth_dev->data->dev_private;
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		if (vf->enic.flow_filter_mode == FILTER_FLOWMAN) {
-			*(const void **)arg = &enic_vf_flow_ops;
-		} else {
-			ENICPMD_LOG(WARNING, "VF representors require flowman support for rte_flow API");
-			ret = -EINVAL;
-		}
-		break;
-	default:
-		ENICPMD_LOG(WARNING, "Filter type (%d) not supported",
-			    filter_type);
-		ret = -EINVAL;
-		break;
+	if (vf->enic.flow_filter_mode != FILTER_FLOWMAN) {
+		ENICPMD_LOG(WARNING,
+				"VF representors require flowman support for rte_flow API");
+		return -EINVAL;
 	}
-	return ret;
+
+	*ops = &enic_vf_flow_ops;
+	return 0;
 }
 
 static int enic_vf_link_update(struct rte_eth_dev *eth_dev,
@@ -566,7 +553,7 @@ static const struct eth_dev_ops enic_vf_representor_dev_ops = {
 	.dev_start            = enic_vf_dev_start,
 	.dev_stop             = enic_vf_dev_stop,
 	.dev_close            = enic_vf_dev_close,
-	.filter_ctrl          = enic_vf_filter_ctrl,
+	.flow_ops_get         = enic_vf_flow_ops_get,
 	.link_update          = enic_vf_link_update,
 	.promiscuous_enable   = enic_vf_promiscuous_enable,
 	.promiscuous_disable  = enic_vf_promiscuous_disable,
diff --git a/drivers/net/failsafe/failsafe_ops.c b/drivers/net/failsafe/failsafe_ops.c
index 1343777d61..5ff33e03e0 100644
--- a/drivers/net/failsafe/failsafe_ops.c
+++ b/drivers/net/failsafe/failsafe_ops.c
@@ -1514,17 +1514,11 @@ fs_rss_hash_update(struct rte_eth_dev *dev,
 }
 
 static int
-fs_filter_ctrl(struct rte_eth_dev *dev __rte_unused,
-		enum rte_filter_type type,
-		enum rte_filter_op op,
-		void *arg)
+fs_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		const struct rte_flow_ops **ops)
 {
-	if (type == RTE_ETH_FILTER_GENERIC &&
-	    op == RTE_ETH_FILTER_GET) {
-		*(const void **)arg = &fs_flow_ops;
-		return 0;
-	}
-	return -ENOTSUP;
+	*ops = &fs_flow_ops;
+	return 0;
 }
 
 const struct eth_dev_ops failsafe_ops = {
@@ -1565,5 +1559,5 @@ const struct eth_dev_ops failsafe_ops = {
 	.mac_addr_set = fs_mac_addr_set,
 	.set_mc_addr_list = fs_set_mc_addr_list,
 	.rss_hash_update = fs_rss_hash_update,
-	.filter_ctrl = fs_filter_ctrl,
+	.flow_ops_get = fs_flow_ops_get,
 };
diff --git a/drivers/net/hinic/hinic_pmd_ethdev.c b/drivers/net/hinic/hinic_pmd_ethdev.c
index 1d6b710c9f..2352dd1615 100644
--- a/drivers/net/hinic/hinic_pmd_ethdev.c
+++ b/drivers/net/hinic/hinic_pmd_ethdev.c
@@ -2504,42 +2504,20 @@ static int hinic_set_mc_addr_list(struct rte_eth_dev *dev,
 }
 
 /**
- * DPDK callback to manage filter control operations
+ * DPDK callback to get flow operations
  *
  * @param dev
  *   Pointer to Ethernet device structure.
- * @param filter_type
- *   Filter type, which just supports generic type.
- * @param filter_op
- *   Filter operation to perform.
- * @param arg
+ * @param ops
  *   Pointer to operation-specific structure.
  *
  * @return
  *   0 on success, negative error value otherwise.
  */
-static int hinic_dev_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg)
+static int hinic_dev_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+				  const struct rte_flow_ops **ops)
 {
-	struct hinic_nic_dev *nic_dev = HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev);
-	int func_id = hinic_global_func_id(nic_dev->hwdev);
-
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &hinic_flow_ops;
-		break;
-	default:
-		PMD_DRV_LOG(INFO, "Filter type (%d) not supported",
-			filter_type);
-		return -EINVAL;
-	}
-
-	PMD_DRV_LOG(INFO, "Set filter_ctrl succeed, func_id: 0x%x, filter_type: 0x%x,"
-			"filter_op: 0x%x.", func_id, filter_type, filter_op);
+	*ops = &hinic_flow_ops;
 	return 0;
 }
 
@@ -3047,7 +3025,7 @@ static const struct eth_dev_ops hinic_pmd_ops = {
 	.mac_addr_remove               = hinic_mac_addr_remove,
 	.mac_addr_add                  = hinic_mac_addr_add,
 	.set_mc_addr_list              = hinic_set_mc_addr_list,
-	.filter_ctrl                   = hinic_dev_filter_ctrl,
+	.flow_ops_get                  = hinic_dev_flow_ops_get,
 };
 
 static const struct eth_dev_ops hinic_pmd_vf_ops = {
@@ -3082,7 +3060,7 @@ static const struct eth_dev_ops hinic_pmd_vf_ops = {
 	.mac_addr_remove               = hinic_mac_addr_remove,
 	.mac_addr_add                  = hinic_mac_addr_add,
 	.set_mc_addr_list              = hinic_set_mc_addr_list,
-	.filter_ctrl                   = hinic_dev_filter_ctrl,
+	.flow_ops_get                  = hinic_dev_flow_ops_get,
 };
 
 static int hinic_func_init(struct rte_eth_dev *eth_dev)
diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c
index 9cbcc13de8..f6d47369b2 100644
--- a/drivers/net/hns3/hns3_ethdev.c
+++ b/drivers/net/hns3/hns3_ethdev.c
@@ -6550,7 +6550,7 @@ static const struct eth_dev_ops hns3_eth_dev_ops = {
 	.rss_hash_conf_get      = hns3_dev_rss_hash_conf_get,
 	.reta_update            = hns3_dev_rss_reta_update,
 	.reta_query             = hns3_dev_rss_reta_query,
-	.filter_ctrl            = hns3_dev_filter_ctrl,
+	.flow_ops_get           = hns3_dev_flow_ops_get,
 	.vlan_filter_set        = hns3_vlan_filter_set,
 	.vlan_tpid_set          = hns3_vlan_tpid_set,
 	.vlan_offload_set       = hns3_vlan_offload_set,
diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h
index 932600d05b..d180dc1e7f 100644
--- a/drivers/net/hns3/hns3_ethdev.h
+++ b/drivers/net/hns3/hns3_ethdev.h
@@ -963,9 +963,8 @@ hns3_test_and_clear_bit(unsigned int nr, volatile uint64_t *addr)
 }
 
 int hns3_buffer_alloc(struct hns3_hw *hw);
-int hns3_dev_filter_ctrl(struct rte_eth_dev *dev,
-			 enum rte_filter_type filter_type,
-			 enum rte_filter_op filter_op, void *arg);
+int hns3_dev_flow_ops_get(struct rte_eth_dev *dev,
+			  const struct rte_flow_ops **ops);
 bool hns3_is_reset_pending(struct hns3_adapter *hns);
 bool hns3vf_is_reset_pending(struct hns3_adapter *hns);
 void hns3_update_link_status_and_event(struct hns3_hw *hw);
diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c
index fd20c522dc..a35e1d9aad 100644
--- a/drivers/net/hns3/hns3_ethdev_vf.c
+++ b/drivers/net/hns3/hns3_ethdev_vf.c
@@ -2769,7 +2769,7 @@ static const struct eth_dev_ops hns3vf_eth_dev_ops = {
 	.rss_hash_conf_get  = hns3_dev_rss_hash_conf_get,
 	.reta_update        = hns3_dev_rss_reta_update,
 	.reta_query         = hns3_dev_rss_reta_query,
-	.filter_ctrl        = hns3_dev_filter_ctrl,
+	.flow_ops_get       = hns3_dev_flow_ops_get,
 	.vlan_filter_set    = hns3vf_vlan_filter_set,
 	.vlan_offload_set   = hns3vf_vlan_offload_set,
 	.get_reg            = hns3_get_regs,
diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c
index a016857aa5..0c4e91109c 100644
--- a/drivers/net/hns3/hns3_flow.c
+++ b/drivers/net/hns3/hns3_flow.c
@@ -2001,34 +2001,16 @@ static const struct rte_flow_ops hns3_flow_ops = {
 	.isolate = NULL,
 };
 
-/*
- * The entry of flow API.
- * @param dev
- *   Pointer to Ethernet device.
- * @return
- *   0 on success, a negative errno value otherwise is set.
- */
 int
-hns3_dev_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op, void *arg)
+hns3_dev_flow_ops_get(struct rte_eth_dev *dev,
+		      const struct rte_flow_ops **ops)
 {
 	struct hns3_hw *hw;
-	int ret = 0;
 
 	hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		if (hw->adapter_state >= HNS3_NIC_CLOSED)
-			return -ENODEV;
-		*(const void **)arg = &hns3_flow_ops;
-		break;
-	default:
-		hns3_err(hw, "Filter type (%d) not supported", filter_type);
-		ret = -EOPNOTSUPP;
-		break;
-	}
+	if (hw->adapter_state >= HNS3_NIC_CLOSED)
+		return -ENODEV;
 
-	return ret;
+	*ops = &hns3_flow_ops;
+	return 0;
 }
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index d7cd049891..e8634755f2 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -319,10 +319,8 @@ static int i40e_dev_udp_tunnel_port_add(struct rte_eth_dev *dev,
 static int i40e_dev_udp_tunnel_port_del(struct rte_eth_dev *dev,
 					struct rte_eth_udp_tunnel *udp_tunnel);
 static void i40e_filter_input_set_init(struct i40e_pf *pf);
-static int i40e_dev_filter_ctrl(struct rte_eth_dev *dev,
-				enum rte_filter_type filter_type,
-				enum rte_filter_op filter_op,
-				void *arg);
+static int i40e_dev_flow_ops_get(struct rte_eth_dev *dev,
+				 const struct rte_flow_ops **ops);
 static int i40e_dev_get_dcb_info(struct rte_eth_dev *dev,
 				  struct rte_eth_dcb_info *dcb_info);
 static int i40e_dev_sync_phy_type(struct i40e_hw *hw);
@@ -484,7 +482,7 @@ static const struct eth_dev_ops i40e_eth_dev_ops = {
 	.rss_hash_conf_get            = i40e_dev_rss_hash_conf_get,
 	.udp_tunnel_port_add          = i40e_dev_udp_tunnel_port_add,
 	.udp_tunnel_port_del          = i40e_dev_udp_tunnel_port_del,
-	.filter_ctrl                  = i40e_dev_filter_ctrl,
+	.flow_ops_get                 = i40e_dev_flow_ops_get,
 	.rxq_info_get                 = i40e_rxq_info_get,
 	.txq_info_get                 = i40e_txq_info_get,
 	.rx_burst_mode_get            = i40e_rx_burst_mode_get,
@@ -9785,30 +9783,14 @@ i40e_ethertype_filter_set(struct i40e_pf *pf,
 }
 
 static int
-i40e_dev_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg)
+i40e_dev_flow_ops_get(struct rte_eth_dev *dev,
+		      const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
 	if (dev == NULL)
 		return -EINVAL;
 
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &i40e_flow_ops;
-		break;
-	default:
-		PMD_DRV_LOG(WARNING, "Filter type (%d) not supported",
-							filter_type);
-		ret = -EINVAL;
-		break;
-	}
-
-	return ret;
+	*ops = &i40e_flow_ops;
+	return 0;
 }
 
 /*
diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c
index 4d37722022..e3933cde26 100644
--- a/drivers/net/iavf/iavf_ethdev.c
+++ b/drivers/net/iavf/iavf_ethdev.c
@@ -117,10 +117,8 @@ static int iavf_dev_rx_queue_intr_enable(struct rte_eth_dev *dev,
 					uint16_t queue_id);
 static int iavf_dev_rx_queue_intr_disable(struct rte_eth_dev *dev,
 					 uint16_t queue_id);
-static int iavf_dev_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg);
+static int iavf_dev_flow_ops_get(struct rte_eth_dev *dev,
+				 const struct rte_flow_ops **ops);
 static int iavf_set_mc_addr_list(struct rte_eth_dev *dev,
 			struct rte_ether_addr *mc_addrs,
 			uint32_t mc_addrs_num);
@@ -195,7 +193,7 @@ static const struct eth_dev_ops iavf_eth_dev_ops = {
 	.mtu_set                    = iavf_dev_mtu_set,
 	.rx_queue_intr_enable       = iavf_dev_rx_queue_intr_enable,
 	.rx_queue_intr_disable      = iavf_dev_rx_queue_intr_disable,
-	.filter_ctrl                = iavf_dev_filter_ctrl,
+	.flow_ops_get               = iavf_dev_flow_ops_get,
 	.tx_done_cleanup	    = iavf_dev_tx_done_cleanup,
 };
 
@@ -2070,30 +2068,14 @@ iavf_dev_interrupt_handler(void *param)
 }
 
 static int
-iavf_dev_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg)
+iavf_dev_flow_ops_get(struct rte_eth_dev *dev,
+		      const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
 	if (!dev)
 		return -EINVAL;
 
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &iavf_flow_ops;
-		break;
-	default:
-		PMD_DRV_LOG(WARNING, "Filter type (%d) not supported",
-			    filter_type);
-		ret = -EINVAL;
-		break;
-	}
-
-	return ret;
+	*ops = &iavf_flow_ops;
+	return 0;
 }
 
 static void
diff --git a/drivers/net/ice/ice_dcf_ethdev.c b/drivers/net/ice/ice_dcf_ethdev.c
index e0772295e9..86600959f8 100644
--- a/drivers/net/ice/ice_dcf_ethdev.c
+++ b/drivers/net/ice/ice_dcf_ethdev.c
@@ -743,31 +743,14 @@ ice_dcf_dev_allmulticast_disable(__rte_unused struct rte_eth_dev *dev)
 }
 
 static int
-ice_dcf_dev_filter_ctrl(struct rte_eth_dev *dev,
-			enum rte_filter_type filter_type,
-			enum rte_filter_op filter_op,
-			void *arg)
+ice_dcf_dev_flow_ops_get(struct rte_eth_dev *dev,
+			 const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
 	if (!dev)
 		return -EINVAL;
 
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &ice_flow_ops;
-		break;
-
-	default:
-		PMD_DRV_LOG(WARNING, "Filter type (%d) not supported",
-			    filter_type);
-		ret = -EINVAL;
-		break;
-	}
-
-	return ret;
+	*ops = &ice_flow_ops;
+	return 0;
 }
 
 #define ICE_DCF_32_BIT_WIDTH (CHAR_BIT * 4)
@@ -984,7 +967,7 @@ static const struct eth_dev_ops ice_dcf_eth_dev_ops = {
 	.promiscuous_disable     = ice_dcf_dev_promiscuous_disable,
 	.allmulticast_enable     = ice_dcf_dev_allmulticast_enable,
 	.allmulticast_disable    = ice_dcf_dev_allmulticast_disable,
-	.filter_ctrl             = ice_dcf_dev_filter_ctrl,
+	.flow_ops_get            = ice_dcf_dev_flow_ops_get,
 	.udp_tunnel_port_add	 = ice_dcf_dev_udp_tunnel_port_add,
 	.udp_tunnel_port_del	 = ice_dcf_dev_udp_tunnel_port_del,
 };
diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c
index dfd99ace94..f49fad4aba 100644
--- a/drivers/net/ice/ice_ethdev.c
+++ b/drivers/net/ice/ice_ethdev.c
@@ -129,10 +129,8 @@ static int ice_xstats_get(struct rte_eth_dev *dev,
 static int ice_xstats_get_names(struct rte_eth_dev *dev,
 				struct rte_eth_xstat_name *xstats_names,
 				unsigned int limit);
-static int ice_dev_filter_ctrl(struct rte_eth_dev *dev,
-			enum rte_filter_type filter_type,
-			enum rte_filter_op filter_op,
-			void *arg);
+static int ice_dev_flow_ops_get(struct rte_eth_dev *dev,
+				const struct rte_flow_ops **ops);
 static int ice_dev_udp_tunnel_port_add(struct rte_eth_dev *dev,
 			struct rte_eth_udp_tunnel *udp_tunnel);
 static int ice_dev_udp_tunnel_port_del(struct rte_eth_dev *dev,
@@ -215,7 +213,7 @@ static const struct eth_dev_ops ice_eth_dev_ops = {
 	.xstats_get                   = ice_xstats_get,
 	.xstats_get_names             = ice_xstats_get_names,
 	.xstats_reset                 = ice_stats_reset,
-	.filter_ctrl                  = ice_dev_filter_ctrl,
+	.flow_ops_get                 = ice_dev_flow_ops_get,
 	.udp_tunnel_port_add          = ice_dev_udp_tunnel_port_add,
 	.udp_tunnel_port_del          = ice_dev_udp_tunnel_port_del,
 	.tx_done_cleanup              = ice_tx_done_cleanup,
@@ -5259,30 +5257,14 @@ static int ice_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
 }
 
 static int
-ice_dev_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg)
+ice_dev_flow_ops_get(struct rte_eth_dev *dev,
+		     const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
 	if (!dev)
 		return -EINVAL;
 
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &ice_flow_ops;
-		break;
-	default:
-		PMD_DRV_LOG(WARNING, "Filter type (%d) not supported",
-					filter_type);
-		ret = -EINVAL;
-		break;
-	}
-
-	return ret;
+	*ops = &ice_flow_ops;
+	return 0;
 }
 
 /* Add UDP tunneling port */
diff --git a/drivers/net/igc/igc_ethdev.c b/drivers/net/igc/igc_ethdev.c
index dbaa7a83e5..25abd4ddc3 100644
--- a/drivers/net/igc/igc_ethdev.c
+++ b/drivers/net/igc/igc_ethdev.c
@@ -297,7 +297,7 @@ static const struct eth_dev_ops eth_igc_ops = {
 	.vlan_offload_set	= eth_igc_vlan_offload_set,
 	.vlan_tpid_set		= eth_igc_vlan_tpid_set,
 	.vlan_strip_queue_set	= eth_igc_vlan_strip_queue_set,
-	.filter_ctrl		= eth_igc_filter_ctrl,
+	.flow_ops_get		= eth_igc_flow_ops_get,
 };
 
 /*
diff --git a/drivers/net/igc/igc_filter.c b/drivers/net/igc/igc_filter.c
index 836621d4c1..51fcabfb59 100644
--- a/drivers/net/igc/igc_filter.c
+++ b/drivers/net/igc/igc_filter.c
@@ -369,24 +369,9 @@ igc_clear_all_filter(struct rte_eth_dev *dev)
 }
 
 int
-eth_igc_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type,
-		enum rte_filter_op filter_op, void *arg)
+eth_igc_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		     const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
-	RTE_SET_USED(dev);
-
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &igc_flow_ops;
-		break;
-	default:
-		PMD_DRV_LOG(WARNING, "Filter type (%d) not supported",
-							filter_type);
-		ret = -EINVAL;
-	}
-
-	return ret;
+	*ops = &igc_flow_ops;
+	return 0;
 }
diff --git a/drivers/net/igc/igc_filter.h b/drivers/net/igc/igc_filter.h
index df8516bc40..781d270def 100644
--- a/drivers/net/igc/igc_filter.h
+++ b/drivers/net/igc/igc_filter.h
@@ -29,9 +29,8 @@ int igc_set_syn_filter(struct rte_eth_dev *dev,
 		const struct igc_syn_filter *filter);
 void igc_clear_syn_filter(struct rte_eth_dev *dev);
 void igc_clear_all_filter(struct rte_eth_dev *dev);
-int
-eth_igc_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type,
-		enum rte_filter_op filter_op, void *arg);
+int eth_igc_flow_ops_get(struct rte_eth_dev *dev,
+			 const struct rte_flow_ops **ops);
 
 #ifdef __cplusplus
 }
diff --git a/drivers/net/ipn3ke/ipn3ke_representor.c b/drivers/net/ipn3ke/ipn3ke_representor.c
index 856d21ef9b..589d9fa587 100644
--- a/drivers/net/ipn3ke/ipn3ke_representor.c
+++ b/drivers/net/ipn3ke/ipn3ke_representor.c
@@ -2821,11 +2821,9 @@ ipn3ke_rpst_mtu_set(struct rte_eth_dev *ethdev, uint16_t mtu)
 }
 
 static int
-ipn3ke_afu_filter_ctrl(struct rte_eth_dev *ethdev,
-	enum rte_filter_type filter_type, enum rte_filter_op filter_op,
-	void *arg)
+ipn3ke_afu_flow_ops_get(struct rte_eth_dev *ethdev,
+			const struct rte_flow_ops **ops)
 {
-	int ret = 0;
 	struct ipn3ke_hw *hw;
 	struct ipn3ke_rpst *rpst;
 
@@ -2836,27 +2834,13 @@ ipn3ke_afu_filter_ctrl(struct rte_eth_dev *ethdev,
 	rpst = IPN3KE_DEV_PRIVATE_TO_RPST(ethdev);
 
 	if (hw->acc_flow)
-		switch (filter_type) {
-		case RTE_ETH_FILTER_GENERIC:
-			if (filter_op != RTE_ETH_FILTER_GET)
-				return -EINVAL;
-			*(const void **)arg = &ipn3ke_flow_ops;
-			break;
-		default:
-			IPN3KE_AFU_PMD_WARN("Filter type (%d) not supported",
-					filter_type);
-			ret = -EINVAL;
-			break;
-		}
+		*ops = &ipn3ke_flow_ops;
 	else if (rpst->i40e_pf_eth)
-		(*rpst->i40e_pf_eth->dev_ops->filter_ctrl)(ethdev,
-							filter_type,
-							filter_op,
-							arg);
+		(*rpst->i40e_pf_eth->dev_ops->flow_ops_get)(ethdev, ops);
 	else
 		return -EINVAL;
 
-	return ret;
+	return 0;
 }
 
 static const struct eth_dev_ops ipn3ke_rpst_dev_ops = {
@@ -2874,7 +2858,7 @@ static const struct eth_dev_ops ipn3ke_rpst_dev_ops = {
 	.stats_reset          = ipn3ke_rpst_stats_reset,
 	.xstats_reset         = ipn3ke_rpst_stats_reset,
 
-	.filter_ctrl          = ipn3ke_afu_filter_ctrl,
+	.flow_ops_get         = ipn3ke_afu_flow_ops_get,
 
 	.rx_queue_start       = ipn3ke_rpst_rx_queue_start,
 	.rx_queue_stop        = ipn3ke_rpst_rx_queue_stop,
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index 761a0f26bb..d5581a243a 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -304,10 +304,8 @@ static int ixgbe_add_5tuple_filter(struct rte_eth_dev *dev,
 			struct ixgbe_5tuple_filter *filter);
 static void ixgbe_remove_5tuple_filter(struct rte_eth_dev *dev,
 			struct ixgbe_5tuple_filter *filter);
-static int ixgbe_dev_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg);
+static int ixgbe_dev_flow_ops_get(struct rte_eth_dev *dev,
+				  const struct rte_flow_ops **ops);
 static int ixgbevf_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu);
 
 static int ixgbe_dev_set_mc_addr_list(struct rte_eth_dev *dev,
@@ -538,7 +536,7 @@ static const struct eth_dev_ops ixgbe_eth_dev_ops = {
 	.reta_query           = ixgbe_dev_rss_reta_query,
 	.rss_hash_update      = ixgbe_dev_rss_hash_update,
 	.rss_hash_conf_get    = ixgbe_dev_rss_hash_conf_get,
-	.filter_ctrl          = ixgbe_dev_filter_ctrl,
+	.flow_ops_get         = ixgbe_dev_flow_ops_get,
 	.set_mc_addr_list     = ixgbe_dev_set_mc_addr_list,
 	.rxq_info_get         = ixgbe_rxq_info_get,
 	.txq_info_get         = ixgbe_txq_info_get,
@@ -6798,27 +6796,11 @@ ixgbe_add_del_ethertype_filter(struct rte_eth_dev *dev,
 }
 
 static int
-ixgbe_dev_filter_ctrl(__rte_unused struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg)
+ixgbe_dev_flow_ops_get(__rte_unused struct rte_eth_dev *dev,
+		       const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &ixgbe_flow_ops;
-		break;
-	default:
-		PMD_DRV_LOG(WARNING, "Filter type (%d) not supported",
-							filter_type);
-		ret = -EINVAL;
-		break;
-	}
-
-	return ret;
+	*ops = &ixgbe_flow_ops;
+	return 0;
 }
 
 static u8 *
diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c
index 041c1934f5..d048d21033 100644
--- a/drivers/net/mlx4/mlx4.c
+++ b/drivers/net/mlx4/mlx4.c
@@ -437,7 +437,7 @@ static const struct eth_dev_ops mlx4_dev_ops = {
 	.flow_ctrl_get = mlx4_flow_ctrl_get,
 	.flow_ctrl_set = mlx4_flow_ctrl_set,
 	.mtu_set = mlx4_mtu_set,
-	.filter_ctrl = mlx4_filter_ctrl,
+	.flow_ops_get = mlx4_flow_ops_get,
 	.rx_queue_intr_enable = mlx4_rx_intr_enable,
 	.rx_queue_intr_disable = mlx4_rx_intr_disable,
 	.is_removed = mlx4_is_removed,
diff --git a/drivers/net/mlx4/mlx4_flow.c b/drivers/net/mlx4/mlx4_flow.c
index b8ecfa829b..43a65abcc0 100644
--- a/drivers/net/mlx4/mlx4_flow.c
+++ b/drivers/net/mlx4/mlx4_flow.c
@@ -1590,37 +1590,19 @@ static const struct rte_flow_ops mlx4_flow_ops = {
 };
 
 /**
- * Manage filter operations.
+ * Get rte_flow callbacks.
  *
  * @param dev
  *   Pointer to Ethernet device structure.
- * @param filter_type
- *   Filter type.
- * @param filter_op
- *   Operation to perform.
- * @param arg
+ * @param ops
  *   Pointer to operation-specific structure.
  *
- * @return
- *   0 on success, negative errno value otherwise and rte_errno is set.
+ * @return 0
  */
 int
-mlx4_filter_ctrl(struct rte_eth_dev *dev,
-		 enum rte_filter_type filter_type,
-		 enum rte_filter_op filter_op,
-		 void *arg)
+mlx4_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		  const struct rte_flow_ops **ops)
 {
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			break;
-		*(const void **)arg = &mlx4_flow_ops;
-		return 0;
-	default:
-		ERROR("%p: filter type (%d) not supported",
-		      (void *)dev, filter_type);
-		break;
-	}
-	rte_errno = ENOTSUP;
-	return -rte_errno;
+	*ops = &mlx4_flow_ops;
+	return 0;
 }
diff --git a/drivers/net/mlx4/mlx4_flow.h b/drivers/net/mlx4/mlx4_flow.h
index e4366f28bb..5e82df6bd6 100644
--- a/drivers/net/mlx4/mlx4_flow.h
+++ b/drivers/net/mlx4/mlx4_flow.h
@@ -51,9 +51,6 @@ uint64_t mlx4_conv_rss_types(struct mlx4_priv *priv, uint64_t types,
 			     int verbs_to_dpdk);
 int mlx4_flow_sync(struct mlx4_priv *priv, struct rte_flow_error *error);
 void mlx4_flow_clean(struct mlx4_priv *priv);
-int mlx4_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg);
+int mlx4_flow_ops_get(struct rte_eth_dev *dev, const struct rte_flow_ops **ops);
 
 #endif /* RTE_PMD_MLX4_FLOW_H_ */
diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
index abd7ff70df..d9372f0a00 100644
--- a/drivers/net/mlx5/mlx5.c
+++ b/drivers/net/mlx5/mlx5.c
@@ -1477,7 +1477,7 @@ const struct eth_dev_ops mlx5_dev_ops = {
 	.reta_query = mlx5_dev_rss_reta_query,
 	.rss_hash_update = mlx5_rss_hash_update,
 	.rss_hash_conf_get = mlx5_rss_hash_conf_get,
-	.filter_ctrl = mlx5_dev_filter_ctrl,
+	.flow_ops_get = mlx5_flow_ops_get,
 	.rxq_info_get = mlx5_rxq_info_get,
 	.txq_info_get = mlx5_txq_info_get,
 	.rx_burst_mode_get = mlx5_rx_burst_mode_get,
@@ -1562,7 +1562,7 @@ const struct eth_dev_ops mlx5_dev_ops_isolate = {
 	.mtu_set = mlx5_dev_set_mtu,
 	.vlan_strip_queue_set = mlx5_vlan_strip_queue_set,
 	.vlan_offload_set = mlx5_vlan_offload_set,
-	.filter_ctrl = mlx5_dev_filter_ctrl,
+	.flow_ops_get = mlx5_flow_ops_get,
 	.rxq_info_get = mlx5_rxq_info_get,
 	.txq_info_get = mlx5_txq_info_get,
 	.rx_burst_mode_get = mlx5_rx_burst_mode_get,
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index a281fd20ea..24aff0beab 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -1192,10 +1192,7 @@ int mlx5_flow_query(struct rte_eth_dev *dev, struct rte_flow *flow,
 		    struct rte_flow_error *error);
 int mlx5_flow_isolate(struct rte_eth_dev *dev, int enable,
 		      struct rte_flow_error *error);
-int mlx5_dev_filter_ctrl(struct rte_eth_dev *dev,
-			 enum rte_filter_type filter_type,
-			 enum rte_filter_op filter_op,
-			 void *arg);
+int mlx5_flow_ops_get(struct rte_eth_dev *dev, const struct rte_flow_ops **ops);
 int mlx5_flow_start_default(struct rte_eth_dev *dev);
 void mlx5_flow_stop_default(struct rte_eth_dev *dev);
 int mlx5_flow_verify(struct rte_eth_dev *dev);
diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c
index 773f3e63f4..29a1677164 100644
--- a/drivers/net/mlx5/mlx5_flow.c
+++ b/drivers/net/mlx5/mlx5_flow.c
@@ -6492,40 +6492,20 @@ mlx5_flow_query(struct rte_eth_dev *dev,
 }
 
 /**
- * Manage filter operations.
+ * Get rte_flow callbacks.
  *
  * @param dev
  *   Pointer to Ethernet device structure.
- * @param filter_type
- *   Filter type.
- * @param filter_op
- *   Operation to perform.
- * @param arg
+ * @param ops
  *   Pointer to operation-specific structure.
  *
- * @return
- *   0 on success, a negative errno value otherwise and rte_errno is set.
+ * @return 0
  */
 int
-mlx5_dev_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg)
+mlx5_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		  const struct rte_flow_ops **ops)
 {
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET) {
-			rte_errno = EINVAL;
-			return -rte_errno;
-		}
-		*(const void **)arg = &mlx5_flow_ops;
-		return 0;
-	default:
-		DRV_LOG(ERR, "port %u filter type (%d) not supported",
-			dev->data->port_id, filter_type);
-		rte_errno = ENOTSUP;
-		return -rte_errno;
-	}
+	*ops = &mlx5_flow_ops;
 	return 0;
 }
 
diff --git a/drivers/net/mvpp2/mrvl_ethdev.c b/drivers/net/mvpp2/mrvl_ethdev.c
index e119952340..1d41788974 100644
--- a/drivers/net/mvpp2/mrvl_ethdev.c
+++ b/drivers/net/mvpp2/mrvl_ethdev.c
@@ -2340,32 +2340,18 @@ mrvl_rss_hash_conf_get(struct rte_eth_dev *dev,
  *
  * @param dev
  *   Pointer to the device structure.
- * @param filer_type
- *   Flow filter type.
- * @param filter_op
- *   Flow filter operation.
- * @param arg
+ * @param ops
  *   Pointer to pass the flow ops.
  *
  * @return
  *   0 on success, negative error value otherwise.
  */
 static int
-mrvl_eth_filter_ctrl(struct rte_eth_dev *dev __rte_unused,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op, void *arg)
+mrvl_eth_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		      const struct rte_flow_ops **ops)
 {
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &mrvl_flow_ops;
-		return 0;
-	default:
-		MRVL_LOG(WARNING, "Filter type (%d) not supported",
-				filter_type);
-		return -EINVAL;
-	}
+	*ops = &mrvl_flow_ops;
+	return 0;
 }
 
 /**
@@ -2443,7 +2429,7 @@ static const struct eth_dev_ops mrvl_ops = {
 	.flow_ctrl_set = mrvl_flow_ctrl_set,
 	.rss_hash_update = mrvl_rss_hash_update,
 	.rss_hash_conf_get = mrvl_rss_hash_conf_get,
-	.filter_ctrl = mrvl_eth_filter_ctrl,
+	.flow_ops_get = mrvl_eth_flow_ops_get,
 	.mtr_ops_get = mrvl_mtr_ops_get,
 	.tm_ops_get = mrvl_tm_ops_get,
 };
diff --git a/drivers/net/octeontx2/otx2_ethdev.c b/drivers/net/octeontx2/otx2_ethdev.c
index e9fbbca4da..bacf180a6d 100644
--- a/drivers/net/octeontx2/otx2_ethdev.c
+++ b/drivers/net/octeontx2/otx2_ethdev.c
@@ -2322,7 +2322,7 @@ static const struct eth_dev_ops otx2_eth_dev_ops = {
 	.tx_done_cleanup          = otx2_nix_tx_done_cleanup,
 	.set_queue_rate_limit     = otx2_nix_tm_set_queue_rate_limit,
 	.pool_ops_supported       = otx2_nix_pool_ops_supported,
-	.filter_ctrl              = otx2_nix_dev_filter_ctrl,
+	.flow_ops_get             = otx2_nix_dev_flow_ops_get,
 	.get_module_info          = otx2_nix_get_module_info,
 	.get_module_eeprom        = otx2_nix_get_module_eeprom,
 	.fw_version_get           = otx2_nix_fw_version_get,
diff --git a/drivers/net/octeontx2/otx2_ethdev.h b/drivers/net/octeontx2/otx2_ethdev.h
index 99f0469d89..7391f09b8a 100644
--- a/drivers/net/octeontx2/otx2_ethdev.h
+++ b/drivers/net/octeontx2/otx2_ethdev.h
@@ -396,9 +396,8 @@ otx2_eth_pmd_priv(struct rte_eth_dev *eth_dev)
 /* Ops */
 int otx2_nix_info_get(struct rte_eth_dev *eth_dev,
 		      struct rte_eth_dev_info *dev_info);
-int otx2_nix_dev_filter_ctrl(struct rte_eth_dev *eth_dev,
-			     enum rte_filter_type filter_type,
-			     enum rte_filter_op filter_op, void *arg);
+int otx2_nix_dev_flow_ops_get(struct rte_eth_dev *eth_dev,
+			      const struct rte_flow_ops **ops);
 int otx2_nix_fw_version_get(struct rte_eth_dev *eth_dev, char *fw_version,
 			    size_t fw_size);
 int otx2_nix_get_module_info(struct rte_eth_dev *eth_dev,
diff --git a/drivers/net/octeontx2/otx2_ethdev_ops.c b/drivers/net/octeontx2/otx2_ethdev_ops.c
index 963cc285ed..9e3f80937d 100644
--- a/drivers/net/octeontx2/otx2_ethdev_ops.c
+++ b/drivers/net/octeontx2/otx2_ethdev_ops.c
@@ -471,24 +471,11 @@ otx2_nix_pool_ops_supported(struct rte_eth_dev *eth_dev, const char *pool)
 }
 
 int
-otx2_nix_dev_filter_ctrl(struct rte_eth_dev *eth_dev,
-			 enum rte_filter_type filter_type,
-			 enum rte_filter_op filter_op, void *arg)
+otx2_nix_dev_flow_ops_get(struct rte_eth_dev *eth_dev __rte_unused,
+			  const struct rte_flow_ops **ops)
 {
-	RTE_SET_USED(eth_dev);
-
-	if (filter_type != RTE_ETH_FILTER_GENERIC) {
-		otx2_err("Unsupported filter type %d", filter_type);
-		return -ENOTSUP;
-	}
-
-	if (filter_op == RTE_ETH_FILTER_GET) {
-		*(const void **)arg = &otx2_flow_ops;
-		return 0;
-	}
-
-	otx2_err("Invalid filter_op %d", filter_op);
-	return -EINVAL;
+	*ops = &otx2_flow_ops;
+	return 0;
 }
 
 static struct cgx_fw_data *
diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c
index ab5f5b1065..ff4b9255c4 100644
--- a/drivers/net/qede/qede_ethdev.c
+++ b/drivers/net/qede/qede_ethdev.c
@@ -2434,7 +2434,7 @@ static const struct eth_dev_ops qede_eth_dev_ops = {
 	.reta_update  = qede_rss_reta_update,
 	.reta_query  = qede_rss_reta_query,
 	.mtu_set = qede_set_mtu,
-	.filter_ctrl = qede_dev_filter_ctrl,
+	.flow_ops_get = qede_dev_flow_ops_get,
 	.udp_tunnel_port_add = qede_udp_dst_port_add,
 	.udp_tunnel_port_del = qede_udp_dst_port_del,
 	.fw_version_get = qede_fw_version_get,
diff --git a/drivers/net/qede/qede_ethdev.h b/drivers/net/qede/qede_ethdev.h
index da4b87f5e2..a38b701183 100644
--- a/drivers/net/qede/qede_ethdev.h
+++ b/drivers/net/qede/qede_ethdev.h
@@ -285,11 +285,8 @@ int qede_dev_set_link_state(struct rte_eth_dev *eth_dev, bool link_up);
 int qede_link_update(struct rte_eth_dev *eth_dev,
 		     __rte_unused int wait_to_complete);
 
-int qede_dev_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type type,
-			 enum rte_filter_op op, void *arg);
-
-int qede_ntuple_filter_conf(struct rte_eth_dev *eth_dev,
-			    enum rte_filter_op filter_op, void *arg);
+int qede_dev_flow_ops_get(struct rte_eth_dev *dev,
+			  const struct rte_flow_ops **ops);
 
 int qede_check_fdir_support(struct rte_eth_dev *eth_dev);
 
diff --git a/drivers/net/qede/qede_filter.c b/drivers/net/qede/qede_filter.c
index df5c07dfe5..c756594bfc 100644
--- a/drivers/net/qede/qede_filter.c
+++ b/drivers/net/qede/qede_filter.c
@@ -1050,31 +1050,18 @@ const struct rte_flow_ops qede_flow_ops = {
 	.flush = qede_flow_flush,
 };
 
-int qede_dev_filter_ctrl(struct rte_eth_dev *eth_dev,
-			 enum rte_filter_type filter_type,
-			 enum rte_filter_op filter_op,
-			 void *arg)
+int
+qede_dev_flow_ops_get(struct rte_eth_dev *eth_dev,
+		      const struct rte_flow_ops **ops)
 {
 	struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
 	struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
 
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (ECORE_IS_CMT(edev)) {
-			DP_ERR(edev, "flowdir is not supported in 100G mode\n");
-			return -ENOTSUP;
-		}
-
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-
-		*(const void **)arg = &qede_flow_ops;
-		return 0;
-	default:
-		DP_ERR(edev, "Unsupported filter type %d\n",
-			filter_type);
-		return -EINVAL;
+	if (ECORE_IS_CMT(edev)) {
+		DP_ERR(edev, "flowdir is not supported in 100G mode\n");
+		return -ENOTSUP;
 	}
 
+	*ops = &qede_flow_ops;
 	return 0;
 }
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 479b4f4df6..d72df2e13b 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -1751,32 +1751,11 @@ sfc_dev_rss_reta_update(struct rte_eth_dev *dev,
 }
 
 static int
-sfc_dev_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type,
-		    enum rte_filter_op filter_op,
-		    void *arg)
+sfc_dev_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		     const struct rte_flow_ops **ops)
 {
-	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
-	int rc = ENOTSUP;
-
-	sfc_log_init(sa, "entry");
-
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET) {
-			rc = EINVAL;
-		} else {
-			*(const void **)arg = &sfc_flow_ops;
-			rc = 0;
-		}
-		break;
-	default:
-		sfc_err(sa, "Unknown filter type %u", filter_type);
-		break;
-	}
-
-	sfc_log_init(sa, "exit: %d", -rc);
-	SFC_ASSERT(rc >= 0);
-	return -rc;
+	*ops = &sfc_flow_ops;
+	return 0;
 }
 
 static int
@@ -1859,7 +1838,7 @@ static const struct eth_dev_ops sfc_eth_dev_ops = {
 	.reta_query			= sfc_dev_rss_reta_query,
 	.rss_hash_update		= sfc_dev_rss_hash_update,
 	.rss_hash_conf_get		= sfc_dev_rss_hash_conf_get,
-	.filter_ctrl			= sfc_dev_filter_ctrl,
+	.flow_ops_get			= sfc_dev_flow_ops_get,
 	.set_mc_addr_list		= sfc_set_mc_addr_list,
 	.rxq_info_get			= sfc_rx_queue_info_get,
 	.txq_info_get			= sfc_tx_queue_info_get,
diff --git a/drivers/net/softnic/rte_eth_softnic.c b/drivers/net/softnic/rte_eth_softnic.c
index 99d8468c94..0c2a79a7d2 100644
--- a/drivers/net/softnic/rte_eth_softnic.c
+++ b/drivers/net/softnic/rte_eth_softnic.c
@@ -248,18 +248,11 @@ pmd_link_update(struct rte_eth_dev *dev __rte_unused,
 }
 
 static int
-pmd_filter_ctrl(struct rte_eth_dev *dev __rte_unused,
-		enum rte_filter_type filter_type,
-		enum rte_filter_op filter_op,
-		void *arg)
+pmd_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		 const struct rte_flow_ops **ops)
 {
-	if (filter_type == RTE_ETH_FILTER_GENERIC &&
-			filter_op == RTE_ETH_FILTER_GET) {
-		*(const void **)arg = &pmd_flow_ops;
-		return 0;
-	}
-
-	return -ENOTSUP;
+	*ops = &pmd_flow_ops;
+	return 0;
 }
 
 static int
@@ -287,7 +280,7 @@ static const struct eth_dev_ops pmd_ops = {
 	.dev_infos_get = pmd_dev_infos_get,
 	.rx_queue_setup = pmd_rx_queue_setup,
 	.tx_queue_setup = pmd_tx_queue_setup,
-	.filter_ctrl = pmd_filter_ctrl,
+	.flow_ops_get = pmd_flow_ops_get,
 	.tm_ops_get = pmd_tm_ops_get,
 	.mtr_ops_get = pmd_mtr_ops_get,
 };
diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c
index c36d4bf76e..68baa18523 100644
--- a/drivers/net/tap/rte_eth_tap.c
+++ b/drivers/net/tap/rte_eth_tap.c
@@ -1890,7 +1890,7 @@ static const struct eth_dev_ops ops = {
 	.stats_reset            = tap_stats_reset,
 	.dev_supported_ptypes_get = tap_dev_supported_ptypes_get,
 	.rss_hash_update        = tap_rss_hash_update,
-	.filter_ctrl            = tap_dev_filter_ctrl,
+	.flow_ops_get           = tap_dev_flow_ops_get,
 };
 
 static int
diff --git a/drivers/net/tap/tap_flow.c b/drivers/net/tap/tap_flow.c
index 1538349e9c..1ee6fb30ab 100644
--- a/drivers/net/tap/tap_flow.c
+++ b/drivers/net/tap/tap_flow.c
@@ -2160,35 +2160,20 @@ static int rss_add_actions(struct rte_flow *flow, struct pmd_internals *pmd,
 }
 
 /**
- * Manage filter operations.
+ * Get rte_flow operations.
  *
  * @param dev
  *   Pointer to Ethernet device structure.
- * @param filter_type
- *   Filter type.
- * @param filter_op
- *   Operation to perform.
- * @param arg
+ * @param ops
  *   Pointer to operation-specific structure.
  *
  * @return
  *   0 on success, negative errno value on failure.
  */
 int
-tap_dev_filter_ctrl(struct rte_eth_dev *dev,
-		    enum rte_filter_type filter_type,
-		    enum rte_filter_op filter_op,
-		    void *arg)
+tap_dev_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		     const struct rte_flow_ops **ops)
 {
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &tap_flow_ops;
-		return 0;
-	default:
-		TAP_LOG(ERR, "%p: filter type (%d) not supported",
-			dev, filter_type);
-	}
-	return -EINVAL;
+	*ops = &tap_flow_ops;
+	return 0;
 }
diff --git a/drivers/net/tap/tap_flow.h b/drivers/net/tap/tap_flow.h
index ac60a9ae20..240fbc3dfa 100644
--- a/drivers/net/tap/tap_flow.h
+++ b/drivers/net/tap/tap_flow.h
@@ -46,10 +46,8 @@ enum bpf_fd_idx {
 	SEC_MAX,
 };
 
-int tap_dev_filter_ctrl(struct rte_eth_dev *dev,
-			enum rte_filter_type filter_type,
-			enum rte_filter_op filter_op,
-			void *arg);
+int tap_dev_flow_ops_get(struct rte_eth_dev *dev,
+			 const struct rte_flow_ops **ops);
 int tap_flow_flush(struct rte_eth_dev *dev, struct rte_flow_error *error);
 
 int tap_flow_implicit_create(struct pmd_internals *pmd,
diff --git a/drivers/net/txgbe/txgbe_ethdev.c b/drivers/net/txgbe/txgbe_ethdev.c
index 90137d0ceb..ab748e129d 100644
--- a/drivers/net/txgbe/txgbe_ethdev.c
+++ b/drivers/net/txgbe/txgbe_ethdev.c
@@ -4076,27 +4076,11 @@ txgbe_add_del_ethertype_filter(struct rte_eth_dev *dev,
 }
 
 static int
-txgbe_dev_filter_ctrl(__rte_unused struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg)
+txgbe_dev_flow_ops_get(__rte_unused struct rte_eth_dev *dev,
+		       const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &txgbe_flow_ops;
-		break;
-	default:
-		PMD_DRV_LOG(WARNING, "Filter type (%d) not supported",
-							filter_type);
-		ret = -EINVAL;
-		break;
-	}
-
-	return ret;
+	*ops = &txgbe_flow_ops;
+	return 0;
 }
 
 static u8 *
@@ -5206,7 +5190,7 @@ static const struct eth_dev_ops txgbe_eth_dev_ops = {
 	.reta_query                 = txgbe_dev_rss_reta_query,
 	.rss_hash_update            = txgbe_dev_rss_hash_update,
 	.rss_hash_conf_get          = txgbe_dev_rss_hash_conf_get,
-	.filter_ctrl                = txgbe_dev_filter_ctrl,
+	.flow_ops_get               = txgbe_dev_flow_ops_get,
 	.set_mc_addr_list           = txgbe_dev_set_mc_addr_list,
 	.rxq_info_get               = txgbe_rxq_info_get,
 	.txq_info_get               = txgbe_txq_info_get,
diff --git a/lib/librte_ethdev/ethdev_driver.h b/lib/librte_ethdev/ethdev_driver.h
index 57fdedaa1a..1c6592ec23 100644
--- a/lib/librte_ethdev/ethdev_driver.h
+++ b/lib/librte_ethdev/ethdev_driver.h
@@ -465,34 +465,10 @@ typedef int (*eth_get_module_eeprom_t)(struct rte_eth_dev *dev,
 				       struct rte_dev_eeprom_info *info);
 /**< @internal Retrieve plugin module eeprom data */
 
-/**
- * Feature filter types
- */
-enum rte_filter_type {
-	RTE_ETH_FILTER_NONE = 0,
-	RTE_ETH_FILTER_ETHERTYPE,
-	RTE_ETH_FILTER_FLEXIBLE,
-	RTE_ETH_FILTER_SYN,
-	RTE_ETH_FILTER_NTUPLE,
-	RTE_ETH_FILTER_TUNNEL,
-	RTE_ETH_FILTER_FDIR,
-	RTE_ETH_FILTER_HASH,
-	RTE_ETH_FILTER_L2_TUNNEL,
-	RTE_ETH_FILTER_GENERIC,
-};
-
-/**
- * Generic operations on filters
- */
-enum rte_filter_op {
-	RTE_ETH_FILTER_GET,      /**< get flow API ops */
-};
-
-typedef int (*eth_filter_ctrl_t)(struct rte_eth_dev *dev,
-				 enum rte_filter_type filter_type,
-				 enum rte_filter_op filter_op,
-				 void *arg);
-/**< @internal Take operations to assigned filter type on an Ethernet device */
+struct rte_flow_ops;
+typedef int (*eth_flow_ops_get_t)(struct rte_eth_dev *dev,
+				  const struct rte_flow_ops **ops);
+/**< @internal Get flow operations */
 
 typedef int (*eth_tm_ops_get_t)(struct rte_eth_dev *dev, void *ops);
 /**< @internal Get Traffic Management (TM) operations on an Ethernet device */
@@ -880,7 +856,7 @@ struct eth_dev_ops {
 	eth_get_module_eeprom_t    get_module_eeprom;
 	/** Get plugin module eeprom data. */
 
-	eth_filter_ctrl_t          filter_ctrl; /**< common filter control. */
+	eth_flow_ops_get_t         flow_ops_get; /**< Get flow operations. */
 
 	eth_get_dcb_info           get_dcb_info; /** Get DCB information. */
 
@@ -1377,6 +1353,18 @@ rte_eth_hairpin_queue_peer_unbind(uint16_t cur_port, uint16_t cur_queue,
  * Legacy ethdev API used internally by drivers.
  */
 
+enum rte_filter_type {
+	RTE_ETH_FILTER_NONE = 0,
+	RTE_ETH_FILTER_ETHERTYPE,
+	RTE_ETH_FILTER_FLEXIBLE,
+	RTE_ETH_FILTER_SYN,
+	RTE_ETH_FILTER_NTUPLE,
+	RTE_ETH_FILTER_TUNNEL,
+	RTE_ETH_FILTER_FDIR,
+	RTE_ETH_FILTER_HASH,
+	RTE_ETH_FILTER_L2_TUNNEL,
+};
+
 /**
  * Define all structures for Ethertype Filter type.
  */
diff --git a/lib/librte_ethdev/rte_eth_ctrl.h b/lib/librte_ethdev/rte_eth_ctrl.h
index 8a50dbfef9..42652f9cce 100644
--- a/lib/librte_ethdev/rte_eth_ctrl.h
+++ b/lib/librte_ethdev/rte_eth_ctrl.h
@@ -339,7 +339,7 @@ struct rte_eth_fdir_action {
 };
 
 /**
- * A structure used to define the flow director filter entry by filter_ctrl API.
+ * A structure used to define the flow director filter entry.
  */
 struct rte_eth_fdir_filter {
 	uint32_t soft_id;
diff --git a/lib/librte_ethdev/rte_flow.c b/lib/librte_ethdev/rte_flow.c
index 241af6c4ca..1a896e3e64 100644
--- a/lib/librte_ethdev/rte_flow.c
+++ b/lib/librte_ethdev/rte_flow.c
@@ -255,18 +255,19 @@ rte_flow_ops_get(uint16_t port_id, struct rte_flow_error *error)
 
 	if (unlikely(!rte_eth_dev_is_valid_port(port_id)))
 		code = ENODEV;
-	else if (unlikely(!dev->dev_ops->filter_ctrl ||
-			  dev->dev_ops->filter_ctrl(dev,
-						    RTE_ETH_FILTER_GENERIC,
-						    RTE_ETH_FILTER_GET,
-						    &ops) ||
-			  !ops))
-		code = ENOSYS;
+	else if (unlikely(dev->dev_ops->flow_ops_get == NULL))
+		code = ENOTSUP;
 	else
-		return ops;
-	rte_flow_error_set(error, code, RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
-			   NULL, rte_strerror(code));
-	return NULL;
+		code = dev->dev_ops->flow_ops_get(dev, &ops);
+	if (code == 0 && ops == NULL)
+		code = EACCES;
+
+	if (code != 0) {
+		rte_flow_error_set(error, code, RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
+				   NULL, rte_strerror(code));
+		return NULL;
+	}
+	return ops;
 }
 
 /* Check whether a flow rule can be created on a given port. */
diff --git a/lib/librte_ethdev/rte_flow_driver.h b/lib/librte_ethdev/rte_flow_driver.h
index dabd819d10..da594d9256 100644
--- a/lib/librte_ethdev/rte_flow_driver.h
+++ b/lib/librte_ethdev/rte_flow_driver.h
@@ -28,31 +28,6 @@ extern "C" {
 /**
  * Generic flow operations structure implemented and returned by PMDs.
  *
- * To implement this API, PMDs must handle the RTE_ETH_FILTER_GENERIC filter
- * type in their .filter_ctrl callback function (struct eth_dev_ops) as well
- * as the RTE_ETH_FILTER_GET filter operation.
- *
- * If successful, this operation must result in a pointer to a PMD-specific
- * struct rte_flow_ops written to the argument address as described below:
- *
- * \code
- *
- * // PMD filter_ctrl callback
- *
- * static const struct rte_flow_ops pmd_flow_ops = { ... };
- *
- * switch (filter_type) {
- * case RTE_ETH_FILTER_GENERIC:
- *     if (filter_op != RTE_ETH_FILTER_GET)
- *         return -EINVAL;
- *     *(const void **)arg = &pmd_flow_ops;
- *     return 0;
- * }
- *
- * \endcode
- *
- * See also rte_flow_ops_get().
- *
  * These callback functions are not supposed to be used by applications
  * directly, which must rely on the API defined in rte_flow.h.
  *
-- 
2.30.1


^ permalink raw reply	[relevance 1%]

* Re: [dpdk-dev] [PATCH] ethdev: introduce enable_driver_sdk to install driver headers
  2021-03-12 15:34  0%     ` Bruce Richardson
@ 2021-03-12 15:52  0%       ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2021-03-12 15:52 UTC (permalink / raw)
  To: David Marchand, Bruce Richardson, Ferruh Yigit
  Cc: Tyler Retzlaff, dev, Andrew Rybchenko

12/03/2021 16:34, Bruce Richardson:
> On Fri, Mar 12, 2021 at 04:25:09PM +0100, David Marchand wrote:
> > On Fri, Mar 12, 2021 at 4:20 PM Ferruh Yigit <ferruh.yigit@intel.com> wrote:
> > >
> > > On 3/11/2021 7:27 PM, Tyler Retzlaff wrote:
> > > > Introduce a meson option enable_driver_sdk when true installs internal
> > > > driver headers for ethdev. this allows drivers that do not depend on
> > > > stable api/abi to be built external to the dpdk source tree.
> > > >
> > > > Signed-off-by: Tyler Retzlaff <roretzla@linux.microsoft.com>
> > > > ---
> > > >
> > > > it's still unclear to me if we should be renaming the headers:
> > > >
> > > >    ethdev_driver.h -> rte_ethdev_driver.h
> > > >    ethdev_pci.h -> rte_ethdev_pci.h
> > > >    ethdev_vdev.h -> rte_ethdev_vdev.h
> > > >
> > > >   lib/librte_ethdev/meson.build | 5 +++++
> > > >   meson_options.txt             | 2 ++
> > > >   2 files changed, 7 insertions(+)
> > > >
> > > > diff --git a/lib/librte_ethdev/meson.build b/lib/librte_ethdev/meson.build
> > > > index c37b2e377..7ecdec6f0 100644
> > > > --- a/lib/librte_ethdev/meson.build
> > > > +++ b/lib/librte_ethdev/meson.build
> > > > @@ -20,6 +20,11 @@ headers = files('rte_ethdev.h',
> > > >       'rte_mtr_driver.h',
> > > >       'rte_tm.h',
> > > >       'rte_tm_driver.h')
> > > > +if get_option('enable_driver_sdk')
> > > > +headers += files('ethdev_driver.h',
> > > > +     'ethdev_pci.h',
> > > > +     'ethdev_vdev.h')
> > > > +endif
> > >
> > > Instead of adding the "get_option('enable_driver_sdk')" checks to the modules,
> > > what about a more generic solution, like:
> > >
> > > modules assign relevant headers into a new variable, let's say 'pmd_headers',
> > > and in a high level meson file, all 'pmd_headers' are installed if
> > > 'enable_driver_sdk' enabled?
> > >
> > 
> > +1.
> > Just, I don't like "pmd_headers" as the list name.
> > It can be misunderstood as the list of pmd-specific headers (thinking
> > of rte_pmd_i40e.h), that are exposed to applications.
> >
> Since the option is called "enable_driver_sdk" the variable name of
> "driver_sdk_headers" would be a good match. We should try and keep variable
> names and option names in sync as much as possible.

+1



^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] ethdev: introduce enable_driver_sdk to install driver headers
  2021-03-12 15:25  0%   ` David Marchand
@ 2021-03-12 15:34  0%     ` Bruce Richardson
  2021-03-12 15:52  0%       ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Bruce Richardson @ 2021-03-12 15:34 UTC (permalink / raw)
  To: David Marchand
  Cc: Ferruh Yigit, Tyler Retzlaff, dev, Thomas Monjalon, Andrew Rybchenko

On Fri, Mar 12, 2021 at 04:25:09PM +0100, David Marchand wrote:
> On Fri, Mar 12, 2021 at 4:20 PM Ferruh Yigit <ferruh.yigit@intel.com> wrote:
> >
> > On 3/11/2021 7:27 PM, Tyler Retzlaff wrote:
> > > Introduce a meson option enable_driver_sdk when true installs internal
> > > driver headers for ethdev. this allows drivers that do not depend on
> > > stable api/abi to be built external to the dpdk source tree.
> > >
> > > Signed-off-by: Tyler Retzlaff <roretzla@linux.microsoft.com>
> > > ---
> > >
> > > it's still unclear to me if we should be renaming the headers:
> > >
> > >    ethdev_driver.h -> rte_ethdev_driver.h
> > >    ethdev_pci.h -> rte_ethdev_pci.h
> > >    ethdev_vdev.h -> rte_ethdev_vdev.h
> > >
> > >   lib/librte_ethdev/meson.build | 5 +++++
> > >   meson_options.txt             | 2 ++
> > >   2 files changed, 7 insertions(+)
> > >
> > > diff --git a/lib/librte_ethdev/meson.build b/lib/librte_ethdev/meson.build
> > > index c37b2e377..7ecdec6f0 100644
> > > --- a/lib/librte_ethdev/meson.build
> > > +++ b/lib/librte_ethdev/meson.build
> > > @@ -20,6 +20,11 @@ headers = files('rte_ethdev.h',
> > >       'rte_mtr_driver.h',
> > >       'rte_tm.h',
> > >       'rte_tm_driver.h')
> > > +if get_option('enable_driver_sdk')
> > > +headers += files('ethdev_driver.h',
> > > +     'ethdev_pci.h',
> > > +     'ethdev_vdev.h')
> > > +endif
> >
> > Instead of adding the "get_option('enable_driver_sdk')" checks to the modules,
> > what about a more generic solution, like:
> >
> > modules assign relevant headers into a new variable, let's say 'pmd_headers',
> > and in a high level meson file, all 'pmd_headers' are installed if
> > 'enable_driver_sdk' enabled?
> >
> 
> +1.
> Just, I don't like "pmd_headers" as the list name.
> It can be misunderstood as the list of pmd-specific headers (thinking
> of rte_pmd_i40e.h), that are exposed to applications.
>
Since the option is called "enable_driver_sdk" the variable name of
"driver_sdk_headers" would be a good match. We should try and keep variable
names and option names in sync as much as possible.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] ethdev: introduce enable_driver_sdk to install driver headers
  2021-03-12 15:19  0% ` Ferruh Yigit
@ 2021-03-12 15:25  0%   ` David Marchand
  2021-03-12 15:34  0%     ` Bruce Richardson
  0 siblings, 1 reply; 200+ results
From: David Marchand @ 2021-03-12 15:25 UTC (permalink / raw)
  To: Ferruh Yigit
  Cc: Tyler Retzlaff, dev, Thomas Monjalon, Andrew Rybchenko, Bruce Richardson

On Fri, Mar 12, 2021 at 4:20 PM Ferruh Yigit <ferruh.yigit@intel.com> wrote:
>
> On 3/11/2021 7:27 PM, Tyler Retzlaff wrote:
> > Introduce a meson option enable_driver_sdk when true installs internal
> > driver headers for ethdev. this allows drivers that do not depend on
> > stable api/abi to be built external to the dpdk source tree.
> >
> > Signed-off-by: Tyler Retzlaff <roretzla@linux.microsoft.com>
> > ---
> >
> > it's still unclear to me if we should be renaming the headers:
> >
> >    ethdev_driver.h -> rte_ethdev_driver.h
> >    ethdev_pci.h -> rte_ethdev_pci.h
> >    ethdev_vdev.h -> rte_ethdev_vdev.h
> >
> >   lib/librte_ethdev/meson.build | 5 +++++
> >   meson_options.txt             | 2 ++
> >   2 files changed, 7 insertions(+)
> >
> > diff --git a/lib/librte_ethdev/meson.build b/lib/librte_ethdev/meson.build
> > index c37b2e377..7ecdec6f0 100644
> > --- a/lib/librte_ethdev/meson.build
> > +++ b/lib/librte_ethdev/meson.build
> > @@ -20,6 +20,11 @@ headers = files('rte_ethdev.h',
> >       'rte_mtr_driver.h',
> >       'rte_tm.h',
> >       'rte_tm_driver.h')
> > +if get_option('enable_driver_sdk')
> > +headers += files('ethdev_driver.h',
> > +     'ethdev_pci.h',
> > +     'ethdev_vdev.h')
> > +endif
>
> Instead of adding the "get_option('enable_driver_sdk')" checks to the modules,
> what about a more generic solution, like:
>
> modules assign relevant headers into a new variable, let's say 'pmd_headers',
> and in a high level meson file, all 'pmd_headers' are installed if
> 'enable_driver_sdk' enabled?
>

+1.
Just, I don't like "pmd_headers" as the list name.
It can be misunderstood as the list of pmd-specific headers (thinking
of rte_pmd_i40e.h), that are exposed to applications.


-- 
David Marchand


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] ethdev: introduce enable_driver_sdk to install driver headers
  2021-03-11 19:27  3% [dpdk-dev] [PATCH] ethdev: introduce enable_driver_sdk to install driver headers Tyler Retzlaff
@ 2021-03-12 15:19  0% ` Ferruh Yigit
  2021-03-12 15:25  0%   ` David Marchand
  2021-03-12 22:20  3% ` [dpdk-dev] [PATCH v2] " Tyler Retzlaff
  1 sibling, 1 reply; 200+ results
From: Ferruh Yigit @ 2021-03-12 15:19 UTC (permalink / raw)
  To: Tyler Retzlaff, dev; +Cc: thomas, andrew.rybchenko, bruce.richardson

On 3/11/2021 7:27 PM, Tyler Retzlaff wrote:
> Introduce a meson option enable_driver_sdk when true installs internal
> driver headers for ethdev. this allows drivers that do not depend on
> stable api/abi to be built external to the dpdk source tree.
> 
> Signed-off-by: Tyler Retzlaff <roretzla@linux.microsoft.com>
> ---
> 
> it's still unclear to me if we should be renaming the headers:
> 
>    ethdev_driver.h -> rte_ethdev_driver.h
>    ethdev_pci.h -> rte_ethdev_pci.h
>    ethdev_vdev.h -> rte_ethdev_vdev.h
> 
>   lib/librte_ethdev/meson.build | 5 +++++
>   meson_options.txt             | 2 ++
>   2 files changed, 7 insertions(+)
> 
> diff --git a/lib/librte_ethdev/meson.build b/lib/librte_ethdev/meson.build
> index c37b2e377..7ecdec6f0 100644
> --- a/lib/librte_ethdev/meson.build
> +++ b/lib/librte_ethdev/meson.build
> @@ -20,6 +20,11 @@ headers = files('rte_ethdev.h',
>   	'rte_mtr_driver.h',
>   	'rte_tm.h',
>   	'rte_tm_driver.h')
> +if get_option('enable_driver_sdk')
> +headers += files('ethdev_driver.h',
> +	'ethdev_pci.h',
> +	'ethdev_vdev.h')
> +endif

Instead of adding the "get_option('enable_driver_sdk')" checks to the modules, 
what about a more generic solution, like:

modules assign relevant headers into a new variable, let's say 'pmd_headers', 
and in a high level meson file, all 'pmd_headers' are installed if 
'enable_driver_sdk' enabled?

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 7/7] eventdev: fix ABI breakage due to event vector
  2021-03-08 18:44  9%   ` Jerin Jacob
@ 2021-03-12 14:28  9%     ` David Marchand
  2021-03-16  5:54  7%       ` [dpdk-dev] [EXT] " Pavan Nikhilesh Bhagavatula
  2021-03-15 10:01  7%     ` [dpdk-dev] " Kinsella, Ray
  1 sibling, 1 reply; 200+ results
From: David Marchand @ 2021-03-12 14:28 UTC (permalink / raw)
  To: Jerin Jacob
  Cc: Pavan Nikhilesh, Jerin Jacob, Jayatheerthan, Jay,
	Erik Gabriel Carrillo, Gujjar, Abhinandan S, McDaniel, Timothy,
	Hemant Agrawal, Van Haaren, Harry, Mattias Rönnblom,
	Liang Ma, Ray Kinsella, Neil Horman, dpdk-dev, Thomas Monjalon

On Mon, Mar 8, 2021 at 7:44 PM Jerin Jacob <jerinjacobk@gmail.com> wrote:
> Summary:
> 1)  Ideal way of adding this feature is to add elements in the
> existing structure as mentioned
> in  ("eventdev: introduce event vector Rx capability") in this series.
> 2) Since this breaking ABI, Introducing a new structure to fix this. I
> think, we can remove this
> limitation in 21.11 as that time we can change ABI as required.
>
> So, Is this patch needs to be squashed to  ("eventdev: introduce event
> vector Rx capability") to avoid
> ABI compatibility between patches? Or Is it OK to break the ABI
> compatibility in a patch in the series
> and later fix it in the same series?(This is for more readability as
> we can revert this patch in 21.11).

What matters is not to break compilation between patches, so that
bisecting is always possible.
For ABI checks... I don't see the need to enforce such a requirement.


Yet, it is more straightforward to not break the 20.11 ABI at all.
You can announce the intended ABI change in the release notes /
deprecation notices, not sure I saw it in this series.

If you still want to share the final state intended for v21.11, you
can send the patch at the end of the series with something in the
title like "for v21.11" and mark it deferred in patchwork.


-- 
David Marchand


^ permalink raw reply	[relevance 9%]

* Re: [dpdk-dev] [PATCH] librte_eal/common: fix return type of rte_bsf64
  2021-03-12  7:34  3%     ` Morten Brørup
@ 2021-03-12 11:46  0%       ` Kinsella, Ray
  2021-03-12 18:10  3%         ` Tyler Retzlaff
  2021-03-12 18:24  0%       ` Tyler Retzlaff
  1 sibling, 1 reply; 200+ results
From: Kinsella, Ray @ 2021-03-12 11:46 UTC (permalink / raw)
  To: Morten Brørup, Tyler Retzlaff, Stephen Hemminger
  Cc: dev, anatoly.burakov, Neil Horman



On 12/03/2021 07:34, Morten Brørup wrote:
> CC: ABI Policy maintainers. You might have an opinion. Or not. :-)

My 2c is that this is affecting inlined functions from include/rte_common.h.
Although not ideal, the practical effect on Binary Compatibility is therefore likely to be _nil_.

Just a small comment - when Steve points out "The cast is no longer needed, it should be removed."
I think Tyler _may_ have mis-understood his point when he said 

"it's not so much about making it compile. it's about making it correct
with respect to original author intent, consistent with the rte_bsf32
declaration ... "

My interpretation of what Steve said, is that once you change the return type
to uint32_t ... there is no need for the cast any more, that is all. 

> 
>> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Tyler Retzlaff
>> Sent: Wednesday, March 10, 2021 11:53 PM
>>
>> On Wed, Mar 10, 2021 at 10:49:42AM -0800, Stephen Hemminger wrote:
>>> On Tue,  9 Mar 2021 22:41:06 -0800
>>> Tyler Retzlaff <roretzla@linux.microsoft.com> wrote:
>>>
>>>> based on the original commit and the usage of rte_bsf64 it appears
>> the
>>>> function should always have returned uint32_t instead of int which
>> is
>>>> consistent with the cast introduced in the return statement.
>>>>
>>>> Fixes: 4e261f551986 ("eal: add 64-bit bsf and 32-bit safe bsf
>>>> functions")
>>>> Cc: anatoly.burakov@intel.com
>>>>
>>>> Signed-off-by: Tyler Retzlaff <roretzla@linux.microsoft.com>
>>>> ---
>>>>  lib/librte_eal/include/rte_common.h | 2 +-
>>>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>>>
>>>> diff --git a/lib/librte_eal/include/rte_common.h
>> b/lib/librte_eal/include/rte_common.h
>>>> index 1b630baf1..5e70ee7a8 100644
>>>> --- a/lib/librte_eal/include/rte_common.h
>>>> +++ b/lib/librte_eal/include/rte_common.h
>>>> @@ -679,7 +679,7 @@ rte_fls_u32(uint32_t x)
>>>>   * @return
>>>>   *     least significant set bit in the input parameter.
>>>>   */
>>>> -static inline int
>>>> +static inline uint32_t
>>>>  rte_bsf64(uint64_t v)
>>>>  {
>>>>  	return (uint32_t)__builtin_ctzll(v);
>>>
>>> The cast is no longer needed, it should be removed.
>>
>> it's not so much about making it compile. it's about making it correct
>> with respect to original author intent, consistent with the rte_bsf32
>> declaration, other consumers of the inline function inside rte_common.h
>> and whether or not it makes sense to have a function that returns a
>> count of bits signed. based on those factors i'm asserting that the
>> cast is actually correct and it is the return type that is wrong.
>>
>> your suggestion however would avoid having to deal with the downside of
>> changing the return type which is that an api change is necessary since
>> the function is exposed to applications. but even for something small
>> like this i think it is best to pursue the correct change rather than
>> sprinkle casts to (uint32_t) at various call-sites.
>>
>> i'm in the process of sending the proposal to deprecate/change the
>> return type unless others feel the above evaluation missed the mark.
>>
>> thanks!
> 
> Please also update the similar math functions in rte_common.h, so the return type is consistent across these functions:
> - rte_bsf32()
> - rte_bsf32_safe()
> - rte_fls_u32()
> - rte_bsf64()
> - rte_fls_u64()
> - rte_log2_u32()
> - rte_log2_u64()
> 
> They should all return either int or uint32_t.
> 
> Standard C conventions would have them all return int (probably due to C's default type promotion to int when used in calculations), which is also the type returned by their underlying implementation.
> 
> For some unknown reason, DPDK often uses uint32_t where you would normally use int. I guess it was inspired by MISRA C (for embedded systems); but it is not a documented conventions, and often deviated from.
> 
> I don't have a personal preference for int or uint32_t here. But at least follow the same convention in the same header file.
> 
> (Please note that the functions returning a Boolean value as an int type should keep doing that.)
> 
> 
> Med venlig hilsen / kind regards
> - Morten Brørup
> 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] librte_eal/common: fix return type of rte_bsf64
  @ 2021-03-12  7:34  3%     ` Morten Brørup
  2021-03-12 11:46  0%       ` Kinsella, Ray
  2021-03-12 18:24  0%       ` Tyler Retzlaff
  0 siblings, 2 replies; 200+ results
From: Morten Brørup @ 2021-03-12  7:34 UTC (permalink / raw)
  To: Tyler Retzlaff, Stephen Hemminger
  Cc: dev, anatoly.burakov, Ray Kinsella, Neil Horman

CC: ABI Policy maintainers. You might have an opinion. Or not. :-)

> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Tyler Retzlaff
> Sent: Wednesday, March 10, 2021 11:53 PM
> 
> On Wed, Mar 10, 2021 at 10:49:42AM -0800, Stephen Hemminger wrote:
> > On Tue,  9 Mar 2021 22:41:06 -0800
> > Tyler Retzlaff <roretzla@linux.microsoft.com> wrote:
> >
> > > based on the original commit and the usage of rte_bsf64 it appears
> the
> > > function should always have returned uint32_t instead of int which
> is
> > > consistent with the cast introduced in the return statement.
> > >
> > > Fixes: 4e261f551986 ("eal: add 64-bit bsf and 32-bit safe bsf
> > > functions")
> > > Cc: anatoly.burakov@intel.com
> > >
> > > Signed-off-by: Tyler Retzlaff <roretzla@linux.microsoft.com>
> > > ---
> > >  lib/librte_eal/include/rte_common.h | 2 +-
> > >  1 file changed, 1 insertion(+), 1 deletion(-)
> > >
> > > diff --git a/lib/librte_eal/include/rte_common.h
> b/lib/librte_eal/include/rte_common.h
> > > index 1b630baf1..5e70ee7a8 100644
> > > --- a/lib/librte_eal/include/rte_common.h
> > > +++ b/lib/librte_eal/include/rte_common.h
> > > @@ -679,7 +679,7 @@ rte_fls_u32(uint32_t x)
> > >   * @return
> > >   *     least significant set bit in the input parameter.
> > >   */
> > > -static inline int
> > > +static inline uint32_t
> > >  rte_bsf64(uint64_t v)
> > >  {
> > >  	return (uint32_t)__builtin_ctzll(v);
> >
> > The cast is no longer needed, it should be removed.
> 
> it's not so much about making it compile. it's about making it correct
> with respect to original author intent, consistent with the rte_bsf32
> declaration, other consumers of the inline function inside rte_common.h
> and whether or not it makes sense to have a function that returns a
> count of bits signed. based on those factors i'm asserting that the
> cast is actually correct and it is the return type that is wrong.
> 
> your suggestion however would avoid having to deal with the downside of
> changing the return type which is that an api change is necessary since
> the function is exposed to applications. but even for something small
> like this i think it is best to pursue the correct change rather than
> sprinkle casts to (uint32_t) at various call-sites.
> 
> i'm in the process of sending the proposal to deprecate/change the
> return type unless others feel the above evaluation missed the mark.
> 
> thanks!

Please also update the similar math functions in rte_common.h, so the return type is consistent across these functions:
- rte_bsf32()
- rte_bsf32_safe()
- rte_fls_u32()
- rte_bsf64()
- rte_fls_u64()
- rte_log2_u32()
- rte_log2_u64()

They should all return either int or uint32_t.

Standard C conventions would have them all return int (probably due to C's default type promotion to int when used in calculations), which is also the type returned by their underlying implementation.

For some unknown reason, DPDK often uses uint32_t where you would normally use int. I guess it was inspired by MISRA C (for embedded systems); but it is not a documented conventions, and often deviated from.

I don't have a personal preference for int or uint32_t here. But at least follow the same convention in the same header file.

(Please note that the functions returning a Boolean value as an int type should keep doing that.)


Med venlig hilsen / kind regards
- Morten Brørup


^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH 1/2] ethdev: replace callback getting filter operations
  @ 2021-03-11 22:17  1% ` Thomas Monjalon
      2 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2021-03-11 22:17 UTC (permalink / raw)
  To: dev
  Cc: Ori Kam, Ajit Khaparde, Somnath Kotur, Chas Williams,
	Min Hu (Connor),
	Rahul Lakkireddy, Hemant Agrawal, Sachin Saxena, Jeff Guo,
	Haiyue Wang, John Daley, Hyong Youb Kim, Gaetan Rivet,
	Ziyang Xuan, Xiaoyun Wang, Guoyang Zhou, Yisen Zhuang, Lijun Ou,
	Beilei Xing, Jingjing Wu, Qiming Yang, Qi Zhang, Rosen Xu,
	Matan Azrad, Shahaf Shuler, Viacheslav Ovsiienko, Liron Himi,
	Jerin Jacob, Nithin Dabilpuram, Kiran Kumar K, Rasesh Mody,
	Shahed Shaikh, Andrew Rybchenko, Jasvinder Singh,
	Cristian Dumitrescu, Keith Wiles, Jiawen Wu, Jian Wang,
	Ferruh Yigit

Since rte_flow is the only API for filtering operations,
the legacy driver interface filter_ctrl was too much complicated
for the simple task of getting the struct rte_flow_ops.

The filter type RTE_ETH_FILTER_GENERIC and
the filter operarion RTE_ETH_FILTER_GET are removed.
The new driver callback flow_ops_get replaces filter_ctrl.

Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
---
 doc/guides/nics/features.rst            |  4 +--
 doc/guides/prog_guide/rte_flow.rst      | 14 +-------
 doc/guides/rel_notes/release_20_11.rst  |  2 +-
 doc/guides/rel_notes/release_2_2.rst    |  2 +-
 drivers/net/bnxt/bnxt.h                 |  6 ++--
 drivers/net/bnxt/bnxt_ethdev.c          | 40 +++++++--------------
 drivers/net/bnxt/bnxt_reps.c            |  2 +-
 drivers/net/bonding/rte_eth_bond_pmd.c  | 13 +++----
 drivers/net/cxgbe/cxgbe_ethdev.c        |  2 +-
 drivers/net/cxgbe/cxgbe_flow.c          | 22 +++---------
 drivers/net/cxgbe/cxgbe_flow.h          |  7 ++--
 drivers/net/dpaa2/dpaa2_ethdev.c        | 44 +++--------------------
 drivers/net/dpaa2/dpaa2_flow.c          | 29 +++++-----------
 drivers/net/e1000/igb_ethdev.c          | 31 ++++-------------
 drivers/net/enic/enic_ethdev.c          | 30 +++++-----------
 drivers/net/enic/enic_vf_representor.c  | 33 ++++++------------
 drivers/net/failsafe/failsafe_ops.c     | 16 +++------
 drivers/net/hinic/hinic_pmd_ethdev.c    | 36 ++++---------------
 drivers/net/hns3/hns3_ethdev.c          |  2 +-
 drivers/net/hns3/hns3_ethdev.h          |  5 ++-
 drivers/net/hns3/hns3_ethdev_vf.c       |  2 +-
 drivers/net/hns3/hns3_flow.c            | 30 ++++------------
 drivers/net/i40e/i40e_ethdev.c          | 32 ++++-------------
 drivers/net/iavf/iavf_ethdev.c          | 32 ++++-------------
 drivers/net/ice/ice_dcf_ethdev.c        | 27 +++------------
 drivers/net/ice/ice_ethdev.c            | 32 ++++-------------
 drivers/net/igc/igc_ethdev.c            |  2 +-
 drivers/net/igc/igc_filter.c            | 23 +++----------
 drivers/net/igc/igc_filter.h            |  5 ++-
 drivers/net/ipn3ke/ipn3ke_representor.c | 28 ++++-----------
 drivers/net/ixgbe/ixgbe_ethdev.c        | 32 ++++-------------
 drivers/net/mlx4/mlx4.c                 |  2 +-
 drivers/net/mlx4/mlx4_flow.c            | 32 ++++-------------
 drivers/net/mlx4/mlx4_flow.h            |  5 +--
 drivers/net/mlx5/mlx5.c                 |  4 +--
 drivers/net/mlx5/mlx5.h                 |  5 +--
 drivers/net/mlx5/mlx5_flow.c            | 32 ++++-------------
 drivers/net/mvpp2/mrvl_ethdev.c         | 26 ++++----------
 drivers/net/octeontx2/otx2_ethdev.c     |  2 +-
 drivers/net/octeontx2/otx2_ethdev.h     |  5 ++-
 drivers/net/octeontx2/otx2_ethdev_ops.c | 21 +++--------
 drivers/net/qede/qede_ethdev.c          |  2 +-
 drivers/net/qede/qede_ethdev.h          |  7 ++--
 drivers/net/qede/qede_filter.c          | 27 ++++-----------
 drivers/net/sfc/sfc_ethdev.c            | 31 +++--------------
 drivers/net/softnic/rte_eth_softnic.c   | 17 +++------
 drivers/net/tap/rte_eth_tap.c           |  2 +-
 drivers/net/tap/tap_flow.c              | 27 ++++-----------
 drivers/net/tap/tap_flow.h              |  6 ++--
 drivers/net/txgbe/txgbe_ethdev.c        | 26 +++-----------
 lib/librte_ethdev/ethdev_driver.h       | 46 +++++++++----------------
 lib/librte_ethdev/rte_eth_ctrl.h        |  2 +-
 lib/librte_ethdev/rte_flow.c            |  9 ++---
 lib/librte_ethdev/rte_flow_driver.h     | 25 --------------
 54 files changed, 226 insertions(+), 720 deletions(-)

diff --git a/doc/guides/nics/features.rst b/doc/guides/nics/features.rst
index dbca9a85b9..f6d30d0af3 100644
--- a/doc/guides/nics/features.rst
+++ b/doc/guides/nics/features.rst
@@ -402,9 +402,9 @@ Supports configuring link flow control.
 Flow API
 --------
 
-Supports the DPDK Flow API for generic filtering.
+Supports flow API family.
 
-* **[implements] eth_dev_ops**: ``filter_ctrl:RTE_ETH_FILTER_GENERIC``.
+* **[implements] eth_dev_ops**: ``flow_ops_get``.
 * **[implements] rte_flow_ops**: ``All``.
 
 
diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst
index 62a57919eb..aec2ba1ec0 100644
--- a/doc/guides/prog_guide/rte_flow.rst
+++ b/doc/guides/prog_guide/rte_flow.rst
@@ -22,11 +22,6 @@ defined in ``rte_flow.h``.
   queues, to virtual/physical device functions or ports, performing tunnel
   offloads, adding marks and so on.
 
-It is slightly higher-level than the legacy filtering framework which it
-encompasses and supersedes (including all functions and filter types) in
-order to expose a single interface with an unambiguous behavior that is
-common to all poll-mode drivers (PMDs).
-
 Flow rule
 ---------
 
@@ -3104,7 +3099,6 @@ port and may return errors such as ``ENOTSUP`` ("not supported"):
 - Configuring MAC addresses.
 - Configuring multicast addresses.
 - Configuring VLAN filters.
-- Configuring Rx filters through the legacy API (e.g. FDIR).
 - Configuring global RSS settings.
 
 .. code-block:: c
@@ -3331,13 +3325,7 @@ The PMD interface is defined in ``rte_flow_driver.h``. It is not subject to
 API/ABI versioning constraints as it is not exposed to applications and may
 evolve independently.
 
-It is currently implemented on top of the legacy filtering framework through
-filter type *RTE_ETH_FILTER_GENERIC* that accepts the single operation
-*RTE_ETH_FILTER_GET* to return PMD-specific *rte_flow* callbacks wrapped
-inside ``struct rte_flow_ops``.
-
-This overhead is temporarily necessary in order to keep compatibility with
-the legacy filtering framework, which should eventually disappear.
+The PMD interface is based on callbacks pointed by the ``struct rte_flow_ops``.
 
 - PMD callbacks implement exactly the interface described in `Rules
   management`_, except for the port ID argument which has already been
diff --git a/doc/guides/rel_notes/release_20_11.rst b/doc/guides/rel_notes/release_20_11.rst
index 7405a9864f..1260539a21 100644
--- a/doc/guides/rel_notes/release_20_11.rst
+++ b/doc/guides/rel_notes/release_20_11.rst
@@ -571,7 +571,7 @@ API Changes
   a TC is greater than 256.
 
 * ethdev: Removed the legacy filter API, including
-  ``rte_eth_dev_filter_supported()`` and ``rte_eth_dev_filter_ctrl()``.
+  ``rte_eth_dev_filter_supported()`` and ``rte_eth_dev_flow_ops_get()``.
 
 * ethdev: Removed the legacy L2 tunnel configuration API, including
   ``rte_eth_dev_l2_tunnel_eth_type_conf()`` and
diff --git a/doc/guides/rel_notes/release_2_2.rst b/doc/guides/rel_notes/release_2_2.rst
index cea5c8746d..f7deeac34b 100644
--- a/doc/guides/rel_notes/release_2_2.rst
+++ b/doc/guides/rel_notes/release_2_2.rst
@@ -501,7 +501,7 @@ API Changes
 -----------
 
 * The deprecated flow director API is removed.
-  It was replaced by ``rte_eth_dev_filter_ctrl()``.
+  It was replaced by ``rte_eth_dev_flow_ops_get()``.
 
 * The ``dcb_queue`` is renamed to ``dcb_tc`` in following dcb configuration
   structures: ``rte_eth_dcb_rx_conf``, ``rte_eth_dcb_tx_conf``,
diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h
index b4370e5acd..a6c02d88aa 100644
--- a/drivers/net/bnxt/bnxt.h
+++ b/drivers/net/bnxt/bnxt.h
@@ -981,9 +981,7 @@ void bnxt_flow_cnt_alarm_cb(void *arg);
 int bnxt_flow_stats_req(struct bnxt *bp);
 int bnxt_flow_stats_cnt(struct bnxt *bp);
 uint32_t bnxt_get_speed_capabilities(struct bnxt *bp);
+int bnxt_flow_ops_get_op(struct rte_eth_dev *dev,
+			 const struct rte_flow_ops **ops);
 
-int
-bnxt_filter_ctrl_op(struct rte_eth_dev *dev,
-		    enum rte_filter_type filter_type,
-		    enum rte_filter_op filter_op, void *arg);
 #endif
diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index 9824cdb6d8..87d298804f 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -3086,9 +3086,8 @@ bnxt_tx_descriptor_status_op(void *tx_queue, uint16_t offset)
 }
 
 int
-bnxt_filter_ctrl_op(struct rte_eth_dev *dev,
-		    enum rte_filter_type filter_type,
-		    enum rte_filter_op filter_op, void *arg)
+bnxt_flow_ops_get_op(struct rte_eth_dev *dev,
+		     const struct rte_flow_ops **ops)
 {
 	struct bnxt *bp = dev->data->dev_private;
 	int ret = 0;
@@ -3101,10 +3100,8 @@ bnxt_filter_ctrl_op(struct rte_eth_dev *dev,
 		bp = vfr->parent_dev->data->dev_private;
 		/* parent is deleted while children are still valid */
 		if (!bp) {
-			PMD_DRV_LOG(DEBUG, "BNXT Port:%d VFR Error %d:%d\n",
-				    dev->data->port_id,
-				    filter_type,
-				    filter_op);
+			PMD_DRV_LOG(DEBUG, "BNXT Port:%d VFR Error\n",
+				    dev->data->port_id);
 			return -EIO;
 		}
 	}
@@ -3113,27 +3110,16 @@ bnxt_filter_ctrl_op(struct rte_eth_dev *dev,
 	if (ret)
 		return ret;
 
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
+	/* PMD supports thread-safe flow operations.  rte_flow API
+	 * functions can avoid mutex for multi-thread safety.
+	 */
+	dev->data->dev_flags |= RTE_ETH_DEV_FLOW_OPS_THREAD_SAFE;
 
-		/* PMD supports thread-safe flow operations.  rte_flow API
-		 * functions can avoid mutex for multi-thread safety.
-		 */
-		dev->data->dev_flags |= RTE_ETH_DEV_FLOW_OPS_THREAD_SAFE;
+	if (BNXT_TRUFLOW_EN(bp))
+		*ops = &bnxt_ulp_rte_flow_ops;
+	else
+		*ops = &bnxt_flow_ops;
 
-		if (BNXT_TRUFLOW_EN(bp))
-			*(const void **)arg = &bnxt_ulp_rte_flow_ops;
-		else
-			*(const void **)arg = &bnxt_flow_ops;
-		break;
-	default:
-		PMD_DRV_LOG(ERR,
-			"Filter type (%d) not supported", filter_type);
-		ret = -EINVAL;
-		break;
-	}
 	return ret;
 }
 
@@ -3644,7 +3630,7 @@ static const struct eth_dev_ops bnxt_dev_ops = {
 	.rx_queue_stop = bnxt_rx_queue_stop,
 	.tx_queue_start = bnxt_tx_queue_start,
 	.tx_queue_stop = bnxt_tx_queue_stop,
-	.filter_ctrl = bnxt_filter_ctrl_op,
+	.flow_ops_get = bnxt_flow_ops_get_op,
 	.dev_supported_ptypes_get = bnxt_dev_supported_ptypes_get_op,
 	.get_eeprom_length    = bnxt_get_eeprom_length_op,
 	.get_eeprom           = bnxt_get_eeprom_op,
diff --git a/drivers/net/bnxt/bnxt_reps.c b/drivers/net/bnxt/bnxt_reps.c
index d94874578e..b224a7d2c2 100644
--- a/drivers/net/bnxt/bnxt_reps.c
+++ b/drivers/net/bnxt/bnxt_reps.c
@@ -29,7 +29,7 @@ static const struct eth_dev_ops bnxt_rep_dev_ops = {
 	.dev_stop = bnxt_rep_dev_stop_op,
 	.stats_get = bnxt_rep_stats_get_op,
 	.stats_reset = bnxt_rep_stats_reset_op,
-	.filter_ctrl = bnxt_filter_ctrl_op
+	.flow_ops_get = bnxt_flow_ops_get_op
 };
 
 uint16_t
diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c
index 5241c60089..24e3cf3c2e 100644
--- a/drivers/net/bonding/rte_eth_bond_pmd.c
+++ b/drivers/net/bonding/rte_eth_bond_pmd.c
@@ -3108,14 +3108,11 @@ bond_ethdev_mac_address_set(struct rte_eth_dev *dev,
 }
 
 static int
-bond_filter_ctrl(struct rte_eth_dev *dev __rte_unused,
-		 enum rte_filter_type type, enum rte_filter_op op, void *arg)
+bond_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		  const struct rte_flow_ops **ops)
 {
-	if (type == RTE_ETH_FILTER_GENERIC && op == RTE_ETH_FILTER_GET) {
-		*(const void **)arg = &bond_flow_ops;
-		return 0;
-	}
-	return -ENOTSUP;
+	*ops = &bond_flow_ops;
+	return 0;
 }
 
 static int
@@ -3207,7 +3204,7 @@ const struct eth_dev_ops default_dev_ops = {
 	.mac_addr_set         = bond_ethdev_mac_address_set,
 	.mac_addr_add         = bond_ethdev_mac_addr_add,
 	.mac_addr_remove      = bond_ethdev_mac_addr_remove,
-	.filter_ctrl          = bond_filter_ctrl
+	.flow_ops_get         = bond_flow_ops_get
 };
 
 static int
diff --git a/drivers/net/cxgbe/cxgbe_ethdev.c b/drivers/net/cxgbe/cxgbe_ethdev.c
index bfa57c979d..e8a2de3ef3 100644
--- a/drivers/net/cxgbe/cxgbe_ethdev.c
+++ b/drivers/net/cxgbe/cxgbe_ethdev.c
@@ -1335,7 +1335,7 @@ static const struct eth_dev_ops cxgbe_eth_dev_ops = {
 	.rx_queue_start		= cxgbe_dev_rx_queue_start,
 	.rx_queue_stop		= cxgbe_dev_rx_queue_stop,
 	.rx_queue_release	= cxgbe_dev_rx_queue_release,
-	.filter_ctrl            = cxgbe_dev_filter_ctrl,
+	.flow_ops_get           = cxgbe_dev_flow_ops_get,
 	.stats_get		= cxgbe_dev_stats_get,
 	.stats_reset		= cxgbe_dev_stats_reset,
 	.flow_ctrl_get		= cxgbe_flow_ctrl_get,
diff --git a/drivers/net/cxgbe/cxgbe_flow.c b/drivers/net/cxgbe/cxgbe_flow.c
index 520a5a5c9a..edcbba9d7c 100644
--- a/drivers/net/cxgbe/cxgbe_flow.c
+++ b/drivers/net/cxgbe/cxgbe_flow.c
@@ -1448,23 +1448,9 @@ static const struct rte_flow_ops cxgbe_flow_ops = {
 };
 
 int
-cxgbe_dev_filter_ctrl(struct rte_eth_dev *dev,
-		      enum rte_filter_type filter_type,
-		      enum rte_filter_op filter_op,
-		      void *arg)
+cxgbe_dev_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		       const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
-	RTE_SET_USED(dev);
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &cxgbe_flow_ops;
-		break;
-	default:
-		ret = -ENOTSUP;
-		break;
-	}
-	return ret;
+	*ops = &cxgbe_flow_ops;
+	return 0;
 }
diff --git a/drivers/net/cxgbe/cxgbe_flow.h b/drivers/net/cxgbe/cxgbe_flow.h
index ec8e47aebe..9cf29550a9 100644
--- a/drivers/net/cxgbe/cxgbe_flow.h
+++ b/drivers/net/cxgbe/cxgbe_flow.h
@@ -35,10 +35,7 @@ struct rte_flow {
 	struct rte_eth_dev *dev;
 };
 
-int
-cxgbe_dev_filter_ctrl(struct rte_eth_dev *dev,
-		      enum rte_filter_type filter_type,
-		      enum rte_filter_op filter_op,
-		      void *arg);
+int cxgbe_dev_flow_ops_get(struct rte_eth_dev *dev,
+			   const struct rte_flow_ops **ops);
 
 #endif /* _CXGBE_FLOW_H_ */
diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c
index 0e7ebf4dc0..9011dcfc12 100644
--- a/drivers/net/dpaa2/dpaa2_ethdev.c
+++ b/drivers/net/dpaa2/dpaa2_ethdev.c
@@ -99,10 +99,6 @@ static const struct rte_dpaa2_xstats_name_off dpaa2_xstats_strings[] = {
 	{"cgr_reject_bytes", 4, 1},
 };
 
-static const enum rte_filter_op dpaa2_supported_filter_ops[] = {
-	RTE_ETH_FILTER_GET
-};
-
 static struct rte_dpaa2_driver rte_dpaa2_pmd;
 static int dpaa2_dev_link_update(struct rte_eth_dev *dev,
 				 int wait_to_complete);
@@ -2322,45 +2318,15 @@ int dpaa2_eth_eventq_detach(const struct rte_eth_dev *dev,
 	return ret;
 }
 
-static inline int
-dpaa2_dev_verify_filter_ops(enum rte_filter_op filter_op)
-{
-	unsigned int i;
-
-	for (i = 0; i < RTE_DIM(dpaa2_supported_filter_ops); i++) {
-		if (dpaa2_supported_filter_ops[i] == filter_op)
-			return 0;
-	}
-	return -ENOTSUP;
-}
-
 static int
-dpaa2_dev_flow_ctrl(struct rte_eth_dev *dev,
-		    enum rte_filter_type filter_type,
-				 enum rte_filter_op filter_op,
-				 void *arg)
+dpaa2_dev_flow_ops_get(struct rte_eth_dev *dev,
+		       const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
 	if (!dev)
 		return -ENODEV;
 
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (dpaa2_dev_verify_filter_ops(filter_op) < 0) {
-			ret = -ENOTSUP;
-			break;
-		}
-		*(const void **)arg = &dpaa2_flow_ops;
-		dpaa2_filter_type |= filter_type;
-		break;
-	default:
-		RTE_LOG(ERR, PMD, "Filter type (%d) not supported",
-			filter_type);
-		ret = -ENOTSUP;
-		break;
-	}
-	return ret;
+	*ops = &dpaa2_flow_ops;
+	return 0;
 }
 
 static void
@@ -2453,7 +2419,7 @@ static struct eth_dev_ops dpaa2_ethdev_ops = {
 	.mac_addr_set         = dpaa2_dev_set_mac_addr,
 	.rss_hash_update      = dpaa2_dev_rss_hash_update,
 	.rss_hash_conf_get    = dpaa2_dev_rss_hash_conf_get,
-	.filter_ctrl          = dpaa2_dev_flow_ctrl,
+	.flow_ops_get         = dpaa2_dev_flow_ops_get,
 	.rxq_info_get	      = dpaa2_rxq_info_get,
 	.txq_info_get	      = dpaa2_txq_info_get,
 	.tm_ops_get	      = dpaa2_tm_ops_get,
diff --git a/drivers/net/dpaa2/dpaa2_flow.c b/drivers/net/dpaa2/dpaa2_flow.c
index 29f1f2e654..bfe17c350a 100644
--- a/drivers/net/dpaa2/dpaa2_flow.c
+++ b/drivers/net/dpaa2/dpaa2_flow.c
@@ -89,8 +89,6 @@ enum rte_flow_action_type dpaa2_supported_action_type[] = {
 /* Max of enum rte_flow_item_type + 1, for both IPv4 and IPv6*/
 #define DPAA2_FLOW_ITEM_TYPE_GENERIC_IP (RTE_FLOW_ITEM_TYPE_META + 1)
 
-enum rte_filter_type dpaa2_filter_type = RTE_ETH_FILTER_NONE;
-
 #ifndef __cplusplus
 static const struct rte_flow_item_eth dpaa2_flow_item_eth_mask = {
 	.dst.addr_bytes = "\xff\xff\xff\xff\xff\xff",
@@ -3969,24 +3967,15 @@ struct rte_flow *dpaa2_flow_create(struct rte_eth_dev *dev,
 	flow->ipaddr_rule.fs_ipdst_offset =
 		IP_ADDRESS_OFFSET_INVALID;
 
-	switch (dpaa2_filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		ret = dpaa2_generic_flow_set(flow, dev, attr, pattern,
-					     actions, error);
-		if (ret < 0) {
-			if (error->type > RTE_FLOW_ERROR_TYPE_ACTION)
-				rte_flow_error_set(error, EPERM,
-						RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
-						attr, "unknown");
-			DPAA2_PMD_ERR(
-			"Failure to create flow, return code (%d)", ret);
-			goto creation_error;
-		}
-		break;
-	default:
-		DPAA2_PMD_ERR("Filter type (%d) not supported",
-		dpaa2_filter_type);
-		break;
+	ret = dpaa2_generic_flow_set(flow, dev, attr, pattern,
+			actions, error);
+	if (ret < 0) {
+		if (error->type > RTE_FLOW_ERROR_TYPE_ACTION)
+			rte_flow_error_set(error, EPERM,
+					RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
+					attr, "unknown");
+		DPAA2_PMD_ERR("Failure to create flow, return code (%d)", ret);
+		goto creation_error;
 	}
 
 	return flow;
diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c
index 395dc3f5aa..7c0451ebe2 100644
--- a/drivers/net/e1000/igb_ethdev.c
+++ b/drivers/net/e1000/igb_ethdev.c
@@ -194,10 +194,8 @@ static int igb_add_5tuple_filter_82576(struct rte_eth_dev *dev,
 			struct rte_eth_ntuple_filter *ntuple_filter);
 static int igb_remove_5tuple_filter_82576(struct rte_eth_dev *dev,
 			struct rte_eth_ntuple_filter *ntuple_filter);
-static int eth_igb_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg);
+static int eth_igb_flow_ops_get(struct rte_eth_dev *dev,
+				const struct rte_flow_ops **ops);
 static int eth_igb_get_reg_length(struct rte_eth_dev *dev);
 static int eth_igb_get_regs(struct rte_eth_dev *dev,
 		struct rte_dev_reg_info *regs);
@@ -374,7 +372,7 @@ static const struct eth_dev_ops eth_igb_ops = {
 	.reta_query           = eth_igb_rss_reta_query,
 	.rss_hash_update      = eth_igb_rss_hash_update,
 	.rss_hash_conf_get    = eth_igb_rss_hash_conf_get,
-	.filter_ctrl          = eth_igb_filter_ctrl,
+	.flow_ops_get         = eth_igb_flow_ops_get,
 	.set_mc_addr_list     = eth_igb_set_mc_addr_list,
 	.rxq_info_get         = igb_rxq_info_get,
 	.txq_info_get         = igb_txq_info_get,
@@ -4579,26 +4577,11 @@ igb_add_del_ethertype_filter(struct rte_eth_dev *dev,
 }
 
 static int
-eth_igb_filter_ctrl(struct rte_eth_dev *dev __rte_unused,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg)
+eth_igb_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		     const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &igb_flow_ops;
-		break;
-	default:
-		PMD_DRV_LOG(WARNING, "Filter type (%d) not supported",
-							filter_type);
-		break;
-	}
-
-	return ret;
+	*ops = &igb_flow_ops;
+	return 0;
 }
 
 static int
diff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c
index b3f441c8f7..38da5e8ce4 100644
--- a/drivers/net/enic/enic_ethdev.c
+++ b/drivers/net/enic/enic_ethdev.c
@@ -74,13 +74,10 @@ static const struct vic_speed_capa {
 RTE_LOG_REGISTER(enic_pmd_logtype, pmd.net.enic, INFO);
 
 static int
-enicpmd_dev_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg)
+enicpmd_dev_flow_ops_get(struct rte_eth_dev *dev,
+			 const struct rte_flow_ops **ops)
 {
 	struct enic *enic = pmd_priv(dev);
-	int ret = 0;
 
 	ENICPMD_FUNC_TRACE();
 
@@ -90,23 +87,12 @@ enicpmd_dev_filter_ctrl(struct rte_eth_dev *dev,
 	 */
 	if (enic->geneve_opt_enabled)
 		return -ENOTSUP;
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		if (enic->flow_filter_mode == FILTER_FLOWMAN)
-			*(const void **)arg = &enic_fm_flow_ops;
-		else
-			*(const void **)arg = &enic_flow_ops;
-		break;
-	default:
-		dev_warning(enic, "Filter type (%d) not supported",
-			filter_type);
-		ret = -EINVAL;
-		break;
-	}
 
-	return ret;
+	if (enic->flow_filter_mode == FILTER_FLOWMAN)
+		*ops = &enic_fm_flow_ops;
+	else
+		*ops = &enic_flow_ops;
+	return 0;
 }
 
 static void enicpmd_dev_tx_queue_release(void *txq)
@@ -1121,7 +1107,7 @@ static const struct eth_dev_ops enicpmd_eth_dev_ops = {
 	.mac_addr_remove      = enicpmd_remove_mac_addr,
 	.mac_addr_set         = enicpmd_set_mac_addr,
 	.set_mc_addr_list     = enicpmd_set_mc_addr_list,
-	.filter_ctrl          = enicpmd_dev_filter_ctrl,
+	.flow_ops_get         = enicpmd_dev_flow_ops_get,
 	.reta_query           = enicpmd_dev_rss_reta_query,
 	.reta_update          = enicpmd_dev_rss_reta_update,
 	.rss_hash_conf_get    = enicpmd_dev_rss_hash_conf_get,
diff --git a/drivers/net/enic/enic_vf_representor.c b/drivers/net/enic/enic_vf_representor.c
index f7b79c1c4e..79dd6e5640 100644
--- a/drivers/net/enic/enic_vf_representor.c
+++ b/drivers/net/enic/enic_vf_representor.c
@@ -377,34 +377,21 @@ static const struct rte_flow_ops enic_vf_flow_ops = {
 };
 
 static int
-enic_vf_filter_ctrl(struct rte_eth_dev *eth_dev,
-		    enum rte_filter_type filter_type,
-		    enum rte_filter_op filter_op,
-		    void *arg)
+enic_vf_flow_ops_get(struct rte_eth_dev *eth_dev,
+		     const struct rte_flow_ops **ops)
 {
 	struct enic_vf_representor *vf;
-	int ret = 0;
 
 	ENICPMD_FUNC_TRACE();
 	vf = eth_dev->data->dev_private;
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		if (vf->enic.flow_filter_mode == FILTER_FLOWMAN) {
-			*(const void **)arg = &enic_vf_flow_ops;
-		} else {
-			ENICPMD_LOG(WARNING, "VF representors require flowman support for rte_flow API");
-			ret = -EINVAL;
-		}
-		break;
-	default:
-		ENICPMD_LOG(WARNING, "Filter type (%d) not supported",
-			    filter_type);
-		ret = -EINVAL;
-		break;
+	if (vf->enic.flow_filter_mode != FILTER_FLOWMAN) {
+		ENICPMD_LOG(WARNING,
+				"VF representors require flowman support for rte_flow API");
+		return -EINVAL;
 	}
-	return ret;
+
+	*ops = &enic_vf_flow_ops;
+	return 0;
 }
 
 static int enic_vf_link_update(struct rte_eth_dev *eth_dev,
@@ -566,7 +553,7 @@ static const struct eth_dev_ops enic_vf_representor_dev_ops = {
 	.dev_start            = enic_vf_dev_start,
 	.dev_stop             = enic_vf_dev_stop,
 	.dev_close            = enic_vf_dev_close,
-	.filter_ctrl          = enic_vf_filter_ctrl,
+	.flow_ops_get         = enic_vf_flow_ops_get,
 	.link_update          = enic_vf_link_update,
 	.promiscuous_enable   = enic_vf_promiscuous_enable,
 	.promiscuous_disable  = enic_vf_promiscuous_disable,
diff --git a/drivers/net/failsafe/failsafe_ops.c b/drivers/net/failsafe/failsafe_ops.c
index 1343777d61..5ff33e03e0 100644
--- a/drivers/net/failsafe/failsafe_ops.c
+++ b/drivers/net/failsafe/failsafe_ops.c
@@ -1514,17 +1514,11 @@ fs_rss_hash_update(struct rte_eth_dev *dev,
 }
 
 static int
-fs_filter_ctrl(struct rte_eth_dev *dev __rte_unused,
-		enum rte_filter_type type,
-		enum rte_filter_op op,
-		void *arg)
+fs_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		const struct rte_flow_ops **ops)
 {
-	if (type == RTE_ETH_FILTER_GENERIC &&
-	    op == RTE_ETH_FILTER_GET) {
-		*(const void **)arg = &fs_flow_ops;
-		return 0;
-	}
-	return -ENOTSUP;
+	*ops = &fs_flow_ops;
+	return 0;
 }
 
 const struct eth_dev_ops failsafe_ops = {
@@ -1565,5 +1559,5 @@ const struct eth_dev_ops failsafe_ops = {
 	.mac_addr_set = fs_mac_addr_set,
 	.set_mc_addr_list = fs_set_mc_addr_list,
 	.rss_hash_update = fs_rss_hash_update,
-	.filter_ctrl = fs_filter_ctrl,
+	.flow_ops_get = fs_flow_ops_get,
 };
diff --git a/drivers/net/hinic/hinic_pmd_ethdev.c b/drivers/net/hinic/hinic_pmd_ethdev.c
index 1d6b710c9f..2352dd1615 100644
--- a/drivers/net/hinic/hinic_pmd_ethdev.c
+++ b/drivers/net/hinic/hinic_pmd_ethdev.c
@@ -2504,42 +2504,20 @@ static int hinic_set_mc_addr_list(struct rte_eth_dev *dev,
 }
 
 /**
- * DPDK callback to manage filter control operations
+ * DPDK callback to get flow operations
  *
  * @param dev
  *   Pointer to Ethernet device structure.
- * @param filter_type
- *   Filter type, which just supports generic type.
- * @param filter_op
- *   Filter operation to perform.
- * @param arg
+ * @param ops
  *   Pointer to operation-specific structure.
  *
  * @return
  *   0 on success, negative error value otherwise.
  */
-static int hinic_dev_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg)
+static int hinic_dev_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+				  const struct rte_flow_ops **ops)
 {
-	struct hinic_nic_dev *nic_dev = HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev);
-	int func_id = hinic_global_func_id(nic_dev->hwdev);
-
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &hinic_flow_ops;
-		break;
-	default:
-		PMD_DRV_LOG(INFO, "Filter type (%d) not supported",
-			filter_type);
-		return -EINVAL;
-	}
-
-	PMD_DRV_LOG(INFO, "Set filter_ctrl succeed, func_id: 0x%x, filter_type: 0x%x,"
-			"filter_op: 0x%x.", func_id, filter_type, filter_op);
+	*ops = &hinic_flow_ops;
 	return 0;
 }
 
@@ -3047,7 +3025,7 @@ static const struct eth_dev_ops hinic_pmd_ops = {
 	.mac_addr_remove               = hinic_mac_addr_remove,
 	.mac_addr_add                  = hinic_mac_addr_add,
 	.set_mc_addr_list              = hinic_set_mc_addr_list,
-	.filter_ctrl                   = hinic_dev_filter_ctrl,
+	.flow_ops_get                  = hinic_dev_flow_ops_get,
 };
 
 static const struct eth_dev_ops hinic_pmd_vf_ops = {
@@ -3082,7 +3060,7 @@ static const struct eth_dev_ops hinic_pmd_vf_ops = {
 	.mac_addr_remove               = hinic_mac_addr_remove,
 	.mac_addr_add                  = hinic_mac_addr_add,
 	.set_mc_addr_list              = hinic_set_mc_addr_list,
-	.filter_ctrl                   = hinic_dev_filter_ctrl,
+	.flow_ops_get                  = hinic_dev_flow_ops_get,
 };
 
 static int hinic_func_init(struct rte_eth_dev *eth_dev)
diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c
index 9cbcc13de8..f6d47369b2 100644
--- a/drivers/net/hns3/hns3_ethdev.c
+++ b/drivers/net/hns3/hns3_ethdev.c
@@ -6550,7 +6550,7 @@ static const struct eth_dev_ops hns3_eth_dev_ops = {
 	.rss_hash_conf_get      = hns3_dev_rss_hash_conf_get,
 	.reta_update            = hns3_dev_rss_reta_update,
 	.reta_query             = hns3_dev_rss_reta_query,
-	.filter_ctrl            = hns3_dev_filter_ctrl,
+	.flow_ops_get           = hns3_dev_flow_ops_get,
 	.vlan_filter_set        = hns3_vlan_filter_set,
 	.vlan_tpid_set          = hns3_vlan_tpid_set,
 	.vlan_offload_set       = hns3_vlan_offload_set,
diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h
index 932600d05b..d180dc1e7f 100644
--- a/drivers/net/hns3/hns3_ethdev.h
+++ b/drivers/net/hns3/hns3_ethdev.h
@@ -963,9 +963,8 @@ hns3_test_and_clear_bit(unsigned int nr, volatile uint64_t *addr)
 }
 
 int hns3_buffer_alloc(struct hns3_hw *hw);
-int hns3_dev_filter_ctrl(struct rte_eth_dev *dev,
-			 enum rte_filter_type filter_type,
-			 enum rte_filter_op filter_op, void *arg);
+int hns3_dev_flow_ops_get(struct rte_eth_dev *dev,
+			  const struct rte_flow_ops **ops);
 bool hns3_is_reset_pending(struct hns3_adapter *hns);
 bool hns3vf_is_reset_pending(struct hns3_adapter *hns);
 void hns3_update_link_status_and_event(struct hns3_hw *hw);
diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c
index fd20c522dc..a35e1d9aad 100644
--- a/drivers/net/hns3/hns3_ethdev_vf.c
+++ b/drivers/net/hns3/hns3_ethdev_vf.c
@@ -2769,7 +2769,7 @@ static const struct eth_dev_ops hns3vf_eth_dev_ops = {
 	.rss_hash_conf_get  = hns3_dev_rss_hash_conf_get,
 	.reta_update        = hns3_dev_rss_reta_update,
 	.reta_query         = hns3_dev_rss_reta_query,
-	.filter_ctrl        = hns3_dev_filter_ctrl,
+	.flow_ops_get       = hns3_dev_flow_ops_get,
 	.vlan_filter_set    = hns3vf_vlan_filter_set,
 	.vlan_offload_set   = hns3vf_vlan_offload_set,
 	.get_reg            = hns3_get_regs,
diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c
index a016857aa5..0c4e91109c 100644
--- a/drivers/net/hns3/hns3_flow.c
+++ b/drivers/net/hns3/hns3_flow.c
@@ -2001,34 +2001,16 @@ static const struct rte_flow_ops hns3_flow_ops = {
 	.isolate = NULL,
 };
 
-/*
- * The entry of flow API.
- * @param dev
- *   Pointer to Ethernet device.
- * @return
- *   0 on success, a negative errno value otherwise is set.
- */
 int
-hns3_dev_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op, void *arg)
+hns3_dev_flow_ops_get(struct rte_eth_dev *dev,
+		      const struct rte_flow_ops **ops)
 {
 	struct hns3_hw *hw;
-	int ret = 0;
 
 	hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		if (hw->adapter_state >= HNS3_NIC_CLOSED)
-			return -ENODEV;
-		*(const void **)arg = &hns3_flow_ops;
-		break;
-	default:
-		hns3_err(hw, "Filter type (%d) not supported", filter_type);
-		ret = -EOPNOTSUPP;
-		break;
-	}
+	if (hw->adapter_state >= HNS3_NIC_CLOSED)
+		return -ENODEV;
 
-	return ret;
+	*ops = &hns3_flow_ops;
+	return 0;
 }
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index d7cd049891..e8634755f2 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -319,10 +319,8 @@ static int i40e_dev_udp_tunnel_port_add(struct rte_eth_dev *dev,
 static int i40e_dev_udp_tunnel_port_del(struct rte_eth_dev *dev,
 					struct rte_eth_udp_tunnel *udp_tunnel);
 static void i40e_filter_input_set_init(struct i40e_pf *pf);
-static int i40e_dev_filter_ctrl(struct rte_eth_dev *dev,
-				enum rte_filter_type filter_type,
-				enum rte_filter_op filter_op,
-				void *arg);
+static int i40e_dev_flow_ops_get(struct rte_eth_dev *dev,
+				 const struct rte_flow_ops **ops);
 static int i40e_dev_get_dcb_info(struct rte_eth_dev *dev,
 				  struct rte_eth_dcb_info *dcb_info);
 static int i40e_dev_sync_phy_type(struct i40e_hw *hw);
@@ -484,7 +482,7 @@ static const struct eth_dev_ops i40e_eth_dev_ops = {
 	.rss_hash_conf_get            = i40e_dev_rss_hash_conf_get,
 	.udp_tunnel_port_add          = i40e_dev_udp_tunnel_port_add,
 	.udp_tunnel_port_del          = i40e_dev_udp_tunnel_port_del,
-	.filter_ctrl                  = i40e_dev_filter_ctrl,
+	.flow_ops_get                 = i40e_dev_flow_ops_get,
 	.rxq_info_get                 = i40e_rxq_info_get,
 	.txq_info_get                 = i40e_txq_info_get,
 	.rx_burst_mode_get            = i40e_rx_burst_mode_get,
@@ -9785,30 +9783,14 @@ i40e_ethertype_filter_set(struct i40e_pf *pf,
 }
 
 static int
-i40e_dev_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg)
+i40e_dev_flow_ops_get(struct rte_eth_dev *dev,
+		      const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
 	if (dev == NULL)
 		return -EINVAL;
 
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &i40e_flow_ops;
-		break;
-	default:
-		PMD_DRV_LOG(WARNING, "Filter type (%d) not supported",
-							filter_type);
-		ret = -EINVAL;
-		break;
-	}
-
-	return ret;
+	*ops = &i40e_flow_ops;
+	return 0;
 }
 
 /*
diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c
index 4d37722022..e3933cde26 100644
--- a/drivers/net/iavf/iavf_ethdev.c
+++ b/drivers/net/iavf/iavf_ethdev.c
@@ -117,10 +117,8 @@ static int iavf_dev_rx_queue_intr_enable(struct rte_eth_dev *dev,
 					uint16_t queue_id);
 static int iavf_dev_rx_queue_intr_disable(struct rte_eth_dev *dev,
 					 uint16_t queue_id);
-static int iavf_dev_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg);
+static int iavf_dev_flow_ops_get(struct rte_eth_dev *dev,
+				 const struct rte_flow_ops **ops);
 static int iavf_set_mc_addr_list(struct rte_eth_dev *dev,
 			struct rte_ether_addr *mc_addrs,
 			uint32_t mc_addrs_num);
@@ -195,7 +193,7 @@ static const struct eth_dev_ops iavf_eth_dev_ops = {
 	.mtu_set                    = iavf_dev_mtu_set,
 	.rx_queue_intr_enable       = iavf_dev_rx_queue_intr_enable,
 	.rx_queue_intr_disable      = iavf_dev_rx_queue_intr_disable,
-	.filter_ctrl                = iavf_dev_filter_ctrl,
+	.flow_ops_get               = iavf_dev_flow_ops_get,
 	.tx_done_cleanup	    = iavf_dev_tx_done_cleanup,
 };
 
@@ -2070,30 +2068,14 @@ iavf_dev_interrupt_handler(void *param)
 }
 
 static int
-iavf_dev_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg)
+iavf_dev_flow_ops_get(struct rte_eth_dev *dev,
+		      const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
 	if (!dev)
 		return -EINVAL;
 
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &iavf_flow_ops;
-		break;
-	default:
-		PMD_DRV_LOG(WARNING, "Filter type (%d) not supported",
-			    filter_type);
-		ret = -EINVAL;
-		break;
-	}
-
-	return ret;
+	*ops = &iavf_flow_ops;
+	return 0;
 }
 
 static void
diff --git a/drivers/net/ice/ice_dcf_ethdev.c b/drivers/net/ice/ice_dcf_ethdev.c
index e0772295e9..86600959f8 100644
--- a/drivers/net/ice/ice_dcf_ethdev.c
+++ b/drivers/net/ice/ice_dcf_ethdev.c
@@ -743,31 +743,14 @@ ice_dcf_dev_allmulticast_disable(__rte_unused struct rte_eth_dev *dev)
 }
 
 static int
-ice_dcf_dev_filter_ctrl(struct rte_eth_dev *dev,
-			enum rte_filter_type filter_type,
-			enum rte_filter_op filter_op,
-			void *arg)
+ice_dcf_dev_flow_ops_get(struct rte_eth_dev *dev,
+			 const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
 	if (!dev)
 		return -EINVAL;
 
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &ice_flow_ops;
-		break;
-
-	default:
-		PMD_DRV_LOG(WARNING, "Filter type (%d) not supported",
-			    filter_type);
-		ret = -EINVAL;
-		break;
-	}
-
-	return ret;
+	*ops = &ice_flow_ops;
+	return 0;
 }
 
 #define ICE_DCF_32_BIT_WIDTH (CHAR_BIT * 4)
@@ -984,7 +967,7 @@ static const struct eth_dev_ops ice_dcf_eth_dev_ops = {
 	.promiscuous_disable     = ice_dcf_dev_promiscuous_disable,
 	.allmulticast_enable     = ice_dcf_dev_allmulticast_enable,
 	.allmulticast_disable    = ice_dcf_dev_allmulticast_disable,
-	.filter_ctrl             = ice_dcf_dev_filter_ctrl,
+	.flow_ops_get            = ice_dcf_dev_flow_ops_get,
 	.udp_tunnel_port_add	 = ice_dcf_dev_udp_tunnel_port_add,
 	.udp_tunnel_port_del	 = ice_dcf_dev_udp_tunnel_port_del,
 };
diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c
index dfd99ace94..f49fad4aba 100644
--- a/drivers/net/ice/ice_ethdev.c
+++ b/drivers/net/ice/ice_ethdev.c
@@ -129,10 +129,8 @@ static int ice_xstats_get(struct rte_eth_dev *dev,
 static int ice_xstats_get_names(struct rte_eth_dev *dev,
 				struct rte_eth_xstat_name *xstats_names,
 				unsigned int limit);
-static int ice_dev_filter_ctrl(struct rte_eth_dev *dev,
-			enum rte_filter_type filter_type,
-			enum rte_filter_op filter_op,
-			void *arg);
+static int ice_dev_flow_ops_get(struct rte_eth_dev *dev,
+				const struct rte_flow_ops **ops);
 static int ice_dev_udp_tunnel_port_add(struct rte_eth_dev *dev,
 			struct rte_eth_udp_tunnel *udp_tunnel);
 static int ice_dev_udp_tunnel_port_del(struct rte_eth_dev *dev,
@@ -215,7 +213,7 @@ static const struct eth_dev_ops ice_eth_dev_ops = {
 	.xstats_get                   = ice_xstats_get,
 	.xstats_get_names             = ice_xstats_get_names,
 	.xstats_reset                 = ice_stats_reset,
-	.filter_ctrl                  = ice_dev_filter_ctrl,
+	.flow_ops_get                 = ice_dev_flow_ops_get,
 	.udp_tunnel_port_add          = ice_dev_udp_tunnel_port_add,
 	.udp_tunnel_port_del          = ice_dev_udp_tunnel_port_del,
 	.tx_done_cleanup              = ice_tx_done_cleanup,
@@ -5259,30 +5257,14 @@ static int ice_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
 }
 
 static int
-ice_dev_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg)
+ice_dev_flow_ops_get(struct rte_eth_dev *dev,
+		     const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
 	if (!dev)
 		return -EINVAL;
 
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &ice_flow_ops;
-		break;
-	default:
-		PMD_DRV_LOG(WARNING, "Filter type (%d) not supported",
-					filter_type);
-		ret = -EINVAL;
-		break;
-	}
-
-	return ret;
+	*ops = &ice_flow_ops;
+	return 0;
 }
 
 /* Add UDP tunneling port */
diff --git a/drivers/net/igc/igc_ethdev.c b/drivers/net/igc/igc_ethdev.c
index dbaa7a83e5..25abd4ddc3 100644
--- a/drivers/net/igc/igc_ethdev.c
+++ b/drivers/net/igc/igc_ethdev.c
@@ -297,7 +297,7 @@ static const struct eth_dev_ops eth_igc_ops = {
 	.vlan_offload_set	= eth_igc_vlan_offload_set,
 	.vlan_tpid_set		= eth_igc_vlan_tpid_set,
 	.vlan_strip_queue_set	= eth_igc_vlan_strip_queue_set,
-	.filter_ctrl		= eth_igc_filter_ctrl,
+	.flow_ops_get		= eth_igc_flow_ops_get,
 };
 
 /*
diff --git a/drivers/net/igc/igc_filter.c b/drivers/net/igc/igc_filter.c
index 836621d4c1..51fcabfb59 100644
--- a/drivers/net/igc/igc_filter.c
+++ b/drivers/net/igc/igc_filter.c
@@ -369,24 +369,9 @@ igc_clear_all_filter(struct rte_eth_dev *dev)
 }
 
 int
-eth_igc_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type,
-		enum rte_filter_op filter_op, void *arg)
+eth_igc_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		     const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
-	RTE_SET_USED(dev);
-
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &igc_flow_ops;
-		break;
-	default:
-		PMD_DRV_LOG(WARNING, "Filter type (%d) not supported",
-							filter_type);
-		ret = -EINVAL;
-	}
-
-	return ret;
+	*ops = &igc_flow_ops;
+	return 0;
 }
diff --git a/drivers/net/igc/igc_filter.h b/drivers/net/igc/igc_filter.h
index df8516bc40..781d270def 100644
--- a/drivers/net/igc/igc_filter.h
+++ b/drivers/net/igc/igc_filter.h
@@ -29,9 +29,8 @@ int igc_set_syn_filter(struct rte_eth_dev *dev,
 		const struct igc_syn_filter *filter);
 void igc_clear_syn_filter(struct rte_eth_dev *dev);
 void igc_clear_all_filter(struct rte_eth_dev *dev);
-int
-eth_igc_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type,
-		enum rte_filter_op filter_op, void *arg);
+int eth_igc_flow_ops_get(struct rte_eth_dev *dev,
+			 const struct rte_flow_ops **ops);
 
 #ifdef __cplusplus
 }
diff --git a/drivers/net/ipn3ke/ipn3ke_representor.c b/drivers/net/ipn3ke/ipn3ke_representor.c
index 856d21ef9b..589d9fa587 100644
--- a/drivers/net/ipn3ke/ipn3ke_representor.c
+++ b/drivers/net/ipn3ke/ipn3ke_representor.c
@@ -2821,11 +2821,9 @@ ipn3ke_rpst_mtu_set(struct rte_eth_dev *ethdev, uint16_t mtu)
 }
 
 static int
-ipn3ke_afu_filter_ctrl(struct rte_eth_dev *ethdev,
-	enum rte_filter_type filter_type, enum rte_filter_op filter_op,
-	void *arg)
+ipn3ke_afu_flow_ops_get(struct rte_eth_dev *ethdev,
+			const struct rte_flow_ops **ops)
 {
-	int ret = 0;
 	struct ipn3ke_hw *hw;
 	struct ipn3ke_rpst *rpst;
 
@@ -2836,27 +2834,13 @@ ipn3ke_afu_filter_ctrl(struct rte_eth_dev *ethdev,
 	rpst = IPN3KE_DEV_PRIVATE_TO_RPST(ethdev);
 
 	if (hw->acc_flow)
-		switch (filter_type) {
-		case RTE_ETH_FILTER_GENERIC:
-			if (filter_op != RTE_ETH_FILTER_GET)
-				return -EINVAL;
-			*(const void **)arg = &ipn3ke_flow_ops;
-			break;
-		default:
-			IPN3KE_AFU_PMD_WARN("Filter type (%d) not supported",
-					filter_type);
-			ret = -EINVAL;
-			break;
-		}
+		*ops = &ipn3ke_flow_ops;
 	else if (rpst->i40e_pf_eth)
-		(*rpst->i40e_pf_eth->dev_ops->filter_ctrl)(ethdev,
-							filter_type,
-							filter_op,
-							arg);
+		(*rpst->i40e_pf_eth->dev_ops->flow_ops_get)(ethdev, ops);
 	else
 		return -EINVAL;
 
-	return ret;
+	return 0;
 }
 
 static const struct eth_dev_ops ipn3ke_rpst_dev_ops = {
@@ -2874,7 +2858,7 @@ static const struct eth_dev_ops ipn3ke_rpst_dev_ops = {
 	.stats_reset          = ipn3ke_rpst_stats_reset,
 	.xstats_reset         = ipn3ke_rpst_stats_reset,
 
-	.filter_ctrl          = ipn3ke_afu_filter_ctrl,
+	.flow_ops_get         = ipn3ke_afu_flow_ops_get,
 
 	.rx_queue_start       = ipn3ke_rpst_rx_queue_start,
 	.rx_queue_stop        = ipn3ke_rpst_rx_queue_stop,
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index 761a0f26bb..d5581a243a 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -304,10 +304,8 @@ static int ixgbe_add_5tuple_filter(struct rte_eth_dev *dev,
 			struct ixgbe_5tuple_filter *filter);
 static void ixgbe_remove_5tuple_filter(struct rte_eth_dev *dev,
 			struct ixgbe_5tuple_filter *filter);
-static int ixgbe_dev_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg);
+static int ixgbe_dev_flow_ops_get(struct rte_eth_dev *dev,
+				  const struct rte_flow_ops **ops);
 static int ixgbevf_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu);
 
 static int ixgbe_dev_set_mc_addr_list(struct rte_eth_dev *dev,
@@ -538,7 +536,7 @@ static const struct eth_dev_ops ixgbe_eth_dev_ops = {
 	.reta_query           = ixgbe_dev_rss_reta_query,
 	.rss_hash_update      = ixgbe_dev_rss_hash_update,
 	.rss_hash_conf_get    = ixgbe_dev_rss_hash_conf_get,
-	.filter_ctrl          = ixgbe_dev_filter_ctrl,
+	.flow_ops_get         = ixgbe_dev_flow_ops_get,
 	.set_mc_addr_list     = ixgbe_dev_set_mc_addr_list,
 	.rxq_info_get         = ixgbe_rxq_info_get,
 	.txq_info_get         = ixgbe_txq_info_get,
@@ -6798,27 +6796,11 @@ ixgbe_add_del_ethertype_filter(struct rte_eth_dev *dev,
 }
 
 static int
-ixgbe_dev_filter_ctrl(__rte_unused struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg)
+ixgbe_dev_flow_ops_get(__rte_unused struct rte_eth_dev *dev,
+		       const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &ixgbe_flow_ops;
-		break;
-	default:
-		PMD_DRV_LOG(WARNING, "Filter type (%d) not supported",
-							filter_type);
-		ret = -EINVAL;
-		break;
-	}
-
-	return ret;
+	*ops = &ixgbe_flow_ops;
+	return 0;
 }
 
 static u8 *
diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c
index 041c1934f5..d048d21033 100644
--- a/drivers/net/mlx4/mlx4.c
+++ b/drivers/net/mlx4/mlx4.c
@@ -437,7 +437,7 @@ static const struct eth_dev_ops mlx4_dev_ops = {
 	.flow_ctrl_get = mlx4_flow_ctrl_get,
 	.flow_ctrl_set = mlx4_flow_ctrl_set,
 	.mtu_set = mlx4_mtu_set,
-	.filter_ctrl = mlx4_filter_ctrl,
+	.flow_ops_get = mlx4_flow_ops_get,
 	.rx_queue_intr_enable = mlx4_rx_intr_enable,
 	.rx_queue_intr_disable = mlx4_rx_intr_disable,
 	.is_removed = mlx4_is_removed,
diff --git a/drivers/net/mlx4/mlx4_flow.c b/drivers/net/mlx4/mlx4_flow.c
index b8ecfa829b..43a65abcc0 100644
--- a/drivers/net/mlx4/mlx4_flow.c
+++ b/drivers/net/mlx4/mlx4_flow.c
@@ -1590,37 +1590,19 @@ static const struct rte_flow_ops mlx4_flow_ops = {
 };
 
 /**
- * Manage filter operations.
+ * Get rte_flow callbacks.
  *
  * @param dev
  *   Pointer to Ethernet device structure.
- * @param filter_type
- *   Filter type.
- * @param filter_op
- *   Operation to perform.
- * @param arg
+ * @param ops
  *   Pointer to operation-specific structure.
  *
- * @return
- *   0 on success, negative errno value otherwise and rte_errno is set.
+ * @return 0
  */
 int
-mlx4_filter_ctrl(struct rte_eth_dev *dev,
-		 enum rte_filter_type filter_type,
-		 enum rte_filter_op filter_op,
-		 void *arg)
+mlx4_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		  const struct rte_flow_ops **ops)
 {
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			break;
-		*(const void **)arg = &mlx4_flow_ops;
-		return 0;
-	default:
-		ERROR("%p: filter type (%d) not supported",
-		      (void *)dev, filter_type);
-		break;
-	}
-	rte_errno = ENOTSUP;
-	return -rte_errno;
+	*ops = &mlx4_flow_ops;
+	return 0;
 }
diff --git a/drivers/net/mlx4/mlx4_flow.h b/drivers/net/mlx4/mlx4_flow.h
index e4366f28bb..5e82df6bd6 100644
--- a/drivers/net/mlx4/mlx4_flow.h
+++ b/drivers/net/mlx4/mlx4_flow.h
@@ -51,9 +51,6 @@ uint64_t mlx4_conv_rss_types(struct mlx4_priv *priv, uint64_t types,
 			     int verbs_to_dpdk);
 int mlx4_flow_sync(struct mlx4_priv *priv, struct rte_flow_error *error);
 void mlx4_flow_clean(struct mlx4_priv *priv);
-int mlx4_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg);
+int mlx4_flow_ops_get(struct rte_eth_dev *dev, const struct rte_flow_ops **ops);
 
 #endif /* RTE_PMD_MLX4_FLOW_H_ */
diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
index abd7ff70df..d9372f0a00 100644
--- a/drivers/net/mlx5/mlx5.c
+++ b/drivers/net/mlx5/mlx5.c
@@ -1477,7 +1477,7 @@ const struct eth_dev_ops mlx5_dev_ops = {
 	.reta_query = mlx5_dev_rss_reta_query,
 	.rss_hash_update = mlx5_rss_hash_update,
 	.rss_hash_conf_get = mlx5_rss_hash_conf_get,
-	.filter_ctrl = mlx5_dev_filter_ctrl,
+	.flow_ops_get = mlx5_flow_ops_get,
 	.rxq_info_get = mlx5_rxq_info_get,
 	.txq_info_get = mlx5_txq_info_get,
 	.rx_burst_mode_get = mlx5_rx_burst_mode_get,
@@ -1562,7 +1562,7 @@ const struct eth_dev_ops mlx5_dev_ops_isolate = {
 	.mtu_set = mlx5_dev_set_mtu,
 	.vlan_strip_queue_set = mlx5_vlan_strip_queue_set,
 	.vlan_offload_set = mlx5_vlan_offload_set,
-	.filter_ctrl = mlx5_dev_filter_ctrl,
+	.flow_ops_get = mlx5_flow_ops_get,
 	.rxq_info_get = mlx5_rxq_info_get,
 	.txq_info_get = mlx5_txq_info_get,
 	.rx_burst_mode_get = mlx5_rx_burst_mode_get,
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index a281fd20ea..24aff0beab 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -1192,10 +1192,7 @@ int mlx5_flow_query(struct rte_eth_dev *dev, struct rte_flow *flow,
 		    struct rte_flow_error *error);
 int mlx5_flow_isolate(struct rte_eth_dev *dev, int enable,
 		      struct rte_flow_error *error);
-int mlx5_dev_filter_ctrl(struct rte_eth_dev *dev,
-			 enum rte_filter_type filter_type,
-			 enum rte_filter_op filter_op,
-			 void *arg);
+int mlx5_flow_ops_get(struct rte_eth_dev *dev, const struct rte_flow_ops **ops);
 int mlx5_flow_start_default(struct rte_eth_dev *dev);
 void mlx5_flow_stop_default(struct rte_eth_dev *dev);
 int mlx5_flow_verify(struct rte_eth_dev *dev);
diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c
index 773f3e63f4..29a1677164 100644
--- a/drivers/net/mlx5/mlx5_flow.c
+++ b/drivers/net/mlx5/mlx5_flow.c
@@ -6492,40 +6492,20 @@ mlx5_flow_query(struct rte_eth_dev *dev,
 }
 
 /**
- * Manage filter operations.
+ * Get rte_flow callbacks.
  *
  * @param dev
  *   Pointer to Ethernet device structure.
- * @param filter_type
- *   Filter type.
- * @param filter_op
- *   Operation to perform.
- * @param arg
+ * @param ops
  *   Pointer to operation-specific structure.
  *
- * @return
- *   0 on success, a negative errno value otherwise and rte_errno is set.
+ * @return 0
  */
 int
-mlx5_dev_filter_ctrl(struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg)
+mlx5_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		  const struct rte_flow_ops **ops)
 {
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET) {
-			rte_errno = EINVAL;
-			return -rte_errno;
-		}
-		*(const void **)arg = &mlx5_flow_ops;
-		return 0;
-	default:
-		DRV_LOG(ERR, "port %u filter type (%d) not supported",
-			dev->data->port_id, filter_type);
-		rte_errno = ENOTSUP;
-		return -rte_errno;
-	}
+	*ops = &mlx5_flow_ops;
 	return 0;
 }
 
diff --git a/drivers/net/mvpp2/mrvl_ethdev.c b/drivers/net/mvpp2/mrvl_ethdev.c
index e119952340..1d41788974 100644
--- a/drivers/net/mvpp2/mrvl_ethdev.c
+++ b/drivers/net/mvpp2/mrvl_ethdev.c
@@ -2340,32 +2340,18 @@ mrvl_rss_hash_conf_get(struct rte_eth_dev *dev,
  *
  * @param dev
  *   Pointer to the device structure.
- * @param filer_type
- *   Flow filter type.
- * @param filter_op
- *   Flow filter operation.
- * @param arg
+ * @param ops
  *   Pointer to pass the flow ops.
  *
  * @return
  *   0 on success, negative error value otherwise.
  */
 static int
-mrvl_eth_filter_ctrl(struct rte_eth_dev *dev __rte_unused,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op, void *arg)
+mrvl_eth_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		      const struct rte_flow_ops **ops)
 {
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &mrvl_flow_ops;
-		return 0;
-	default:
-		MRVL_LOG(WARNING, "Filter type (%d) not supported",
-				filter_type);
-		return -EINVAL;
-	}
+	*ops = &mrvl_flow_ops;
+	return 0;
 }
 
 /**
@@ -2443,7 +2429,7 @@ static const struct eth_dev_ops mrvl_ops = {
 	.flow_ctrl_set = mrvl_flow_ctrl_set,
 	.rss_hash_update = mrvl_rss_hash_update,
 	.rss_hash_conf_get = mrvl_rss_hash_conf_get,
-	.filter_ctrl = mrvl_eth_filter_ctrl,
+	.flow_ops_get = mrvl_eth_flow_ops_get,
 	.mtr_ops_get = mrvl_mtr_ops_get,
 	.tm_ops_get = mrvl_tm_ops_get,
 };
diff --git a/drivers/net/octeontx2/otx2_ethdev.c b/drivers/net/octeontx2/otx2_ethdev.c
index e9fbbca4da..bacf180a6d 100644
--- a/drivers/net/octeontx2/otx2_ethdev.c
+++ b/drivers/net/octeontx2/otx2_ethdev.c
@@ -2322,7 +2322,7 @@ static const struct eth_dev_ops otx2_eth_dev_ops = {
 	.tx_done_cleanup          = otx2_nix_tx_done_cleanup,
 	.set_queue_rate_limit     = otx2_nix_tm_set_queue_rate_limit,
 	.pool_ops_supported       = otx2_nix_pool_ops_supported,
-	.filter_ctrl              = otx2_nix_dev_filter_ctrl,
+	.flow_ops_get             = otx2_nix_dev_flow_ops_get,
 	.get_module_info          = otx2_nix_get_module_info,
 	.get_module_eeprom        = otx2_nix_get_module_eeprom,
 	.fw_version_get           = otx2_nix_fw_version_get,
diff --git a/drivers/net/octeontx2/otx2_ethdev.h b/drivers/net/octeontx2/otx2_ethdev.h
index 99f0469d89..7391f09b8a 100644
--- a/drivers/net/octeontx2/otx2_ethdev.h
+++ b/drivers/net/octeontx2/otx2_ethdev.h
@@ -396,9 +396,8 @@ otx2_eth_pmd_priv(struct rte_eth_dev *eth_dev)
 /* Ops */
 int otx2_nix_info_get(struct rte_eth_dev *eth_dev,
 		      struct rte_eth_dev_info *dev_info);
-int otx2_nix_dev_filter_ctrl(struct rte_eth_dev *eth_dev,
-			     enum rte_filter_type filter_type,
-			     enum rte_filter_op filter_op, void *arg);
+int otx2_nix_dev_flow_ops_get(struct rte_eth_dev *eth_dev,
+			      const struct rte_flow_ops **ops);
 int otx2_nix_fw_version_get(struct rte_eth_dev *eth_dev, char *fw_version,
 			    size_t fw_size);
 int otx2_nix_get_module_info(struct rte_eth_dev *eth_dev,
diff --git a/drivers/net/octeontx2/otx2_ethdev_ops.c b/drivers/net/octeontx2/otx2_ethdev_ops.c
index 963cc285ed..9e3f80937d 100644
--- a/drivers/net/octeontx2/otx2_ethdev_ops.c
+++ b/drivers/net/octeontx2/otx2_ethdev_ops.c
@@ -471,24 +471,11 @@ otx2_nix_pool_ops_supported(struct rte_eth_dev *eth_dev, const char *pool)
 }
 
 int
-otx2_nix_dev_filter_ctrl(struct rte_eth_dev *eth_dev,
-			 enum rte_filter_type filter_type,
-			 enum rte_filter_op filter_op, void *arg)
+otx2_nix_dev_flow_ops_get(struct rte_eth_dev *eth_dev __rte_unused,
+			  const struct rte_flow_ops **ops)
 {
-	RTE_SET_USED(eth_dev);
-
-	if (filter_type != RTE_ETH_FILTER_GENERIC) {
-		otx2_err("Unsupported filter type %d", filter_type);
-		return -ENOTSUP;
-	}
-
-	if (filter_op == RTE_ETH_FILTER_GET) {
-		*(const void **)arg = &otx2_flow_ops;
-		return 0;
-	}
-
-	otx2_err("Invalid filter_op %d", filter_op);
-	return -EINVAL;
+	*ops = &otx2_flow_ops;
+	return 0;
 }
 
 static struct cgx_fw_data *
diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c
index ab5f5b1065..ff4b9255c4 100644
--- a/drivers/net/qede/qede_ethdev.c
+++ b/drivers/net/qede/qede_ethdev.c
@@ -2434,7 +2434,7 @@ static const struct eth_dev_ops qede_eth_dev_ops = {
 	.reta_update  = qede_rss_reta_update,
 	.reta_query  = qede_rss_reta_query,
 	.mtu_set = qede_set_mtu,
-	.filter_ctrl = qede_dev_filter_ctrl,
+	.flow_ops_get = qede_dev_flow_ops_get,
 	.udp_tunnel_port_add = qede_udp_dst_port_add,
 	.udp_tunnel_port_del = qede_udp_dst_port_del,
 	.fw_version_get = qede_fw_version_get,
diff --git a/drivers/net/qede/qede_ethdev.h b/drivers/net/qede/qede_ethdev.h
index da4b87f5e2..a38b701183 100644
--- a/drivers/net/qede/qede_ethdev.h
+++ b/drivers/net/qede/qede_ethdev.h
@@ -285,11 +285,8 @@ int qede_dev_set_link_state(struct rte_eth_dev *eth_dev, bool link_up);
 int qede_link_update(struct rte_eth_dev *eth_dev,
 		     __rte_unused int wait_to_complete);
 
-int qede_dev_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type type,
-			 enum rte_filter_op op, void *arg);
-
-int qede_ntuple_filter_conf(struct rte_eth_dev *eth_dev,
-			    enum rte_filter_op filter_op, void *arg);
+int qede_dev_flow_ops_get(struct rte_eth_dev *dev,
+			  const struct rte_flow_ops **ops);
 
 int qede_check_fdir_support(struct rte_eth_dev *eth_dev);
 
diff --git a/drivers/net/qede/qede_filter.c b/drivers/net/qede/qede_filter.c
index df5c07dfe5..c756594bfc 100644
--- a/drivers/net/qede/qede_filter.c
+++ b/drivers/net/qede/qede_filter.c
@@ -1050,31 +1050,18 @@ const struct rte_flow_ops qede_flow_ops = {
 	.flush = qede_flow_flush,
 };
 
-int qede_dev_filter_ctrl(struct rte_eth_dev *eth_dev,
-			 enum rte_filter_type filter_type,
-			 enum rte_filter_op filter_op,
-			 void *arg)
+int
+qede_dev_flow_ops_get(struct rte_eth_dev *eth_dev,
+		      const struct rte_flow_ops **ops)
 {
 	struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
 	struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
 
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (ECORE_IS_CMT(edev)) {
-			DP_ERR(edev, "flowdir is not supported in 100G mode\n");
-			return -ENOTSUP;
-		}
-
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-
-		*(const void **)arg = &qede_flow_ops;
-		return 0;
-	default:
-		DP_ERR(edev, "Unsupported filter type %d\n",
-			filter_type);
-		return -EINVAL;
+	if (ECORE_IS_CMT(edev)) {
+		DP_ERR(edev, "flowdir is not supported in 100G mode\n");
+		return -ENOTSUP;
 	}
 
+	*ops = &qede_flow_ops;
 	return 0;
 }
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 479b4f4df6..d72df2e13b 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -1751,32 +1751,11 @@ sfc_dev_rss_reta_update(struct rte_eth_dev *dev,
 }
 
 static int
-sfc_dev_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type,
-		    enum rte_filter_op filter_op,
-		    void *arg)
+sfc_dev_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		     const struct rte_flow_ops **ops)
 {
-	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
-	int rc = ENOTSUP;
-
-	sfc_log_init(sa, "entry");
-
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET) {
-			rc = EINVAL;
-		} else {
-			*(const void **)arg = &sfc_flow_ops;
-			rc = 0;
-		}
-		break;
-	default:
-		sfc_err(sa, "Unknown filter type %u", filter_type);
-		break;
-	}
-
-	sfc_log_init(sa, "exit: %d", -rc);
-	SFC_ASSERT(rc >= 0);
-	return -rc;
+	*ops = &sfc_flow_ops;
+	return 0;
 }
 
 static int
@@ -1859,7 +1838,7 @@ static const struct eth_dev_ops sfc_eth_dev_ops = {
 	.reta_query			= sfc_dev_rss_reta_query,
 	.rss_hash_update		= sfc_dev_rss_hash_update,
 	.rss_hash_conf_get		= sfc_dev_rss_hash_conf_get,
-	.filter_ctrl			= sfc_dev_filter_ctrl,
+	.flow_ops_get			= sfc_dev_flow_ops_get,
 	.set_mc_addr_list		= sfc_set_mc_addr_list,
 	.rxq_info_get			= sfc_rx_queue_info_get,
 	.txq_info_get			= sfc_tx_queue_info_get,
diff --git a/drivers/net/softnic/rte_eth_softnic.c b/drivers/net/softnic/rte_eth_softnic.c
index 99d8468c94..0c2a79a7d2 100644
--- a/drivers/net/softnic/rte_eth_softnic.c
+++ b/drivers/net/softnic/rte_eth_softnic.c
@@ -248,18 +248,11 @@ pmd_link_update(struct rte_eth_dev *dev __rte_unused,
 }
 
 static int
-pmd_filter_ctrl(struct rte_eth_dev *dev __rte_unused,
-		enum rte_filter_type filter_type,
-		enum rte_filter_op filter_op,
-		void *arg)
+pmd_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		 const struct rte_flow_ops **ops)
 {
-	if (filter_type == RTE_ETH_FILTER_GENERIC &&
-			filter_op == RTE_ETH_FILTER_GET) {
-		*(const void **)arg = &pmd_flow_ops;
-		return 0;
-	}
-
-	return -ENOTSUP;
+	*ops = &pmd_flow_ops;
+	return 0;
 }
 
 static int
@@ -287,7 +280,7 @@ static const struct eth_dev_ops pmd_ops = {
 	.dev_infos_get = pmd_dev_infos_get,
 	.rx_queue_setup = pmd_rx_queue_setup,
 	.tx_queue_setup = pmd_tx_queue_setup,
-	.filter_ctrl = pmd_filter_ctrl,
+	.flow_ops_get = pmd_flow_ops_get,
 	.tm_ops_get = pmd_tm_ops_get,
 	.mtr_ops_get = pmd_mtr_ops_get,
 };
diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c
index c36d4bf76e..68baa18523 100644
--- a/drivers/net/tap/rte_eth_tap.c
+++ b/drivers/net/tap/rte_eth_tap.c
@@ -1890,7 +1890,7 @@ static const struct eth_dev_ops ops = {
 	.stats_reset            = tap_stats_reset,
 	.dev_supported_ptypes_get = tap_dev_supported_ptypes_get,
 	.rss_hash_update        = tap_rss_hash_update,
-	.filter_ctrl            = tap_dev_filter_ctrl,
+	.flow_ops_get           = tap_dev_flow_ops_get,
 };
 
 static int
diff --git a/drivers/net/tap/tap_flow.c b/drivers/net/tap/tap_flow.c
index 1538349e9c..1ee6fb30ab 100644
--- a/drivers/net/tap/tap_flow.c
+++ b/drivers/net/tap/tap_flow.c
@@ -2160,35 +2160,20 @@ static int rss_add_actions(struct rte_flow *flow, struct pmd_internals *pmd,
 }
 
 /**
- * Manage filter operations.
+ * Get rte_flow operations.
  *
  * @param dev
  *   Pointer to Ethernet device structure.
- * @param filter_type
- *   Filter type.
- * @param filter_op
- *   Operation to perform.
- * @param arg
+ * @param ops
  *   Pointer to operation-specific structure.
  *
  * @return
  *   0 on success, negative errno value on failure.
  */
 int
-tap_dev_filter_ctrl(struct rte_eth_dev *dev,
-		    enum rte_filter_type filter_type,
-		    enum rte_filter_op filter_op,
-		    void *arg)
+tap_dev_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+		     const struct rte_flow_ops **ops)
 {
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &tap_flow_ops;
-		return 0;
-	default:
-		TAP_LOG(ERR, "%p: filter type (%d) not supported",
-			dev, filter_type);
-	}
-	return -EINVAL;
+	*ops = &tap_flow_ops;
+	return 0;
 }
diff --git a/drivers/net/tap/tap_flow.h b/drivers/net/tap/tap_flow.h
index ac60a9ae20..240fbc3dfa 100644
--- a/drivers/net/tap/tap_flow.h
+++ b/drivers/net/tap/tap_flow.h
@@ -46,10 +46,8 @@ enum bpf_fd_idx {
 	SEC_MAX,
 };
 
-int tap_dev_filter_ctrl(struct rte_eth_dev *dev,
-			enum rte_filter_type filter_type,
-			enum rte_filter_op filter_op,
-			void *arg);
+int tap_dev_flow_ops_get(struct rte_eth_dev *dev,
+			 const struct rte_flow_ops **ops);
 int tap_flow_flush(struct rte_eth_dev *dev, struct rte_flow_error *error);
 
 int tap_flow_implicit_create(struct pmd_internals *pmd,
diff --git a/drivers/net/txgbe/txgbe_ethdev.c b/drivers/net/txgbe/txgbe_ethdev.c
index 90137d0ceb..ab748e129d 100644
--- a/drivers/net/txgbe/txgbe_ethdev.c
+++ b/drivers/net/txgbe/txgbe_ethdev.c
@@ -4076,27 +4076,11 @@ txgbe_add_del_ethertype_filter(struct rte_eth_dev *dev,
 }
 
 static int
-txgbe_dev_filter_ctrl(__rte_unused struct rte_eth_dev *dev,
-		     enum rte_filter_type filter_type,
-		     enum rte_filter_op filter_op,
-		     void *arg)
+txgbe_dev_flow_ops_get(__rte_unused struct rte_eth_dev *dev,
+		       const struct rte_flow_ops **ops)
 {
-	int ret = 0;
-
-	switch (filter_type) {
-	case RTE_ETH_FILTER_GENERIC:
-		if (filter_op != RTE_ETH_FILTER_GET)
-			return -EINVAL;
-		*(const void **)arg = &txgbe_flow_ops;
-		break;
-	default:
-		PMD_DRV_LOG(WARNING, "Filter type (%d) not supported",
-							filter_type);
-		ret = -EINVAL;
-		break;
-	}
-
-	return ret;
+	*ops = &txgbe_flow_ops;
+	return 0;
 }
 
 static u8 *
@@ -5206,7 +5190,7 @@ static const struct eth_dev_ops txgbe_eth_dev_ops = {
 	.reta_query                 = txgbe_dev_rss_reta_query,
 	.rss_hash_update            = txgbe_dev_rss_hash_update,
 	.rss_hash_conf_get          = txgbe_dev_rss_hash_conf_get,
-	.filter_ctrl                = txgbe_dev_filter_ctrl,
+	.flow_ops_get               = txgbe_dev_flow_ops_get,
 	.set_mc_addr_list           = txgbe_dev_set_mc_addr_list,
 	.rxq_info_get               = txgbe_rxq_info_get,
 	.txq_info_get               = txgbe_txq_info_get,
diff --git a/lib/librte_ethdev/ethdev_driver.h b/lib/librte_ethdev/ethdev_driver.h
index 57fdedaa1a..1c6592ec23 100644
--- a/lib/librte_ethdev/ethdev_driver.h
+++ b/lib/librte_ethdev/ethdev_driver.h
@@ -465,34 +465,10 @@ typedef int (*eth_get_module_eeprom_t)(struct rte_eth_dev *dev,
 				       struct rte_dev_eeprom_info *info);
 /**< @internal Retrieve plugin module eeprom data */
 
-/**
- * Feature filter types
- */
-enum rte_filter_type {
-	RTE_ETH_FILTER_NONE = 0,
-	RTE_ETH_FILTER_ETHERTYPE,
-	RTE_ETH_FILTER_FLEXIBLE,
-	RTE_ETH_FILTER_SYN,
-	RTE_ETH_FILTER_NTUPLE,
-	RTE_ETH_FILTER_TUNNEL,
-	RTE_ETH_FILTER_FDIR,
-	RTE_ETH_FILTER_HASH,
-	RTE_ETH_FILTER_L2_TUNNEL,
-	RTE_ETH_FILTER_GENERIC,
-};
-
-/**
- * Generic operations on filters
- */
-enum rte_filter_op {
-	RTE_ETH_FILTER_GET,      /**< get flow API ops */
-};
-
-typedef int (*eth_filter_ctrl_t)(struct rte_eth_dev *dev,
-				 enum rte_filter_type filter_type,
-				 enum rte_filter_op filter_op,
-				 void *arg);
-/**< @internal Take operations to assigned filter type on an Ethernet device */
+struct rte_flow_ops;
+typedef int (*eth_flow_ops_get_t)(struct rte_eth_dev *dev,
+				  const struct rte_flow_ops **ops);
+/**< @internal Get flow operations */
 
 typedef int (*eth_tm_ops_get_t)(struct rte_eth_dev *dev, void *ops);
 /**< @internal Get Traffic Management (TM) operations on an Ethernet device */
@@ -880,7 +856,7 @@ struct eth_dev_ops {
 	eth_get_module_eeprom_t    get_module_eeprom;
 	/** Get plugin module eeprom data. */
 
-	eth_filter_ctrl_t          filter_ctrl; /**< common filter control. */
+	eth_flow_ops_get_t         flow_ops_get; /**< Get flow operations. */
 
 	eth_get_dcb_info           get_dcb_info; /** Get DCB information. */
 
@@ -1377,6 +1353,18 @@ rte_eth_hairpin_queue_peer_unbind(uint16_t cur_port, uint16_t cur_queue,
  * Legacy ethdev API used internally by drivers.
  */
 
+enum rte_filter_type {
+	RTE_ETH_FILTER_NONE = 0,
+	RTE_ETH_FILTER_ETHERTYPE,
+	RTE_ETH_FILTER_FLEXIBLE,
+	RTE_ETH_FILTER_SYN,
+	RTE_ETH_FILTER_NTUPLE,
+	RTE_ETH_FILTER_TUNNEL,
+	RTE_ETH_FILTER_FDIR,
+	RTE_ETH_FILTER_HASH,
+	RTE_ETH_FILTER_L2_TUNNEL,
+};
+
 /**
  * Define all structures for Ethertype Filter type.
  */
diff --git a/lib/librte_ethdev/rte_eth_ctrl.h b/lib/librte_ethdev/rte_eth_ctrl.h
index 8a50dbfef9..42652f9cce 100644
--- a/lib/librte_ethdev/rte_eth_ctrl.h
+++ b/lib/librte_ethdev/rte_eth_ctrl.h
@@ -339,7 +339,7 @@ struct rte_eth_fdir_action {
 };
 
 /**
- * A structure used to define the flow director filter entry by filter_ctrl API.
+ * A structure used to define the flow director filter entry.
  */
 struct rte_eth_fdir_filter {
 	uint32_t soft_id;
diff --git a/lib/librte_ethdev/rte_flow.c b/lib/librte_ethdev/rte_flow.c
index 241af6c4ca..ed9f826b85 100644
--- a/lib/librte_ethdev/rte_flow.c
+++ b/lib/librte_ethdev/rte_flow.c
@@ -255,12 +255,9 @@ rte_flow_ops_get(uint16_t port_id, struct rte_flow_error *error)
 
 	if (unlikely(!rte_eth_dev_is_valid_port(port_id)))
 		code = ENODEV;
-	else if (unlikely(!dev->dev_ops->filter_ctrl ||
-			  dev->dev_ops->filter_ctrl(dev,
-						    RTE_ETH_FILTER_GENERIC,
-						    RTE_ETH_FILTER_GET,
-						    &ops) ||
-			  !ops))
+	else if (unlikely(!dev->dev_ops->flow_ops_get ||
+			  dev->dev_ops->flow_ops_get(dev, &ops) ||
+			  ops == NULL))
 		code = ENOSYS;
 	else
 		return ops;
diff --git a/lib/librte_ethdev/rte_flow_driver.h b/lib/librte_ethdev/rte_flow_driver.h
index dabd819d10..da594d9256 100644
--- a/lib/librte_ethdev/rte_flow_driver.h
+++ b/lib/librte_ethdev/rte_flow_driver.h
@@ -28,31 +28,6 @@ extern "C" {
 /**
  * Generic flow operations structure implemented and returned by PMDs.
  *
- * To implement this API, PMDs must handle the RTE_ETH_FILTER_GENERIC filter
- * type in their .filter_ctrl callback function (struct eth_dev_ops) as well
- * as the RTE_ETH_FILTER_GET filter operation.
- *
- * If successful, this operation must result in a pointer to a PMD-specific
- * struct rte_flow_ops written to the argument address as described below:
- *
- * \code
- *
- * // PMD filter_ctrl callback
- *
- * static const struct rte_flow_ops pmd_flow_ops = { ... };
- *
- * switch (filter_type) {
- * case RTE_ETH_FILTER_GENERIC:
- *     if (filter_op != RTE_ETH_FILTER_GET)
- *         return -EINVAL;
- *     *(const void **)arg = &pmd_flow_ops;
- *     return 0;
- * }
- *
- * \endcode
- *
- * See also rte_flow_ops_get().
- *
  * These callback functions are not supposed to be used by applications
  * directly, which must rely on the API defined in rte_flow.h.
  *
-- 
2.30.1


^ permalink raw reply	[relevance 1%]

* [dpdk-dev] [PATCH] ethdev: introduce enable_driver_sdk to install driver headers
@ 2021-03-11 19:27  3% Tyler Retzlaff
  2021-03-12 15:19  0% ` Ferruh Yigit
  2021-03-12 22:20  3% ` [dpdk-dev] [PATCH v2] " Tyler Retzlaff
  0 siblings, 2 replies; 200+ results
From: Tyler Retzlaff @ 2021-03-11 19:27 UTC (permalink / raw)
  To: dev; +Cc: thomas, ferruh.yigit, andrew.rybchenko, bruce.richardson

Introduce a meson option enable_driver_sdk when true installs internal
driver headers for ethdev. this allows drivers that do not depend on
stable api/abi to be built external to the dpdk source tree.

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

it's still unclear to me if we should be renaming the headers:

  ethdev_driver.h -> rte_ethdev_driver.h
  ethdev_pci.h -> rte_ethdev_pci.h
  ethdev_vdev.h -> rte_ethdev_vdev.h

 lib/librte_ethdev/meson.build | 5 +++++
 meson_options.txt             | 2 ++
 2 files changed, 7 insertions(+)

diff --git a/lib/librte_ethdev/meson.build b/lib/librte_ethdev/meson.build
index c37b2e377..7ecdec6f0 100644
--- a/lib/librte_ethdev/meson.build
+++ b/lib/librte_ethdev/meson.build
@@ -20,6 +20,11 @@ headers = files('rte_ethdev.h',
 	'rte_mtr_driver.h',
 	'rte_tm.h',
 	'rte_tm_driver.h')
+if get_option('enable_driver_sdk')
+headers += files('ethdev_driver.h',
+	'ethdev_pci.h',
+	'ethdev_vdev.h')
+endif
 indirect_headers += files(
 	'rte_ethdev_core.h',
 	'rte_eth_ctrl.h')
diff --git a/meson_options.txt b/meson_options.txt
index 6eff62e47..857874a19 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -8,6 +8,8 @@ option('drivers_install_subdir', type: 'string', value: 'dpdk/pmds-<VERSION>',
 	description: 'Subdirectory of libdir where to install PMDs. Defaults to using a versioned subdirectory.')
 option('enable_docs', type: 'boolean', value: false,
 	description: 'build documentation')
+option('enable_driver_sdk', type: 'boolean', value: false,
+	description: 'install internal driver plugin headers')
 option('enable_kmods', type: 'boolean', value: false,
 	description: 'build kernel modules')
 option('examples', type: 'string', value: '',
-- 
2.30.0.vfs.0.2


^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] officially support building driver plugins externally
  2021-03-10 20:52  0% ` Thomas Monjalon
@ 2021-03-10 21:24  0%   ` Tyler Retzlaff
  0 siblings, 0 replies; 200+ results
From: Tyler Retzlaff @ 2021-03-10 21:24 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev, bruce.richardson, olivier.matz

On Wed, Mar 10, 2021 at 09:52:58PM +0100, Thomas Monjalon wrote:
> 12/02/2021 20:09, Tyler Retzlaff:
> > Recently installation of driver headers and export of functions was                                       pulled back from being public to private                                                                  (commit df96fd0d73955bdc7ca3909e772ff2ad903249c6). From a discussion                                      with Thomas Monjalon we understand that it was not the design intent                                      to ever have these headers exposed publicly, but it was allowing us to                                    maintain the drivers we do implement outside of the normal dpdk tree.
> > 
> > We would like to propose that building driver plugins external to the                                     dpdk source tree be officially supported / restored and it is is our                                      understanding there there are asks from other DPDK consumers for the                                      same.  We understand the main concern is that it might incorrectly convey                                 that the API/ABI of the driver interface is stable or promised to be                                      compatible when no such promise exists.

sorry for previous mail format i didn't intend for things to be hard to
read.

> 
> Yes we must have a clean API export for application.
> The driver interface should not be exported by default.

agreed for both points. i think introducing another name to the set of
__rte_internal, __rte_experimental, __rte_<to_be_named> is probably the
mechanism to use?

> 
> > Can the broader community help us with an acceptable solution to building                                 the drivers out of the tree? Aside from installing the needed headers                                     what other mechanical things can we do to achieve this?  We are happy to                                  do the work/submit the required patches as necessary.
> 
> What about a meson option to export the driver interface files?

i would propose driver interface files installation defaults to off and
a meson option -D<to_be_named>=true has to be passed to enable
installation.

> Should it be exported in the same include directory as API files?

that is a good question, i'm not sure there is substantial value if we
are defaulting to not installing the driver interface files. but i have
no objection if someone sees value in a deeper include path.

> Should it be accessible with a pkg-config file?

i haven't worked with pkg-config in some time, is the suggestion that we
include a .pc file or something so a dependent/external driver can
detect that the driver interface files are available?

my first thought is no because it is an unstable api i would not want to
encourage automatically finding and depending on the driver interface
and instead opt for external drivers to have to jump through a few hoops.
but perhaps you have other ideas in mind?


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] officially support building driver plugins externally
  2021-02-12 19:09  3% [dpdk-dev] officially support building driver plugins externally Tyler Retzlaff
@ 2021-03-10 20:52  0% ` Thomas Monjalon
  2021-03-10 21:24  0%   ` Tyler Retzlaff
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2021-03-10 20:52 UTC (permalink / raw)
  To: Tyler Retzlaff; +Cc: dev, bruce.richardson, olivier.matz

12/02/2021 20:09, Tyler Retzlaff:
> Recently installation of driver headers and export of functions was                                       pulled back from being public to private                                                                  (commit df96fd0d73955bdc7ca3909e772ff2ad903249c6). From a discussion                                      with Thomas Monjalon we understand that it was not the design intent                                      to ever have these headers exposed publicly, but it was allowing us to                                    maintain the drivers we do implement outside of the normal dpdk tree.
> 
> We would like to propose that building driver plugins external to the                                     dpdk source tree be officially supported / restored and it is is our                                      understanding there there are asks from other DPDK consumers for the                                      same.  We understand the main concern is that it might incorrectly convey                                 that the API/ABI of the driver interface is stable or promised to be                                      compatible when no such promise exists.

Yes we must have a clean API export for application.
The driver interface should not be exported by default.

> Can the broader community help us with an acceptable solution to building                                 the drivers out of the tree? Aside from installing the needed headers                                     what other mechanical things can we do to achieve this?  We are happy to                                  do the work/submit the required patches as necessary.

What about a meson option to export the driver interface files?
Should it be exported in the same include directory as API files?
Should it be accessible with a pkg-config file?



^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH 2/4] telemetry: make the legacy registration function internal
  @ 2021-03-10 17:24 10% ` Bruce Richardson
    1 sibling, 0 replies; 200+ results
From: Bruce Richardson @ 2021-03-10 17:24 UTC (permalink / raw)
  To: dev; +Cc: Bruce Richardson, Kevin Laatz, Ray Kinsella, Neil Horman

The function for registration of callbacks for legacy telemetry was
documented as internal-only in the API documents, but marked as
experimental in the version.map file. Since this is an internal-only
function, for consistency we update the version mapping to have it as
internal.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
 doc/guides/rel_notes/release_21_05.rst      | 5 +++++
 lib/librte_telemetry/rte_telemetry_legacy.h | 2 +-
 lib/librte_telemetry/version.map            | 2 +-
 3 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/doc/guides/rel_notes/release_21_05.rst b/doc/guides/rel_notes/release_21_05.rst
index 23f7f0bff9..1624f43d73 100644
--- a/doc/guides/rel_notes/release_21_05.rst
+++ b/doc/guides/rel_notes/release_21_05.rst
@@ -117,6 +117,11 @@ ABI Changes
 
 * No ABI change that would break compatibility with 20.11.
 
+* The experimental function ``rte_telemetry_legacy_register`` has been
+  removed from the public API and is now an internal-only function. This
+  function was already marked as internal in the API documentation for it,
+  and was not for use by external applications.
+
 
 Known Issues
 ------------
diff --git a/lib/librte_telemetry/rte_telemetry_legacy.h b/lib/librte_telemetry/rte_telemetry_legacy.h
index c83f9a8d90..fb44740186 100644
--- a/lib/librte_telemetry/rte_telemetry_legacy.h
+++ b/lib/librte_telemetry/rte_telemetry_legacy.h
@@ -78,7 +78,7 @@ legacy_client_handler(void *sock_id);
  *  @return
  *  -ENOENT if max callbacks limit has been reached.
  */
-__rte_experimental
+__rte_internal
 int
 rte_telemetry_legacy_register(const char *cmd,
 		enum rte_telemetry_legacy_data_req data_req,
diff --git a/lib/librte_telemetry/version.map b/lib/librte_telemetry/version.map
index ec0ebc1bec..bde80ce29b 100644
--- a/lib/librte_telemetry/version.map
+++ b/lib/librte_telemetry/version.map
@@ -14,12 +14,12 @@ EXPERIMENTAL {
 	rte_tel_data_start_array;
 	rte_tel_data_start_dict;
 	rte_tel_data_string;
-	rte_telemetry_legacy_register;
 	rte_telemetry_register_cmd;
 
 	local: *;
 };
 
 INTERNAL {
+	rte_telemetry_legacy_register;
 	rte_telemetry_init;
 };
-- 
2.27.0


^ permalink raw reply	[relevance 10%]

* Re: [dpdk-dev] [RFC] ethdev: add sanity packet checks
  @ 2021-03-09 19:46  4%         ` Ori Kam
  0 siblings, 0 replies; 200+ results
From: Ori Kam @ 2021-03-09 19:46 UTC (permalink / raw)
  To: Andrew Rybchenko, NBU-Contact-Thomas Monjalon
  Cc: Slava Ovsiienko, ferruh.yigit, dev, ajit.khaparde, olivier.matz,
	jerinj, Ori Kam

Hi Andrew,
Thanks for the reply PDB,

> -----Original Message-----
> From: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
> Sent: Tuesday, March 9, 2021 5:28 PM
> Subject: Re: [dpdk-dev] [RFC] ethdev: add sanity packet checks
> 
> On 3/9/21 6:08 PM, Ori Kam wrote:
> > Hi
> >
> >> -----Original Message-----
> >> From: dev <dev-bounces@dpdk.org> On Behalf Of Thomas Monjalon
> >> Sent: Tuesday, March 9, 2021 11:11 AM
> >> Subject: Re: [dpdk-dev] [RFC] ethdev: add sanity packet checks
> >>
> >> 09/03/2021 10:01, Andrew Rybchenko:
> >>> On 2/28/21 10:48 PM, Ori Kam wrote:
> >>>> Currently, DPDK application can offload the checksum check,
> >>>> and report it in the mbuf.
> >>>>
> >>>> However, this approach doesn't work if the traffic
> >>>> is offloaded and should not arrive to the application.
> >>>>
> >>>> This commit introduces rte flow item that enables
> >>>> matching on the checksum of the L3 and L4 layers,
> >>>> in addition to other checks that can determine if
> >>>> the packet is valid.
> >>>> some of those tests can be packet len, data len,
> >>>> unsupported flags, and so on.
> >>>>
> >>>> The full check is HW dependent.
> >>>>
> >>>> Signed-off-by: Ori Kam <orika@nvidia.com>
> >>>
> >>> In general, I strongly dislike the approach. If such checks are required,
> >>> it must be done per item basis. I.e. we should add non-header boolean
> >>> flags to IPv4, TCP, UDP etc items. E.g.
> >>>
> >>> struct rte_flow_item_ipv4 {
> >>>         struct rte_ipv4_hdr hdr; /**< IPv4 header definition. */
> >>>         bool hdr_checksum_valid;
> >>> };
> >>>
> >>> Also it will allow to filter by packets with invalid checksum as well and
> >>> redirect to dedicated Rx path or drop and/or count etc.
> >>
> >> +1
> >>
> > I'm not sure I understand your comment, also according to the proposed
> > RFC we can redirect to the correct path.
> >
> >> I think the only drawback of this solution is for HW giving a global
> >> check status without knowing which header is valid or invalid.
> >>
> > Like Thomas remark the main drawback with adding the valid to each
> > of the items is that, it forces the application to have detected rule per
> > each type, which will make the SW logic more complex.
> > Also this may have performance impact on the packets and on the
> > number of flows.
> >
> 
> If we try to match on something which is a part of the packet header X,
> it must be done in a flow item which corresponds to
> protocol X. Otherwise, we have two items which overlap.
> Also approach suggested in RFC break networking protocol layering and
> features of different layers are mixed in one
> item. What will you when you need to support tunnels? Add
> inner/outer fields? Sorry, it is ugly. If valid controls are
> added in protocol items, no specific efforts are required for
> tunnels.
>
I don't think it breaks protocol layers. This is a very common use case that
application before touching the packet wants to make sure that the packet
is valid and not waste extra hops just to understand at the end that it is a bad packet.
Also even now we report in the mbuf the status of the L3,L4  check sum and status (using
the packet state)

About the tunnel we can solve it by adding level just like in the RSS case.

One more thing to consider is that adding the new bits to existing API
will break the API/ABI.


> Also approach suggested in RFC requires very careful definition
> what happens if a packet does not have corresponding layer but
> matching on valid or invalid checksum is requested.
> 
I would say this is app issue, just like modify TTL  in IPV4 if there is
no item then it is the app issue,

> IMHO a vendor HW limitations are out-of-scope of the
> generic API definition. May be one day I will regret about
> these words, but I'm still sure that from API point of view
> solution suggested by me above is better.

I fully agree (I may also regret those words) that HW limitations should be
out of scope unless they are in some form of hint which number of  HW
can use to increase performance.

As far as I can see the only difference between the your suggestion and the RFC
is that in the RFC there is a new dedicated item for such checks, while in your
suggestion we will add those bits to each of the items. (I assume that
also in your suggestion we will add more than just the check sum).
The main draw backs from my point of view of your suggestion 
1. ABI/AFI break.
2. Application is force to insert more rules.


Best,
Ori


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [RFC] ethdev: add sanity packet checks
  2021-03-08 23:05  0%         ` Ajit Khaparde
@ 2021-03-09 19:21  0%           ` Ori Kam
  0 siblings, 0 replies; 200+ results
From: Ori Kam @ 2021-03-09 19:21 UTC (permalink / raw)
  To: Ajit Khaparde
  Cc: NBU-Contact-Thomas Monjalon, Slava Ovsiienko, ferruh.yigit,
	Andrew Rybchenko, dev, jerinj, Ori Kam

Hi

> -----Original Message-----
> From: Ajit Khaparde <ajit.khaparde@broadcom.com>
> Subject: Re: [dpdk-dev] [RFC] ethdev: add sanity packet checks
> 
> On Sun, Mar 7, 2021 at 10:46 AM Ori Kam <orika@nvidia.com> wrote:
> >
> > Hi
> >
> > > -----Original Message-----
> > > From: Thomas Monjalon <thomas@monjalon.net>
> > > Sent: Thursday, March 4, 2021 12:46 PM
> > > Subject: Re: [dpdk-dev] [RFC] ethdev: add sanity packet checks
> > >
> > > 04/03/2021 11:00, Ori Kam:
> > > > From: Thomas Monjalon
> > > > > 28/02/2021 20:48, Ori Kam:
> > > > > > Currently, DPDK application can offload the checksum check,
> > > > > > and report it in the mbuf.
> > > > > >
> > > > > > However, this approach doesn't work if the traffic
> > > > > > is offloaded and should not arrive to the application.
> > > > > >
> > > > > > This commit introduces rte flow item that enables
> > > > >
> > > > > s/rte flow/rte_flow/
> > > > >
> > > >
> > > > Sure
> > > >
> > > > > > matching on the checksum of the L3 and L4 layers,
> > > > > > in addition to other checks that can determine if
> > > > > > the packet is valid.
> > > > > > some of those tests can be packet len, data len,
> > > > > > unsupported flags, and so on.
> > > > > >
> > > > > > The full check is HW dependent.
> > > > >
> > > > > What is the "full check"?
> > > > > How much it is HW dependent?
> > > > >
> > > >
> > > > This also relates to your other comments,
> > > > Each HW may run different set of checks on the packet,
> > > > for example one PMD can just check the tcp flags while
> > > > a different PMD will also check the option.
> > >
> > > I'm not sure how an application can rely on
> > > such a vague definition.
> > >
> > Even now we are marking a packet in the mbuf with unknown
> > in case of some error.
> > Would a better wording be " The HW detected errors in the packet"
> > in any case if the app will need to know what is the error it is his
> > responsibility, this item is just verification for fast path.
> > If you have better suggestion, I will be very happy to hear.
> >
> > >
> > > > > > + * RTE_FLOW_ITEM_TYPE_SANITY_CHECKS
> > > > > > + *
> > > > > > + * Enable matching on packet validity based on HW checks for the L3
> and
> > > L4
> > > > > > + * layers.
> > > > > > + */
> > > > > > +struct rte_flow_item_sanity_checks {
> > > > > > +       uint32_t level;
> > > > > > +       /**< Packet encapsulation level the item should apply to.
> > > > > > +        * @see rte_flow_action_rss
> > > > > > +        */
> > > > > > +RTE_STD_C11
> > > > > > +       union {
> > > > > > +               struct {
> > > > >
> > > > > Why there is no L2 check?
> > > > >
> > > > Our HW doesn't support it.
> > > > If other HW support it, it should be added.
> > >
> > > It would be an ABI breakage. Can we add it day one?
> > >
> > Will add reserve, since this is bit field there shouldn't be any
> > ABI break.
> >
> > > > > > +                       uint32_t l3_ok:1;
> > > > > > +                       /**< L3 layer is valid after passing all HW checking. */
> > > > > > +                       uint32_t l4_ok:1;
> > > > > > +                       /**< L4 layer is valid after passing all HW checking. */
> > > > >
> > > > > l3_ok and l4_ok looks vague.
> > > > > What does it cover exactly?
> > > > >
> > > > It depends on the HW in question.
> > > > In our case it checks in case of L3
> > > > the header len, and the version.
> > > > For L4 checking the len.
> > >
> > > If we don't know exactly what is checked,
> > > how an application can rely on it?
> > > Is it a best effort check? What is the use case?
> > >
> > From application point of view that packet is invalid.
> > it is the app responsibility to understand why.
> 
> And that it can determine based on the available fields in ol_flags. right?

Right.

> If HW can indicate that the packet integrity is in question,
> a PMD should be able to set the bits in ol_flags. After that
> the application should decide what to drop and what to pass.
> 
> What is missing is the ability for the application to tell the HW/PMD to
> drop any packet which fails packet integrity checks.
> 
This is the drop action.
Or am I missing something?

> I believe generally drop packets when Ethernet CRC check fails.
> But l3 and l4 errors are left to the application to deal with.
> If an application wants to save some CPU cycles, it could ask the
> hardware to drop those packets as well. So one bit to enable/disable
> this for all packets should be good.
> 
> In case we still want to pursue this per flow, how about
> RTE_FLOW_ITEM_TYPE_PACKET_INTEGRITY_CHECKS instead of
> RTE_FLOW_ITEM_TYPE_SANITY_CHECKS
> 
Sure I like your name better.

Best,
Ori

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] 20.11.1 patches review and test
  2021-02-22 15:09  1% [dpdk-dev] 20.11.1 patches review and test luca.boccassi
                   ` (3 preceding siblings ...)
  2021-03-02 10:52  0% ` Chen, BoX C
@ 2021-03-09 10:36  0% ` Govindharajan, Hariprasad
  4 siblings, 0 replies; 200+ results
From: Govindharajan, Hariprasad @ 2021-03-09 10:36 UTC (permalink / raw)
  To: luca.boccassi, stable
  Cc: dev, Abhishek Marathe, Akhil Goyal, Ali Alnubani, Walker,
	Benjamin, David Christensen, Hemant Agrawal, Stokes, Ian,
	Jerin Jacob, Mcnamara, John, Ju-Hyoung Lee, Kevin Traynor,
	Luca Boccassi, Pei Zhang, Yu, PingX, Xu, Qian Q,
	Raslan Darawsheh, Thomas Monjalon, Peng, Yuan, Chen, Zhaoyan



> -----Original Message-----
> From: luca.boccassi@gmail.com <luca.boccassi@gmail.com>
> Sent: Monday, February 22, 2021 3:09 PM
> To: stable@dpdk.org
> Cc: dev@dpdk.org; Abhishek Marathe <Abhishek.Marathe@microsoft.com>;
> Akhil Goyal <akhil.goyal@nxp.com>; Ali Alnubani <alialnu@nvidia.com>;
> Walker, Benjamin <benjamin.walker@intel.com>; David Christensen
> <drc@linux.vnet.ibm.com>; Govindharajan, Hariprasad
> <hariprasad.govindharajan@intel.com>; Hemant Agrawal
> <hemant.agrawal@nxp.com>; Stokes, Ian <ian.stokes@intel.com>; Jerin
> Jacob <jerinj@marvell.com>; Mcnamara, John <john.mcnamara@intel.com>;
> Ju-Hyoung Lee <juhlee@microsoft.com>; Kevin Traynor
> <ktraynor@redhat.com>; Luca Boccassi <bluca@debian.org>; Pei Zhang
> <pezhang@redhat.com>; Yu, PingX <pingx.yu@intel.com>; Xu, Qian Q
> <qian.q.xu@intel.com>; Raslan Darawsheh <rasland@nvidia.com>; Thomas
> Monjalon <thomas@monjalon.net>; Peng, Yuan <yuan.peng@intel.com>;
> Chen, Zhaoyan <zhaoyan.chen@intel.com>
> Subject: 20.11.1 patches review and test
> 
> Hi all,
> 
> Here is a list of patches targeted for stable release 20.11.1.
> 
> The planned date for the final release is the 8th of March.
> 
> Please help with testing and validation of your use cases and report any
> issues/results with reply-all to this mail. For the final release the fixes and
> reported validations will be added to the release notes.
> 
> A release candidate tarball can be found at:
> 
>     https://dpdk.org/browse/dpdk-stable/tag/?id=v20.11.1-rc1
> 
> These patches are located at branch 20.11 of dpdk-stable repo:
>     https://dpdk.org/browse/dpdk-stable/
> 
> Thanks.
> 
> Luca Boccassi
> 
> ---
[Govindharajan, Hariprasad] 
Hi Luca,

The following features have been validated with DPDK 20.11.1 and OvS 2.15.0

I40e:
Performance Tests
Jumbo frames
RSS

Niantic:
Performance Tests
Jumbo frames
RSS

Ice:
Jumbo frames 
RSS Kernel forwarding & testpmd forwarding

Vhost:
Port addition, deletion, jumbo frames and RSS multi-queue tests.

Regards
G Hariprasad

> Ajit Khaparde (3):
>       net/bnxt: fix cleanup on mutex init failure
>       net/bnxt: fix format specifier for unsigned int
>       net/bnxt: fix freeing mbuf
> 
> Alexander Kozyrev (4):
>       net/mlx5: fix mbuf freeing in vectorized MPRQ
>       net/mlx5: fix flow tag decompression
>       net/mlx5: check FW miniCQE format capabilities
>       net/mlx5: fix miniCQE configuration for Verbs
> 
> Alvin Zhang (9):
>       net/ixgbe: detect failed VF MTU set
>       net/i40e: fix Rx bytes statistics
>       net/iavf: fix queue pairs configuration
>       doc: fix RSS flow description in i40e guide
>       net/i40e: fix returned code for RSS hardware failure
>       net/ice: fix RSS lookup table initialization
>       test: fix buffer overflow in Tx burst
>       net/ixgbe: fix configuration of max frame size
>       app/testpmd: fix key for RSS flow rule
> 
> Amit Bernstein (1):
>       net/ena: fix Tx doorbell statistics
> 
> Anatoly Burakov (1):
>       fbarray: fix overlap check
> 
> Andrew Boyer (5):
>       net/ionic: do minor logging fixups
>       net/ionic: fix link speed and autonegotiation
>       net/ionic: allow separate L3 and L4 checksum offload
>       net/ionic: fix up function attribute tags
>       net/ionic: fix address handling in Tx
> 
> Ankur Dwivedi (1):
>       test/event_crypto: set cipher operation in transform
> 
> Ashish Sadanandan (1):
>       mbuf: add C++ include guard for dynamic fields header
> 
> Balazs Nemeth (1):
>       net/qede: fix promiscuous enable
> 
> Beilei Xing (2):
>       net/i40e: fix global register recovery
>       net/i40e: fix flex payload rule conflict
> 
> Bernard Iremonger (1):
>       doc: fix QinQ flow rules in testpmd guide
> 
> Bruce Richardson (29):
>       ethdev: avoid blocking telemetry for link status
>       build: provide suitable error for "both" libraries option
>       eal: fix reciprocal header include
>       telemetry: fix missing header include
>       ethdev: fix missing header include
>       net: fix missing header include
>       mbuf: fix missing header include
>       bitrate: fix missing header include
>       rib: fix missing header includes
>       vhost: fix missing header includes
>       ipsec: fix missing header include
>       fib: fix missing header includes
>       table: fix missing header include
>       pipeline: fix missing header includes
>       metrics: fix variable declaration in header
>       node: fix missing header include
>       app: fix build with extra include paths
>       build: force pkg-config for dependency detection
>       power: create guest channel public header file
>       power: make channel message functions public
>       power: rename public structs
>       power: rename constants
>       power: export guest channel header file
>       power: clean up includes
>       eal: fix MCS lock header include
>       eal: fix internal ABI tag with clang
>       power: fix missing header includes
>       rib: fix missing header include
>       eal: fix automatic loading of drivers as shared libs
> 
> Chengchang Tang (7):
>       net/hns3: fix register length when dumping registers
>       net/hns3: fix data overwriting during register dump
>       net/hns3: fix dump register out of range
>       net/hns3: fix interrupt resources in Rx interrupt mode
>       net/hns3: fix firmware exceptions by concurrent commands
>       net/hns3: fix VF reset on mailbox failure
>       net/hns3: fix stats flip overflow
> 
> Chengwen Feng (3):
>       net/hns3: fix VF query link status in dev init
>       net/hns3: remove MPLS from supported flow items
>       net/hns3: fix flow director rule residue on malloc failure
> 
> Ciara Power (3):
>       app/crypto-perf: fix spelling in output
>       app/crypto-perf: fix latency CSV output
>       app/crypto-perf: fix CSV output format
> 
> Cristian Dumitrescu (1):
>       examples/pipeline: fix CLI parsing crash
> 
> Dapeng Yu (4):
>       net/ixgbe: fix flex bytes flow director rule
>       net/ice: check Rx queue number on RSS init
>       net/ixgbe: disable NFS filtering
>       app/testpmd: avoid exit without terminal restore
> 
> David Marchand (3):
>       net/hinic: restore vectorised code
>       examples/pipeline: fix VXLAN script permission
>       mbuf: remove unneeded atomic generic header include
> 
> Dekel Peled (8):
>       net/mlx5: fix shared age action validation
>       net/mlx5: fix hairpin flow split decision
>       net/mlx5: fix flow split combined with counter
>       net/mlx5: fix flow split combined with age action
>       net/mlx5: fix shared RSS translation and cleanup
>       app/testpmd: support shared age action query
>       net/mlx5: fix shared RSS capability check
>       net/mlx5: validate hash Rx queue pointer
> 
> Dmitry Kozlyuk (4):
>       eal/windows: fix build with MinGW-w64 8
>       bus/pci: fix build with MinGW-w64 8
>       bus/pci: fix hardware ID limit on Windows
>       build: fix linker flags on Windows
> 
> Eugeny Parshutin (1):
>       doc: add vtune profiling config to prog guide
> 
> Fan Zhang (1):
>       crypto/qat: fix digest in buffer
> 
> Fei Chen (1):
>       vhost: fix vid allocation race
> 
> Feifei Wang (7):
>       test/ring: reduce duration of performance tests
>       app/eventdev: adjust event count order for pipeline test
>       app/eventdev: remove redundant enqueue in burst Tx
>       examples/eventdev: check CPU core enabling
>       examples/eventdev: add info output for main core
>       examples/eventdev: move ethdev stop to the end
>       app/eventdev: fix SMP barrier in performance test
> 
> Ferruh Yigit (13):
>       app/procinfo: fix _filters stats reporting
>       app/procinfo: fix check on xstats-ids
>       app/procinfo: remove useless memset
>       app/procinfo: remove useless assignment
>       net/pcap: remove local variable shadowing outer one
>       net/bonding: remove local variable shadowing outer one
>       net/af_xdp: remove useless assignment
>       net/bnxt: remove redundant return
>       app/crypto-perf: remove always true condition
>       net/avp: remove always true condition
>       net/pcap: fix byte stats for drop Tx
>       net/pcap: fix infinite Rx with large files
>       app/testpmd: fix help of metering commands
> 
> Gaetan Rivet (2):
>       net/bonding: fix port id validity check on parsing
>       net/bonding: fix PCI address comparison on non-PCI ports
> 
> Gagandeep Singh (2):
>       test/ipsec: fix result code for not supported
>       crypto/dpaa2_sec: fix memory allocation check
> 
> George Prekas (1):
>       app/testpmd: fix IP checksum calculation
> 
> Gregory Etelson (5):
>       net/mlx5: fix Direct Verbs flow descriptor allocation
>       app/testpmd: release flows left before port stop
>       net/mlx5: fix tunnel rules validation on VF representor
>       net/mlx5: fix mark action in active tunnel offload
>       net/mlx5: fix drop action in tunnel offload mode
> 
> Guy Kaneti (1):
>       regex/octeontx2: fix PCI table overflow
> 
> Haiyue Wang (2):
>       net/ice: drain out DCF AdminQ command queue
>       net/ixgbe: fix UDP zero checksum on x86
> 
> Harman Kalra (1):
>       examples/l3fwd: remove limitation on Tx queue count
> 
> Harry van Haaren (1):
>       eventdev: fix a return value comment
> 
> Heinrich Kuhn (1):
>       net/nfp: read chip model from PluDevice register
> 
> Hemant Agrawal (1):
>       app/procinfo: fix security context info
> 
> Hongbo Zheng (1):
>       net/hns3: use new opcode for clearing hardware resource
> 
> Huisong Li (7):
>       app/testpmd: fix queue stats mapping configuration
>       net/hns3: fix xstats with id and names
>       net/hns3: fix error code in xstats
>       net/hns3: fix Rx/Tx errors stats
>       net/hns3: fix link status change from firmware
>       net/hns3: validate requested maximum Rx frame length
>       net/hns3: fix query order of link status and link info
> 
> Hyong Youb Kim (2):
>       net/enic: fix filter type used for flow API
>       net/enic: fix filter log message
> 
> Ido Segev (1):
>       net/ena: flush Rx buffers memory pool cache
> 
> Igor Chauskin (2):
>       net/ena: fix Tx SQ free space assessment
>       net/ena: prevent double doorbell
> 
> Igor Ryzhov (1):
>       net/i40e: fix stats counters
> 
> Ivan Malov (11):
>       common/sfc_efx/base: remove warnings about inline specifiers
>       common/sfc_efx/base: fix signed/unsigned mismatch warnings
>       common/sfc_efx/base: support alternative MAE match fields
>       common/sfc_efx/base: update MCDI headers for MAE privilege
>       common/sfc_efx/base: check for MAE privilege
>       common/sfc_efx/base: fix MPORT related byte order handling
>       common/sfc_efx/base: fix MAE match spec validation helper
>       common/sfc_efx/base: fix MAE match spec class comparison API
>       common/sfc_efx/base: enhance field ID check in field set API
>       common/sfc_efx/base: apply mask to value on match field set
>       net/sfc: fix TSO and checksum offloads for EF10
> 
> Jiawei Wang (4):
>       net/mlx5: fix unnecessary checking for RSS action
>       app/testpmd: fix packets dump overlapping
>       net/mlx5: fix count actions query in sample flow
>       net/mlx5: fix counter and age flow action validation
> 
> Jiawei Zhu (1):
>       net/virtio-user: fix run closing stdin and close callfd
> 
> Jingjing Wu (1):
>       net/iavf: fix vector mapping with queue
> 
> John McNamara (1):
>       license: add licenses for exception cases
> 
> Joyce Kong (1):
>       eal/arm: fix debug build with gcc for 128-bit atomics
> 
> Junfeng Guo (1):
>       net/iavf: fix GTPU UL and DL support for flow director
> 
> Kalesh AP (4):
>       net/bnxt: release HWRM lock in error
>       net/bnxt: propagate FW command failure to application
>       net/bnxt: fix VNIC RSS configure function
>       net/bnxt: fix FW version log
> 
> Karra Satwik (2):
>       net/cxgbe: accept VLAN flow items without ethertype
>       app/testpmd: fix start index for showing FEC array
> 
> Lance Richardson (10):
>       net/bnxt: disable end of packet padding for Rx
>       net/bnxt: limit Rx representor packets per poll
>       net/bnxt: fix doorbell write ordering
>       net/bnxt: fix outer UDP checksum Rx offload capability
>       net/bnxt: make offload flags mapping per-ring
>       net/bnxt: set correct checksum status in mbuf
>       net/bnxt: fix packet type index calculation
>       net/bnxt: fix null termination of Rx mbuf chain
>       net/bnxt: fix fallback mbuf allocation logic
>       net/bnxt: fix Rx completion ring size calculation
> 
> Leyi Rong (1):
>       net/ice: enlarge Rx queue rearm threshold to 64
> 
> Lijun Ou (6):
>       net/hns3: fix interception with flow director
>       net/hns3: fix memory leak on secondary process exit
>       net/hns3: adjust some comments
>       net/hns3: adjust format specifier for enum
>       doc: fix product link in hns3 guide
>       net/hns3: fix RSS indirection table size
> 
> Liron Himi (5):
>       net/octeontx2: fix PF flow action for Tx
>       net/mvpp2: remove debug log on fast-path
>       net/mvpp2: remove VLAN flush
>       net/mvpp2: remove CRC length from MRU validation
>       net/mvpp2: fix frame size checking
> 
> Long Li (1):
>       net/netvsc: ignore unsupported packet on sync command
> 
> Lukasz Wojciechowski (1):
>       test/distributor: fix return buffer queue overload
> 
> Marvin Liu (1):
>       vhost: fix packed ring dequeue offloading
> 
> Matan Azrad (1):
>       vdpa/mlx5: fix configuration mutex cleanup
> 
> Maxime Coquelin (3):
>       net/virtio: add missing backend features negotiation
>       net/virtio: fix memory init with vDPA backend
>       net/virtio: fix getting old status on reconnect
> 
> Michael Baum (7):
>       net/mlx5: fix leak on Rx queue creation failure
>       net/mlx5: fix leak on Tx queue creation failure
>       common/mlx5: fix completion queue entry size configuration
>       net/mlx5: remove CQE padding device argument
>       net/mlx5: fix leak on ASO SQ creation failure
>       net/mlx4: fix device detach
>       net/mlx4: fix handling of probing failure
> 
> Michal Krawczyk (1):
>       net/ena: validate Rx req ID upon acquiring descriptor
> 
> Min Hu (Connor) (3):
>       net/hns3: fix FEC state query
>       net/hns3: fix crash with multi-process
>       doc: add FEC to NIC features
> 
> Murphy Yang (6):
>       net/ice: fix outer UDP Tx checksum offload
>       net/i40e: fix L4 checksum flag
>       net/ice: fix outer checksum flags
>       net/iavf: fix conflicting RSS combination rules
>       net/ice: disable IPv4 checksum offload in vector Tx
>       net/i40e: add null input checks
> 
> Nick Connolly (2):
>       eal/windows: fix debug build with MinGW
>       eal/windows: fix vfprintf warning with clang
> 
> Olivier Matz (5):
>       build: fix plugin load on static build
>       net/virtio-user: fix protocol features advertising
>       service: propagate init error in EAL
>       test/mcslock: remove unneeded per lcore copy
>       mempool: fix panic on dump or audit
> 
> Ophir Munk (4):
>       net/mlx5: fix freeing packet pacing
>       net/mlx5: fix flow action destroy wrapper
>       net/mlx5: fix flow operation wrapper per OS
>       net/mlx5: unify operations for all OS
> 
> Ori Kam (3):
>       regex/mlx5: fix memory rule alignment
>       regex/mlx5: fix support for group id
>       regex/mlx5: fix number of supported queues
> 
> Qi Zhang (4):
>       doc: fix some statements for ice vector PMD
>       net/ice/base: fix tunnel destroy
>       net/ice/base: fix null pointer dereference
>       net/ice/base: fix memory handling
> 
> Ruifeng Wang (4):
>       lpm: fix vector IPv4 lookup
>       net/hns3: fix build with SVE
>       net/octeontx: fix build with SVE
>       common/octeontx2: fix build with SVE
> 
> Samik Gupta (2):
>       net/bnxt: fix Rx rings in RSS redirection table
>       net/bnxt: fix VNIC config on Rx queue stop
> 
> Shiri Kuzin (2):
>       net/mlx5: fix VXLAN decap on non-VXLAN flow
>       net/mlx5: refuse empty VLAN in flow pattern
> 
> Somnath Kotur (4):
>       net/bnxt: fix PF resource query
>       net/bnxt: fix lock init and destroy
>       net/bnxt: fix error handling in device start
>       net/bnxt: refactor init/uninit
> 
> Souvik Dey (2):
>       net/i40e: fix VLAN stripping in VF
>       common/mlx5: fix storing synced MAC to internal table
> 
> Sriharsha Basavapatna (1):
>       net/bnxt: fix max rings computation
> 
> Stephen Hemminger (2):
>       test/rwlock: fix spelling and missing whitespace
>       test: fix terminal settings on exit
> 
> Steve Yang (23):
>       ethdev: fix max Rx packet length check
>       app/testpmd: fix max Rx packet length for VLAN packets
>       net/dpaa: fix jumbo frame flag condition for MTU set
>       net/dpaa2: fix jumbo frame flag condition for MTU set
>       net/e1000: fix jumbo frame flag condition for MTU set
>       net/hns3: fix jumbo frame flag condition for MTU set
>       net/i40e: fix jumbo frame flag condition
>       net/iavf: fix jumbo frame flag condition
>       net/ice: fix jumbo frame flag condition
>       net/ipn3ke: fix jumbo frame flag condition for MTU set
>       net/octeontx: fix jumbo frame flag condition for MTU set
>       net/octeontx2: fix jumbo frame flag condition for MTU
>       net/qede: fix jumbo frame flag condition for MTU set
>       net/sfc: fix jumbo frame flag condition for MTU set
>       net/thunderx: fix jumbo frame flag condition for MTU set
>       net/ixgbe: fix jumbo frame flag condition
>       net/cxgbe: fix jumbo frame flag condition
>       net/axgbe: fix jumbo frame flag condition for MTU set
>       net/enetc: fix jumbo frame flag condition for MTU set
>       net/hinic: fix jumbo frame flag condition for MTU set
>       net/nfp: fix jumbo frame flag condition for MTU set
>       net/liquidio: fix jumbo frame flag condition for MTU set
>       app/testpmd: fix setting maximum packet length
> 
> Suanming Mou (5):
>       net/mlx5: fix shared RSS and mark actions combination
>       net/mlx5: fix multi-process port ID
>       net/mlx5: fix crash on secondary process port close
>       net/mlx5: fix port attach in secondary process
>       net/mlx4: fix port attach in secondary process
> 
> Sunil Kumar Kori (2):
>       net/octeontx2: fix corruption in segments list
>       net/octeontx: fix max Rx packet length
> 
> Tal Shnaiderman (5):
>       bus/pci: ignore missing NUMA node on Windows
>       net/mlx5: fix constant array size
>       net/mlx5: fix device name size on Windows
>       net/mlx5: fix comparison sign in flow engine
>       common/mlx5: fix pointer cast on Windows
> 
> Thomas Monjalon (3):
>       doc: fix figure numbering in graph guide
>       lib: fix doxygen for parameters of function pointers
>       ethdev: fix close failure handling
> 
> Timothy McDaniel (1):
>       event/dlb: fix accessing uninitialized variables
> 
> Ting Xu (1):
>       net/iavf: fix memory leak in large VF
> 
> Tyler Retzlaff (2):
>       bus/pci: fix build with Windows SDK >= 10.0.20253
>       eal/windows: fix C++ compatibility
> 
> Viacheslav Galaktionov (1):
>       net/sfc: fix generic byte statistics to exclude FCS bytes
> 
> Viacheslav Ovsiienko (8):
>       net/mlx5: fix Verbs memory allocation callback
>       net/mlx5: fix buffer split offload advertising
>       doc: update flow mark action in mlx5 guide
>       net/mlx5: fix wire vport hint
>       app/testpmd: fix queue reconfig request on Rx split update
>       doc: fix supported feature table in mlx5 guide
>       doc: fix mark action zero value in mlx5 guide
>       net/mlx5: fix Tx queue size created with DevX
> 
> Vladimir Medvedkin (2):
>       rib: fix insertion in some cases
>       crypto/qat: fix access to uninitialized variable
> 
> Weifeng Li (1):
>       net/i40e: fix X722 for 802.1ad frames ability
> 
> Wenjun Wu (1):
>       net/e1000: fix flow control mode setting
> 
> Wisam Jaddo (1):
>       app/flow-perf: simplify objects initialization
> 
> Xuan Ding (1):
>       net/iavf: fix symmetric flow rule creation
> 
> Yicai Lu (1):
>       ip_frag: remove padding length of fragment
> 
> Yongxin Liu (1):
>       usertools: fix binding built-in kernel driver
> 
> Yunjian Wang (3):
>       eal/linux: fix handling of error events from epoll
>       net/bnxt: fix memory leak when mapping fails
>       net/mvneta: check allocation in Rx queue flush
> 
> Yuri Chipchev (1):
>       net/mvpp2: fix stack corruption

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v3] build: alias default build as generic
  2021-02-18 14:12  3% ` [dpdk-dev] [PATCH v3] " Juraj Linkeš
@ 2021-03-09  8:43  0%   ` Juraj Linkeš
  2021-03-29 10:49  3%   ` [dpdk-dev] [PATCH v4] " Juraj Linkeš
  1 sibling, 0 replies; 200+ results
From: Juraj Linkeš @ 2021-03-09  8:43 UTC (permalink / raw)
  To: Juraj Linkeš,
	bruce.richardson, thomas, Ruifeng.Wang, Honnappa.Nagarahalli,
	jerinjacobk, ferruh.yigit, david.marchand
  Cc: dev

Hi Thomas, David,

Is there anything missing in this patch? We have some acks and reviewed-by. Maybe add more documentation? If so, where?

Thanks,
Juuraj

> -----Original Message-----
> From: Juraj Linkeš <juraj.linkes@pantheon.tech>
> Sent: Thursday, February 18, 2021 3:13 PM
> To: bruce.richardson@intel.com; thomas@monjalon.net;
> Ruifeng.Wang@arm.com; Honnappa.Nagarahalli@arm.com;
> jerinjacobk@gmail.com; ferruh.yigit@intel.com
> Cc: dev@dpdk.org; Juraj Linkeš <juraj.linkes@pantheon.tech>
> Subject: [PATCH v3] build: alias default build as generic
> 
> The current machine='default' build name is not descriptive. The actual default
> build is machine='native'. Add an alternative string which does the same build
> and better describes what we're building:
> machine='generic'. Leave machine='default' for backwards compatibility.
> 
> Signed-off-by: Juraj Linkeš <juraj.linkes@pantheon.tech>
> Reviewed-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
> Acked-by: Bruce Richardson <bruce.richardson@intel.com>
> ---
>  config/arm/meson.build                    |  7 ++++---
>  config/meson.build                        | 13 +++++++------
>  devtools/test-meson-builds.sh             | 14 +++++++-------
>  doc/guides/prog_guide/build-sdk-meson.rst |  4 ++--
>  meson_options.txt                         |  2 +-
>  5 files changed, 21 insertions(+), 19 deletions(-)
> 
> diff --git a/config/arm/meson.build b/config/arm/meson.build index
> 00bc4610a3..aaed89bd5b 100644
> --- a/config/arm/meson.build
> +++ b/config/arm/meson.build
> @@ -1,6 +1,7 @@
>  # SPDX-License-Identifier: BSD-3-Clause  # Copyright(c) 2017 Intel Corporation.
>  # Copyright(c) 2017 Cavium, Inc
> +# Copyright(c) 2021 PANTHEON.tech s.r.o.
> 
>  # common flags to all aarch64 builds, with lowest priority  flags_common = [
> @@ -208,8 +209,8 @@ if dpdk_conf.get('RTE_ARCH_32')  else
>  	# aarch64 build
>  	if not meson.is_cross_build()
> -		if machine == 'default'
> -			# default build
> +		if machine == 'generic'
> +			# generic build
>  			implementer_id = 'generic'
>  			part_number = 'generic'
>  		else
> @@ -256,7 +257,7 @@ else
>  		      '(-Dmachine=generic) build.')
>  	endif
> 
> -	# use default flags with implementer flags
> +	# use common flags with implementer flags
>  	dpdk_flags = flags_common + implementer_config['flags'] +
> part_number_config.get('flags', [])
> 
>  	# apply supported machine args
> diff --git a/config/meson.build b/config/meson.build index
> 3cf560b8a3..ed4de62b37 100644
> --- a/config/meson.build
> +++ b/config/meson.build
> @@ -70,21 +70,22 @@ else
>  	machine = get_option('machine')
>  endif
> 
> -# machine type 'default' is special, it defaults to the per arch agreed common -#
> minimal baseline needed for DPDK.
> +# machine type 'generic' is special, it selects the per arch agreed
> +common # minimal baseline needed for DPDK. Machine type 'default' is
> +also supported # with the same meaning for backwards compatibility.
>  # That might not be the most optimized, but the most portable version while  #
> still being able to support the CPU features required for DPDK.
>  # This can be bumped up by the DPDK project, but it can never be an  # invariant
> like 'native'
> -if machine == 'default'
> +if machine == 'default' or machine == 'generic'
>  	if host_machine.cpu_family().startswith('x86')
> -		# matches the old pre-meson build systems default
> +		# matches the old pre-meson build systems generic machine
>  		machine = 'corei7'
>  	elif host_machine.cpu_family().startswith('arm')
>  		machine = 'armv7-a'
>  	elif host_machine.cpu_family().startswith('aarch')
> -		# arm64 manages defaults in config/arm/meson.build
> -		machine = 'default'
> +		# arm64 manages generic config in config/arm/meson.build
> +		machine = 'generic'
>  	elif host_machine.cpu_family().startswith('ppc')
>  		machine = 'power8'
>  	endif
> diff --git a/devtools/test-meson-builds.sh b/devtools/test-meson-builds.sh index
> c11ae87e0d..daf817ac3e 100755
> --- a/devtools/test-meson-builds.sh
> +++ b/devtools/test-meson-builds.sh
> @@ -223,12 +223,12 @@ done
>  # test compilation with minimal x86 instruction set  # Set the install path for
> libraries to "lib" explicitly to prevent problems  # with pkg-config prefixes if
> installed in "lib/x86_64-linux-gnu" later.
> -default_machine='nehalem'
> -if ! check_cc_flags "-march=$default_machine" ; then
> -	default_machine='corei7'
> +generic_machine='nehalem'
> +if ! check_cc_flags "-march=$generic_machine" ; then
> +	generic_machine='corei7'
>  fi
> -build build-x86-default cc skipABI -Dcheck_includes=true \
> -	-Dlibdir=lib -Dmachine=$default_machine $use_shared
> +build build-x86-generic cc skipABI -Dcheck_includes=true \
> +	-Dlibdir=lib -Dmachine=$generic_machine $use_shared
> 
>  # 32-bit with default compiler
>  if check_cc_flags '-m32' ; then
> @@ -271,10 +271,10 @@ for f in $srcdir/config/ppc/ppc* ; do
>  	build $targetdir $f ABI $use_shared
>  done
> 
> -# Test installation of the x86-default target, to be used for checking
> +# Test installation of the x86-generic target, to be used for checking
>  # the sample apps build using the pkg-config file for cflags and libs  load_env cc
> -build_path=$(readlink -f $builds_dir/build-x86-default)
> +build_path=$(readlink -f $builds_dir/build-x86-generic)
>  export DESTDIR=$build_path/install
>  install_target $build_path $DESTDIR
>  pc_file=$(find $DESTDIR -name libdpdk.pc) diff --git
> a/doc/guides/prog_guide/build-sdk-meson.rst b/doc/guides/prog_guide/build-
> sdk-meson.rst
> index 3429e26479..c7e12eedfb 100644
> --- a/doc/guides/prog_guide/build-sdk-meson.rst
> +++ b/doc/guides/prog_guide/build-sdk-meson.rst
> @@ -85,7 +85,7 @@ Project-specific options are passed used -Doption=value::
> 
>  	meson -Denable_docs=true fullbuild  # build and install docs
> 
> -	meson -Dmachine=default  # use builder-independent baseline -march
> +	meson -Dmachine=generic  # use builder-independent baseline -march
> 
>  	meson -Ddisable_drivers=event/*,net/tap  # disable tap driver and all
>  					# eventdev PMDs for a smaller build
> @@ -114,7 +114,7 @@ Examples of setting some of the same options using
> meson configure::
>          re-scan from meson.
> 
>  .. note::
> -        machine=default uses a config that works on all supported architectures
> +        machine=generic uses a config that works on all supported
> + architectures
>          regardless of the capabilities of the machine where the build is happening.
> 
>  As well as those settings taken from ``meson configure``, other options diff --git
> a/meson_options.txt b/meson_options.txt index 6eff62e47d..2c7b46ef07
> 100644
> --- a/meson_options.txt
> +++ b/meson_options.txt
> @@ -21,7 +21,7 @@ option('include_subdir_arch', type: 'string', value: '',
> option('kernel_dir', type: 'string', value: '',
>  	description: 'Path to the kernel for building kernel modules. Headers
> must be in $kernel_dir/build. Modules will be installed in
> $DEST_DIR/$kernel_dir/extra/dpdk.')
>  option('machine', type: 'string', value: 'native',
> -	description: 'set the target machine type')
> +	description: 'set the target machine type or "generic", a build usable
> +on all machines of the build machine architecture or "native", which
> +lets the compiler pick the architecture of the build machine.')
>  option('max_ethports', type: 'integer', value: 32,
>  	description: 'maximum number of Ethernet devices')
> option('max_lcores', type: 'integer', value: 128,
> --
> 2.20.1


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [RFC] ethdev: add sanity packet checks
  2021-03-07 18:46  3%       ` Ori Kam
@ 2021-03-08 23:05  0%         ` Ajit Khaparde
  2021-03-09 19:21  0%           ` Ori Kam
  0 siblings, 1 reply; 200+ results
From: Ajit Khaparde @ 2021-03-08 23:05 UTC (permalink / raw)
  To: Ori Kam
  Cc: NBU-Contact-Thomas Monjalon, Slava Ovsiienko, ferruh.yigit,
	Andrew Rybchenko, dev, jerinj

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

On Sun, Mar 7, 2021 at 10:46 AM Ori Kam <orika@nvidia.com> wrote:
>
> Hi
>
> > -----Original Message-----
> > From: Thomas Monjalon <thomas@monjalon.net>
> > Sent: Thursday, March 4, 2021 12:46 PM
> > Subject: Re: [dpdk-dev] [RFC] ethdev: add sanity packet checks
> >
> > 04/03/2021 11:00, Ori Kam:
> > > From: Thomas Monjalon
> > > > 28/02/2021 20:48, Ori Kam:
> > > > > Currently, DPDK application can offload the checksum check,
> > > > > and report it in the mbuf.
> > > > >
> > > > > However, this approach doesn't work if the traffic
> > > > > is offloaded and should not arrive to the application.
> > > > >
> > > > > This commit introduces rte flow item that enables
> > > >
> > > > s/rte flow/rte_flow/
> > > >
> > >
> > > Sure
> > >
> > > > > matching on the checksum of the L3 and L4 layers,
> > > > > in addition to other checks that can determine if
> > > > > the packet is valid.
> > > > > some of those tests can be packet len, data len,
> > > > > unsupported flags, and so on.
> > > > >
> > > > > The full check is HW dependent.
> > > >
> > > > What is the "full check"?
> > > > How much it is HW dependent?
> > > >
> > >
> > > This also relates to your other comments,
> > > Each HW may run different set of checks on the packet,
> > > for example one PMD can just check the tcp flags while
> > > a different PMD will also check the option.
> >
> > I'm not sure how an application can rely on
> > such a vague definition.
> >
> Even now we are marking a packet in the mbuf with unknown
> in case of some error.
> Would a better wording be " The HW detected errors in the packet"
> in any case if the app will need to know what is the error it is his
> responsibility, this item is just verification for fast path.
> If you have better suggestion, I will be very happy to hear.
>
> >
> > > > > + * RTE_FLOW_ITEM_TYPE_SANITY_CHECKS
> > > > > + *
> > > > > + * Enable matching on packet validity based on HW checks for the L3 and
> > L4
> > > > > + * layers.
> > > > > + */
> > > > > +struct rte_flow_item_sanity_checks {
> > > > > +       uint32_t level;
> > > > > +       /**< Packet encapsulation level the item should apply to.
> > > > > +        * @see rte_flow_action_rss
> > > > > +        */
> > > > > +RTE_STD_C11
> > > > > +       union {
> > > > > +               struct {
> > > >
> > > > Why there is no L2 check?
> > > >
> > > Our HW doesn't support it.
> > > If other HW support it, it should be added.
> >
> > It would be an ABI breakage. Can we add it day one?
> >
> Will add reserve, since this is bit field there shouldn't be any
> ABI break.
>
> > > > > +                       uint32_t l3_ok:1;
> > > > > +                       /**< L3 layer is valid after passing all HW checking. */
> > > > > +                       uint32_t l4_ok:1;
> > > > > +                       /**< L4 layer is valid after passing all HW checking. */
> > > >
> > > > l3_ok and l4_ok looks vague.
> > > > What does it cover exactly?
> > > >
> > > It depends on the HW in question.
> > > In our case it checks in case of L3
> > > the header len, and the version.
> > > For L4 checking the len.
> >
> > If we don't know exactly what is checked,
> > how an application can rely on it?
> > Is it a best effort check? What is the use case?
> >
> From application point of view that packet is invalid.
> it is the app responsibility to understand why.

And that it can determine based on the available fields in ol_flags. right?
If HW can indicate that the packet integrity is in question,
a PMD should be able to set the bits in ol_flags. After that
the application should decide what to drop and what to pass.

What is missing is the ability for the application to tell the HW/PMD to
drop any packet which fails packet integrity checks.

I believe generally drop packets when Ethernet CRC check fails.
But l3 and l4 errors are left to the application to deal with.
If an application wants to save some CPU cycles, it could ask the
hardware to drop those packets as well. So one bit to enable/disable
this for all packets should be good.

In case we still want to pursue this per flow, how about
RTE_FLOW_ITEM_TYPE_PACKET_INTEGRITY_CHECKS instead of
RTE_FLOW_ITEM_TYPE_SANITY_CHECKS


>
> You can think about it that in any case there might be
> different counters for different errors or different actions.
> For example, the app can decide that incorrect ipv4 version
> should result in packet drop, while incorrect len
> may pass.
>
> Maybe we can list all possible error result, but I'm worried
> that we may not cover all of them. On some HW there is just one
> bit that marks if the packet is valid or not.
>
> >
> > > > > +                       uint32_t l3_ok_csum:1;
> > > > > +                       /**< L3 layer checksum is valid. */
> > > > > +                       uint32_t l4_ok_csum:1;
> > > > > +                       /**< L4 layer checksum is valid. */
> >
> > What worries me is that the checksum is separate but other checks
> > are in a common bucket.
> > I think we should have one field per precise check
> > with a way to report what is checked.
> >
> Pleas see above comment, Current HW doesn't support
> such fine grain detection, so adding bit will force the user
> to select all of them, in addition since the HW has some internal
> checks it is possible that the reject reason will be un related to the
> L3, for example some HW may not support more then two vlans
> so in case of 3 vlans may report bad L3.
>
> Best,
> Ori,
>

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 7/7] eventdev: fix ABI breakage due to event vector
  2021-02-20 22:09  5% ` [dpdk-dev] [PATCH 7/7] eventdev: fix ABI breakage due to event vector pbhagavatula
@ 2021-03-08 18:44  9%   ` Jerin Jacob
  2021-03-12 14:28  9%     ` David Marchand
  2021-03-15 10:01  7%     ` [dpdk-dev] " Kinsella, Ray
  0 siblings, 2 replies; 200+ results
From: Jerin Jacob @ 2021-03-08 18:44 UTC (permalink / raw)
  To: Pavan Nikhilesh
  Cc: Jerin Jacob, Jayatheerthan, Jay, Erik Gabriel Carrillo, Gujjar,
	Abhinandan S, McDaniel, Timothy, Hemant Agrawal, Van Haaren,
	Harry, Mattias Rönnblom, Liang Ma, Ray Kinsella,
	Neil Horman, dpdk-dev, Thomas Monjalon, David Marchand

On Sun, Feb 21, 2021 at 3:41 AM <pbhagavatula@marvell.com> wrote:
>
> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
>
> Fix ABI breakage due to event vector configuration by moving
> the vector configuration into a new structure and having a separate
> function for enabling the vector config on a given ethernet device and
> queue pair.
> This vector config and function can be merged to queue config in
> v21.11.
>
> Fixes: 44c81670cf0a ("eventdev: introduce event vector Rx capability")

Hi @Ray Kinsella @Neil Horman @Thomas Monjalon @David Marchand

Is the ABI breakage contract between release to release. Right? i.e it
is not between each patch. Right?

Summary:
1)  Ideal way of adding this feature is to add elements in the
existing structure as mentioned
in  ("eventdev: introduce event vector Rx capability") in this series.
2) Since this breaking ABI, Introducing a new structure to fix this. I
think, we can remove this
limitation in 21.11 as that time we can change ABI as required.

So, Is this patch needs to be squashed to  ("eventdev: introduce event
vector Rx capability") to avoid
ABI compatibility between patches? Or Is it OK to break the ABI
compatibility in a patch in the series
and later fix it in the same series?(This is for more readability as
we can revert this patch in 21.11).



>
> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
> ---
>  app/test-eventdev/test_pipeline_common.c      |  16 +-
>  lib/librte_eventdev/eventdev_pmd.h            |  29 +++
>  .../rte_event_eth_rx_adapter.c                | 168 ++++++++++++------
>  .../rte_event_eth_rx_adapter.h                |  27 +++
>  lib/librte_eventdev/version.map               |   1 +
>  5 files changed, 184 insertions(+), 57 deletions(-)
>
> diff --git a/app/test-eventdev/test_pipeline_common.c b/app/test-eventdev/test_pipeline_common.c
> index 89f73be86..9aeefdd5f 100644
> --- a/app/test-eventdev/test_pipeline_common.c
> +++ b/app/test-eventdev/test_pipeline_common.c
> @@ -331,6 +331,7 @@ pipeline_event_rx_adapter_setup(struct evt_options *opt, uint8_t stride,
>         uint16_t prod;
>         struct rte_mempool *vector_pool = NULL;
>         struct rte_event_eth_rx_adapter_queue_conf queue_conf;
> +       struct rte_event_eth_rx_adapter_event_vector_config vec_conf;
>
>         memset(&queue_conf, 0,
>                         sizeof(struct rte_event_eth_rx_adapter_queue_conf));
> @@ -360,12 +361,8 @@ pipeline_event_rx_adapter_setup(struct evt_options *opt, uint8_t stride,
>                 }
>                 if (opt->ena_vector) {
>                         if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR) {
> -                               queue_conf.vector_sz = opt->vector_size;
> -                               queue_conf.vector_timeout_ns =
> -                                       opt->vector_tmo_nsec;
>                                 queue_conf.rx_queue_flags |=
>                                 RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR;
> -                               queue_conf.vector_mp = vector_pool;
>                         } else {
>                                 evt_err("Rx adapter doesn't support event vector");
>                                 return -EINVAL;
> @@ -385,6 +382,17 @@ pipeline_event_rx_adapter_setup(struct evt_options *opt, uint8_t stride,
>                         return ret;
>                 }
>
> +               if (opt->ena_vector) {
> +                       vec_conf.vector_sz = opt->vector_size;
> +                       vec_conf.vector_timeout_ns = opt->vector_tmo_nsec;
> +                       vec_conf.vector_mp = vector_pool;
> +                       if (rte_event_eth_rx_adapter_queue_event_vector_config(
> +                                   prod, prod, -1, &vec_conf) < 0) {
> +                               evt_err("Failed to configure event vectorization for Rx adapter");
> +                               return -EINVAL;
> +                       }
> +               }
> +
>                 if (!(cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_INTERNAL_PORT)) {
>                         uint32_t service_id = -1U;
>
> diff --git a/lib/librte_eventdev/eventdev_pmd.h b/lib/librte_eventdev/eventdev_pmd.h
> index 60bfaebc0..d79dfd612 100644
> --- a/lib/librte_eventdev/eventdev_pmd.h
> +++ b/lib/librte_eventdev/eventdev_pmd.h
> @@ -667,6 +667,32 @@ typedef int (*eventdev_eth_rx_adapter_vector_limits_get_t)(
>         const struct rte_eventdev *dev, const struct rte_eth_dev *eth_dev,
>         struct rte_event_eth_rx_adapter_vector_limits *limits);
>
> +struct rte_event_eth_rx_adapter_event_vector_config;
> +/**
> + * Enable event vector on an given Rx queue of a ethernet devices belonging to
> + * the Rx adapter.
> + *
> + * @param dev
> + *   Event device pointer
> + *
> + * @param eth_dev
> + *   Ethernet device pointer
> + *
> + * @param rx_queue_id
> + *   The Rx queue identifier
> + *
> + * @param config
> + *   Pointer to the event vector configuration structure.
> + *
> + * @return
> + *   - 0: Success.
> + *   - <0: Error code returned by the driver function.
> + */
> +typedef int (*eventdev_eth_rx_adapter_event_vector_config_t)(
> +       const struct rte_eventdev *dev, const struct rte_eth_dev *eth_dev,
> +       int32_t rx_queue_id,
> +       const struct rte_event_eth_rx_adapter_event_vector_config *config);
> +
>  typedef uint32_t rte_event_pmd_selftest_seqn_t;
>  extern int rte_event_pmd_selftest_seqn_dynfield_offset;
>
> @@ -1092,6 +1118,9 @@ struct rte_eventdev_ops {
>         eventdev_eth_rx_adapter_vector_limits_get_t
>                 eth_rx_adapter_vector_limits_get;
>         /**< Get event vector limits for the Rx adapter */
> +       eventdev_eth_rx_adapter_event_vector_config_t
> +               eth_rx_adapter_event_vector_config;
> +       /**< Configure Rx adapter with event vector */
>
>         eventdev_timer_adapter_caps_get_t timer_adapter_caps_get;
>         /**< Get timer adapter capabilities */
> diff --git a/lib/librte_eventdev/rte_event_eth_rx_adapter.c b/lib/librte_eventdev/rte_event_eth_rx_adapter.c
> index a1990637f..c71990078 100644
> --- a/lib/librte_eventdev/rte_event_eth_rx_adapter.c
> +++ b/lib/librte_eventdev/rte_event_eth_rx_adapter.c
> @@ -1882,25 +1882,6 @@ rxa_add_queue(struct rte_event_eth_rx_adapter *rx_adapter,
>         } else
>                 qi_ev->flow_id = 0;
>
> -       if (conf->rx_queue_flags &
> -           RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR) {
> -               queue_info->ena_vector = 1;
> -               qi_ev->event_type = RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR;
> -               rxa_set_vector_data(queue_info, conf->vector_sz,
> -                                   conf->vector_timeout_ns, conf->vector_mp,
> -                                   rx_queue_id, dev_info->dev->data->port_id);
> -               rx_adapter->ena_vector = 1;
> -               rx_adapter->vector_tmo_ticks =
> -                       rx_adapter->vector_tmo_ticks
> -                               ? RTE_MIN(queue_info->vector_data
> -                                                 .vector_timeout_ticks,
> -                                         rx_adapter->vector_tmo_ticks)
> -                               : queue_info->vector_data.vector_timeout_ticks;
> -               rx_adapter->vector_tmo_ticks <<= 1;
> -               TAILQ_INIT(&rx_adapter->vector_list);
> -               rx_adapter->prev_expiry_ts = 0;
> -       }
> -
>         rxa_update_queue(rx_adapter, dev_info, rx_queue_id, 1);
>         if (rxa_polled_queue(dev_info, rx_queue_id)) {
>                 rx_adapter->num_rx_polled += !pollq;
> @@ -1926,6 +1907,44 @@ rxa_add_queue(struct rte_event_eth_rx_adapter *rx_adapter,
>         }
>  }
>
> +static void
> +rxa_sw_event_vector_configure(
> +       struct rte_event_eth_rx_adapter *rx_adapter, uint16_t eth_dev_id,
> +       int rx_queue_id,
> +       const struct rte_event_eth_rx_adapter_event_vector_config *config)
> +{
> +       struct eth_device_info *dev_info = &rx_adapter->eth_devices[eth_dev_id];
> +       struct eth_rx_queue_info *queue_info;
> +       struct rte_event *qi_ev;
> +
> +       if (rx_queue_id == -1) {
> +               uint16_t nb_rx_queues;
> +               uint16_t i;
> +
> +               nb_rx_queues = dev_info->dev->data->nb_rx_queues;
> +               for (i = 0; i < nb_rx_queues; i++)
> +                       rxa_sw_event_vector_configure(rx_adapter, eth_dev_id, i,
> +                                                     config);
> +               return;
> +       }
> +
> +       queue_info = &dev_info->rx_queue[rx_queue_id];
> +       qi_ev = (struct rte_event *)&queue_info->event;
> +       queue_info->ena_vector = 1;
> +       qi_ev->event_type = RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR;
> +       rxa_set_vector_data(queue_info, config->vector_sz,
> +                           config->vector_timeout_ns, config->vector_mp,
> +                           rx_queue_id, dev_info->dev->data->port_id);
> +       rx_adapter->ena_vector = 1;
> +       rx_adapter->vector_tmo_ticks =
> +               rx_adapter->vector_tmo_ticks ?
> +                             RTE_MIN(config->vector_timeout_ns << 1,
> +                                     rx_adapter->vector_tmo_ticks) :
> +                             config->vector_timeout_ns << 1;
> +       rx_adapter->prev_expiry_ts = 0;
> +       TAILQ_INIT(&rx_adapter->vector_list);
> +}
> +
>  static int rxa_sw_add(struct rte_event_eth_rx_adapter *rx_adapter,
>                 uint16_t eth_dev_id,
>                 int rx_queue_id,
> @@ -2239,7 +2258,6 @@ rte_event_eth_rx_adapter_queue_add(uint8_t id,
>         struct rte_event_eth_rx_adapter *rx_adapter;
>         struct rte_eventdev *dev;
>         struct eth_device_info *dev_info;
> -       struct rte_event_eth_rx_adapter_vector_limits limits;
>
>         RTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_ERR_RET(id, -EINVAL);
>         RTE_ETH_VALID_PORTID_OR_ERR_RET(eth_dev_id, -EINVAL);
> @@ -2276,39 +2294,6 @@ rte_event_eth_rx_adapter_queue_add(uint8_t id,
>                 return -EINVAL;
>         }
>
> -       if (queue_conf->rx_queue_flags &
> -           RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR) {
> -               ret = rte_event_eth_rx_adapter_vector_limits_get(
> -                       rx_adapter->eventdev_id, eth_dev_id, &limits);
> -               if (ret < 0) {
> -                       RTE_EDEV_LOG_ERR("Failed to get event device vector limits,"
> -                                        " eth port: %" PRIu16
> -                                        " adapter id: %" PRIu8,
> -                                        eth_dev_id, id);
> -                       return -EINVAL;
> -               }
> -               if (queue_conf->vector_sz < limits.min_sz ||
> -                   queue_conf->vector_sz > limits.max_sz ||
> -                   queue_conf->vector_timeout_ns < limits.min_timeout_ns ||
> -                   queue_conf->vector_timeout_ns > limits.max_timeout_ns ||
> -                   queue_conf->vector_mp == NULL) {
> -                       RTE_EDEV_LOG_ERR("Invalid event vector configuration,"
> -                                        " eth port: %" PRIu16
> -                                        " adapter id: %" PRIu8,
> -                                        eth_dev_id, id);
> -                       return -EINVAL;
> -               }
> -               if (queue_conf->vector_mp->elt_size <
> -                   (sizeof(struct rte_event_vector) +
> -                    (sizeof(uintptr_t) * queue_conf->vector_sz))) {
> -                       RTE_EDEV_LOG_ERR("Invalid event vector configuration,"
> -                                        " eth port: %" PRIu16
> -                                        " adapter id: %" PRIu8,
> -                                        eth_dev_id, id);
> -                       return -EINVAL;
> -               }
> -       }
> -
>         if ((cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_MULTI_EVENTQ) == 0 &&
>                 (rx_queue_id != -1)) {
>                 RTE_EDEV_LOG_ERR("Rx queues can only be connected to single "
> @@ -2502,6 +2487,83 @@ rte_event_eth_rx_adapter_queue_del(uint8_t id, uint16_t eth_dev_id,
>         return ret;
>  }
>
> +int
> +rte_event_eth_rx_adapter_queue_event_vector_config(
> +       uint8_t id, uint16_t eth_dev_id, int32_t rx_queue_id,
> +       struct rte_event_eth_rx_adapter_event_vector_config *config)
> +{
> +       struct rte_event_eth_rx_adapter_vector_limits limits;
> +       struct rte_event_eth_rx_adapter *rx_adapter;
> +       struct rte_eventdev *dev;
> +       uint32_t cap;
> +       int ret;
> +
> +       RTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_ERR_RET(id, -EINVAL);
> +       RTE_ETH_VALID_PORTID_OR_ERR_RET(eth_dev_id, -EINVAL);
> +
> +       rx_adapter = rxa_id_to_adapter(id);
> +       if ((rx_adapter == NULL) || (config == NULL))
> +               return -EINVAL;
> +
> +       dev = &rte_eventdevs[rx_adapter->eventdev_id];
> +       ret = rte_event_eth_rx_adapter_caps_get(rx_adapter->eventdev_id,
> +                                               eth_dev_id, &cap);
> +       if (ret) {
> +               RTE_EDEV_LOG_ERR("Failed to get adapter caps edev %" PRIu8
> +                                "eth port %" PRIu16,
> +                                id, eth_dev_id);
> +               return ret;
> +       }
> +
> +       if (!(cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR)) {
> +               RTE_EDEV_LOG_ERR("Event vectorization is not supported,"
> +                                " eth port: %" PRIu16 " adapter id: %" PRIu8,
> +                                eth_dev_id, id);
> +               return -EINVAL;
> +       }
> +
> +       ret = rte_event_eth_rx_adapter_vector_limits_get(
> +               rx_adapter->eventdev_id, eth_dev_id, &limits);
> +       if (ret) {
> +               RTE_EDEV_LOG_ERR("Failed to get vector limits edev %" PRIu8
> +                                "eth port %" PRIu16,
> +                                rx_adapter->eventdev_id, eth_dev_id);
> +               return ret;
> +       }
> +
> +       if (config->vector_sz < limits.min_sz ||
> +           config->vector_sz > limits.max_sz ||
> +           config->vector_timeout_ns < limits.min_timeout_ns ||
> +           config->vector_timeout_ns > limits.max_timeout_ns ||
> +           config->vector_mp == NULL) {
> +               RTE_EDEV_LOG_ERR("Invalid event vector configuration,"
> +                                " eth port: %" PRIu16 " adapter id: %" PRIu8,
> +                                eth_dev_id, id);
> +               return -EINVAL;
> +       }
> +       if (config->vector_mp->elt_size <
> +           (sizeof(struct rte_event_vector) +
> +            (sizeof(uintptr_t) * config->vector_sz))) {
> +               RTE_EDEV_LOG_ERR("Invalid event vector configuration,"
> +                                " eth port: %" PRIu16 " adapter id: %" PRIu8,
> +                                eth_dev_id, id);
> +               return -EINVAL;
> +       }
> +
> +       if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_INTERNAL_PORT) {
> +               RTE_FUNC_PTR_OR_ERR_RET(
> +                       *dev->dev_ops->eth_rx_adapter_event_vector_config,
> +                       -ENOTSUP);
> +               ret = dev->dev_ops->eth_rx_adapter_event_vector_config(
> +                       dev, &rte_eth_devices[eth_dev_id], rx_queue_id, config);
> +       } else {
> +               rxa_sw_event_vector_configure(rx_adapter, eth_dev_id,
> +                                             rx_queue_id, config);
> +       }
> +
> +       return ret;
> +}
> +
>  int
>  rte_event_eth_rx_adapter_vector_limits_get(
>         uint8_t dev_id, uint16_t eth_port_id,
> diff --git a/lib/librte_eventdev/rte_event_eth_rx_adapter.h b/lib/librte_eventdev/rte_event_eth_rx_adapter.h
> index 4bdb38f08..ceef6d565 100644
> --- a/lib/librte_eventdev/rte_event_eth_rx_adapter.h
> +++ b/lib/librte_eventdev/rte_event_eth_rx_adapter.h
> @@ -171,6 +171,9 @@ struct rte_event_eth_rx_adapter_queue_conf {
>          * The event adapter sets ev.event_type to RTE_EVENT_TYPE_ETHDEV in the
>          * enqueued event.
>          */
> +};
> +
> +struct rte_event_eth_rx_adapter_event_vector_config {
>         uint16_t vector_sz;
>         /**<
>          * Indicates the maximum number for mbufs to combine and form a vector.
> @@ -418,6 +421,30 @@ int rte_event_eth_rx_adapter_queue_add(uint8_t id,
>  int rte_event_eth_rx_adapter_queue_del(uint8_t id, uint16_t eth_dev_id,
>                                        int32_t rx_queue_id);
>
> +/**
> + * Configure event vectorization for a given ethernet device queue, that has
> + * been added to a event eth Rx adapter.
> + *
> + * @param id
> + *  The identifier of the ethernet Rx event adapter.
> + *
> + * @param eth_dev_id
> + *  The identifier of the ethernet device.
> + *
> + * @param rx_queue_id
> + *  Ethernet device receive queue index.
> + *  If rx_queue_id is -1, then all Rx queues configured for the ethernet device
> + *  are configured with event vectorization.
> + *
> + * @return
> + *  - 0: Success, Receive queue configured correctly.
> + *  - <0: Error code on failure.
> + */
> +__rte_experimental
> +int rte_event_eth_rx_adapter_queue_event_vector_config(
> +       uint8_t id, uint16_t eth_dev_id, int32_t rx_queue_id,
> +       struct rte_event_eth_rx_adapter_event_vector_config *config);
> +
>  /**
>   * Start ethernet Rx event adapter
>   *
> diff --git a/lib/librte_eventdev/version.map b/lib/librte_eventdev/version.map
> index 34c1c830e..902df0ae3 100644
> --- a/lib/librte_eventdev/version.map
> +++ b/lib/librte_eventdev/version.map
> @@ -142,6 +142,7 @@ EXPERIMENTAL {
>         #added in 21.05
>         rte_event_vector_pool_create;
>         rte_event_eth_rx_adapter_vector_limits_get;
> +       rte_event_eth_rx_adapter_queue_event_vector_config;
>  };
>
>  INTERNAL {
> --
> 2.17.1
>

^ permalink raw reply	[relevance 9%]

* [dpdk-dev] [dpdk-announce] DPDK 20.11.1 released
@ 2021-03-08 18:13  1% luca.boccassi
  0 siblings, 0 replies; 200+ results
From: luca.boccassi @ 2021-03-08 18:13 UTC (permalink / raw)
  To: announce

Hi all,

Here is a new stable release:
	https://fast.dpdk.org/rel/dpdk-20.11.1.tar.xz

The git tree is at:
	https://dpdk.org/browse/dpdk-stable/?h=20.11

Luca Boccassi

---
 VERSION                                            |   2 +-
 app/meson.build                                    |   7 +
 app/proc-info/main.c                               |  32 +-
 app/test-crypto-perf/cperf_options_parsing.c       |   2 +-
 app/test-crypto-perf/cperf_test_latency.c          |   4 +-
 app/test-crypto-perf/cperf_test_pmd_cyclecount.c   |   2 +-
 app/test-crypto-perf/cperf_test_throughput.c       |   4 +-
 app/test-crypto-perf/cperf_test_verify.c           |   2 +-
 app/test-crypto-perf/main.c                        |   8 +-
 app/test-eventdev/test_perf_common.h               |  14 +-
 app/test-eventdev/test_pipeline_queue.c            |  17 +-
 app/test-flow-perf/actions_gen.c                   |  30 +-
 app/test-flow-perf/items_gen.c                     | 123 ++---
 app/test-pmd/cmdline.c                             |  51 ++-
 app/test-pmd/cmdline_flow.c                        |   5 +-
 app/test-pmd/cmdline_mtr.c                         |  33 +-
 app/test-pmd/config.c                              | 164 ++-----
 app/test-pmd/flowgen.c                             |   7 +-
 app/test-pmd/parameters.c                          | 114 +----
 app/test-pmd/testpmd.c                             | 282 +++++-------
 app/test-pmd/testpmd.h                             |  23 +-
 app/test-pmd/util.c                                | 175 +++++---
 app/test/meson.build                               |   2 +-
 app/test/test.c                                    |  31 +-
 app/test/test_distributor.c                        |  20 +-
 app/test/test_event_crypto_adapter.c               |   2 +
 app/test/test_ipsec.c                              |  32 +-
 app/test/test_mcslock.c                            |  16 +-
 app/test/test_pmd_perf.c                           |  18 +-
 app/test/test_ring_perf.c                          |   2 +-
 app/test/test_rwlock.c                             |   9 +-
 buildtools/pkg-config/meson.build                  |   6 +-
 config/meson.build                                 |  11 +-
 doc/guides/nics/features.rst                       |  15 +
 doc/guides/nics/features/cxgbe.ini                 |   1 +
 doc/guides/nics/features/default.ini               |   1 +
 doc/guides/nics/features/hns3.ini                  |   1 +
 doc/guides/nics/hns3.rst                           |   2 +-
 doc/guides/nics/i40e.rst                           |   4 +-
 doc/guides/nics/ice.rst                            |   5 +-
 doc/guides/nics/ixgbe.rst                          |  10 +
 doc/guides/nics/mlx5.rst                           |  40 +-
 doc/guides/prog_guide/graph_lib.rst                |  10 +-
 doc/guides/prog_guide/img/anatomy_of_a_node.svg    |   5 -
 doc/guides/prog_guide/img/link_the_nodes.svg       |   5 -
 doc/guides/prog_guide/profile_app.rst              |  14 +
 doc/guides/rel_notes/release_20_11.rst             | 500 +++++++++++++++++++++
 doc/guides/sample_app_ug/eventdev_pipeline.rst     |   5 +-
 doc/guides/testpmd_app_ug/testpmd_funcs.rst        |   6 +-
 drivers/bus/pci/windows/pci.c                      |  13 +-
 drivers/bus/pci/windows/pci_netuio.c               |   6 +
 drivers/bus/pci/windows/pci_netuio.h               |   2 +
 drivers/common/mlx5/linux/meson.build              |   3 +-
 drivers/common/mlx5/linux/mlx5_nl.c                |  20 +-
 drivers/common/mlx5/mlx5_devx_cmds.c               |   9 +-
 drivers/common/mlx5/mlx5_devx_cmds.h               |   4 +-
 drivers/common/mlx5/mlx5_prm.h                     |   7 +-
 drivers/common/octeontx2/otx2_io_arm64.h           |  15 +-
 drivers/common/qat/meson.build                     |   2 +-
 drivers/common/sfc_efx/base/ef10_nic.c             |  48 +-
 drivers/common/sfc_efx/base/efx.h                  |   5 +
 drivers/common/sfc_efx/base/efx_mae.c              | 171 +++++--
 drivers/common/sfc_efx/base/efx_regs_mcdi.h        |  54 ++-
 drivers/compress/isal/meson.build                  |   2 +-
 drivers/compress/zlib/meson.build                  |   2 +-
 drivers/crypto/armv8/meson.build                   |   2 +-
 drivers/crypto/ccp/meson.build                     |   2 +-
 drivers/crypto/dpaa2_sec/dpaa2_sec_dpseci.c        |   2 +-
 drivers/crypto/openssl/meson.build                 |   2 +-
 drivers/crypto/qat/meson.build                     |   2 +-
 drivers/crypto/qat/qat_asym_pmd.c                  |   8 +-
 drivers/crypto/qat/qat_sym_hw_dp.c                 |  97 ++--
 drivers/crypto/qat/qat_sym_pmd.c                   |   8 +-
 drivers/event/dlb/dlb.c                            |   6 +-
 drivers/net/af_xdp/meson.build                     |   5 +-
 drivers/net/af_xdp/rte_eth_af_xdp.c                |   1 -
 drivers/net/avp/avp_ethdev.c                       |   2 +-
 drivers/net/axgbe/axgbe_ethdev.c                   |   2 +-
 drivers/net/axgbe/axgbe_ethdev.h                   |   6 +
 drivers/net/bnx2x/meson.build                      |   2 +-
 drivers/net/bnxt/bnxt.h                            |  44 +-
 drivers/net/bnxt/bnxt_ethdev.c                     | 356 ++++++++-------
 drivers/net/bnxt/bnxt_hwrm.c                       |  87 ++--
 drivers/net/bnxt/bnxt_reps.c                       |   2 +-
 drivers/net/bnxt/bnxt_ring.c                       |  22 +
 drivers/net/bnxt/bnxt_rxq.c                        |  33 +-
 drivers/net/bnxt/bnxt_rxr.c                        | 169 ++++---
 drivers/net/bnxt/bnxt_rxr.h                        |  12 +-
 drivers/net/bnxt/bnxt_rxtx_vec_neon.c              |  16 +-
 drivers/net/bnxt/bnxt_rxtx_vec_sse.c               |  16 +-
 drivers/net/bnxt/bnxt_txq.c                        |   2 +-
 drivers/net/bnxt/tf_core/tf_core.c                 |   2 +-
 drivers/net/bnxt/tf_core/tf_em_common.c            |   1 -
 drivers/net/bonding/rte_eth_bond_8023ad.c          |   6 +-
 drivers/net/bonding/rte_eth_bond_args.c            |  63 ++-
 drivers/net/cxgbe/cxgbe.h                          |   4 +
 drivers/net/cxgbe/cxgbe_ethdev.c                   |   4 +-
 drivers/net/cxgbe/cxgbe_flow.c                     |   7 +-
 drivers/net/dpaa/dpaa_ethdev.c                     |   2 +-
 drivers/net/dpaa/dpaa_ethdev.h                     |   4 +
 drivers/net/dpaa2/dpaa2_ethdev.c                   |   2 +-
 drivers/net/dpaa2/dpaa2_ethdev.h                   |   4 +
 drivers/net/e1000/e1000_ethdev.h                   |   2 +-
 drivers/net/e1000/em_ethdev.c                      |   5 +-
 drivers/net/e1000/igb_ethdev.c                     |  36 +-
 drivers/net/ena/base/ena_eth_com.c                 |   3 +
 drivers/net/ena/base/ena_plat_dpdk.h               |   1 +
 drivers/net/ena/ena_ethdev.c                       |  85 ++--
 drivers/net/ena/ena_ethdev.h                       |   4 +
 drivers/net/enetc/enetc.h                          |   4 +
 drivers/net/enetc/enetc_ethdev.c                   |   2 +-
 drivers/net/enic/enic_flow.c                       |   4 +-
 drivers/net/hinic/hinic_pmd_ethdev.c               |   5 +-
 drivers/net/hinic/hinic_pmd_rx.c                   |   6 +-
 drivers/net/hinic/hinic_pmd_tx.c                   |  10 +-
 drivers/net/hns3/hns3_cmd.c                        |  25 +-
 drivers/net/hns3/hns3_cmd.h                        |  28 +-
 drivers/net/hns3/hns3_dcb.c                        |   2 +-
 drivers/net/hns3/hns3_ethdev.c                     | 168 +++++--
 drivers/net/hns3/hns3_ethdev_vf.c                  |  60 ++-
 drivers/net/hns3/hns3_flow.c                       |  62 ++-
 drivers/net/hns3/hns3_regs.c                       |  84 ++--
 drivers/net/hns3/hns3_regs.h                       |  22 +-
 drivers/net/hns3/hns3_rss.c                        |  28 +-
 drivers/net/hns3/hns3_rss.h                        |   5 +-
 drivers/net/hns3/hns3_rxtx.c                       |  32 +-
 drivers/net/hns3/hns3_rxtx.h                       |   1 +
 drivers/net/hns3/hns3_stats.c                      | 101 +++--
 drivers/net/hns3/meson.build                       |   1 -
 drivers/net/i40e/base/i40e_osdep.h                 |  10 +
 drivers/net/i40e/i40e_ethdev.c                     |  67 ++-
 drivers/net/i40e/i40e_ethdev.h                     |   4 +
 drivers/net/i40e/i40e_ethdev_vf.c                  |  23 +-
 drivers/net/i40e/i40e_fdir.c                       |  21 +-
 drivers/net/i40e/i40e_flow.c                       |   4 +
 drivers/net/i40e/i40e_rxtx.c                       |   8 +-
 drivers/net/i40e/i40e_rxtx_vec_avx2.c              |  40 +-
 drivers/net/i40e/i40e_rxtx_vec_sse.c               |  20 +-
 drivers/net/i40e/rte_pmd_i40e.c                    |   6 +
 drivers/net/iavf/iavf.h                            |   1 +
 drivers/net/iavf/iavf_ethdev.c                     |  20 +-
 drivers/net/iavf/iavf_fdir.c                       |  12 +-
 drivers/net/iavf/iavf_hash.c                       |   9 +
 drivers/net/iavf/iavf_vchnl.c                      |  18 +-
 drivers/net/ice/base/ice_flex_pipe.c               |  13 +-
 drivers/net/ice/base/ice_sched.c                   |   2 +-
 drivers/net/ice/base/ice_switch.c                  |  12 +-
 drivers/net/ice/ice_dcf.c                          |   4 +-
 drivers/net/ice/ice_dcf_ethdev.c                   |   8 +-
 drivers/net/ice/ice_ethdev.c                       |  18 +-
 drivers/net/ice/ice_ethdev.h                       |   1 +
 drivers/net/ice/ice_rxtx.c                         |  22 +-
 drivers/net/ice/ice_rxtx.h                         |   2 +-
 drivers/net/ice/ice_rxtx_vec_avx2.c                | 118 +++--
 drivers/net/ice/ice_rxtx_vec_avx512.c              | 117 +++--
 drivers/net/ice/ice_rxtx_vec_common.h              |   1 +
 drivers/net/ice/ice_rxtx_vec_sse.c                 |  78 +++-
 drivers/net/ionic/ionic.h                          |   1 +
 drivers/net/ionic/ionic_dev.c                      |   5 +
 drivers/net/ionic/ionic_dev.h                      |   2 +
 drivers/net/ionic/ionic_ethdev.c                   |  32 +-
 drivers/net/ionic/ionic_lif.c                      |  26 +-
 drivers/net/ionic/ionic_main.c                     |  31 +-
 drivers/net/ionic/ionic_rxtx.c                     |  91 ++--
 drivers/net/ipn3ke/ipn3ke_ethdev.h                 |   1 +
 drivers/net/ipn3ke/ipn3ke_representor.c            |   2 +-
 drivers/net/ixgbe/ixgbe_ethdev.c                   |   5 +-
 drivers/net/ixgbe/ixgbe_ethdev.h                   |   3 +
 drivers/net/ixgbe/ixgbe_fdir.c                     |  29 ++
 drivers/net/ixgbe/ixgbe_flow.c                     |  15 +-
 drivers/net/ixgbe/ixgbe_pf.c                       |  43 +-
 drivers/net/ixgbe/ixgbe_rxtx.c                     |  48 +-
 drivers/net/ixgbe/ixgbe_rxtx.h                     |   2 +
 drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c             |  32 +-
 drivers/net/liquidio/lio_ethdev.c                  |   2 +-
 drivers/net/liquidio/lio_ethdev.h                  |   3 +
 drivers/net/mlx4/meson.build                       |   3 +-
 drivers/net/mlx4/mlx4.c                            |  72 ++-
 drivers/net/mlx4/mlx4.h                            |   4 +
 drivers/net/mlx4/mlx4_mp.c                         |  24 +
 drivers/net/mlx4/mlx4_rxtx.h                       |   1 +
 drivers/net/mlx4/mlx4_txq.c                        |  28 ++
 drivers/net/mlx5/linux/mlx5_ethdev_os.c            |   4 +-
 drivers/net/mlx5/linux/mlx5_flow_os.h              |  26 ++
 drivers/net/mlx5/linux/mlx5_mp_os.c                |  19 +
 drivers/net/mlx5/linux/mlx5_os.c                   | 231 ++--------
 drivers/net/mlx5/linux/mlx5_os.h                   |   6 +-
 drivers/net/mlx5/linux/mlx5_verbs.c                |  27 +-
 drivers/net/mlx5/mlx5.c                            | 171 ++++++-
 drivers/net/mlx5/mlx5.h                            |  36 +-
 drivers/net/mlx5/mlx5_devx.c                       |  45 +-
 drivers/net/mlx5/mlx5_ethdev.c                     |   4 +-
 drivers/net/mlx5/mlx5_flow.c                       |  87 ++--
 drivers/net/mlx5/mlx5_flow.h                       |   9 +-
 drivers/net/mlx5/mlx5_flow_age.c                   |   3 +-
 drivers/net/mlx5/mlx5_flow_dv.c                    | 412 ++++++++++-------
 drivers/net/mlx5/mlx5_flow_verbs.c                 |   8 +
 drivers/net/mlx5/mlx5_rxq.c                        |  17 +-
 drivers/net/mlx5/mlx5_rxtx.h                       |   2 +-
 drivers/net/mlx5/mlx5_rxtx_vec_sse.h               |   4 +-
 drivers/net/mlx5/mlx5_txpp.c                       |   9 +-
 drivers/net/mlx5/mlx5_txq.c                        |  22 +-
 drivers/net/mvneta/mvneta_rxtx.c                   |  10 +
 drivers/net/mvpp2/mrvl_ethdev.c                    |  50 +--
 drivers/net/mvpp2/mrvl_ethdev.h                    |   1 -
 drivers/net/netvsc/hn_nvs.c                        |   7 +-
 drivers/net/nfb/meson.build                        |   2 +-
 drivers/net/nfp/nfp_net.c                          |   2 +-
 drivers/net/nfp/nfpcore/nfp_cpp.h                  |   2 +-
 drivers/net/nfp/nfpcore/nfp_cppcore.c              |  49 +-
 drivers/net/octeontx/base/octeontx_io.h            |  10 +-
 drivers/net/octeontx/octeontx_ethdev.c             |   3 +-
 drivers/net/octeontx/octeontx_ethdev.h             |   1 +
 drivers/net/octeontx2/otx2_ethdev.h                |   2 +
 drivers/net/octeontx2/otx2_ethdev_ops.c            |   2 +-
 drivers/net/octeontx2/otx2_flow_parse.c            |   5 +-
 drivers/net/octeontx2/otx2_flow_utils.c            |   2 +-
 drivers/net/octeontx2/otx2_rx.c                    |   6 +
 drivers/net/octeontx2/otx2_rx.h                    |   7 +-
 drivers/net/pcap/rte_eth_pcap.c                    |  47 +-
 drivers/net/qede/qede_ethdev.c                     |   4 +-
 drivers/net/qede/qede_rxtx.h                       |   1 +
 drivers/net/sfc/sfc_ef10_tx.c                      |  19 +
 drivers/net/sfc/sfc_ethdev.c                       |  11 +-
 drivers/net/sfc/sfc_tso.c                          |   7 +
 drivers/net/sfc/sfc_tso.h                          |  30 ++
 drivers/net/szedata2/meson.build                   |   2 +-
 drivers/net/thunderx/base/nicvf_hw_defs.h          |   1 +
 drivers/net/thunderx/nicvf_ethdev.c                |   2 +-
 drivers/net/virtio/virtio_user/vhost.h             |   8 +
 drivers/net/virtio/virtio_user/vhost_user.c        |   7 +-
 drivers/net/virtio/virtio_user/vhost_vdpa.c        | 120 ++++-
 drivers/net/virtio/virtio_user/virtio_user_dev.c   |  18 +-
 drivers/net/virtio/virtio_user/virtio_user_dev.h   |   4 +-
 drivers/net/virtio/virtio_user_ethdev.c            |   2 +-
 drivers/regex/mlx5/mlx5_regex_fastpath.c           |  19 +-
 drivers/regex/mlx5/mlx5_rxp.c                      |   5 +-
 drivers/regex/octeontx2/otx2_regexdev.c            |   3 +
 drivers/vdpa/mlx5/mlx5_vdpa.c                      |   2 +
 examples/eventdev_pipeline/main.c                  |  80 ++--
 examples/l3fwd/main.c                              |   2 +-
 examples/meson.build                               |   7 +-
 examples/pipeline/cli.c                            |   2 +-
 examples/pipeline/examples/vxlan_table.py          |   0
 examples/vm_power_manager/channel_manager.c        |   1 -
 examples/vm_power_manager/channel_monitor.c        | 150 ++++---
 examples/vm_power_manager/channel_monitor.h        |  11 +-
 examples/vm_power_manager/guest_cli/main.c         |  31 +-
 .../guest_cli/vm_power_cli_guest.c                 |  67 ++-
 .../guest_cli/vm_power_cli_guest.h                 |   6 +-
 examples/vm_power_manager/main.c                   |   2 +-
 examples/vm_power_manager/meson.build              |   2 +-
 examples/vm_power_manager/vm_power_cli.c           |   1 -
 lib/librte_bitratestats/rte_bitrate.h              |   2 +
 lib/librte_bpf/meson.build                         |   2 +-
 lib/librte_compressdev/rte_compressdev_pmd.h       |   2 +
 lib/librte_cryptodev/rte_cryptodev_pmd.h           |  12 +-
 lib/librte_eal/arm/include/rte_atomic_64.h         |  28 +-
 lib/librte_eal/common/eal_common_fbarray.c         |   2 +-
 lib/librte_eal/common/eal_common_options.c         |  35 +-
 lib/librte_eal/freebsd/eal.c                       |   4 +-
 lib/librte_eal/include/generic/rte_mcslock.h       |   1 +
 lib/librte_eal/include/rte_compat.h                |  13 +-
 lib/librte_eal/include/rte_keepalive.h             |   2 +-
 lib/librte_eal/include/rte_reciprocal.h            |   2 +
 lib/librte_eal/linux/eal.c                         |   4 +-
 lib/librte_eal/linux/eal_interrupts.c              |   2 +-
 lib/librte_eal/windows/eal.c                       |   6 +-
 lib/librte_eal/windows/eal_lcore.c                 |   1 +
 lib/librte_eal/windows/eal_memory.c                |  42 +-
 lib/librte_eal/windows/include/rte_os.h            |  24 +-
 lib/librte_ethdev/rte_eth_ctrl.h                   |   1 +
 lib/librte_ethdev/rte_ethdev.c                     |  29 +-
 lib/librte_eventdev/rte_eventdev_pmd.h             |  15 +-
 lib/librte_fib/rte_fib.h                           |   2 +
 lib/librte_fib/rte_fib6.h                          |   2 +
 lib/librte_ip_frag/rte_ipv4_reassembly.c           |  11 +-
 lib/librte_ip_frag/rte_ipv6_reassembly.c           |   9 +-
 lib/librte_ipsec/rte_ipsec_sad.h                   |   2 +
 lib/librte_lpm/rte_lpm_altivec.h                   |   8 +-
 lib/librte_lpm/rte_lpm_neon.h                      |   8 +-
 lib/librte_lpm/rte_lpm_sse.h                       |   8 +-
 lib/librte_mbuf/rte_mbuf_core.h                    |   3 +-
 lib/librte_mbuf/rte_mbuf_dyn.h                     |  13 +
 lib/librte_mempool/rte_mempool.c                   |   2 +-
 lib/librte_metrics/meson.build                     |   2 +-
 lib/librte_metrics/rte_metrics_telemetry.c         |   2 +
 lib/librte_metrics/rte_metrics_telemetry.h         |   2 -
 lib/librte_net/rte_geneve.h                        |   2 +
 lib/librte_node/rte_node_ip4_api.h                 |   1 +
 lib/librte_pipeline/rte_swx_ctl.h                  |   1 +
 lib/librte_pipeline/rte_swx_pipeline.h             |   1 +
 lib/librte_port/rte_port.h                         |   2 +-
 lib/librte_port/rte_swx_port.h                     |   4 +-
 lib/librte_power/channel_commands.h                | 125 ------
 lib/librte_power/guest_channel.c                   |  11 +-
 lib/librte_power/guest_channel.h                   |  49 +-
 lib/librte_power/meson.build                       |   3 +-
 lib/librte_power/power_kvm_vm.c                    |  18 +-
 lib/librte_power/rte_power.h                       |   1 +
 lib/librte_power/rte_power_guest_channel.h         | 176 ++++++++
 lib/librte_power/version.map                       |   4 +
 lib/librte_rawdev/rte_rawdev_pmd.h                 |  18 +-
 lib/librte_rib/rte_rib.c                           |   2 +-
 lib/librte_rib/rte_rib.h                           |   3 +
 lib/librte_rib/rte_rib6.h                          |   1 +
 lib/librte_security/rte_security_driver.h          |   7 +-
 lib/librte_table/rte_lru_x86.h                     |   1 +
 lib/librte_table/rte_swx_table.h                   |   6 -
 lib/librte_table/rte_table.h                       |   4 +-
 lib/librte_telemetry/rte_telemetry.h               |   2 +
 lib/librte_vhost/rte_vdpa.h                        |   2 +
 lib/librte_vhost/rte_vdpa_dev.h                    |   1 +
 lib/librte_vhost/rte_vhost_crypto.h                |   8 +
 lib/librte_vhost/vhost.c                           |   6 +
 lib/librte_vhost/virtio_net.c                      |  16 +-
 license/bsd-2-clause.txt                           |  20 +
 license/isc.txt                                    |  11 +
 license/mit.txt                                    |  18 +
 usertools/dpdk-devbind.py                          |  13 +-
 320 files changed, 5071 insertions(+), 2938 deletions(-)
Ajit Khaparde (3):
      net/bnxt: fix cleanup on mutex init failure
      net/bnxt: fix format specifier for unsigned int
      net/bnxt: fix freeing mbuf

Alexander Kozyrev (4):
      net/mlx5: fix mbuf freeing in vectorized MPRQ
      net/mlx5: fix flow tag decompression
      net/mlx5: check FW miniCQE format capabilities
      net/mlx5: fix miniCQE configuration for Verbs

Alvin Zhang (9):
      net/ixgbe: detect failed VF MTU set
      net/i40e: fix Rx bytes statistics
      net/iavf: fix queue pairs configuration
      doc: fix RSS flow description in i40e guide
      net/i40e: fix returned code for RSS hardware failure
      net/ice: fix RSS lookup table initialization
      test: fix buffer overflow in Tx burst
      net/ixgbe: fix configuration of max frame size
      app/testpmd: fix key for RSS flow rule

Amit Bernstein (1):
      net/ena: fix Tx doorbell statistics

Anatoly Burakov (1):
      fbarray: fix overlap check

Andrew Boyer (5):
      net/ionic: do minor logging fixups
      net/ionic: fix link speed and autonegotiation
      net/ionic: allow separate L3 and L4 checksum offload
      net/ionic: fix up function attribute tags
      net/ionic: fix address handling in Tx

Ankur Dwivedi (1):
      test/event_crypto: set cipher operation in transform

Ashish Sadanandan (1):
      mbuf: add C++ include guard for dynamic fields header

Balazs Nemeth (1):
      net/qede: fix promiscuous enable

Beilei Xing (2):
      net/i40e: fix global register recovery
      net/i40e: fix flex payload rule conflict

Bernard Iremonger (1):
      doc: fix QinQ flow rules in testpmd guide

Bruce Richardson (29):
      ethdev: avoid blocking telemetry for link status
      build: provide suitable error for "both" libraries option
      eal: fix reciprocal header include
      telemetry: fix missing header include
      ethdev: fix missing header include
      net: fix missing header include
      mbuf: fix missing header include
      bitrate: fix missing header include
      rib: fix missing header includes
      vhost: fix missing header includes
      ipsec: fix missing header include
      fib: fix missing header includes
      table: fix missing header include
      pipeline: fix missing header includes
      metrics: fix variable declaration in header
      node: fix missing header include
      app: fix build with extra include paths
      build: force pkg-config for dependency detection
      power: create guest channel public header file
      power: make channel message functions public
      power: rename public structs
      power: rename constants
      power: export guest channel header file
      power: clean up includes
      eal: fix MCS lock header include
      eal: fix internal ABI tag with clang
      power: fix missing header includes
      rib: fix missing header include
      eal: fix automatic loading of drivers as shared libs

Chengchang Tang (7):
      net/hns3: fix register length when dumping registers
      net/hns3: fix data overwriting during register dump
      net/hns3: fix dump register out of range
      net/hns3: fix interrupt resources in Rx interrupt mode
      net/hns3: fix firmware exceptions by concurrent commands
      net/hns3: fix VF reset on mailbox failure
      net/hns3: fix stats flip overflow

Chengwen Feng (3):
      net/hns3: fix VF query link status in dev init
      net/hns3: remove MPLS from supported flow items
      net/hns3: fix flow director rule residue on malloc failure

Ciara Power (3):
      app/crypto-perf: fix spelling in output
      app/crypto-perf: fix latency CSV output
      app/crypto-perf: fix CSV output format

Cristian Dumitrescu (1):
      examples/pipeline: fix CLI parsing crash

Dapeng Yu (4):
      net/ixgbe: fix flex bytes flow director rule
      net/ice: check Rx queue number on RSS init
      net/ixgbe: disable NFS filtering
      app/testpmd: avoid exit without terminal restore

David Marchand (3):
      net/hinic: restore vectorised code
      examples/pipeline: fix VXLAN script permission
      mbuf: remove unneeded atomic generic header include

Dekel Peled (8):
      net/mlx5: fix shared age action validation
      net/mlx5: fix hairpin flow split decision
      net/mlx5: fix flow split combined with counter
      net/mlx5: fix flow split combined with age action
      net/mlx5: fix shared RSS translation and cleanup
      app/testpmd: support shared age action query
      net/mlx5: fix shared RSS capability check
      net/mlx5: validate hash Rx queue pointer

Dmitry Kozlyuk (4):
      eal/windows: fix build with MinGW-w64 8
      bus/pci: fix build with MinGW-w64 8
      bus/pci: fix hardware ID limit on Windows
      build: fix linker flags on Windows

Eugeny Parshutin (1):
      doc: add vtune profiling config to prog guide

Fan Zhang (1):
      crypto/qat: fix digest in buffer

Fei Chen (1):
      vhost: fix vid allocation race

Feifei Wang (7):
      test/ring: reduce duration of performance tests
      app/eventdev: adjust event count order for pipeline test
      app/eventdev: remove redundant enqueue in burst Tx
      examples/eventdev: check CPU core enabling
      examples/eventdev: add info output for main core
      examples/eventdev: move ethdev stop to the end
      app/eventdev: fix SMP barrier in performance test

Ferruh Yigit (13):
      app/procinfo: fix _filters stats reporting
      app/procinfo: fix check on xstats-ids
      app/procinfo: remove useless memset
      app/procinfo: remove useless assignment
      net/pcap: remove local variable shadowing outer one
      net/bonding: remove local variable shadowing outer one
      net/af_xdp: remove useless assignment
      net/bnxt: remove redundant return
      app/crypto-perf: remove always true condition
      net/avp: remove always true condition
      net/pcap: fix byte stats for drop Tx
      net/pcap: fix infinite Rx with large files
      app/testpmd: fix help of metering commands

Gaetan Rivet (2):
      net/bonding: fix port id validity check on parsing
      net/bonding: fix PCI address comparison on non-PCI ports

Gagandeep Singh (2):
      test/ipsec: fix result code for not supported
      crypto/dpaa2_sec: fix memory allocation check

George Prekas (1):
      app/testpmd: fix IP checksum calculation

Gregory Etelson (5):
      net/mlx5: fix Direct Verbs flow descriptor allocation
      app/testpmd: release flows left before port stop
      net/mlx5: fix tunnel rules validation on VF representor
      net/mlx5: fix mark action in active tunnel offload
      net/mlx5: fix drop action in tunnel offload mode

Guy Kaneti (1):
      regex/octeontx2: fix PCI table overflow

Haiyue Wang (2):
      net/ice: drain out DCF AdminQ command queue
      net/ixgbe: fix UDP zero checksum on x86

Harman Kalra (1):
      examples/l3fwd: remove limitation on Tx queue count

Harry van Haaren (1):
      eventdev: fix a return value comment

Heinrich Kuhn (1):
      net/nfp: read chip model from PluDevice register

Hemant Agrawal (1):
      app/procinfo: fix security context info

Hongbo Zheng (1):
      net/hns3: use new opcode for clearing hardware resource

Huisong Li (7):
      app/testpmd: fix queue stats mapping configuration
      net/hns3: fix xstats with id and names
      net/hns3: fix error code in xstats
      net/hns3: fix Rx/Tx errors stats
      net/hns3: fix link status change from firmware
      net/hns3: validate requested maximum Rx frame length
      net/hns3: fix query order of link status and link info

Hyong Youb Kim (2):
      net/enic: fix filter type used for flow API
      net/enic: fix filter log message

Ido Segev (1):
      net/ena: flush Rx buffers memory pool cache

Igor Chauskin (2):
      net/ena: fix Tx SQ free space assessment
      net/ena: prevent double doorbell

Igor Ryzhov (1):
      net/i40e: fix stats counters

Ivan Malov (11):
      common/sfc_efx/base: remove warnings about inline specifiers
      common/sfc_efx/base: fix signed/unsigned mismatch warnings
      common/sfc_efx/base: support alternative MAE match fields
      common/sfc_efx/base: update MCDI headers for MAE privilege
      common/sfc_efx/base: check for MAE privilege
      common/sfc_efx/base: fix MPORT related byte order handling
      common/sfc_efx/base: fix MAE match spec validation helper
      common/sfc_efx/base: fix MAE match spec class comparison API
      common/sfc_efx/base: enhance field ID check in field set API
      common/sfc_efx/base: apply mask to value on match field set
      net/sfc: fix TSO and checksum offloads for EF10

Jiawei Wang (4):
      net/mlx5: fix unnecessary checking for RSS action
      app/testpmd: fix packets dump overlapping
      net/mlx5: fix count actions query in sample flow
      net/mlx5: fix counter and age flow action validation

Jiawei Zhu (1):
      net/virtio-user: fix run closing stdin and close callfd

Jingjing Wu (1):
      net/iavf: fix vector mapping with queue

John McNamara (1):
      license: add licenses for exception cases

Joyce Kong (1):
      eal/arm: fix debug build with gcc for 128-bit atomics

Junfeng Guo (1):
      net/iavf: fix GTPU UL and DL support for flow director

Kalesh AP (4):
      net/bnxt: release HWRM lock in error
      net/bnxt: propagate FW command failure to application
      net/bnxt: fix VNIC RSS configure function
      net/bnxt: fix FW version log

Karra Satwik (2):
      net/cxgbe: accept VLAN flow items without ethertype
      app/testpmd: fix start index for showing FEC array

Lance Richardson (10):
      net/bnxt: disable end of packet padding for Rx
      net/bnxt: limit Rx representor packets per poll
      net/bnxt: fix doorbell write ordering
      net/bnxt: fix outer UDP checksum Rx offload capability
      net/bnxt: make offload flags mapping per-ring
      net/bnxt: set correct checksum status in mbuf
      net/bnxt: fix packet type index calculation
      net/bnxt: fix null termination of Rx mbuf chain
      net/bnxt: fix fallback mbuf allocation logic
      net/bnxt: fix Rx completion ring size calculation

Leyi Rong (1):
      net/ice: enlarge Rx queue rearm threshold to 64

Lijun Ou (6):
      net/hns3: fix interception with flow director
      net/hns3: fix memory leak on secondary process exit
      net/hns3: adjust some comments
      net/hns3: adjust format specifier for enum
      doc: fix product link in hns3 guide
      net/hns3: fix RSS indirection table size

Liron Himi (5):
      net/octeontx2: fix PF flow action for Tx
      net/mvpp2: remove debug log on fast-path
      net/mvpp2: remove VLAN flush
      net/mvpp2: remove CRC length from MRU validation
      net/mvpp2: fix frame size checking

Long Li (1):
      net/netvsc: ignore unsupported packet on sync command

Luca Boccassi (2):
      version: 20.11.1-rc1
      version: 20.11.1

Lukasz Wojciechowski (1):
      test/distributor: fix return buffer queue overload

Marvin Liu (1):
      vhost: fix packed ring dequeue offloading

Matan Azrad (1):
      vdpa/mlx5: fix configuration mutex cleanup

Maxime Coquelin (3):
      net/virtio: add missing backend features negotiation
      net/virtio: fix memory init with vDPA backend
      net/virtio: fix getting old status on reconnect

Michael Baum (7):
      net/mlx5: fix leak on Rx queue creation failure
      net/mlx5: fix leak on Tx queue creation failure
      common/mlx5: fix completion queue entry size configuration
      net/mlx5: remove CQE padding device argument
      net/mlx5: fix leak on ASO SQ creation failure
      net/mlx4: fix device detach
      net/mlx4: fix handling of probing failure

Michal Krawczyk (1):
      net/ena: validate Rx req ID upon acquiring descriptor

Min Hu (Connor) (3):
      net/hns3: fix FEC state query
      net/hns3: fix crash with multi-process
      doc: add FEC to NIC features

Murphy Yang (6):
      net/ice: fix outer UDP Tx checksum offload
      net/i40e: fix L4 checksum flag
      net/ice: fix outer checksum flags
      net/iavf: fix conflicting RSS combination rules
      net/ice: disable IPv4 checksum offload in vector Tx
      net/i40e: add null input checks

Nick Connolly (2):
      eal/windows: fix debug build with MinGW
      eal/windows: fix vfprintf warning with clang

Olivier Matz (5):
      build: fix plugin load on static build
      net/virtio-user: fix protocol features advertising
      service: propagate init error in EAL
      test/mcslock: remove unneeded per lcore copy
      mempool: fix panic on dump or audit

Ophir Munk (4):
      net/mlx5: fix freeing packet pacing
      net/mlx5: fix flow action destroy wrapper
      net/mlx5: fix flow operation wrapper per OS
      net/mlx5: unify operations for all OS

Ori Kam (3):
      regex/mlx5: fix memory rule alignment
      regex/mlx5: fix support for group id
      regex/mlx5: fix number of supported queues

Qi Zhang (4):
      doc: fix some statements for ice vector PMD
      net/ice/base: fix tunnel destroy
      net/ice/base: fix null pointer dereference
      net/ice/base: fix memory handling

Ruifeng Wang (4):
      lpm: fix vector IPv4 lookup
      net/hns3: fix build with SVE
      net/octeontx: fix build with SVE
      common/octeontx2: fix build with SVE

Samik Gupta (2):
      net/bnxt: fix Rx rings in RSS redirection table
      net/bnxt: fix VNIC config on Rx queue stop

Shiri Kuzin (2):
      net/mlx5: fix VXLAN decap on non-VXLAN flow
      net/mlx5: refuse empty VLAN in flow pattern

Somnath Kotur (4):
      net/bnxt: fix PF resource query
      net/bnxt: fix lock init and destroy
      net/bnxt: fix error handling in device start
      net/bnxt: refactor init/uninit

Souvik Dey (2):
      net/i40e: fix VLAN stripping in VF
      common/mlx5: fix storing synced MAC to internal table

Sriharsha Basavapatna (1):
      net/bnxt: fix max rings computation

Stephen Hemminger (2):
      test/rwlock: fix spelling and missing whitespace
      test: fix terminal settings on exit

Steve Yang (23):
      ethdev: fix max Rx packet length check
      app/testpmd: fix max Rx packet length for VLAN packets
      net/dpaa: fix jumbo frame flag condition for MTU set
      net/dpaa2: fix jumbo frame flag condition for MTU set
      net/e1000: fix jumbo frame flag condition for MTU set
      net/hns3: fix jumbo frame flag condition for MTU set
      net/i40e: fix jumbo frame flag condition
      net/iavf: fix jumbo frame flag condition
      net/ice: fix jumbo frame flag condition
      net/ipn3ke: fix jumbo frame flag condition for MTU set
      net/octeontx: fix jumbo frame flag condition for MTU set
      net/octeontx2: fix jumbo frame flag condition for MTU
      net/qede: fix jumbo frame flag condition for MTU set
      net/sfc: fix jumbo frame flag condition for MTU set
      net/thunderx: fix jumbo frame flag condition for MTU set
      net/ixgbe: fix jumbo frame flag condition
      net/cxgbe: fix jumbo frame flag condition
      net/axgbe: fix jumbo frame flag condition for MTU set
      net/enetc: fix jumbo frame flag condition for MTU set
      net/hinic: fix jumbo frame flag condition for MTU set
      net/nfp: fix jumbo frame flag condition for MTU set
      net/liquidio: fix jumbo frame flag condition for MTU set
      app/testpmd: fix setting maximum packet length

Suanming Mou (5):
      net/mlx5: fix shared RSS and mark actions combination
      net/mlx5: fix multi-process port ID
      net/mlx5: fix crash on secondary process port close
      net/mlx5: fix port attach in secondary process
      net/mlx4: fix port attach in secondary process

Sunil Kumar Kori (2):
      net/octeontx2: fix corruption in segments list
      net/octeontx: fix max Rx packet length

Tal Shnaiderman (5):
      bus/pci: ignore missing NUMA node on Windows
      net/mlx5: fix constant array size
      net/mlx5: fix device name size on Windows
      net/mlx5: fix comparison sign in flow engine
      common/mlx5: fix pointer cast on Windows

Thomas Monjalon (3):
      doc: fix figure numbering in graph guide
      lib: fix doxygen for parameters of function pointers
      ethdev: fix close failure handling

Timothy McDaniel (1):
      event/dlb: fix accessing uninitialized variables

Ting Xu (1):
      net/iavf: fix memory leak in large VF

Tyler Retzlaff (2):
      bus/pci: fix build with Windows SDK >= 10.0.20253
      eal/windows: fix C++ compatibility

Viacheslav Galaktionov (1):
      net/sfc: fix generic byte statistics to exclude FCS bytes

Viacheslav Ovsiienko (8):
      net/mlx5: fix Verbs memory allocation callback
      net/mlx5: fix buffer split offload advertising
      doc: update flow mark action in mlx5 guide
      net/mlx5: fix wire vport hint
      app/testpmd: fix queue reconfig request on Rx split update
      doc: fix supported feature table in mlx5 guide
      doc: fix mark action zero value in mlx5 guide
      net/mlx5: fix Tx queue size created with DevX

Vladimir Medvedkin (2):
      rib: fix insertion in some cases
      crypto/qat: fix access to uninitialized variable

Weifeng Li (1):
      net/i40e: fix X722 for 802.1ad frames ability

Wenjun Wu (1):
      net/e1000: fix flow control mode setting

Wisam Jaddo (1):
      app/flow-perf: simplify objects initialization

Xuan Ding (1):
      net/iavf: fix symmetric flow rule creation

Yicai Lu (1):
      ip_frag: remove padding length of fragment

Yongxin Liu (1):
      usertools: fix binding built-in kernel driver

Yunjian Wang (3):
      eal/linux: fix handling of error events from epoll
      net/bnxt: fix memory leak when mapping fails
      net/mvneta: check allocation in Rx queue flush

Yuri Chipchev (1):
      net/mvpp2: fix stack corruption

^ permalink raw reply	[relevance 1%]

* Re: [dpdk-dev] [PATCH 0/7] Introduce event vectorization
  2021-02-20 22:09  3% [dpdk-dev] [PATCH 0/7] Introduce event vectorization pbhagavatula
  2021-02-20 22:09  5% ` [dpdk-dev] [PATCH 7/7] eventdev: fix ABI breakage due to event vector pbhagavatula
@ 2021-03-08 16:41  0% ` Jerin Jacob
  2021-03-16 15:48  4% ` [dpdk-dev] [PATCH v2 0/8] " pbhagavatula
  2 siblings, 0 replies; 200+ results
From: Jerin Jacob @ 2021-03-08 16:41 UTC (permalink / raw)
  To: Pavan Nikhilesh
  Cc: Jerin Jacob, Jayatheerthan, Jay, Erik Gabriel Carrillo, Gujjar,
	Abhinandan S, McDaniel, Timothy, Hemant Agrawal, Van Haaren,
	Harry, Mattias Rönnblom, Liang Ma, dpdk-dev

On Sun, Feb 21, 2021 at 3:40 AM <pbhagavatula@marvell.com> wrote:
>
> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
>
> In traditional event programming model, events are identified by a
> flow-id and a uintptr_t. The flow-id uniquely identifies a given event
> and determines the order of scheduling based on schedule type, the
> uintptr_t holds a single object.
>
> Event devices also support burst mode with configurable dequeue depth,
> i.e. each dequeue call would return multiple events and each event
> might be at a different stage of the pipeline.
> Having a burst of events belonging to different stages in a dequeue
> burst is not only difficult to vectorize but also increases the scheduler
> overhead and application overhead of pipelining events further.
> Using event vectors we see a performance gain of ~150% as shown in [1].

Since it is from  4.72 to 34.383, it is 628%.

We had an internal review of this series before it is posting to ML.
So my comments will be limited on this series.

Is anyone planning to review this patch series or any objection to
introducing this feature?
CC list already has all eventdev stakeholders.



>
> By introducing event vectorization, each event will be capable of holding
> multiple uintptr_t of the same flow thereby allowing applications
> to vectorize their pipeline and reduce the complexity of pipelining
> events across multiple stages. This also reduces the complexity of handling
> enqueue and dequeue on an event device.
>
> Since event devices are transparent to the events they are scheduling
> so the event producers such as eth_rx_adapter, crypto_adapter , etc..
> are responsible for vectorizing the buffers of the same flow into a single
> event.
>
> The series also breaks ABI in [2/7] patch which we fix in [7/7]. The patch
> [7/7] can be changed in the next major release i.e. v21.11.
>
> The dpdk-test-eventdev application has been updated with options to test
> multiple vector sizes and timeouts.
>
> [1]
> As for performance improvement, with a ARM Cortex-A72 equivalent processer,
> software event device (--vdev=event_sw0), single worker core, single stage
> and using one service core for Rx adapter, Tx adapter, Scheduling.
>
> Without event vectorization:
>     ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
>          --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
>          --stlist=a --wlcores=20
>     Port[0] using Rx adapter[0] configured
>     Port[0] using Tx adapter[0] Configured
>     4.728 mpps avg 4.728 mpps
>
> With event vectorization:
>     ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
>         --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
>         --stlist=a --wlcores=20 --enable_vector --nb_eth_queues 1
>         --vector_size 256
>     Port[0] using Rx adapter[0] configured
>     Port[0] using Tx adapter[0] Configured
>     34.383 mpps avg 34.383 mpps
>
> Having dedicated service cores for each Rx queues and tweaking the vector,
> dequeue burst size would further improve performance.
>
> API usage is shown below:
>
> Configuration:
>
>         struct rte_event_eth_rx_adapter_event_vector_config vec_conf;
>
>         vector_pool = rte_event_vector_pool_create("vector_pool",
>                         nb_elem, 0, vector_size, socket_id);
>
>         rte_event_eth_rx_adapter_create(id, event_id, &adptr_conf);
>         rte_event_eth_rx_adapter_queue_add(id, eth_id, -1, &queue_conf);
>         if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR) {
>                 vec_conf.vector_sz = vector_size;
>                 vec_conf.vector_timeout_ns = vector_tmo_nsec;
>                 vec_conf.vector_mp = vector_pool;
>                 rte_event_eth_rx_adapter_queue_event_vector_config(id,
>                                 eth_id, -1, &vec_conf);
>         }
>
> Fastpath:
>
>         num = rte_event_dequeue_burst(event_id, port_id, &ev, 1, 0);
>         if (!num)
>                 continue;
>
>         if (ev.event_type & RTE_EVENT_TYPE_VECTOR) {
>                 switch (ev.event_type) {
>                 case RTE_EVENT_TYPE_ETHDEV_VECTOR:
>                 case RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR:
>                         struct rte_mbuf **mbufs;
>
>                         mbufs = ev.vector_ev->mbufs;
>                         for (i = 0; i < ev.vector_ev->nb_elem; i++)
>                                 //Process mbufs.
>                         break;
>                 case ...
>                 }
>         }
>         ...
>
> Pavan Nikhilesh (7):
>   eventdev: introduce event vector capability
>   eventdev: introduce event vector Rx capability
>   eventdev: introduce event vector Tx capability
>   eventdev: add Rx adapter event vector support
>   eventdev: add Tx adapter event vector support
>   app/eventdev: add event vector mode in pipeline test
>   eventdev: fix ABI breakage due to event vector
>
>  app/test-eventdev/evt_common.h                |   4 +
>  app/test-eventdev/evt_options.c               |  52 +++
>  app/test-eventdev/evt_options.h               |   4 +
>  app/test-eventdev/test_pipeline_atq.c         | 310 +++++++++++++--
>  app/test-eventdev/test_pipeline_common.c      |  77 +++-
>  app/test-eventdev/test_pipeline_common.h      |  18 +
>  app/test-eventdev/test_pipeline_queue.c       | 320 +++++++++++++--
>  .../prog_guide/event_ethernet_rx_adapter.rst  |  38 ++
>  .../prog_guide/event_ethernet_tx_adapter.rst  |  12 +
>  doc/guides/prog_guide/eventdev.rst            |  36 +-
>  doc/guides/tools/testeventdev.rst             |  28 ++
>  lib/librte_eventdev/eventdev_pmd.h            |  60 ++-
>  .../rte_event_eth_rx_adapter.c                | 367 +++++++++++++++++-
>  .../rte_event_eth_rx_adapter.h                |  93 +++++
>  .../rte_event_eth_tx_adapter.c                |  66 +++-
>  lib/librte_eventdev/rte_eventdev.c            |  11 +-
>  lib/librte_eventdev/rte_eventdev.h            | 145 ++++++-
>  lib/librte_eventdev/version.map               |   5 +
>  18 files changed, 1560 insertions(+), 86 deletions(-)
>
> --
> 2.17.1
>

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [RFC] ethdev: add sanity packet checks
  2021-03-04 10:46  3%     ` Thomas Monjalon
@ 2021-03-07 18:46  3%       ` Ori Kam
  2021-03-08 23:05  0%         ` Ajit Khaparde
  0 siblings, 1 reply; 200+ results
From: Ori Kam @ 2021-03-07 18:46 UTC (permalink / raw)
  To: NBU-Contact-Thomas Monjalon
  Cc: Slava Ovsiienko, ferruh.yigit, Andrew Rybchenko, dev,
	ajit.khaparde, jerinj, Ori Kam

Hi

> -----Original Message-----
> From: Thomas Monjalon <thomas@monjalon.net>
> Sent: Thursday, March 4, 2021 12:46 PM
> Subject: Re: [dpdk-dev] [RFC] ethdev: add sanity packet checks
> 
> 04/03/2021 11:00, Ori Kam:
> > From: Thomas Monjalon
> > > 28/02/2021 20:48, Ori Kam:
> > > > Currently, DPDK application can offload the checksum check,
> > > > and report it in the mbuf.
> > > >
> > > > However, this approach doesn't work if the traffic
> > > > is offloaded and should not arrive to the application.
> > > >
> > > > This commit introduces rte flow item that enables
> > >
> > > s/rte flow/rte_flow/
> > >
> >
> > Sure
> >
> > > > matching on the checksum of the L3 and L4 layers,
> > > > in addition to other checks that can determine if
> > > > the packet is valid.
> > > > some of those tests can be packet len, data len,
> > > > unsupported flags, and so on.
> > > >
> > > > The full check is HW dependent.
> > >
> > > What is the "full check"?
> > > How much it is HW dependent?
> > >
> >
> > This also relates to your other comments,
> > Each HW may run different set of checks on the packet,
> > for example one PMD can just check the tcp flags while
> > a different PMD will also check the option.
> 
> I'm not sure how an application can rely on
> such a vague definition.
> 
Even now we are marking a packet in the mbuf with unknown 
in case of some error.
Would a better wording be " The HW detected errors in the packet"
in any case if the app will need to know what is the error it is his
responsibility, this item is just verification for fast path.
If you have better suggestion, I will be very happy to hear.

> 
> > > > + * RTE_FLOW_ITEM_TYPE_SANITY_CHECKS
> > > > + *
> > > > + * Enable matching on packet validity based on HW checks for the L3 and
> L4
> > > > + * layers.
> > > > + */
> > > > +struct rte_flow_item_sanity_checks {
> > > > +	uint32_t level;
> > > > +	/**< Packet encapsulation level the item should apply to.
> > > > +	 * @see rte_flow_action_rss
> > > > +	 */
> > > > +RTE_STD_C11
> > > > +	union {
> > > > +		struct {
> > >
> > > Why there is no L2 check?
> > >
> > Our HW doesn't support it.
> > If other HW support it, it should be added.
> 
> It would be an ABI breakage. Can we add it day one?
> 
Will add reserve, since this is bit field there shouldn't be any
ABI break.

> > > > +			uint32_t l3_ok:1;
> > > > +			/**< L3 layer is valid after passing all HW checking. */
> > > > +			uint32_t l4_ok:1;
> > > > +			/**< L4 layer is valid after passing all HW checking. */
> > >
> > > l3_ok and l4_ok looks vague.
> > > What does it cover exactly?
> > >
> > It depends on the HW in question.
> > In our case it checks in case of L3
> > the header len, and the version.
> > For L4 checking the len.
> 
> If we don't know exactly what is checked,
> how an application can rely on it?
> Is it a best effort check? What is the use case?
> 
From application point of view that packet is invalid.
it is the app responsibility to understand why.
You can think about it that in any case there might be
different counters for different errors or different actions.
For example, the app can decide that incorrect ipv4 version
should result in packet drop, while incorrect len
may pass.

Maybe we can list all possible error result, but I'm worried
that we may not cover all of them. On some HW there is just one 
bit that marks if the packet is valid or not.

> 
> > > > +			uint32_t l3_ok_csum:1;
> > > > +			/**< L3 layer checksum is valid. */
> > > > +			uint32_t l4_ok_csum:1;
> > > > +			/**< L4 layer checksum is valid. */
> 
> What worries me is that the checksum is separate but other checks
> are in a common bucket.
> I think we should have one field per precise check
> with a way to report what is checked.
> 
Pleas see above comment, Current HW doesn't support
such fine grain detection, so adding bit will force the user
to select all of them, in addition since the HW has some internal 
checks it is possible that the reject reason will be un related to the
L3, for example some HW may not support more then two vlans
so in case of 3 vlans may report bad L3.

Best,
Ori,


^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v4 4/4] eal/windows: do not expose POSIX symbols
  @ 2021-03-06  0:05  3%       ` Dmitry Kozlyuk
  0 siblings, 0 replies; 200+ results
From: Dmitry Kozlyuk @ 2021-03-06  0:05 UTC (permalink / raw)
  To: dev
  Cc: Nick Connolly, Khoa To, Dmitry Kozlyuk, Olivier Matz,
	Narcisa Ana Maria Vasile, Dmitry Malloy, Pallavi Kadam

Exposing POSIX symbols could break consumer POSIX compatibility code.
Export POSIX names for commonly used symbols only to internal consumers.
Move definitions used only by EAL inside EAL.
Replace deprecated [r]index() with standard str[r]chr().

Signed-off-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
---
 doc/guides/rel_notes/release_21_05.rst     |   3 +
 lib/librte_cmdline/cmdline.c               |   4 -
 lib/librte_cmdline/cmdline_socket.c        |   4 -
 lib/librte_eal/common/eal_common_errno.c   |   4 +
 lib/librte_eal/common/eal_common_options.c |   2 +-
 lib/librte_eal/windows/include/rte_os.h    | 103 ++++-----------------
 6 files changed, 27 insertions(+), 93 deletions(-)

diff --git a/doc/guides/rel_notes/release_21_05.rst b/doc/guides/rel_notes/release_21_05.rst
index 5aa9ed7db..f606186ec 100644
--- a/doc/guides/rel_notes/release_21_05.rst
+++ b/doc/guides/rel_notes/release_21_05.rst
@@ -84,6 +84,9 @@ API Changes
    Also, make sure to start the actual text at the margin.
    =======================================================
 
+* eal/windows: Removed POSIX symbol export from ``<rte_os.h>``.
+  It has been incorrect and could conflict with consumer POSIX implementations.
+
 
 ABI Changes
 -----------
diff --git a/lib/librte_cmdline/cmdline.c b/lib/librte_cmdline/cmdline.c
index 79ea5f98c..49770869b 100644
--- a/lib/librte_cmdline/cmdline.c
+++ b/lib/librte_cmdline/cmdline.c
@@ -18,10 +18,6 @@
 
 #include "cmdline_private.h"
 
-#ifdef RTE_EXEC_ENV_WINDOWS
-#define write _write
-#endif
-
 static void
 cmdline_valid_buffer(struct rdline *rdl, const char *buf,
 		     __rte_unused unsigned int size)
diff --git a/lib/librte_cmdline/cmdline_socket.c b/lib/librte_cmdline/cmdline_socket.c
index 0fe149700..998e8ade2 100644
--- a/lib/librte_cmdline/cmdline_socket.c
+++ b/lib/librte_cmdline/cmdline_socket.c
@@ -16,10 +16,6 @@
 #include "cmdline_private.h"
 #include "cmdline_socket.h"
 
-#ifdef RTE_EXEC_ENV_WINDOWS
-#define open _open
-#endif
-
 struct cmdline *
 cmdline_file_new(cmdline_parse_ctx_t *ctx, const char *prompt, const char *path)
 {
diff --git a/lib/librte_eal/common/eal_common_errno.c b/lib/librte_eal/common/eal_common_errno.c
index 2a10fb823..f86802705 100644
--- a/lib/librte_eal/common/eal_common_errno.c
+++ b/lib/librte_eal/common/eal_common_errno.c
@@ -15,6 +15,10 @@
 #include <rte_errno.h>
 #include <rte_string_fns.h>
 
+#ifdef RTE_EXEC_ENV_WINDOWS
+#define strerror_r(errnum, buf, buflen) strerror_s(buf, buflen, errnum)
+#endif
+
 RTE_DEFINE_PER_LCORE(int, _rte_errno);
 
 const char *
diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c
index 230bac9f3..6d4d6ff19 100644
--- a/lib/librte_eal/common/eal_common_options.c
+++ b/lib/librte_eal/common/eal_common_options.c
@@ -1936,7 +1936,7 @@ eal_check_common_options(struct internal_config *internal_cfg)
 		RTE_LOG(ERR, EAL, "Invalid length of --" OPT_MBUF_POOL_OPS_NAME" option\n");
 		return -1;
 	}
-	if (index(eal_get_hugefile_prefix(), '%') != NULL) {
+	if (strchr(eal_get_hugefile_prefix(), '%') != NULL) {
 		RTE_LOG(ERR, EAL, "Invalid char, '%%', in --"OPT_FILE_PREFIX" "
 			"option\n");
 		return -1;
diff --git a/lib/librte_eal/windows/include/rte_os.h b/lib/librte_eal/windows/include/rte_os.h
index 7ef38ff06..d97e07890 100644
--- a/lib/librte_eal/windows/include/rte_os.h
+++ b/lib/librte_eal/windows/include/rte_os.h
@@ -11,7 +11,6 @@
  * Windows OS. It must not include Windows-specific headers.
  */
 
-#include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -20,100 +19,36 @@
 extern "C" {
 #endif
 
-/* limits.h replacement, value as in <windows.h> */
-#ifndef PATH_MAX
-#define PATH_MAX _MAX_PATH
-#endif
-
-#ifndef sleep
-#define sleep(x) Sleep(1000 * (x))
-#endif
-
-#ifndef strerror_r
-#define strerror_r(a, b, c) strerror_s(b, c, a)
-#endif
-
-#ifndef strdup
-/* strdup is deprecated in Microsoft libc and _strdup is preferred */
-#define strdup(str) _strdup(str)
-#endif
-
-#ifndef strtok_r
-#define strtok_r(str, delim, saveptr) strtok_s(str, delim, saveptr)
-#endif
-
-#ifndef index
-#define index(a, b)     strchr(a, b)
-#endif
-
-#ifndef rindex
-#define rindex(a, b)    strrchr(a, b)
-#endif
-
-#ifndef strncasecmp
-#define strncasecmp(s1, s2, count)        _strnicmp(s1, s2, count)
-#endif
-
-#ifndef close
-#define close _close
-#endif
-
-#ifndef unlink
-#define unlink _unlink
-#endif
-
 /* cpu_set macros implementation */
 #define RTE_CPU_AND(dst, src1, src2) CPU_AND(dst, src1, src2)
 #define RTE_CPU_OR(dst, src1, src2) CPU_OR(dst, src1, src2)
 #define RTE_CPU_FILL(set) CPU_FILL(set)
 #define RTE_CPU_NOT(dst, src) CPU_NOT(dst, src)
 
-/* as in <windows.h> */
-typedef long long ssize_t;
-
-#ifndef RTE_TOOLCHAIN_GCC
-
-static inline int
-asprintf(char **buffer, const char *format, ...)
-{
-	int size, ret;
-	va_list arg;
-
-	va_start(arg, format);
-	size = vsnprintf(NULL, 0, format, arg);
-	va_end(arg);
-	if (size < 0)
-		return -1;
-	size++;
+/* Allow DPDK to call common functions by POSIX names. */
+#ifdef RTE_BUILD_INTERNAL
 
-	*buffer = (char *)malloc(size);
-	if (*buffer == NULL)
-		return -1;
-
-	va_start(arg, format);
-	ret = vsnprintf(*buffer, size, format, arg);
-	va_end(arg);
-	if (ret != size - 1) {
-		free(*buffer);
-		return -1;
-	}
-	return ret;
-}
+#ifndef PATH_MAX
+#define PATH_MAX _MAX_PATH
+#endif
 
-static inline const char *
-eal_strerror(int code)
-{
-	static char buffer[128];
+#define strdup(str) _strdup(str)
+#define strtok_r(str, delim, saveptr) strtok_s(str, delim, saveptr)
+#define strncasecmp(s1, s2, count) _strnicmp(s1, s2, count)
 
-	strerror_s(buffer, sizeof(buffer), code);
-	return buffer;
-}
+#define open(path, flags, ...) _open(path, flags, ##__VA_ARGS__)
+#define read(fd, buf, n) _read(fd, buf, n)
+#define write(fd, buf, n) _write(fd, buf, n)
+#define close(fd) _close(fd)
+#define unlink(path) _unlink(path)
 
-#ifndef strerror
-#define strerror eal_strerror
-#endif
+#endif /* RTE_BUILD_INTERNAL */
 
-#endif /* RTE_TOOLCHAIN_GCC */
+/* This is an exception without "rte_" prefix, because Windows does have
+ * ssize_t, but it's defined in <windows.h> which we avoid to expose.
+ * If ssize_t is defined in user code, it necessarily has the same type.
+ */
+typedef long long ssize_t;
 
 #ifdef __cplusplus
 }
-- 
2.29.2


^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [RFC v4 1/4] ethdev: add meter PPS profile
  2021-03-04  6:34  0%                   ` Matan Azrad
@ 2021-03-05 18:44  0%                     ` Dumitrescu, Cristian
  0 siblings, 0 replies; 200+ results
From: Dumitrescu, Cristian @ 2021-03-05 18:44 UTC (permalink / raw)
  To: Matan Azrad, Li Zhang, Dekel Peled, Ori Kam, Slava Ovsiienko
  Cc: dev, NBU-Contact-Thomas Monjalon, Raslan Darawsheh, mb,
	ajit.khaparde, Yigit, Ferruh, Singh, Jasvinder



> -----Original Message-----
> From: Matan Azrad <matan@nvidia.com>
> Sent: Thursday, March 4, 2021 6:34 AM
> To: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>; Li Zhang
> <lizh@nvidia.com>; Dekel Peled <dekelp@nvidia.com>; Ori Kam
> <orika@nvidia.com>; Slava Ovsiienko <viacheslavo@nvidia.com>
> Cc: dev@dpdk.org; NBU-Contact-Thomas Monjalon
> <thomas@monjalon.net>; Raslan Darawsheh <rasland@nvidia.com>;
> mb@smartsharesystems.com; ajit.khaparde@broadcom.com; Yigit, Ferruh
> <ferruh.yigit@intel.com>; Singh, Jasvinder <jasvinder.singh@intel.com>
> Subject: RE: [dpdk-dev] [RFC v4 1/4] ethdev: add meter PPS profile
> 
> Hi Cristian
> 
> From: Dumitrescu, Cristian
> > Hi Matan,
> >
> > > -----Original Message-----
> > > From: Matan Azrad <matan@nvidia.com>
> > > Sent: Tuesday, March 2, 2021 6:10 PM
> > > To: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>; Li Zhang
> > > <lizh@nvidia.com>; Dekel Peled <dekelp@nvidia.com>; Ori Kam
> > > <orika@nvidia.com>; Slava Ovsiienko <viacheslavo@nvidia.com>
> > > Cc: dev@dpdk.org; NBU-Contact-Thomas Monjalon
> <thomas@monjalon.net>;
> > > Raslan Darawsheh <rasland@nvidia.com>; mb@smartsharesystems.com;
> > > ajit.khaparde@broadcom.com; Yigit, Ferruh <ferruh.yigit@intel.com>;
> > > Singh, Jasvinder <jasvinder.singh@intel.com>
> > > Subject: RE: [dpdk-dev] [RFC v4 1/4] ethdev: add meter PPS profile
> > >
> > > Hi Cristian
> > >
> > > Good discussion, thank you for that!
> > >
> > > From: Dumitrescu, Cristian
> > > > Hi Matan,
> > > >
> > > > > -----Original Message-----
> > > > > From: Matan Azrad <matan@nvidia.com>
> > > > > Sent: Tuesday, March 2, 2021 12:37 PM
> > > > > To: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>; Li Zhang
> > > > > <lizh@nvidia.com>; Dekel Peled <dekelp@nvidia.com>; Ori Kam
> > > > > <orika@nvidia.com>; Slava Ovsiienko <viacheslavo@nvidia.com>
> > > > > Cc: dev@dpdk.org; NBU-Contact-Thomas Monjalon
> > > <thomas@monjalon.net>;
> > > > > Raslan Darawsheh <rasland@nvidia.com>;
> mb@smartsharesystems.com;
> > > > > ajit.khaparde@broadcom.com; Yigit, Ferruh
> > > > > <ferruh.yigit@intel.com>; Singh, Jasvinder
> > > > > <jasvinder.singh@intel.com>
> > > > > Subject: RE: [dpdk-dev] [RFC v4 1/4] ethdev: add meter PPS profile
> > > > >
> > > > > HI Cristian
> > > > >
> > > > > From: Dumitrescu, Cristian
> > > > > > Hi Matan,
> > > > > >
> > > > > > > -----Original Message-----
> > > > > > > From: Matan Azrad <matan@nvidia.com>
> > > > > > > Sent: Tuesday, March 2, 2021 7:02 AM
> > > > > > > To: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>; Li
> > > > > > > Zhang <lizh@nvidia.com>; Dekel Peled <dekelp@nvidia.com>; Ori
> > > > > > > Kam <orika@nvidia.com>; Slava Ovsiienko
> > > > > > > <viacheslavo@nvidia.com>
> > > > > > > Cc: dev@dpdk.org; NBU-Contact-Thomas Monjalon
> > > > > <thomas@monjalon.net>;
> > > > > > > Raslan Darawsheh <rasland@nvidia.com>;
> > > mb@smartsharesystems.com;
> > > > > > > ajit.khaparde@broadcom.com; Yigit, Ferruh
> > > > > > > <ferruh.yigit@intel.com>; Singh, Jasvinder
> > > > > > > <jasvinder.singh@intel.com>
> > > > > > > Subject: RE: [dpdk-dev] [RFC v4 1/4] ethdev: add meter PPS
> > > > > > > profile
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > Hi Cristian
> > > > > > >
> > > > > > > Thank you for review, please see inline.
> > > > > > >
> > > > > > > From: Dumitrescu, Cristian
> > > > > > > > > From: dev <dev-bounces@dpdk.org> On Behalf Of Li Zhang
> > > > > > > <snip>
> > > > > > > > We had this same problem earlier for the rte_tm.h API, where
> > > > > > > > people
> > > > > > > asked to
> > > > > > > > add support for WRED and shaper rates specified in packets
> > > > > > > > to the existing
> > > > > > > byte
> > > > > > > > rate support. I am more than happy to support adding the
> > > > > > > > same here, but please let's adopt the same solution here
> > > > > > > > rather than invent a different approach.
> > > > > > > >
> > > > > > > > Please refer to struct rte_tm_wred_params and struct
> > > > > > > rte_tm_shaper_params
> > > > > > > > from rte_tm.h: the packets vs. bytes mode is explicitly
> > > > > > > > specified through
> > > > > > > the use
> > > > > > > > of a flag called packet_mode that is added to the WRED and
> > > > > > > > shaper
> > > > > profile.
> > > > > > > > When packet_mode is 0, the profile rates and bucket sizes
> > > > > > > > are specified in bytes per second and bytes, respectively;
> > > > > > > > when packet_mode is not 0, the profile rates and bucket
> > > > > > > > sizes are specified in packets and packets per
> > > > > > > second,
> > > > > > > > respectively. The same profile parameters are used, no need
> > > > > > > > to invent additional algorithms (such as srTCM - packet
> > > > > > > > mode) or profile data
> > > > > > > structures.
> > > > > > > > Can we do the same here, please?
> > > > > > >
> > > > > > > This flag approach is very intuitive suggestion and it has
> advantages.
> > > > > > >
> > > > > > > The main problem with the flag approach is that it breaks ABI and
> API.
> > > > > > > The profile structure size is changed due to a new field - ABI
> > > breakage.
> > > > > > > The user must initialize the flag with zero to get old
> > > > > > > behavior - API
> > > > > breakage.
> > > > > > >
> > > > > >
> > > > > > The rte_mtr API is experimental, all the API functions are
> > > > > > correctly marked with __rte_experimental in rte_mtr.h file, so
> > > > > > we can safely change the API
> > > > > and
> > > > > > the ABI breakage is not applicable here. Therefore, this problem
> > > > > > does not
> > > > > exist,
> > > > > > correct?
> > > > >
> > > > > Yes, but still meter is not new API and I know that a lot of user
> > > > > uses it for a long time.
> > > > > Forcing them to change while we have good solution that don't
> > > > > force it, looks me problematic.
> > > > >
> > > >
> > > > Not really, only 3 drivers are currently implementing this API.
> > >
> > > The user is not the PMD, the PMDs are the providers.
> > > I'm talking about all our customers, all the current DPDK based
> > > applications like OVS and others (I familiar with at least 4 ConnectX
> > > customer applications) which use the meter API and I'm sure there are
> more
> > around the world.
> > >
> > > > Even to these drivers, the required changes are none or extremely
> small:
> > > as Ajit
> > > > was also noting, as the default value of 0 continues to represent
> > > > the
> > > existing
> > > > byte mode, all you have to do is make sure the new flag is set to
> > > > zero in the profile params structure, which is already done
> > > > implicitly in most places as
> > > this
> > > > structure is initialized to all-zeros.
> > >
> > > Are you sure all the world initialize the struct to 0? and also in
> > > this case, without new compilation, not all the struct will be
> > > zeroes(the old size is smaller).
> > >
> > > > A simple search exercise for struct rte_mtr_meter_profile is all
> > > > that is
> > > needed.
> > > > You also agreed the flag approach is very intuitive, hence better
> > > > and nicer,
> > > with
> > > > no additional work needed for you, so why not do it?
> > >
> > > Do you understand that any current application that use the meter API
> > > must recompile the code of the application? Part of them also probably
> > > need to set the flag to 0....
> > > Do you understand also the potential issues for the applications which
> > > are not aware to the change? Debug time, etc....
> > >
> > > > > > > I don't see issues with Li suggestion, Do you think Li
> > > > > > > suggestion has critical issues?
> > > > > >
> > > > > > It is probably better to keep the rte_mtr and the rte_tm APIs
> > > > > > aligned, it simplifies the code maintenance and improves the
> > > > > > user experience, which always pays off in the long run. Both
> > > > > > APIs configure token buckets in either packet mode or byte mode,
> > > > > > and it is desirable to have them work in the
> > > > > same
> > > > > > way. Also, I think we should avoid duplicating configuration
> > > > > > data structures
> > > > > for
> > > > > > to support essentially the same algorithms (such as srTCM or
> > > > > > trTCM) if we
> > > > > can.
> > > > > >
> > > > >
> > > > > Yes, but I don't think this motivation is critical.
> > > >
> > > > I really disagree. As API maintainer, making every effort to keep
> > > > the APIs
> > > clear
> > > > and consistent is a critical task for me.
> > >
> > > New pps profile is also clear and simple.
> > >
> > > > We don't want to proliferate the API data structures and parameters
> > > > if there is a good way to avoid it. Especially
> > > in
> > > > cases like this, when the drivers are just beginning to pick up this
> > > > (still
> > > > experimental) API,  we have the rare chance to make things right and
> > > therefore
> > > > we should do it. Please also keep in mind that, as more feature are
> > > > added
> > > to
> > > > the API, small corner cuts like this one that might not look like a
> > > > big deal
> > > now,
> > > > eventually come back as unnecessary complexity in the drivers
> themselves.
> > >
> > > I don't see a complexity in the current suggestion.
> > >
> > > > So, please, let's try to keep the quality of the APIs high.
> > >
> > > Also by this way is high.
> > >
> > >
> > > Look, the flag approach is also good and makes the job.
> > > The two approaches are clear, simple and in high quality.
> > > I don't care which one from the 2 to take but I want to be sure we are
> > > all understand the pros and cons.
> > >
> > > If you understand my concern on flag approach and still insist to take
> > > the flag approach we will align.
> >
> > Yes, thanks for summarizing the pros and cons, I confirm that I do
> understand
> > your concerns.
> >
> > Yes, sorry to disappoint you, I still think the packet_mode based approach
> is
> > better for the long run, as it keeps the APIs clean and consistent. We are
> not
> > adding new algorithms here, we're just adding a new mode to an existing
> > algorithm, so IMO we should not duplicate configuration data structures
> and
> > proliferate the number of algorithms artificially.
> 
> Actually, PPS meter is a new algorithm - you can see that current algorithms
> RFCs don't talk about PPS.
> 

Yes, I know, I implemented it in librte_meter, but still, it is the same algorithm with just a different measurement unit (packet instead of byte), that's why many people (and you included :) ) still refer to it as srTCM  - RFC 2697.

> > Yes, I do realize that in some limited cases the users will have to explicitly
> set
> > the new packet_mode flag to zero or one, in case they need to enable the
> > packet mode, but I think this is an acceptable cost because: (A) This API is
> > clearly marked as experimental; (B) It is better to take a small incremental
> hit
> > now to keep the APIs in good order rather than taking a bit hit in a few
> years as
> > more features are added in the wrong way and the APIs become
> > unmanageable.
> 
> I don't think that the current suggestion is in wrong way.
> In any case, you insist, we will align.
> 

Thank you.

> > > And if we so, and we are going to break the API\ABI, we are going to
> > > introduce new meter policy API soon and there, breaking API can help,
> > > lets see in other discussion later.
> > >
> >
> > Yes, as you point out API changes are unavoidable as new features are
> added,
> > we have to manage the API evolution correctly.
> >
> > > One more point:
> > > Currently, the meter_id is managed by the user, I think it is better
> > > to let the PMDs to manage the meter_id.
> > >
> > > Searching the PMD meter handler inside the PMD is very expensive for
> > > the API call rate when the meter_id is managed by the user.
> > >
> > > Same for profile_id.
> > >
> > > Also all the rte_flow API including the shared action API taking the
> > > PMD management approach.
> > >
> > > What do you think?
> > >
> >
> > Yes, we have carefully considered and discussed both approaches a few
> years
> > back when the API was introduced, this is not done by accident :), there are
> > pros and cons for each of them.
> >
> > If the object IDs are generated by the driver (outputs of the API), then it is
> the
> > user application that needs to keep track of them, which can be very
> painful.
> > Basically, for each API object the user application needs to create its own
> > wrapper to store this ID. We basically transfer this problem to the user app.
> 
> No exactly\not for all, the app gets the meter_id in the same time it decides
> it now.
> 
> > If the object IDs are generated by the user application (inputs into the API),
> > then we simplify the application by removing and indirection layer. Yes, it is
> > true that this indirection layer now moves into the driver, but we should try
> to
> > make the life easier for the appl developers as opposed to us, the driver
> > developers. This indirection layer in the driver can be made a bit smarter
> than
> > just a slow "for" loop; the search operation can be made faster with a small
> bit
> > of effort, such as keeping this list sorted based on the object ID, splitting
> this list
> > into buckets (similar to a hash table), etc, right?
> 
> Yes, there are even better solution than hash table from "rate" perspective.
> 

I'd be very interested to hear your proposals here.

> But any solution costs a lot of memory just for this mapping...
> When we talked about 4M meters supported(in mlx5 next release) it
> becomes an issue.
> 

I thought your concern was about the speed/rate of API calls, you are saying it is not speed but memory footprint??

I would imagine that a system that enables all the 4M meters is a big beast with the most powerful CPU on the planet and many dozens of gigabytes of RAM, so a few extra megabytes for some API layers is not a concern?

> > Having the user app provide the object ID is especially important in the case
> of
> > rte_tm API, where we have to deal with a tree of nodes, with thousands of
> > nodes for each level. Having the app to store and manages this tree of IDs
> is a
> > really bad idea, as the user app needs to mirror the tree of nodes on its
> side for
> > no real benefit. As an added benefit, the user can generate these IDs using
> a
> > rule, such as: given the specific path through the tree, the value of the ID
> can
> > be computed.
> 
> rte_tm is not rte_mtr - I think meter is different and used differently.
> For example, as I know, no one from our dpdk meter customers(at least 5)
> use TREEs for meter management. OVS, for example, just randomize some
> meter_id and don't care about it.
> 

What kinds of trees? I'd be very interested to hear some proposals to make this handle mapping faster.

> Also, all the rte_flow API basics works with PMD ID\handle management
> approach.
> 

Yes, I am not saying it is wrong, none of the approaches is wrong IMO.

> > But again, as you also mention above, there is a list of pros and cons for
> every
> > approach, no approach is perfect. We took this approach for the good
> reasons
> > listed above.
> 
> If you familiar with TREE usage with meter, maybe we can combined easily
> the two approaches in this topic,
> 
> meter_id argument can be by reference, if it 0 - PMD set it, if not PMD use it.
> 

It would be good if you could elaborate here a bit, just to make sure we are on the same page.

> > > > > > The flag proposal is actually reducing the amount of work that
> > > > > > you guys
> > > > > need to
> > > > > > do to implement your proposal. There is no negative impact to
> > > > > > your
> > > > > proposal
> > > > > > and no big change, right?
> > > > >
> > > > > Yes you right, but the implementation effect is not our concern.
> > > > >
> > > > >
> > > > > > > > This is a quick summary of the required API changes to add
> > > > > > > > support for the packet mode, they are minimal:
> > > > > > > > a) Introduce the packet_mode flag in the profile parameters
> > > > > > > > data
> > > > > > > structure.
> > > > > > > > b) Change the description (comment) of the rate and bucket
> > > > > > > > size
> > > > > > > parameters in
> > > > > > > > the meter profile parameters data structures to reflect that
> > > > > > > > their values represents either bytes or packets, depending
> > > > > > > > on the value of the new flag packet_mode from the same
> structure.
> > > > > > > > c) Add the relevant capabilities: just search for "packet"
> > > > > > > > in the rte_tm.h capabilities data structures and apply the
> > > > > > > > same to the rte_mtr.h
> > > > > > > capabilities,
> > > > > > > > when applicable.
> > > > > > >
> > > > > > > > Regards,
> > > > > > > > Cristian
> > > > > >
> > > > > > Regards,
> > > > > > Cristian
> > > >
> > > > Regards,
> > > > Cristian
> >
> > Regards,
> > Cristian

Regards,
Cristian

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [RFC] ethdev: add sanity packet checks
  @ 2021-03-04 10:46  3%     ` Thomas Monjalon
  2021-03-07 18:46  3%       ` Ori Kam
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2021-03-04 10:46 UTC (permalink / raw)
  To: Ori Kam
  Cc: Slava Ovsiienko, ferruh.yigit, Andrew Rybchenko, dev,
	ajit.khaparde, jerinj

04/03/2021 11:00, Ori Kam:
> From: Thomas Monjalon
> > 28/02/2021 20:48, Ori Kam:
> > > Currently, DPDK application can offload the checksum check,
> > > and report it in the mbuf.
> > >
> > > However, this approach doesn't work if the traffic
> > > is offloaded and should not arrive to the application.
> > >
> > > This commit introduces rte flow item that enables
> > 
> > s/rte flow/rte_flow/
> > 
> 
> Sure
> 
> > > matching on the checksum of the L3 and L4 layers,
> > > in addition to other checks that can determine if
> > > the packet is valid.
> > > some of those tests can be packet len, data len,
> > > unsupported flags, and so on.
> > >
> > > The full check is HW dependent.
> > 
> > What is the "full check"?
> > How much it is HW dependent?
> > 
> 
> This also relates to your other comments,
> Each HW may run different set of checks on the packet,
> for example one PMD can just check the tcp flags while
> a different PMD will also check the option.

I'm not sure how an application can rely on
such a vague definition.


> > > + * RTE_FLOW_ITEM_TYPE_SANITY_CHECKS
> > > + *
> > > + * Enable matching on packet validity based on HW checks for the L3 and L4
> > > + * layers.
> > > + */
> > > +struct rte_flow_item_sanity_checks {
> > > +	uint32_t level;
> > > +	/**< Packet encapsulation level the item should apply to.
> > > +	 * @see rte_flow_action_rss
> > > +	 */
> > > +RTE_STD_C11
> > > +	union {
> > > +		struct {
> > 
> > Why there is no L2 check?
> > 
> Our HW doesn't support it.
> If other HW support it, it should be added.

It would be an ABI breakage. Can we add it day one?

> > > +			uint32_t l3_ok:1;
> > > +			/**< L3 layer is valid after passing all HW checking. */
> > > +			uint32_t l4_ok:1;
> > > +			/**< L4 layer is valid after passing all HW checking. */
> > 
> > l3_ok and l4_ok looks vague.
> > What does it cover exactly?
> > 
> It depends on the HW in question.
> In our case it checks in case of L3
> the header len, and the version.
> For L4 checking the len.

If we don't know exactly what is checked,
how an application can rely on it?
Is it a best effort check? What is the use case?


> > > +			uint32_t l3_ok_csum:1;
> > > +			/**< L3 layer checksum is valid. */
> > > +			uint32_t l4_ok_csum:1;
> > > +			/**< L4 layer checksum is valid. */

What worries me is that the checksum is separate but other checks
are in a common bucket.
I think we should have one field per precise check
with a way to report what is checked.



^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [RFC v4 1/4] ethdev: add meter PPS profile
  2021-03-03 20:35  0%                 ` Dumitrescu, Cristian
@ 2021-03-04  6:34  0%                   ` Matan Azrad
  2021-03-05 18:44  0%                     ` Dumitrescu, Cristian
  0 siblings, 1 reply; 200+ results
From: Matan Azrad @ 2021-03-04  6:34 UTC (permalink / raw)
  To: Dumitrescu, Cristian, Li Zhang, Dekel Peled, Ori Kam, Slava Ovsiienko
  Cc: dev, NBU-Contact-Thomas Monjalon, Raslan Darawsheh, mb,
	ajit.khaparde, Yigit, Ferruh, Singh, Jasvinder

Hi Cristian

From: Dumitrescu, Cristian
> Hi Matan,
> 
> > -----Original Message-----
> > From: Matan Azrad <matan@nvidia.com>
> > Sent: Tuesday, March 2, 2021 6:10 PM
> > To: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>; Li Zhang
> > <lizh@nvidia.com>; Dekel Peled <dekelp@nvidia.com>; Ori Kam
> > <orika@nvidia.com>; Slava Ovsiienko <viacheslavo@nvidia.com>
> > Cc: dev@dpdk.org; NBU-Contact-Thomas Monjalon <thomas@monjalon.net>;
> > Raslan Darawsheh <rasland@nvidia.com>; mb@smartsharesystems.com;
> > ajit.khaparde@broadcom.com; Yigit, Ferruh <ferruh.yigit@intel.com>;
> > Singh, Jasvinder <jasvinder.singh@intel.com>
> > Subject: RE: [dpdk-dev] [RFC v4 1/4] ethdev: add meter PPS profile
> >
> > Hi Cristian
> >
> > Good discussion, thank you for that!
> >
> > From: Dumitrescu, Cristian
> > > Hi Matan,
> > >
> > > > -----Original Message-----
> > > > From: Matan Azrad <matan@nvidia.com>
> > > > Sent: Tuesday, March 2, 2021 12:37 PM
> > > > To: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>; Li Zhang
> > > > <lizh@nvidia.com>; Dekel Peled <dekelp@nvidia.com>; Ori Kam
> > > > <orika@nvidia.com>; Slava Ovsiienko <viacheslavo@nvidia.com>
> > > > Cc: dev@dpdk.org; NBU-Contact-Thomas Monjalon
> > <thomas@monjalon.net>;
> > > > Raslan Darawsheh <rasland@nvidia.com>; mb@smartsharesystems.com;
> > > > ajit.khaparde@broadcom.com; Yigit, Ferruh
> > > > <ferruh.yigit@intel.com>; Singh, Jasvinder
> > > > <jasvinder.singh@intel.com>
> > > > Subject: RE: [dpdk-dev] [RFC v4 1/4] ethdev: add meter PPS profile
> > > >
> > > > HI Cristian
> > > >
> > > > From: Dumitrescu, Cristian
> > > > > Hi Matan,
> > > > >
> > > > > > -----Original Message-----
> > > > > > From: Matan Azrad <matan@nvidia.com>
> > > > > > Sent: Tuesday, March 2, 2021 7:02 AM
> > > > > > To: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>; Li
> > > > > > Zhang <lizh@nvidia.com>; Dekel Peled <dekelp@nvidia.com>; Ori
> > > > > > Kam <orika@nvidia.com>; Slava Ovsiienko
> > > > > > <viacheslavo@nvidia.com>
> > > > > > Cc: dev@dpdk.org; NBU-Contact-Thomas Monjalon
> > > > <thomas@monjalon.net>;
> > > > > > Raslan Darawsheh <rasland@nvidia.com>;
> > mb@smartsharesystems.com;
> > > > > > ajit.khaparde@broadcom.com; Yigit, Ferruh
> > > > > > <ferruh.yigit@intel.com>; Singh, Jasvinder
> > > > > > <jasvinder.singh@intel.com>
> > > > > > Subject: RE: [dpdk-dev] [RFC v4 1/4] ethdev: add meter PPS
> > > > > > profile
> > > > > >
> > > > > >
> > > > > >
> > > > > > Hi Cristian
> > > > > >
> > > > > > Thank you for review, please see inline.
> > > > > >
> > > > > > From: Dumitrescu, Cristian
> > > > > > > > From: dev <dev-bounces@dpdk.org> On Behalf Of Li Zhang
> > > > > > <snip>
> > > > > > > We had this same problem earlier for the rte_tm.h API, where
> > > > > > > people
> > > > > > asked to
> > > > > > > add support for WRED and shaper rates specified in packets
> > > > > > > to the existing
> > > > > > byte
> > > > > > > rate support. I am more than happy to support adding the
> > > > > > > same here, but please let's adopt the same solution here
> > > > > > > rather than invent a different approach.
> > > > > > >
> > > > > > > Please refer to struct rte_tm_wred_params and struct
> > > > > > rte_tm_shaper_params
> > > > > > > from rte_tm.h: the packets vs. bytes mode is explicitly
> > > > > > > specified through
> > > > > > the use
> > > > > > > of a flag called packet_mode that is added to the WRED and
> > > > > > > shaper
> > > > profile.
> > > > > > > When packet_mode is 0, the profile rates and bucket sizes
> > > > > > > are specified in bytes per second and bytes, respectively;
> > > > > > > when packet_mode is not 0, the profile rates and bucket
> > > > > > > sizes are specified in packets and packets per
> > > > > > second,
> > > > > > > respectively. The same profile parameters are used, no need
> > > > > > > to invent additional algorithms (such as srTCM - packet
> > > > > > > mode) or profile data
> > > > > > structures.
> > > > > > > Can we do the same here, please?
> > > > > >
> > > > > > This flag approach is very intuitive suggestion and it has advantages.
> > > > > >
> > > > > > The main problem with the flag approach is that it breaks ABI and API.
> > > > > > The profile structure size is changed due to a new field - ABI
> > breakage.
> > > > > > The user must initialize the flag with zero to get old
> > > > > > behavior - API
> > > > breakage.
> > > > > >
> > > > >
> > > > > The rte_mtr API is experimental, all the API functions are
> > > > > correctly marked with __rte_experimental in rte_mtr.h file, so
> > > > > we can safely change the API
> > > > and
> > > > > the ABI breakage is not applicable here. Therefore, this problem
> > > > > does not
> > > > exist,
> > > > > correct?
> > > >
> > > > Yes, but still meter is not new API and I know that a lot of user
> > > > uses it for a long time.
> > > > Forcing them to change while we have good solution that don't
> > > > force it, looks me problematic.
> > > >
> > >
> > > Not really, only 3 drivers are currently implementing this API.
> >
> > The user is not the PMD, the PMDs are the providers.
> > I'm talking about all our customers, all the current DPDK based
> > applications like OVS and others (I familiar with at least 4 ConnectX
> > customer applications) which use the meter API and I'm sure there are more
> around the world.
> >
> > > Even to these drivers, the required changes are none or extremely small:
> > as Ajit
> > > was also noting, as the default value of 0 continues to represent
> > > the
> > existing
> > > byte mode, all you have to do is make sure the new flag is set to
> > > zero in the profile params structure, which is already done
> > > implicitly in most places as
> > this
> > > structure is initialized to all-zeros.
> >
> > Are you sure all the world initialize the struct to 0? and also in
> > this case, without new compilation, not all the struct will be
> > zeroes(the old size is smaller).
> >
> > > A simple search exercise for struct rte_mtr_meter_profile is all
> > > that is
> > needed.
> > > You also agreed the flag approach is very intuitive, hence better
> > > and nicer,
> > with
> > > no additional work needed for you, so why not do it?
> >
> > Do you understand that any current application that use the meter API
> > must recompile the code of the application? Part of them also probably
> > need to set the flag to 0....
> > Do you understand also the potential issues for the applications which
> > are not aware to the change? Debug time, etc....
> >
> > > > > > I don't see issues with Li suggestion, Do you think Li
> > > > > > suggestion has critical issues?
> > > > >
> > > > > It is probably better to keep the rte_mtr and the rte_tm APIs
> > > > > aligned, it simplifies the code maintenance and improves the
> > > > > user experience, which always pays off in the long run. Both
> > > > > APIs configure token buckets in either packet mode or byte mode,
> > > > > and it is desirable to have them work in the
> > > > same
> > > > > way. Also, I think we should avoid duplicating configuration
> > > > > data structures
> > > > for
> > > > > to support essentially the same algorithms (such as srTCM or
> > > > > trTCM) if we
> > > > can.
> > > > >
> > > >
> > > > Yes, but I don't think this motivation is critical.
> > >
> > > I really disagree. As API maintainer, making every effort to keep
> > > the APIs
> > clear
> > > and consistent is a critical task for me.
> >
> > New pps profile is also clear and simple.
> >
> > > We don't want to proliferate the API data structures and parameters
> > > if there is a good way to avoid it. Especially
> > in
> > > cases like this, when the drivers are just beginning to pick up this
> > > (still
> > > experimental) API,  we have the rare chance to make things right and
> > therefore
> > > we should do it. Please also keep in mind that, as more feature are
> > > added
> > to
> > > the API, small corner cuts like this one that might not look like a
> > > big deal
> > now,
> > > eventually come back as unnecessary complexity in the drivers themselves.
> >
> > I don't see a complexity in the current suggestion.
> >
> > > So, please, let's try to keep the quality of the APIs high.
> >
> > Also by this way is high.
> >
> >
> > Look, the flag approach is also good and makes the job.
> > The two approaches are clear, simple and in high quality.
> > I don't care which one from the 2 to take but I want to be sure we are
> > all understand the pros and cons.
> >
> > If you understand my concern on flag approach and still insist to take
> > the flag approach we will align.
> 
> Yes, thanks for summarizing the pros and cons, I confirm that I do understand
> your concerns.
> 
> Yes, sorry to disappoint you, I still think the packet_mode based approach is
> better for the long run, as it keeps the APIs clean and consistent. We are not
> adding new algorithms here, we're just adding a new mode to an existing
> algorithm, so IMO we should not duplicate configuration data structures and
> proliferate the number of algorithms artificially.

Actually, PPS meter is a new algorithm - you can see that current algorithms RFCs don't talk about PPS.

> Yes, I do realize that in some limited cases the users will have to explicitly set
> the new packet_mode flag to zero or one, in case they need to enable the
> packet mode, but I think this is an acceptable cost because: (A) This API is
> clearly marked as experimental; (B) It is better to take a small incremental hit
> now to keep the APIs in good order rather than taking a bit hit in a few years as
> more features are added in the wrong way and the APIs become
> unmanageable.

I don't think that the current suggestion is in wrong way.
In any case, you insist, we will align.

> > And if we so, and we are going to break the API\ABI, we are going to
> > introduce new meter policy API soon and there, breaking API can help,
> > lets see in other discussion later.
> >
> 
> Yes, as you point out API changes are unavoidable as new features are added,
> we have to manage the API evolution correctly.
> 
> > One more point:
> > Currently, the meter_id is managed by the user, I think it is better
> > to let the PMDs to manage the meter_id.
> >
> > Searching the PMD meter handler inside the PMD is very expensive for
> > the API call rate when the meter_id is managed by the user.
> >
> > Same for profile_id.
> >
> > Also all the rte_flow API including the shared action API taking the
> > PMD management approach.
> >
> > What do you think?
> >
> 
> Yes, we have carefully considered and discussed both approaches a few years
> back when the API was introduced, this is not done by accident :), there are
> pros and cons for each of them.
> 
> If the object IDs are generated by the driver (outputs of the API), then it is the
> user application that needs to keep track of them, which can be very painful.
> Basically, for each API object the user application needs to create its own
> wrapper to store this ID. We basically transfer this problem to the user app.

No exactly\not for all, the app gets the meter_id in the same time it decides it now.
 
> If the object IDs are generated by the user application (inputs into the API),
> then we simplify the application by removing and indirection layer. Yes, it is
> true that this indirection layer now moves into the driver, but we should try to
> make the life easier for the appl developers as opposed to us, the driver
> developers. This indirection layer in the driver can be made a bit smarter than
> just a slow "for" loop; the search operation can be made faster with a small bit
> of effort, such as keeping this list sorted based on the object ID, splitting this list
> into buckets (similar to a hash table), etc, right?

Yes, there are even better solution than hash table from "rate" perspective.

But any solution costs a lot of memory just for this mapping...
When we talked about 4M meters supported(in mlx5 next release) it becomes an issue.  
 
> Having the user app provide the object ID is especially important in the case of
> rte_tm API, where we have to deal with a tree of nodes, with thousands of
> nodes for each level. Having the app to store and manages this tree of IDs is a
> really bad idea, as the user app needs to mirror the tree of nodes on its side for
> no real benefit. As an added benefit, the user can generate these IDs using a
> rule, such as: given the specific path through the tree, the value of the ID can
> be computed.

rte_tm is not rte_mtr - I think meter is different and used differently.
For example, as I know, no one from our dpdk meter customers(at least 5) use TREEs for meter management. OVS, for example, just randomize some meter_id and don't care about it.

Also, all the rte_flow API basics works with PMD ID\handle management approach.

> But again, as you also mention above, there is a list of pros and cons for every
> approach, no approach is perfect. We took this approach for the good reasons
> listed above.

If you familiar with TREE usage with meter, maybe we can combined easily the two approaches in this topic,

meter_id argument can be by reference, if it 0 - PMD set it, if not PMD use it.

> > > > > The flag proposal is actually reducing the amount of work that
> > > > > you guys
> > > > need to
> > > > > do to implement your proposal. There is no negative impact to
> > > > > your
> > > > proposal
> > > > > and no big change, right?
> > > >
> > > > Yes you right, but the implementation effect is not our concern.
> > > >
> > > >
> > > > > > > This is a quick summary of the required API changes to add
> > > > > > > support for the packet mode, they are minimal:
> > > > > > > a) Introduce the packet_mode flag in the profile parameters
> > > > > > > data
> > > > > > structure.
> > > > > > > b) Change the description (comment) of the rate and bucket
> > > > > > > size
> > > > > > parameters in
> > > > > > > the meter profile parameters data structures to reflect that
> > > > > > > their values represents either bytes or packets, depending
> > > > > > > on the value of the new flag packet_mode from the same structure.
> > > > > > > c) Add the relevant capabilities: just search for "packet"
> > > > > > > in the rte_tm.h capabilities data structures and apply the
> > > > > > > same to the rte_mtr.h
> > > > > > capabilities,
> > > > > > > when applicable.
> > > > > >
> > > > > > > Regards,
> > > > > > > Cristian
> > > > >
> > > > > Regards,
> > > > > Cristian
> > >
> > > Regards,
> > > Cristian
> 
> Regards,
> Cristian

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [RFC v4 1/4] ethdev: add meter PPS profile
  2021-03-02 18:10  3%               ` Matan Azrad
@ 2021-03-03 20:35  0%                 ` Dumitrescu, Cristian
  2021-03-04  6:34  0%                   ` Matan Azrad
  0 siblings, 1 reply; 200+ results
From: Dumitrescu, Cristian @ 2021-03-03 20:35 UTC (permalink / raw)
  To: Matan Azrad, Li Zhang, Dekel Peled, Ori Kam, Slava Ovsiienko
  Cc: dev, NBU-Contact-Thomas Monjalon, Raslan Darawsheh, mb,
	ajit.khaparde, Yigit, Ferruh, Singh, Jasvinder

Hi Matan,

> -----Original Message-----
> From: Matan Azrad <matan@nvidia.com>
> Sent: Tuesday, March 2, 2021 6:10 PM
> To: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>; Li Zhang
> <lizh@nvidia.com>; Dekel Peled <dekelp@nvidia.com>; Ori Kam
> <orika@nvidia.com>; Slava Ovsiienko <viacheslavo@nvidia.com>
> Cc: dev@dpdk.org; NBU-Contact-Thomas Monjalon
> <thomas@monjalon.net>; Raslan Darawsheh <rasland@nvidia.com>;
> mb@smartsharesystems.com; ajit.khaparde@broadcom.com; Yigit, Ferruh
> <ferruh.yigit@intel.com>; Singh, Jasvinder <jasvinder.singh@intel.com>
> Subject: RE: [dpdk-dev] [RFC v4 1/4] ethdev: add meter PPS profile
> 
> Hi Cristian
> 
> Good discussion, thank you for that!
> 
> From: Dumitrescu, Cristian
> > Hi Matan,
> >
> > > -----Original Message-----
> > > From: Matan Azrad <matan@nvidia.com>
> > > Sent: Tuesday, March 2, 2021 12:37 PM
> > > To: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>; Li Zhang
> > > <lizh@nvidia.com>; Dekel Peled <dekelp@nvidia.com>; Ori Kam
> > > <orika@nvidia.com>; Slava Ovsiienko <viacheslavo@nvidia.com>
> > > Cc: dev@dpdk.org; NBU-Contact-Thomas Monjalon
> <thomas@monjalon.net>;
> > > Raslan Darawsheh <rasland@nvidia.com>; mb@smartsharesystems.com;
> > > ajit.khaparde@broadcom.com; Yigit, Ferruh <ferruh.yigit@intel.com>;
> > > Singh, Jasvinder <jasvinder.singh@intel.com>
> > > Subject: RE: [dpdk-dev] [RFC v4 1/4] ethdev: add meter PPS profile
> > >
> > > HI Cristian
> > >
> > > From: Dumitrescu, Cristian
> > > > Hi Matan,
> > > >
> > > > > -----Original Message-----
> > > > > From: Matan Azrad <matan@nvidia.com>
> > > > > Sent: Tuesday, March 2, 2021 7:02 AM
> > > > > To: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>; Li Zhang
> > > > > <lizh@nvidia.com>; Dekel Peled <dekelp@nvidia.com>; Ori Kam
> > > > > <orika@nvidia.com>; Slava Ovsiienko <viacheslavo@nvidia.com>
> > > > > Cc: dev@dpdk.org; NBU-Contact-Thomas Monjalon
> > > <thomas@monjalon.net>;
> > > > > Raslan Darawsheh <rasland@nvidia.com>;
> mb@smartsharesystems.com;
> > > > > ajit.khaparde@broadcom.com; Yigit, Ferruh
> > > > > <ferruh.yigit@intel.com>; Singh, Jasvinder
> > > > > <jasvinder.singh@intel.com>
> > > > > Subject: RE: [dpdk-dev] [RFC v4 1/4] ethdev: add meter PPS profile
> > > > >
> > > > >
> > > > >
> > > > > Hi Cristian
> > > > >
> > > > > Thank you for review, please see inline.
> > > > >
> > > > > From: Dumitrescu, Cristian
> > > > > > > From: dev <dev-bounces@dpdk.org> On Behalf Of Li Zhang
> > > > > <snip>
> > > > > > We had this same problem earlier for the rte_tm.h API, where
> > > > > > people
> > > > > asked to
> > > > > > add support for WRED and shaper rates specified in packets to
> > > > > > the existing
> > > > > byte
> > > > > > rate support. I am more than happy to support adding the same
> > > > > > here, but please let's adopt the same solution here rather than
> > > > > > invent a different approach.
> > > > > >
> > > > > > Please refer to struct rte_tm_wred_params and struct
> > > > > rte_tm_shaper_params
> > > > > > from rte_tm.h: the packets vs. bytes mode is explicitly
> > > > > > specified through
> > > > > the use
> > > > > > of a flag called packet_mode that is added to the WRED and
> > > > > > shaper
> > > profile.
> > > > > > When packet_mode is 0, the profile rates and bucket sizes are
> > > > > > specified in bytes per second and bytes, respectively; when
> > > > > > packet_mode is not 0, the profile rates and bucket sizes are
> > > > > > specified in packets and packets per
> > > > > second,
> > > > > > respectively. The same profile parameters are used, no need to
> > > > > > invent additional algorithms (such as srTCM - packet mode) or
> > > > > > profile data
> > > > > structures.
> > > > > > Can we do the same here, please?
> > > > >
> > > > > This flag approach is very intuitive suggestion and it has advantages.
> > > > >
> > > > > The main problem with the flag approach is that it breaks ABI and API.
> > > > > The profile structure size is changed due to a new field - ABI
> breakage.
> > > > > The user must initialize the flag with zero to get old behavior -
> > > > > API
> > > breakage.
> > > > >
> > > >
> > > > The rte_mtr API is experimental, all the API functions are correctly
> > > > marked with __rte_experimental in rte_mtr.h file, so we can safely
> > > > change the API
> > > and
> > > > the ABI breakage is not applicable here. Therefore, this problem
> > > > does not
> > > exist,
> > > > correct?
> > >
> > > Yes, but still meter is not new API and I know that a lot of user uses
> > > it for a long time.
> > > Forcing them to change while we have good solution that don't force
> > > it, looks me problematic.
> > >
> >
> > Not really, only 3 drivers are currently implementing this API.
> 
> The user is not the PMD, the PMDs are the providers.
> I'm talking about all our customers, all the current DPDK based applications
> like OVS and others (I familiar with at least 4 ConnectX customer applications)
> which use the meter API and I'm sure there are more around the world.
> 
> > Even to these drivers, the required changes are none or extremely small:
> as Ajit
> > was also noting, as the default value of 0 continues to represent the
> existing
> > byte mode, all you have to do is make sure the new flag is set to zero in the
> > profile params structure, which is already done implicitly in most places as
> this
> > structure is initialized to all-zeros.
> 
> Are you sure all the world initialize the struct to 0? and also in this case,
> without new compilation, not all the struct will be zeroes(the old size is
> smaller).
> 
> > A simple search exercise for struct rte_mtr_meter_profile is all that is
> needed.
> > You also agreed the flag approach is very intuitive, hence better and nicer,
> with
> > no additional work needed for you, so why not do it?
> 
> Do you understand that any current application that use the meter API must
> recompile the code of the application? Part of them also probably need to
> set the flag to 0....
> Do you understand also the potential issues for the applications which are
> not aware to the change? Debug time, etc....
> 
> > > > > I don't see issues with Li suggestion, Do you think Li suggestion
> > > > > has critical issues?
> > > >
> > > > It is probably better to keep the rte_mtr and the rte_tm APIs
> > > > aligned, it simplifies the code maintenance and improves the user
> > > > experience, which always pays off in the long run. Both APIs
> > > > configure token buckets in either packet mode or byte mode, and it
> > > > is desirable to have them work in the
> > > same
> > > > way. Also, I think we should avoid duplicating configuration data
> > > > structures
> > > for
> > > > to support essentially the same algorithms (such as srTCM or trTCM)
> > > > if we
> > > can.
> > > >
> > >
> > > Yes, but I don't think this motivation is critical.
> >
> > I really disagree. As API maintainer, making every effort to keep the APIs
> clear
> > and consistent is a critical task for me.
> 
> New pps profile is also clear and simple.
> 
> > We don't want to proliferate the API
> > data structures and parameters if there is a good way to avoid it. Especially
> in
> > cases like this, when the drivers are just beginning to pick up this (still
> > experimental) API,  we have the rare chance to make things right and
> therefore
> > we should do it. Please also keep in mind that, as more feature are added
> to
> > the API, small corner cuts like this one that might not look like a big deal
> now,
> > eventually come back as unnecessary complexity in the drivers themselves.
> 
> I don't see a complexity in the current suggestion.
> 
> > So, please, let's try to keep the quality of the APIs high.
> 
> Also by this way is high.
> 
> 
> Look, the flag approach is also good and makes the job.
> The two approaches are clear, simple and in high quality.
> I don't care which one from the 2 to take but I want to be sure we are all
> understand the pros and cons.
> 
> If you understand my concern on flag approach and still insist to take the flag
> approach we will align.

Yes, thanks for summarizing the pros and cons, I confirm that I do understand your concerns.

Yes, sorry to disappoint you, I still think the packet_mode based approach is better for the long run, as it keeps the APIs clean and consistent. We are not adding new algorithms here, we're just adding a new mode to an existing algorithm, so IMO we should not duplicate configuration data structures and proliferate the number of algorithms artificially.

Yes, I do realize that in some limited cases the users will have to explicitly set the new packet_mode flag to zero or one, in case they need to enable the packet mode, but I think this is an acceptable cost because: (A) This API is clearly marked as experimental; (B) It is better to take a small incremental hit now to keep the APIs in good order rather than taking a bit hit in a few years as more features are added in the wrong way and the APIs become unmanageable.

> 
> And if we so, and we are going to break the API\ABI, we are going to
> introduce new meter policy API soon and there, breaking API can help, lets
> see in other discussion later.
> 

Yes, as you point out API changes are unavoidable as new features are added, we have to manage the API evolution correctly.

> One more point:
> Currently, the meter_id is managed by the user, I think it is better to let the
> PMDs to manage the meter_id.
> 
> Searching the PMD meter handler inside the PMD is very expensive for the
> API call rate when the meter_id is managed by the user.
> 
> Same for profile_id.
> 
> Also all the rte_flow API including the shared action API taking the PMD
> management approach.
> 
> What do you think?
> 

Yes, we have carefully considered and discussed both approaches a few years back when the API was introduced, this is not done by accident :), there are pros and cons for each of them.

If the object IDs are generated by the driver (outputs of the API), then it is the user application that needs to keep track of them, which can be very painful. Basically, for each API object the user application needs to create its own wrapper to store this ID. We basically transfer this problem to the user app.

If the object IDs are generated by the user application (inputs into the API), then we simplify the application by removing and indirection layer. Yes, it is true that this indirection layer now moves into the driver, but we should try to make the life easier for the appl developers as opposed to us, the driver developers. This indirection layer in the driver can be made a bit smarter than just a slow "for" loop; the search operation can be made faster with a small bit of effort, such as keeping this list sorted based on the object ID, splitting this list into buckets (similar to a hash table), etc, right?

Having the user app provide the object ID is especially important in the case of rte_tm API, where we have to deal with a tree of nodes, with thousands of nodes for each level. Having the app to store and manages this tree of IDs is a really bad idea, as the user app needs to mirror the tree of nodes on its side for no real benefit. As an added benefit, the user can generate these IDs using a rule, such as: given the specific path through the tree, the value of the ID can be computed.

But again, as you also mention above, there is a list of pros and cons for every approach, no approach is perfect. We took this approach for the good reasons listed above.

> > > > The flag proposal is actually reducing the amount of work that you
> > > > guys
> > > need to
> > > > do to implement your proposal. There is no negative impact to your
> > > proposal
> > > > and no big change, right?
> > >
> > > Yes you right, but the implementation effect is not our concern.
> > >
> > >
> > > > > > This is a quick summary of the required API changes to add
> > > > > > support for the packet mode, they are minimal:
> > > > > > a) Introduce the packet_mode flag in the profile parameters data
> > > > > structure.
> > > > > > b) Change the description (comment) of the rate and bucket size
> > > > > parameters in
> > > > > > the meter profile parameters data structures to reflect that
> > > > > > their values represents either bytes or packets, depending on
> > > > > > the value of the new flag packet_mode from the same structure.
> > > > > > c) Add the relevant capabilities: just search for "packet" in
> > > > > > the rte_tm.h capabilities data structures and apply the same to
> > > > > > the rte_mtr.h
> > > > > capabilities,
> > > > > > when applicable.
> > > > >
> > > > > > Regards,
> > > > > > Cristian
> > > >
> > > > Regards,
> > > > Cristian
> >
> > Regards,
> > Cristian

Regards,
Cristian

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] 20.11.1 patches review and test
  2021-03-02 11:27  0%   ` Luca Boccassi
@ 2021-03-03  1:57  0%     ` Chen, BoX C
  0 siblings, 0 replies; 200+ results
From: Chen, BoX C @ 2021-03-03  1:57 UTC (permalink / raw)
  To: Luca Boccassi, stable
  Cc: dev, Walker, Benjamin, Govindharajan, Hariprasad, Mcnamara, John,
	Yu, PingX, Pei Zhang, Peng, Yuan, Chen, Zhaoyan

> -----Original Message-----
> From: Luca Boccassi <bluca@debian.org>
> Sent: March 2, 2021 19:28
> To: Chen, BoX C <box.c.chen@intel.com>; stable@dpdk.org
> Cc: dev@dpdk.org; Walker, Benjamin <benjamin.walker@intel.com>;
> Govindharajan, Hariprasad <hariprasad.govindharajan@intel.com>;
> Mcnamara, John <john.mcnamara@intel.com>; Yu, PingX
> <pingx.yu@intel.com>; Pei Zhang <pezhang@redhat.com>; Peng, Yuan
> <yuan.peng@intel.com>; Chen, Zhaoyan <zhaoyan.chen@intel.com>
> Subject: Re: [dpdk-dev] 20.11.1 patches review and test
> 
> On Tue, 2021-03-02 at 10:52 +0000, Chen, BoX C wrote:
> > Hi Luca,
> >
> > Testing with dpdk v20.11.1 from Intel looks good.
> >
> > # Basic Intel(R) NIC testing
> >   *PF(i40e, ixgbe): test scenarios including
> rte_flow/TSO/Jumboframe/checksum offload/Tunnel, etc. Listed but not all.
> >     - No new issue are found.
> >
> >   *VF(i40e,ixgbe): test scenarios including vf-
> rte_flow/TSO/Jumboframe/checksum offload/Tunnel, Listed but not all.
> >     - No new issues are found.
> >
> >   *PF/VF(ice): test scenarios including Switch features/Flow
> Director/Advanced RSS/ACL/DCF/Flexible Descriptor and so on, Listed but
> not all.
> >     - No new issues are found. one known issue: can't create 512 acl rules
> after creating a full mask switch rule. This issue is also occurred in dpdk 20.11
> and no fix patch.
> >
> >   * Build or compile:
> >               * Build: cover the build test combination with latest GCC/Clang/ICC
> version and the popular OS revision such as Ubuntu20.04, CentOS 8.3 and so
> on. Listed but not all.
> >                 - All passed.
> >
> >               * Compile: cover the CFLAGES(O0/O1/O2/O3) with popular OS such
> as Ubuntu20.04 and CentOS 8.3.
> >                 - All passed.
> >
> >   * Intel NIC single core/NIC performance: test scenarios including PF/VF
> single core performance test(AVX2+AVX512),RFC2544 Zero packet loss
> performance test and so on. Listed but not all.
> >               - All passed. No big data drop.
> >
> >   * Power and IPsec: test scenarios including Telemetry/Empty Poll
> Lib/Priority Base Frequency and so on.
> >     - All passed.
> >
> >
> >  # Basic cryptodev and virtio testing
> >     * Virtio: both function and performance test are covered. Such as
> PVP/Virtio_loopback/virtio-user loopback/virtio-net VM2VM perf
> testing/VMAWARE ESXI 7.0u1, etc.. Listed but not all.
> >       - No new issues are found. two known issues:(1)The UDP fragmentation
> offload feature of Virtio-net device can’t be turned on in the VM, bugzilla has
> been submited:https://bugzilla.kernel.org/show_bug.cgi?id=207075
> > 	                                              (2)vm2vm virtio-net cbdma enable test scp file
> between two vm random fail due to lost connection after vhost reconnect.
> This issue is also occurred in dpdk 20.11 and no fix patch.
> >
> >    * Cryptodev:
> >               - Function test: test scenarios including Cryptodev API
> testing/CompressDev ISA-L/QAT/ZLIB PMD Testing/FIPS, etc. Listed but not
> all.
> >                 - All passed.
> >               - Performance test: test scenarios including Thoughput Performance
> /Cryptodev Latency, etc. Listed but not all.
> >                 - No big data drop.
> >
> > Regards,
> > Chen Bo
> 
> Thank you!
> 
> Are there bugzilla tickets for the ICE and vm2vm issues?
> 

There are no bugzilla tickets.
ICE: It affects not only dpdk 20.11 but also 21.02. Intel's Dev is working on this bug. I suggest you can release the 20.11 without this fix patch.
vm2vm: this issue is converted to a feature development. Patch can not be provided in a short time. The patch plan to be released on dpdk 21.05.

> > > -----Original Message-----
> > > From: dev <dev-bounces@dpdk.org> On Behalf Of
> > > luca.boccassi@gmail.com
> > > Sent: February 22, 2021 23:09
> > > To: stable@dpdk.org
> > > Cc: dev@dpdk.org; Abhishek Marathe
> <Abhishek.Marathe@microsoft.com>;
> > > Akhil Goyal <akhil.goyal@nxp.com>; Ali Alnubani
> > > <alialnu@nvidia.com>; Walker, Benjamin <benjamin.walker@intel.com>;
> > > David Christensen <drc@linux.vnet.ibm.com>; Govindharajan,
> > > Hariprasad <hariprasad.govindharajan@intel.com>; Hemant Agrawal
> > > <hemant.agrawal@nxp.com>; Stokes, Ian <ian.stokes@intel.com>; Jerin
> > > Jacob <jerinj@marvell.com>; Mcnamara, John
> > > <john.mcnamara@intel.com>; Ju-Hyoung Lee <juhlee@microsoft.com>;
> > > Kevin Traynor <ktraynor@redhat.com>; Luca Boccassi
> > > <bluca@debian.org>; Pei Zhang <pezhang@redhat.com>; Yu, PingX
> > > <pingx.yu@intel.com>; Xu, Qian Q <qian.q.xu@intel.com>; Raslan
> > > Darawsheh <rasland@nvidia.com>; Thomas Monjalon
> > > <thomas@monjalon.net>; Peng, Yuan <yuan.peng@intel.com>; Chen,
> > > Zhaoyan <zhaoyan.chen@intel.com>
> > > Subject: [dpdk-dev] 20.11.1 patches review and test
> > >
> > > Hi all,
> > >
> > > Here is a list of patches targeted for stable release 20.11.1.
> > >
> > > The planned date for the final release is the 8th of March.
> > >
> > > Please help with testing and validation of your use cases and report
> > > any issues/results with reply-all to this mail. For the final
> > > release the fixes and reported validations will be added to the release
> notes.
> > >
> > > A release candidate tarball can be found at:
> > >
> > >     https://dpdk.org/browse/dpdk-stable/tag/?id=v20.11.1-rc1
> > >
> > > These patches are located at branch 20.11 of dpdk-stable repo:
> > >     https://dpdk.org/browse/dpdk-stable/
> > >
> > > Thanks.
> > >
> > > Luca Boccassi
> > >
> > > ---
> > > Ajit Khaparde (3):
> > >       net/bnxt: fix cleanup on mutex init failure
> > >       net/bnxt: fix format specifier for unsigned int
> > >       net/bnxt: fix freeing mbuf
> > >
> > > Alexander Kozyrev (4):
> > >       net/mlx5: fix mbuf freeing in vectorized MPRQ
> > >       net/mlx5: fix flow tag decompression
> > >       net/mlx5: check FW miniCQE format capabilities
> > >       net/mlx5: fix miniCQE configuration for Verbs
> > >
> > > Alvin Zhang (9):
> > >       net/ixgbe: detect failed VF MTU set
> > >       net/i40e: fix Rx bytes statistics
> > >       net/iavf: fix queue pairs configuration
> > >       doc: fix RSS flow description in i40e guide
> > >       net/i40e: fix returned code for RSS hardware failure
> > >       net/ice: fix RSS lookup table initialization
> > >       test: fix buffer overflow in Tx burst
> > >       net/ixgbe: fix configuration of max frame size
> > >       app/testpmd: fix key for RSS flow rule
> > >
> > > Amit Bernstein (1):
> > >       net/ena: fix Tx doorbell statistics
> > >
> > > Anatoly Burakov (1):
> > >       fbarray: fix overlap check
> > >
> > > Andrew Boyer (5):
> > >       net/ionic: do minor logging fixups
> > >       net/ionic: fix link speed and autonegotiation
> > >       net/ionic: allow separate L3 and L4 checksum offload
> > >       net/ionic: fix up function attribute tags
> > >       net/ionic: fix address handling in Tx
> > >
> > > Ankur Dwivedi (1):
> > >       test/event_crypto: set cipher operation in transform
> > >
> > > Ashish Sadanandan (1):
> > >       mbuf: add C++ include guard for dynamic fields header
> > >
> > > Balazs Nemeth (1):
> > >       net/qede: fix promiscuous enable
> > >
> > > Beilei Xing (2):
> > >       net/i40e: fix global register recovery
> > >       net/i40e: fix flex payload rule conflict
> > >
> > > Bernard Iremonger (1):
> > >       doc: fix QinQ flow rules in testpmd guide
> > >
> > > Bruce Richardson (29):
> > >       ethdev: avoid blocking telemetry for link status
> > >       build: provide suitable error for "both" libraries option
> > >       eal: fix reciprocal header include
> > >       telemetry: fix missing header include
> > >       ethdev: fix missing header include
> > >       net: fix missing header include
> > >       mbuf: fix missing header include
> > >       bitrate: fix missing header include
> > >       rib: fix missing header includes
> > >       vhost: fix missing header includes
> > >       ipsec: fix missing header include
> > >       fib: fix missing header includes
> > >       table: fix missing header include
> > >       pipeline: fix missing header includes
> > >       metrics: fix variable declaration in header
> > >       node: fix missing header include
> > >       app: fix build with extra include paths
> > >       build: force pkg-config for dependency detection
> > >       power: create guest channel public header file
> > >       power: make channel message functions public
> > >       power: rename public structs
> > >       power: rename constants
> > >       power: export guest channel header file
> > >       power: clean up includes
> > >       eal: fix MCS lock header include
> > >       eal: fix internal ABI tag with clang
> > >       power: fix missing header includes
> > >       rib: fix missing header include
> > >       eal: fix automatic loading of drivers as shared libs
> > >
> > > Chengchang Tang (7):
> > >       net/hns3: fix register length when dumping registers
> > >       net/hns3: fix data overwriting during register dump
> > >       net/hns3: fix dump register out of range
> > >       net/hns3: fix interrupt resources in Rx interrupt mode
> > >       net/hns3: fix firmware exceptions by concurrent commands
> > >       net/hns3: fix VF reset on mailbox failure
> > >       net/hns3: fix stats flip overflow
> > >
> > > Chengwen Feng (3):
> > >       net/hns3: fix VF query link status in dev init
> > >       net/hns3: remove MPLS from supported flow items
> > >       net/hns3: fix flow director rule residue on malloc failure
> > >
> > > Ciara Power (3):
> > >       app/crypto-perf: fix spelling in output
> > >       app/crypto-perf: fix latency CSV output
> > >       app/crypto-perf: fix CSV output format
> > >
> > > Cristian Dumitrescu (1):
> > >       examples/pipeline: fix CLI parsing crash
> > >
> > > Dapeng Yu (4):
> > >       net/ixgbe: fix flex bytes flow director rule
> > >       net/ice: check Rx queue number on RSS init
> > >       net/ixgbe: disable NFS filtering
> > >       app/testpmd: avoid exit without terminal restore
> > >
> > > David Marchand (3):
> > >       net/hinic: restore vectorised code
> > >       examples/pipeline: fix VXLAN script permission
> > >       mbuf: remove unneeded atomic generic header include
> > >
> > > Dekel Peled (8):
> > >       net/mlx5: fix shared age action validation
> > >       net/mlx5: fix hairpin flow split decision
> > >       net/mlx5: fix flow split combined with counter
> > >       net/mlx5: fix flow split combined with age action
> > >       net/mlx5: fix shared RSS translation and cleanup
> > >       app/testpmd: support shared age action query
> > >       net/mlx5: fix shared RSS capability check
> > >       net/mlx5: validate hash Rx queue pointer
> > >
> > > Dmitry Kozlyuk (4):
> > >       eal/windows: fix build with MinGW-w64 8
> > >       bus/pci: fix build with MinGW-w64 8
> > >       bus/pci: fix hardware ID limit on Windows
> > >       build: fix linker flags on Windows
> > >
> > > Eugeny Parshutin (1):
> > >       doc: add vtune profiling config to prog guide
> > >
> > > Fan Zhang (1):
> > >       crypto/qat: fix digest in buffer
> > >
> > > Fei Chen (1):
> > >       vhost: fix vid allocation race
> > >
> > > Feifei Wang (7):
> > >       test/ring: reduce duration of performance tests
> > >       app/eventdev: adjust event count order for pipeline test
> > >       app/eventdev: remove redundant enqueue in burst Tx
> > >       examples/eventdev: check CPU core enabling
> > >       examples/eventdev: add info output for main core
> > >       examples/eventdev: move ethdev stop to the end
> > >       app/eventdev: fix SMP barrier in performance test
> > >
> > > Ferruh Yigit (13):
> > >       app/procinfo: fix _filters stats reporting
> > >       app/procinfo: fix check on xstats-ids
> > >       app/procinfo: remove useless memset
> > >       app/procinfo: remove useless assignment
> > >       net/pcap: remove local variable shadowing outer one
> > >       net/bonding: remove local variable shadowing outer one
> > >       net/af_xdp: remove useless assignment
> > >       net/bnxt: remove redundant return
> > >       app/crypto-perf: remove always true condition
> > >       net/avp: remove always true condition
> > >       net/pcap: fix byte stats for drop Tx
> > >       net/pcap: fix infinite Rx with large files
> > >       app/testpmd: fix help of metering commands
> > >
> > > Gaetan Rivet (2):
> > >       net/bonding: fix port id validity check on parsing
> > >       net/bonding: fix PCI address comparison on non-PCI ports
> > >
> > > Gagandeep Singh (2):
> > >       test/ipsec: fix result code for not supported
> > >       crypto/dpaa2_sec: fix memory allocation check
> > >
> > > George Prekas (1):
> > >       app/testpmd: fix IP checksum calculation
> > >
> > > Gregory Etelson (5):
> > >       net/mlx5: fix Direct Verbs flow descriptor allocation
> > >       app/testpmd: release flows left before port stop
> > >       net/mlx5: fix tunnel rules validation on VF representor
> > >       net/mlx5: fix mark action in active tunnel offload
> > >       net/mlx5: fix drop action in tunnel offload mode
> > >
> > > Guy Kaneti (1):
> > >       regex/octeontx2: fix PCI table overflow
> > >
> > > Haiyue Wang (2):
> > >       net/ice: drain out DCF AdminQ command queue
> > >       net/ixgbe: fix UDP zero checksum on x86
> > >
> > > Harman Kalra (1):
> > >       examples/l3fwd: remove limitation on Tx queue count
> > >
> > > Harry van Haaren (1):
> > >       eventdev: fix a return value comment
> > >
> > > Heinrich Kuhn (1):
> > >       net/nfp: read chip model from PluDevice register
> > >
> > > Hemant Agrawal (1):
> > >       app/procinfo: fix security context info
> > >
> > > Hongbo Zheng (1):
> > >       net/hns3: use new opcode for clearing hardware resource
> > >
> > > Huisong Li (7):
> > >       app/testpmd: fix queue stats mapping configuration
> > >       net/hns3: fix xstats with id and names
> > >       net/hns3: fix error code in xstats
> > >       net/hns3: fix Rx/Tx errors stats
> > >       net/hns3: fix link status change from firmware
> > >       net/hns3: validate requested maximum Rx frame length
> > >       net/hns3: fix query order of link status and link info
> > >
> > > Hyong Youb Kim (2):
> > >       net/enic: fix filter type used for flow API
> > >       net/enic: fix filter log message
> > >
> > > Ido Segev (1):
> > >       net/ena: flush Rx buffers memory pool cache
> > >
> > > Igor Chauskin (2):
> > >       net/ena: fix Tx SQ free space assessment
> > >       net/ena: prevent double doorbell
> > >
> > > Igor Ryzhov (1):
> > >       net/i40e: fix stats counters
> > >
> > > Ivan Malov (11):
> > >       common/sfc_efx/base: remove warnings about inline specifiers
> > >       common/sfc_efx/base: fix signed/unsigned mismatch warnings
> > >       common/sfc_efx/base: support alternative MAE match fields
> > >       common/sfc_efx/base: update MCDI headers for MAE privilege
> > >       common/sfc_efx/base: check for MAE privilege
> > >       common/sfc_efx/base: fix MPORT related byte order handling
> > >       common/sfc_efx/base: fix MAE match spec validation helper
> > >       common/sfc_efx/base: fix MAE match spec class comparison API
> > >       common/sfc_efx/base: enhance field ID check in field set API
> > >       common/sfc_efx/base: apply mask to value on match field set
> > >       net/sfc: fix TSO and checksum offloads for EF10
> > >
> > > Jiawei Wang (4):
> > >       net/mlx5: fix unnecessary checking for RSS action
> > >       app/testpmd: fix packets dump overlapping
> > >       net/mlx5: fix count actions query in sample flow
> > >       net/mlx5: fix counter and age flow action validation
> > >
> > > Jiawei Zhu (1):
> > >       net/virtio-user: fix run closing stdin and close callfd
> > >
> > > Jingjing Wu (1):
> > >       net/iavf: fix vector mapping with queue
> > >
> > > John McNamara (1):
> > >       license: add licenses for exception cases
> > >
> > > Joyce Kong (1):
> > >       eal/arm: fix debug build with gcc for 128-bit atomics
> > >
> > > Junfeng Guo (1):
> > >       net/iavf: fix GTPU UL and DL support for flow director
> > >
> > > Kalesh AP (4):
> > >       net/bnxt: release HWRM lock in error
> > >       net/bnxt: propagate FW command failure to application
> > >       net/bnxt: fix VNIC RSS configure function
> > >       net/bnxt: fix FW version log
> > >
> > > Karra Satwik (2):
> > >       net/cxgbe: accept VLAN flow items without ethertype
> > >       app/testpmd: fix start index for showing FEC array
> > >
> > > Lance Richardson (10):
> > >       net/bnxt: disable end of packet padding for Rx
> > >       net/bnxt: limit Rx representor packets per poll
> > >       net/bnxt: fix doorbell write ordering
> > >       net/bnxt: fix outer UDP checksum Rx offload capability
> > >       net/bnxt: make offload flags mapping per-ring
> > >       net/bnxt: set correct checksum status in mbuf
> > >       net/bnxt: fix packet type index calculation
> > >       net/bnxt: fix null termination of Rx mbuf chain
> > >       net/bnxt: fix fallback mbuf allocation logic
> > >       net/bnxt: fix Rx completion ring size calculation
> > >
> > > Leyi Rong (1):
> > >       net/ice: enlarge Rx queue rearm threshold to 64
> > >
> > > Lijun Ou (6):
> > >       net/hns3: fix interception with flow director
> > >       net/hns3: fix memory leak on secondary process exit
> > >       net/hns3: adjust some comments
> > >       net/hns3: adjust format specifier for enum
> > >       doc: fix product link in hns3 guide
> > >       net/hns3: fix RSS indirection table size
> > >
> > > Liron Himi (5):
> > >       net/octeontx2: fix PF flow action for Tx
> > >       net/mvpp2: remove debug log on fast-path
> > >       net/mvpp2: remove VLAN flush
> > >       net/mvpp2: remove CRC length from MRU validation
> > >       net/mvpp2: fix frame size checking
> > >
> > > Long Li (1):
> > >       net/netvsc: ignore unsupported packet on sync command
> > >
> > > Lukasz Wojciechowski (1):
> > >       test/distributor: fix return buffer queue overload
> > >
> > > Marvin Liu (1):
> > >       vhost: fix packed ring dequeue offloading
> > >
> > > Matan Azrad (1):
> > >       vdpa/mlx5: fix configuration mutex cleanup
> > >
> > > Maxime Coquelin (3):
> > >       net/virtio: add missing backend features negotiation
> > >       net/virtio: fix memory init with vDPA backend
> > >       net/virtio: fix getting old status on reconnect
> > >
> > > Michael Baum (7):
> > >       net/mlx5: fix leak on Rx queue creation failure
> > >       net/mlx5: fix leak on Tx queue creation failure
> > >       common/mlx5: fix completion queue entry size configuration
> > >       net/mlx5: remove CQE padding device argument
> > >       net/mlx5: fix leak on ASO SQ creation failure
> > >       net/mlx4: fix device detach
> > >       net/mlx4: fix handling of probing failure
> > >
> > > Michal Krawczyk (1):
> > >       net/ena: validate Rx req ID upon acquiring descriptor
> > >
> > > Min Hu (Connor) (3):
> > >       net/hns3: fix FEC state query
> > >       net/hns3: fix crash with multi-process
> > >       doc: add FEC to NIC features
> > >
> > > Murphy Yang (6):
> > >       net/ice: fix outer UDP Tx checksum offload
> > >       net/i40e: fix L4 checksum flag
> > >       net/ice: fix outer checksum flags
> > >       net/iavf: fix conflicting RSS combination rules
> > >       net/ice: disable IPv4 checksum offload in vector Tx
> > >       net/i40e: add null input checks
> > >
> > > Nick Connolly (2):
> > >       eal/windows: fix debug build with MinGW
> > >       eal/windows: fix vfprintf warning with clang
> > >
> > > Olivier Matz (5):
> > >       build: fix plugin load on static build
> > >       net/virtio-user: fix protocol features advertising
> > >       service: propagate init error in EAL
> > >       test/mcslock: remove unneeded per lcore copy
> > >       mempool: fix panic on dump or audit
> > >
> > > Ophir Munk (4):
> > >       net/mlx5: fix freeing packet pacing
> > >       net/mlx5: fix flow action destroy wrapper
> > >       net/mlx5: fix flow operation wrapper per OS
> > >       net/mlx5: unify operations for all OS
> > >
> > > Ori Kam (3):
> > >       regex/mlx5: fix memory rule alignment
> > >       regex/mlx5: fix support for group id
> > >       regex/mlx5: fix number of supported queues
> > >
> > > Qi Zhang (4):
> > >       doc: fix some statements for ice vector PMD
> > >       net/ice/base: fix tunnel destroy
> > >       net/ice/base: fix null pointer dereference
> > >       net/ice/base: fix memory handling
> > >
> > > Ruifeng Wang (4):
> > >       lpm: fix vector IPv4 lookup
> > >       net/hns3: fix build with SVE
> > >       net/octeontx: fix build with SVE
> > >       common/octeontx2: fix build with SVE
> > >
> > > Samik Gupta (2):
> > >       net/bnxt: fix Rx rings in RSS redirection table
> > >       net/bnxt: fix VNIC config on Rx queue stop
> > >
> > > Shiri Kuzin (2):
> > >       net/mlx5: fix VXLAN decap on non-VXLAN flow
> > >       net/mlx5: refuse empty VLAN in flow pattern
> > >
> > > Somnath Kotur (4):
> > >       net/bnxt: fix PF resource query
> > >       net/bnxt: fix lock init and destroy
> > >       net/bnxt: fix error handling in device start
> > >       net/bnxt: refactor init/uninit
> > >
> > > Souvik Dey (2):
> > >       net/i40e: fix VLAN stripping in VF
> > >       common/mlx5: fix storing synced MAC to internal table
> > >
> > > Sriharsha Basavapatna (1):
> > >       net/bnxt: fix max rings computation
> > >
> > > Stephen Hemminger (2):
> > >       test/rwlock: fix spelling and missing whitespace
> > >       test: fix terminal settings on exit
> > >
> > > Steve Yang (23):
> > >       ethdev: fix max Rx packet length check
> > >       app/testpmd: fix max Rx packet length for VLAN packets
> > >       net/dpaa: fix jumbo frame flag condition for MTU set
> > >       net/dpaa2: fix jumbo frame flag condition for MTU set
> > >       net/e1000: fix jumbo frame flag condition for MTU set
> > >       net/hns3: fix jumbo frame flag condition for MTU set
> > >       net/i40e: fix jumbo frame flag condition
> > >       net/iavf: fix jumbo frame flag condition
> > >       net/ice: fix jumbo frame flag condition
> > >       net/ipn3ke: fix jumbo frame flag condition for MTU set
> > >       net/octeontx: fix jumbo frame flag condition for MTU set
> > >       net/octeontx2: fix jumbo frame flag condition for MTU
> > >       net/qede: fix jumbo frame flag condition for MTU set
> > >       net/sfc: fix jumbo frame flag condition for MTU set
> > >       net/thunderx: fix jumbo frame flag condition for MTU set
> > >       net/ixgbe: fix jumbo frame flag condition
> > >       net/cxgbe: fix jumbo frame flag condition
> > >       net/axgbe: fix jumbo frame flag condition for MTU set
> > >       net/enetc: fix jumbo frame flag condition for MTU set
> > >       net/hinic: fix jumbo frame flag condition for MTU set
> > >       net/nfp: fix jumbo frame flag condition for MTU set
> > >       net/liquidio: fix jumbo frame flag condition for MTU set
> > >       app/testpmd: fix setting maximum packet length
> > >
> > > Suanming Mou (5):
> > >       net/mlx5: fix shared RSS and mark actions combination
> > >       net/mlx5: fix multi-process port ID
> > >       net/mlx5: fix crash on secondary process port close
> > >       net/mlx5: fix port attach in secondary process
> > >       net/mlx4: fix port attach in secondary process
> > >
> > > Sunil Kumar Kori (2):
> > >       net/octeontx2: fix corruption in segments list
> > >       net/octeontx: fix max Rx packet length
> > >
> > > Tal Shnaiderman (5):
> > >       bus/pci: ignore missing NUMA node on Windows
> > >       net/mlx5: fix constant array size
> > >       net/mlx5: fix device name size on Windows
> > >       net/mlx5: fix comparison sign in flow engine
> > >       common/mlx5: fix pointer cast on Windows
> > >
> > > Thomas Monjalon (3):
> > >       doc: fix figure numbering in graph guide
> > >       lib: fix doxygen for parameters of function pointers
> > >       ethdev: fix close failure handling
> > >
> > > Timothy McDaniel (1):
> > >       event/dlb: fix accessing uninitialized variables
> > >
> > > Ting Xu (1):
> > >       net/iavf: fix memory leak in large VF
> > >
> > > Tyler Retzlaff (2):
> > >       bus/pci: fix build with Windows SDK >= 10.0.20253
> > >       eal/windows: fix C++ compatibility
> > >
> > > Viacheslav Galaktionov (1):
> > >       net/sfc: fix generic byte statistics to exclude FCS bytes
> > >
> > > Viacheslav Ovsiienko (8):
> > >       net/mlx5: fix Verbs memory allocation callback
> > >       net/mlx5: fix buffer split offload advertising
> > >       doc: update flow mark action in mlx5 guide
> > >       net/mlx5: fix wire vport hint
> > >       app/testpmd: fix queue reconfig request on Rx split update
> > >       doc: fix supported feature table in mlx5 guide
> > >       doc: fix mark action zero value in mlx5 guide
> > >       net/mlx5: fix Tx queue size created with DevX
> > >
> > > Vladimir Medvedkin (2):
> > >       rib: fix insertion in some cases
> > >       crypto/qat: fix access to uninitialized variable
> > >
> > > Weifeng Li (1):
> > >       net/i40e: fix X722 for 802.1ad frames ability
> > >
> > > Wenjun Wu (1):
> > >       net/e1000: fix flow control mode setting
> > >
> > > Wisam Jaddo (1):
> > >       app/flow-perf: simplify objects initialization
> > >
> > > Xuan Ding (1):
> > >       net/iavf: fix symmetric flow rule creation
> > >
> > > Yicai Lu (1):
> > >       ip_frag: remove padding length of fragment
> > >
> > > Yongxin Liu (1):
> > >       usertools: fix binding built-in kernel driver
> > >
> > > Yunjian Wang (3):
> > >       eal/linux: fix handling of error events from epoll
> > >       net/bnxt: fix memory leak when mapping fails
> > >       net/mvneta: check allocation in Rx queue flush
> > >
> > > Yuri Chipchev (1):
> > >       net/mvpp2: fix stack corruption


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [RFC v4 1/4] ethdev: add meter PPS profile
  2021-03-02 14:33  0%             ` Dumitrescu, Cristian
@ 2021-03-02 18:10  3%               ` Matan Azrad
  2021-03-03 20:35  0%                 ` Dumitrescu, Cristian
  0 siblings, 1 reply; 200+ results
From: Matan Azrad @ 2021-03-02 18:10 UTC (permalink / raw)
  To: Dumitrescu, Cristian, Li Zhang, Dekel Peled, Ori Kam, Slava Ovsiienko
  Cc: dev, NBU-Contact-Thomas Monjalon, Raslan Darawsheh, mb,
	ajit.khaparde, Yigit, Ferruh, Singh, Jasvinder

Hi Cristian

Good discussion, thank you for that!

From: Dumitrescu, Cristian
> Hi Matan,
> 
> > -----Original Message-----
> > From: Matan Azrad <matan@nvidia.com>
> > Sent: Tuesday, March 2, 2021 12:37 PM
> > To: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>; Li Zhang
> > <lizh@nvidia.com>; Dekel Peled <dekelp@nvidia.com>; Ori Kam
> > <orika@nvidia.com>; Slava Ovsiienko <viacheslavo@nvidia.com>
> > Cc: dev@dpdk.org; NBU-Contact-Thomas Monjalon <thomas@monjalon.net>;
> > Raslan Darawsheh <rasland@nvidia.com>; mb@smartsharesystems.com;
> > ajit.khaparde@broadcom.com; Yigit, Ferruh <ferruh.yigit@intel.com>;
> > Singh, Jasvinder <jasvinder.singh@intel.com>
> > Subject: RE: [dpdk-dev] [RFC v4 1/4] ethdev: add meter PPS profile
> >
> > HI Cristian
> >
> > From: Dumitrescu, Cristian
> > > Hi Matan,
> > >
> > > > -----Original Message-----
> > > > From: Matan Azrad <matan@nvidia.com>
> > > > Sent: Tuesday, March 2, 2021 7:02 AM
> > > > To: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>; Li Zhang
> > > > <lizh@nvidia.com>; Dekel Peled <dekelp@nvidia.com>; Ori Kam
> > > > <orika@nvidia.com>; Slava Ovsiienko <viacheslavo@nvidia.com>
> > > > Cc: dev@dpdk.org; NBU-Contact-Thomas Monjalon
> > <thomas@monjalon.net>;
> > > > Raslan Darawsheh <rasland@nvidia.com>; mb@smartsharesystems.com;
> > > > ajit.khaparde@broadcom.com; Yigit, Ferruh
> > > > <ferruh.yigit@intel.com>; Singh, Jasvinder
> > > > <jasvinder.singh@intel.com>
> > > > Subject: RE: [dpdk-dev] [RFC v4 1/4] ethdev: add meter PPS profile
> > > >
> > > >
> > > >
> > > > Hi Cristian
> > > >
> > > > Thank you for review, please see inline.
> > > >
> > > > From: Dumitrescu, Cristian
> > > > > > From: dev <dev-bounces@dpdk.org> On Behalf Of Li Zhang
> > > > <snip>
> > > > > We had this same problem earlier for the rte_tm.h API, where
> > > > > people
> > > > asked to
> > > > > add support for WRED and shaper rates specified in packets to
> > > > > the existing
> > > > byte
> > > > > rate support. I am more than happy to support adding the same
> > > > > here, but please let's adopt the same solution here rather than
> > > > > invent a different approach.
> > > > >
> > > > > Please refer to struct rte_tm_wred_params and struct
> > > > rte_tm_shaper_params
> > > > > from rte_tm.h: the packets vs. bytes mode is explicitly
> > > > > specified through
> > > > the use
> > > > > of a flag called packet_mode that is added to the WRED and
> > > > > shaper
> > profile.
> > > > > When packet_mode is 0, the profile rates and bucket sizes are
> > > > > specified in bytes per second and bytes, respectively; when
> > > > > packet_mode is not 0, the profile rates and bucket sizes are
> > > > > specified in packets and packets per
> > > > second,
> > > > > respectively. The same profile parameters are used, no need to
> > > > > invent additional algorithms (such as srTCM - packet mode) or
> > > > > profile data
> > > > structures.
> > > > > Can we do the same here, please?
> > > >
> > > > This flag approach is very intuitive suggestion and it has advantages.
> > > >
> > > > The main problem with the flag approach is that it breaks ABI and API.
> > > > The profile structure size is changed due to a new field - ABI breakage.
> > > > The user must initialize the flag with zero to get old behavior -
> > > > API
> > breakage.
> > > >
> > >
> > > The rte_mtr API is experimental, all the API functions are correctly
> > > marked with __rte_experimental in rte_mtr.h file, so we can safely
> > > change the API
> > and
> > > the ABI breakage is not applicable here. Therefore, this problem
> > > does not
> > exist,
> > > correct?
> >
> > Yes, but still meter is not new API and I know that a lot of user uses
> > it for a long time.
> > Forcing them to change while we have good solution that don't force
> > it, looks me problematic.
> >
> 
> Not really, only 3 drivers are currently implementing this API.

The user is not the PMD, the PMDs are the providers.
I'm talking about all our customers, all the current DPDK based applications like OVS and others (I familiar with at least 4 ConnectX customer applications) which use the meter API and I'm sure there are more around the world.
  
> Even to these drivers, the required changes are none or extremely small: as Ajit
> was also noting, as the default value of 0 continues to represent the existing
> byte mode, all you have to do is make sure the new flag is set to zero in the
> profile params structure, which is already done implicitly in most places as this
> structure is initialized to all-zeros.

Are you sure all the world initialize the struct to 0? and also in this case, without new compilation, not all the struct will be zeroes(the old size is smaller). 

> A simple search exercise for struct rte_mtr_meter_profile is all that is needed.
> You also agreed the flag approach is very intuitive, hence better and nicer, with
> no additional work needed for you, so why not do it?

Do you understand that any current application that use the meter API must recompile the code of the application? Part of them also probably need to set the flag to 0....
Do you understand also the potential issues for the applications which are not aware to the change? Debug time, etc....

> > > > I don't see issues with Li suggestion, Do you think Li suggestion
> > > > has critical issues?
> > >
> > > It is probably better to keep the rte_mtr and the rte_tm APIs
> > > aligned, it simplifies the code maintenance and improves the user
> > > experience, which always pays off in the long run. Both APIs
> > > configure token buckets in either packet mode or byte mode, and it
> > > is desirable to have them work in the
> > same
> > > way. Also, I think we should avoid duplicating configuration data
> > > structures
> > for
> > > to support essentially the same algorithms (such as srTCM or trTCM)
> > > if we
> > can.
> > >
> >
> > Yes, but I don't think this motivation is critical.
> 
> I really disagree. As API maintainer, making every effort to keep the APIs clear
> and consistent is a critical task for me.

New pps profile is also clear and simple.

> We don't want to proliferate the API
> data structures and parameters if there is a good way to avoid it. Especially in
> cases like this, when the drivers are just beginning to pick up this (still
> experimental) API,  we have the rare chance to make things right and therefore
> we should do it. Please also keep in mind that, as more feature are added to
> the API, small corner cuts like this one that might not look like a big deal now,
> eventually come back as unnecessary complexity in the drivers themselves.

I don't see a complexity in the current suggestion.

> So, please, let's try to keep the quality of the APIs high.

Also by this way is high.


Look, the flag approach is also good and makes the job.
The two approaches are clear, simple and in high quality.
I don't care which one from the 2 to take but I want to be sure we are all understand the pros and cons.

If you understand my concern on flag approach and still insist to take the flag approach we will align.

And if we so, and we are going to break the API\ABI, we are going to introduce new meter policy API soon and there, breaking API can help, lets see in other discussion later.

One more point:
Currently, the meter_id is managed by the user, I think it is better to let the PMDs to manage the meter_id.

Searching the PMD meter handler inside the PMD is very expensive for the API call rate when the meter_id is managed by the user.

Same for profile_id.

Also all the rte_flow API including the shared action API taking the PMD management approach.

What do you think?

> > > The flag proposal is actually reducing the amount of work that you
> > > guys
> > need to
> > > do to implement your proposal. There is no negative impact to your
> > proposal
> > > and no big change, right?
> >
> > Yes you right, but the implementation effect is not our concern.
> >
> >
> > > > > This is a quick summary of the required API changes to add
> > > > > support for the packet mode, they are minimal:
> > > > > a) Introduce the packet_mode flag in the profile parameters data
> > > > structure.
> > > > > b) Change the description (comment) of the rate and bucket size
> > > > parameters in
> > > > > the meter profile parameters data structures to reflect that
> > > > > their values represents either bytes or packets, depending on
> > > > > the value of the new flag packet_mode from the same structure.
> > > > > c) Add the relevant capabilities: just search for "packet" in
> > > > > the rte_tm.h capabilities data structures and apply the same to
> > > > > the rte_mtr.h
> > > > capabilities,
> > > > > when applicable.
> > > >
> > > > > Regards,
> > > > > Cristian
> > >
> > > Regards,
> > > Cristian
> 
> Regards,
> Cristian

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [RFC v4 1/4] ethdev: add meter PPS profile
  2021-03-02 12:37  0%           ` Matan Azrad
@ 2021-03-02 14:33  0%             ` Dumitrescu, Cristian
  2021-03-02 18:10  3%               ` Matan Azrad
  0 siblings, 1 reply; 200+ results
From: Dumitrescu, Cristian @ 2021-03-02 14:33 UTC (permalink / raw)
  To: Matan Azrad, Li Zhang, Dekel Peled, Ori Kam, Slava Ovsiienko
  Cc: dev, NBU-Contact-Thomas Monjalon, Raslan Darawsheh, mb,
	ajit.khaparde, Yigit, Ferruh, Singh, Jasvinder

Hi Matan,

> -----Original Message-----
> From: Matan Azrad <matan@nvidia.com>
> Sent: Tuesday, March 2, 2021 12:37 PM
> To: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>; Li Zhang
> <lizh@nvidia.com>; Dekel Peled <dekelp@nvidia.com>; Ori Kam
> <orika@nvidia.com>; Slava Ovsiienko <viacheslavo@nvidia.com>
> Cc: dev@dpdk.org; NBU-Contact-Thomas Monjalon
> <thomas@monjalon.net>; Raslan Darawsheh <rasland@nvidia.com>;
> mb@smartsharesystems.com; ajit.khaparde@broadcom.com; Yigit, Ferruh
> <ferruh.yigit@intel.com>; Singh, Jasvinder <jasvinder.singh@intel.com>
> Subject: RE: [dpdk-dev] [RFC v4 1/4] ethdev: add meter PPS profile
> 
> HI Cristian
> 
> From: Dumitrescu, Cristian
> > Hi Matan,
> >
> > > -----Original Message-----
> > > From: Matan Azrad <matan@nvidia.com>
> > > Sent: Tuesday, March 2, 2021 7:02 AM
> > > To: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>; Li Zhang
> > > <lizh@nvidia.com>; Dekel Peled <dekelp@nvidia.com>; Ori Kam
> > > <orika@nvidia.com>; Slava Ovsiienko <viacheslavo@nvidia.com>
> > > Cc: dev@dpdk.org; NBU-Contact-Thomas Monjalon
> <thomas@monjalon.net>;
> > > Raslan Darawsheh <rasland@nvidia.com>; mb@smartsharesystems.com;
> > > ajit.khaparde@broadcom.com; Yigit, Ferruh <ferruh.yigit@intel.com>;
> > > Singh, Jasvinder <jasvinder.singh@intel.com>
> > > Subject: RE: [dpdk-dev] [RFC v4 1/4] ethdev: add meter PPS profile
> > >
> > >
> > >
> > > Hi Cristian
> > >
> > > Thank you for review, please see inline.
> > >
> > > From: Dumitrescu, Cristian
> > > > > From: dev <dev-bounces@dpdk.org> On Behalf Of Li Zhang
> > > <snip>
> > > > We had this same problem earlier for the rte_tm.h API, where people
> > > asked to
> > > > add support for WRED and shaper rates specified in packets to the
> > > > existing
> > > byte
> > > > rate support. I am more than happy to support adding the same here,
> > > > but please let's adopt the same solution here rather than invent a
> > > > different approach.
> > > >
> > > > Please refer to struct rte_tm_wred_params and struct
> > > rte_tm_shaper_params
> > > > from rte_tm.h: the packets vs. bytes mode is explicitly specified
> > > > through
> > > the use
> > > > of a flag called packet_mode that is added to the WRED and shaper
> profile.
> > > > When packet_mode is 0, the profile rates and bucket sizes are
> > > > specified in bytes per second and bytes, respectively; when
> > > > packet_mode is not 0, the profile rates and bucket sizes are
> > > > specified in packets and packets per
> > > second,
> > > > respectively. The same profile parameters are used, no need to
> > > > invent additional algorithms (such as srTCM - packet mode) or
> > > > profile data
> > > structures.
> > > > Can we do the same here, please?
> > >
> > > This flag approach is very intuitive suggestion and it has advantages.
> > >
> > > The main problem with the flag approach is that it breaks ABI and API.
> > > The profile structure size is changed due to a new field - ABI breakage.
> > > The user must initialize the flag with zero to get old behavior - API
> breakage.
> > >
> >
> > The rte_mtr API is experimental, all the API functions are correctly marked
> > with __rte_experimental in rte_mtr.h file, so we can safely change the API
> and
> > the ABI breakage is not applicable here. Therefore, this problem does not
> exist,
> > correct?
> 
> Yes, but still meter is not new API and I know that a lot of user uses it for a
> long time.
> Forcing them to change while we have good solution that don't force it, looks
> me problematic.
> 

Not really, only 3 drivers are currently implementing this API.

Even to these drivers, the required changes are none or extremely small: as Ajit was also noting, as the default value of 0 continues to represent the existing byte mode, all you have to do is make sure the new flag is set to zero in the profile params structure, which is already done implicitly in most places as this structure is initialized to all-zeros.

A simple search exercise for struct rte_mtr_meter_profile is all that is needed. You also agreed the flag approach is very intuitive, hence better and nicer, with no additional work needed for you, so why not do it?

> 
> > > I don't see issues with Li suggestion, Do you think Li suggestion has
> > > critical issues?
> >
> > It is probably better to keep the rte_mtr and the rte_tm APIs aligned, it
> > simplifies the code maintenance and improves the user experience, which
> > always pays off in the long run. Both APIs configure token buckets in either
> > packet mode or byte mode, and it is desirable to have them work in the
> same
> > way. Also, I think we should avoid duplicating configuration data structures
> for
> > to support essentially the same algorithms (such as srTCM or trTCM) if we
> can.
> >
> 
> Yes, but I don't think this motivation is critical.

I really disagree. As API maintainer, making every effort to keep the APIs clear and consistent is a critical task for me. We don't want to proliferate the API data structures and parameters if there is a good way to avoid it. Especially in cases like this, when the drivers are just beginning to pick up this (still experimental) API,  we have the rare chance to make things right and therefore we should do it. Please also keep in mind that, as more feature are added to the API, small corner cuts like this one that might not look like a big deal now, eventually come back as unnecessary complexity in the drivers themselves.

So, please, let's try to keep the quality of the APIs high.

> 
> > The flag proposal is actually reducing the amount of work that you guys
> need to
> > do to implement your proposal. There is no negative impact to your
> proposal
> > and no big change, right?
> 
> Yes you right, but the implementation effect is not our concern.
> 
> 
> > > > This is a quick summary of the required API changes to add support
> > > > for the packet mode, they are minimal:
> > > > a) Introduce the packet_mode flag in the profile parameters data
> > > structure.
> > > > b) Change the description (comment) of the rate and bucket size
> > > parameters in
> > > > the meter profile parameters data structures to reflect that their
> > > > values represents either bytes or packets, depending on the value of
> > > > the new flag packet_mode from the same structure.
> > > > c) Add the relevant capabilities: just search for "packet" in the
> > > > rte_tm.h capabilities data structures and apply the same to the
> > > > rte_mtr.h
> > > capabilities,
> > > > when applicable.
> > >
> > > > Regards,
> > > > Cristian
> >
> > Regards,
> > Cristian

Regards,
Cristian

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 2/2] eal: rename key opaque pointer in TLS API
  @ 2021-03-02 13:46  3%       ` Morten Brørup
  0 siblings, 0 replies; 200+ results
From: Morten Brørup @ 2021-03-02 13:46 UTC (permalink / raw)
  To: Tal Shnaiderman, dev
  Cc: NBU-Contact-Thomas Monjalon, pallavi.kadam, dmitry.kozliuk,
	navasile, dmitrym, david.marchand, anatoly.burakov,
	vladimir.medvedkin

> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Tal Shnaiderman
> Sent: Tuesday, March 2, 2021 2:13 PM
> 
> > Subject: RE: [dpdk-dev] [PATCH 2/2] eal: rename key opaque pointer in
> TLS
> > API
> >
> > External email: Use caution opening links or attachments
> >
> >
> > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Tal
> Shnaiderman
> > > Sent: Tuesday, March 2, 2021 12:25 PM
> > >
> > > rename the key opaque pointer from rte_tls_key to
> rte_thread_tls_key
> > > to avoid confusion with transport layer security.
> > >
> >
> > [...]
> >
> > > diff --git a/lib/librte_eal/include/rte_thread.h
> > > b/lib/librte_eal/include/rte_thread.h
> > > index 39737d1829..90bcb02554 100644
> > > --- a/lib/librte_eal/include/rte_thread.h
> > > +++ b/lib/librte_eal/include/rte_thread.h
> > > @@ -23,7 +23,7 @@ extern "C" {
> > >  /**
> > >   * TLS key type, an opaque pointer.
> > >   */
> > > -typedef struct eal_tls_key *rte_tls_key;
> > > +typedef struct eal_tls_key *rte_thread_tls_key;
> > >
> > >  /**
> > >   * Set core affinity of the current thread.
> > > @@ -63,7 +63,8 @@ void rte_thread_get_affinity(rte_cpuset_t
> *cpusetp);
> > >   */
> > >
> > >  __rte_experimental
> > > -int rte_thread_tls_key_create(rte_tls_key *key, void
> > > (*destructor)(void *));
> > > +int rte_thread_tls_key_create(rte_thread_tls_key *key,
> > > +                     void (*destructor)(void *));
> > >
> >
> > I agree with your argument for TLS confusion.
> >
> > How about rte_thread_key, instead of rte_thread_tls_key. Having both
> > thread and tls seems redundant.
> >
> 
> Thanks for the input, make sense, I'll change the name to your
> suggestion.
> 
> >
> > Here are some more thoughts... It is meant as a provocation only, not
> a real
> > suggestion:
> >
> > The DPDK API often uses the term "lcore" as the abstraction for
> threads, e.g.
> > rte_per_lcore.h refers to thread local storage using "per_lcore",
> while it is in
> > fact "per thread". Why use another terminology in the API for thread
> keys,
> > instead of sticking with the "lcore" naming tradition, e.g. struct
> > rte_lcore_key?
> >
> 
> You're right, but then there are some functions in eal_common_thread.c
> which uses the 'thread' terminology, maybe it's a good idea to rework
> it all to a single accepted term.
> 

Agreed. Especially after the introduction of service cores and non-EAL thread support, using "lcore" as a terminology for "thread" seems to be a legacy convention with decreasing relevance.

However, cleaning up that convention would totally break the ABI, and take quite an effort. So I guess it will remain wishful thinking only. :-)

But we can follow your lead and do it right with new ABIs.

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [RFC v4 1/4] ethdev: add meter PPS profile
  2021-03-02 12:29  3%         ` Dumitrescu, Cristian
@ 2021-03-02 12:37  0%           ` Matan Azrad
  2021-03-02 14:33  0%             ` Dumitrescu, Cristian
  0 siblings, 1 reply; 200+ results
From: Matan Azrad @ 2021-03-02 12:37 UTC (permalink / raw)
  To: Dumitrescu, Cristian, Li Zhang, Dekel Peled, Ori Kam, Slava Ovsiienko
  Cc: dev, NBU-Contact-Thomas Monjalon, Raslan Darawsheh, mb,
	ajit.khaparde, Yigit, Ferruh, Singh, Jasvinder

HI Cristian

From: Dumitrescu, Cristian
> Hi Matan,
> 
> > -----Original Message-----
> > From: Matan Azrad <matan@nvidia.com>
> > Sent: Tuesday, March 2, 2021 7:02 AM
> > To: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>; Li Zhang
> > <lizh@nvidia.com>; Dekel Peled <dekelp@nvidia.com>; Ori Kam
> > <orika@nvidia.com>; Slava Ovsiienko <viacheslavo@nvidia.com>
> > Cc: dev@dpdk.org; NBU-Contact-Thomas Monjalon <thomas@monjalon.net>;
> > Raslan Darawsheh <rasland@nvidia.com>; mb@smartsharesystems.com;
> > ajit.khaparde@broadcom.com; Yigit, Ferruh <ferruh.yigit@intel.com>;
> > Singh, Jasvinder <jasvinder.singh@intel.com>
> > Subject: RE: [dpdk-dev] [RFC v4 1/4] ethdev: add meter PPS profile
> >
> >
> >
> > Hi Cristian
> >
> > Thank you for review, please see inline.
> >
> > From: Dumitrescu, Cristian
> > > > From: dev <dev-bounces@dpdk.org> On Behalf Of Li Zhang
> > <snip>
> > > We had this same problem earlier for the rte_tm.h API, where people
> > asked to
> > > add support for WRED and shaper rates specified in packets to the
> > > existing
> > byte
> > > rate support. I am more than happy to support adding the same here,
> > > but please let's adopt the same solution here rather than invent a
> > > different approach.
> > >
> > > Please refer to struct rte_tm_wred_params and struct
> > rte_tm_shaper_params
> > > from rte_tm.h: the packets vs. bytes mode is explicitly specified
> > > through
> > the use
> > > of a flag called packet_mode that is added to the WRED and shaper profile.
> > > When packet_mode is 0, the profile rates and bucket sizes are
> > > specified in bytes per second and bytes, respectively; when
> > > packet_mode is not 0, the profile rates and bucket sizes are
> > > specified in packets and packets per
> > second,
> > > respectively. The same profile parameters are used, no need to
> > > invent additional algorithms (such as srTCM - packet mode) or
> > > profile data
> > structures.
> > > Can we do the same here, please?
> >
> > This flag approach is very intuitive suggestion and it has advantages.
> >
> > The main problem with the flag approach is that it breaks ABI and API.
> > The profile structure size is changed due to a new field - ABI breakage.
> > The user must initialize the flag with zero to get old behavior - API breakage.
> >
> 
> The rte_mtr API is experimental, all the API functions are correctly marked
> with __rte_experimental in rte_mtr.h file, so we can safely change the API and
> the ABI breakage is not applicable here. Therefore, this problem does not exist,
> correct?

Yes, but still meter is not new API and I know that a lot of user uses it for a long time.
Forcing them to change while we have good solution that don't force it, looks me problematic.
 

> > I don't see issues with Li suggestion, Do you think Li suggestion has
> > critical issues?
> 
> It is probably better to keep the rte_mtr and the rte_tm APIs aligned, it
> simplifies the code maintenance and improves the user experience, which
> always pays off in the long run. Both APIs configure token buckets in either
> packet mode or byte mode, and it is desirable to have them work in the same
> way. Also, I think we should avoid duplicating configuration data structures for
> to support essentially the same algorithms (such as srTCM or trTCM) if we can.
> 

Yes, but I don't think this motivation is critical.

> The flag proposal is actually reducing the amount of work that you guys need to
> do to implement your proposal. There is no negative impact to your proposal
> and no big change, right?

Yes you right, but the implementation effect is not our concern. 


> > > This is a quick summary of the required API changes to add support
> > > for the packet mode, they are minimal:
> > > a) Introduce the packet_mode flag in the profile parameters data
> > structure.
> > > b) Change the description (comment) of the rate and bucket size
> > parameters in
> > > the meter profile parameters data structures to reflect that their
> > > values represents either bytes or packets, depending on the value of
> > > the new flag packet_mode from the same structure.
> > > c) Add the relevant capabilities: just search for "packet" in the
> > > rte_tm.h capabilities data structures and apply the same to the
> > > rte_mtr.h
> > capabilities,
> > > when applicable.
> >
> > > Regards,
> > > Cristian
> 
> Regards,
> Cristian

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [RFC v4 1/4] ethdev: add meter PPS profile
  2021-03-02  7:02  4%       ` Matan Azrad
@ 2021-03-02 12:29  3%         ` Dumitrescu, Cristian
  2021-03-02 12:37  0%           ` Matan Azrad
  0 siblings, 1 reply; 200+ results
From: Dumitrescu, Cristian @ 2021-03-02 12:29 UTC (permalink / raw)
  To: Matan Azrad, Li Zhang, Dekel Peled, Ori Kam, Slava Ovsiienko
  Cc: dev, NBU-Contact-Thomas Monjalon, Raslan Darawsheh, mb,
	ajit.khaparde, Yigit, Ferruh, Singh, Jasvinder

Hi Matan,

> -----Original Message-----
> From: Matan Azrad <matan@nvidia.com>
> Sent: Tuesday, March 2, 2021 7:02 AM
> To: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>; Li Zhang
> <lizh@nvidia.com>; Dekel Peled <dekelp@nvidia.com>; Ori Kam
> <orika@nvidia.com>; Slava Ovsiienko <viacheslavo@nvidia.com>
> Cc: dev@dpdk.org; NBU-Contact-Thomas Monjalon
> <thomas@monjalon.net>; Raslan Darawsheh <rasland@nvidia.com>;
> mb@smartsharesystems.com; ajit.khaparde@broadcom.com; Yigit, Ferruh
> <ferruh.yigit@intel.com>; Singh, Jasvinder <jasvinder.singh@intel.com>
> Subject: RE: [dpdk-dev] [RFC v4 1/4] ethdev: add meter PPS profile
> 
> 
> 
> Hi Cristian
> 
> Thank you for review, please see inline.
> 
> From: Dumitrescu, Cristian
> > > From: dev <dev-bounces@dpdk.org> On Behalf Of Li Zhang
> <snip>
> > We had this same problem earlier for the rte_tm.h API, where people
> asked to
> > add support for WRED and shaper rates specified in packets to the existing
> byte
> > rate support. I am more than happy to support adding the same here, but
> > please let's adopt the same solution here rather than invent a different
> > approach.
> >
> > Please refer to struct rte_tm_wred_params and struct
> rte_tm_shaper_params
> > from rte_tm.h: the packets vs. bytes mode is explicitly specified through
> the use
> > of a flag called packet_mode that is added to the WRED and shaper profile.
> > When packet_mode is 0, the profile rates and bucket sizes are specified in
> > bytes per second and bytes, respectively; when packet_mode is not 0, the
> > profile rates and bucket sizes are specified in packets and packets per
> second,
> > respectively. The same profile parameters are used, no need to invent
> > additional algorithms (such as srTCM - packet mode) or profile data
> structures.
> > Can we do the same here, please?
> 
> This flag approach is very intuitive suggestion and it has advantages.
> 
> The main problem with the flag approach is that it breaks ABI and API.
> The profile structure size is changed due to a new field - ABI breakage.
> The user must initialize the flag with zero to get old behavior - API breakage.
> 

The rte_mtr API is experimental, all the API functions are correctly marked with __rte_experimental in rte_mtr.h file, so we can safely change the API and the ABI breakage is not applicable here. Therefore, this problem does not exist, correct?

> I don't see issues with Li suggestion, Do you think Li suggestion has critical
> issues?

It is probably better to keep the rte_mtr and the rte_tm APIs aligned, it simplifies the code maintenance and improves the user experience, which always pays off in the long run. Both APIs configure token buckets in either packet mode or byte mode, and it is desirable to have them work in the same way. Also, I think we should avoid duplicating configuration data structures for to support essentially the same algorithms (such as srTCM or trTCM) if we can.

The flag proposal is actually reducing the amount of work that you guys need to do to implement your proposal. There is no negative impact to your proposal and no big change, right?

> 
> > This is a quick summary of the required API changes to add support for the
> > packet mode, they are minimal:
> > a) Introduce the packet_mode flag in the profile parameters data
> structure.
> > b) Change the description (comment) of the rate and bucket size
> parameters in
> > the meter profile parameters data structures to reflect that their values
> > represents either bytes or packets, depending on the value of the new flag
> > packet_mode from the same structure.
> > c) Add the relevant capabilities: just search for "packet" in the rte_tm.h
> > capabilities data structures and apply the same to the rte_mtr.h
> capabilities,
> > when applicable.
> 
> > Regards,
> > Cristian

Regards,
Cristian

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] 20.11.1 patches review and test
  2021-03-02 10:52  0% ` Chen, BoX C
@ 2021-03-02 11:27  0%   ` Luca Boccassi
  2021-03-03  1:57  0%     ` Chen, BoX C
  0 siblings, 1 reply; 200+ results
From: Luca Boccassi @ 2021-03-02 11:27 UTC (permalink / raw)
  To: Chen, BoX C, stable
  Cc: dev, Walker, Benjamin, Govindharajan, Hariprasad, Mcnamara, John,
	Yu, PingX, Pei Zhang, Peng, Yuan, Chen, Zhaoyan

On Tue, 2021-03-02 at 10:52 +0000, Chen, BoX C wrote:
> Hi Luca,
> 
> Testing with dpdk v20.11.1 from Intel looks good. 
> 
> # Basic Intel(R) NIC testing
>   *PF(i40e, ixgbe): test scenarios including rte_flow/TSO/Jumboframe/checksum offload/Tunnel, etc. Listed but not all.
>     - No new issue are found. 
>                              
>   *VF(i40e,ixgbe): test scenarios including vf-rte_flow/TSO/Jumboframe/checksum offload/Tunnel, Listed but not all.
>     - No new issues are found.        
>               
>   *PF/VF(ice): test scenarios including Switch features/Flow Director/Advanced RSS/ACL/DCF/Flexible Descriptor and so on, Listed but not all.
>     - No new issues are found. one known issue: can't create 512 acl rules after creating a full mask switch rule. This issue is also occurred in dpdk 20.11 and no fix patch.
>                              
>   * Build or compile:  
>               * Build: cover the build test combination with latest GCC/Clang/ICC version and the popular OS revision such as Ubuntu20.04, CentOS 8.3 and so on. Listed but not all.
>                 - All passed.
>               
>               * Compile: cover the CFLAGES(O0/O1/O2/O3) with popular OS such as Ubuntu20.04 and CentOS 8.3. 
>                 - All passed.
>               
>   * Intel NIC single core/NIC performance: test scenarios including PF/VF single core performance test(AVX2+AVX512),RFC2544 Zero packet loss performance test and so on. Listed but not all.
>               - All passed. No big data drop. 
> 
>   * Power and IPsec: test scenarios including Telemetry/Empty Poll Lib/Priority Base Frequency and so on.
>     - All passed.                                
> 
>    
>  # Basic cryptodev and virtio testing
>     * Virtio: both function and performance test are covered. Such as PVP/Virtio_loopback/virtio-user loopback/virtio-net VM2VM perf testing/VMAWARE ESXI 7.0u1, etc.. Listed but not all.
>       - No new issues are found. two known issues:(1)The UDP fragmentation offload feature of Virtio-net device can’t be turned on in the VM, bugzilla has been submited:https://bugzilla.kernel.org/show_bug.cgi?id=207075
> 	                                              (2)vm2vm virtio-net cbdma enable test scp file between two vm random fail due to lost connection after vhost reconnect. This issue is also occurred in dpdk 20.11 and no fix patch.
>                                            
>    * Cryptodev: 
>               - Function test: test scenarios including Cryptodev API testing/CompressDev ISA-L/QAT/ZLIB PMD Testing/FIPS, etc. Listed but not all.
>                 - All passed.
>               - Performance test: test scenarios including Thoughput Performance /Cryptodev Latency, etc. Listed but not all.
>                 - No big data drop.
> 
> Regards,
> Chen Bo

Thank you!

Are there bugzilla tickets for the ICE and vm2vm issues?

> > -----Original Message-----
> > From: dev <dev-bounces@dpdk.org> On Behalf Of luca.boccassi@gmail.com
> > Sent: February 22, 2021 23:09
> > To: stable@dpdk.org
> > Cc: dev@dpdk.org; Abhishek Marathe <Abhishek.Marathe@microsoft.com>;
> > Akhil Goyal <akhil.goyal@nxp.com>; Ali Alnubani <alialnu@nvidia.com>;
> > Walker, Benjamin <benjamin.walker@intel.com>; David Christensen
> > <drc@linux.vnet.ibm.com>; Govindharajan, Hariprasad
> > <hariprasad.govindharajan@intel.com>; Hemant Agrawal
> > <hemant.agrawal@nxp.com>; Stokes, Ian <ian.stokes@intel.com>; Jerin
> > Jacob <jerinj@marvell.com>; Mcnamara, John <john.mcnamara@intel.com>;
> > Ju-Hyoung Lee <juhlee@microsoft.com>; Kevin Traynor
> > <ktraynor@redhat.com>; Luca Boccassi <bluca@debian.org>; Pei Zhang
> > <pezhang@redhat.com>; Yu, PingX <pingx.yu@intel.com>; Xu, Qian Q
> > <qian.q.xu@intel.com>; Raslan Darawsheh <rasland@nvidia.com>; Thomas
> > Monjalon <thomas@monjalon.net>; Peng, Yuan <yuan.peng@intel.com>;
> > Chen, Zhaoyan <zhaoyan.chen@intel.com>
> > Subject: [dpdk-dev] 20.11.1 patches review and test
> > 
> > Hi all,
> > 
> > Here is a list of patches targeted for stable release 20.11.1.
> > 
> > The planned date for the final release is the 8th of March.
> > 
> > Please help with testing and validation of your use cases and report any
> > issues/results with reply-all to this mail. For the final release the fixes and
> > reported validations will be added to the release notes.
> > 
> > A release candidate tarball can be found at:
> > 
> >     https://dpdk.org/browse/dpdk-stable/tag/?id=v20.11.1-rc1
> > 
> > These patches are located at branch 20.11 of dpdk-stable repo:
> >     https://dpdk.org/browse/dpdk-stable/
> > 
> > Thanks.
> > 
> > Luca Boccassi
> > 
> > ---
> > Ajit Khaparde (3):
> >       net/bnxt: fix cleanup on mutex init failure
> >       net/bnxt: fix format specifier for unsigned int
> >       net/bnxt: fix freeing mbuf
> > 
> > Alexander Kozyrev (4):
> >       net/mlx5: fix mbuf freeing in vectorized MPRQ
> >       net/mlx5: fix flow tag decompression
> >       net/mlx5: check FW miniCQE format capabilities
> >       net/mlx5: fix miniCQE configuration for Verbs
> > 
> > Alvin Zhang (9):
> >       net/ixgbe: detect failed VF MTU set
> >       net/i40e: fix Rx bytes statistics
> >       net/iavf: fix queue pairs configuration
> >       doc: fix RSS flow description in i40e guide
> >       net/i40e: fix returned code for RSS hardware failure
> >       net/ice: fix RSS lookup table initialization
> >       test: fix buffer overflow in Tx burst
> >       net/ixgbe: fix configuration of max frame size
> >       app/testpmd: fix key for RSS flow rule
> > 
> > Amit Bernstein (1):
> >       net/ena: fix Tx doorbell statistics
> > 
> > Anatoly Burakov (1):
> >       fbarray: fix overlap check
> > 
> > Andrew Boyer (5):
> >       net/ionic: do minor logging fixups
> >       net/ionic: fix link speed and autonegotiation
> >       net/ionic: allow separate L3 and L4 checksum offload
> >       net/ionic: fix up function attribute tags
> >       net/ionic: fix address handling in Tx
> > 
> > Ankur Dwivedi (1):
> >       test/event_crypto: set cipher operation in transform
> > 
> > Ashish Sadanandan (1):
> >       mbuf: add C++ include guard for dynamic fields header
> > 
> > Balazs Nemeth (1):
> >       net/qede: fix promiscuous enable
> > 
> > Beilei Xing (2):
> >       net/i40e: fix global register recovery
> >       net/i40e: fix flex payload rule conflict
> > 
> > Bernard Iremonger (1):
> >       doc: fix QinQ flow rules in testpmd guide
> > 
> > Bruce Richardson (29):
> >       ethdev: avoid blocking telemetry for link status
> >       build: provide suitable error for "both" libraries option
> >       eal: fix reciprocal header include
> >       telemetry: fix missing header include
> >       ethdev: fix missing header include
> >       net: fix missing header include
> >       mbuf: fix missing header include
> >       bitrate: fix missing header include
> >       rib: fix missing header includes
> >       vhost: fix missing header includes
> >       ipsec: fix missing header include
> >       fib: fix missing header includes
> >       table: fix missing header include
> >       pipeline: fix missing header includes
> >       metrics: fix variable declaration in header
> >       node: fix missing header include
> >       app: fix build with extra include paths
> >       build: force pkg-config for dependency detection
> >       power: create guest channel public header file
> >       power: make channel message functions public
> >       power: rename public structs
> >       power: rename constants
> >       power: export guest channel header file
> >       power: clean up includes
> >       eal: fix MCS lock header include
> >       eal: fix internal ABI tag with clang
> >       power: fix missing header includes
> >       rib: fix missing header include
> >       eal: fix automatic loading of drivers as shared libs
> > 
> > Chengchang Tang (7):
> >       net/hns3: fix register length when dumping registers
> >       net/hns3: fix data overwriting during register dump
> >       net/hns3: fix dump register out of range
> >       net/hns3: fix interrupt resources in Rx interrupt mode
> >       net/hns3: fix firmware exceptions by concurrent commands
> >       net/hns3: fix VF reset on mailbox failure
> >       net/hns3: fix stats flip overflow
> > 
> > Chengwen Feng (3):
> >       net/hns3: fix VF query link status in dev init
> >       net/hns3: remove MPLS from supported flow items
> >       net/hns3: fix flow director rule residue on malloc failure
> > 
> > Ciara Power (3):
> >       app/crypto-perf: fix spelling in output
> >       app/crypto-perf: fix latency CSV output
> >       app/crypto-perf: fix CSV output format
> > 
> > Cristian Dumitrescu (1):
> >       examples/pipeline: fix CLI parsing crash
> > 
> > Dapeng Yu (4):
> >       net/ixgbe: fix flex bytes flow director rule
> >       net/ice: check Rx queue number on RSS init
> >       net/ixgbe: disable NFS filtering
> >       app/testpmd: avoid exit without terminal restore
> > 
> > David Marchand (3):
> >       net/hinic: restore vectorised code
> >       examples/pipeline: fix VXLAN script permission
> >       mbuf: remove unneeded atomic generic header include
> > 
> > Dekel Peled (8):
> >       net/mlx5: fix shared age action validation
> >       net/mlx5: fix hairpin flow split decision
> >       net/mlx5: fix flow split combined with counter
> >       net/mlx5: fix flow split combined with age action
> >       net/mlx5: fix shared RSS translation and cleanup
> >       app/testpmd: support shared age action query
> >       net/mlx5: fix shared RSS capability check
> >       net/mlx5: validate hash Rx queue pointer
> > 
> > Dmitry Kozlyuk (4):
> >       eal/windows: fix build with MinGW-w64 8
> >       bus/pci: fix build with MinGW-w64 8
> >       bus/pci: fix hardware ID limit on Windows
> >       build: fix linker flags on Windows
> > 
> > Eugeny Parshutin (1):
> >       doc: add vtune profiling config to prog guide
> > 
> > Fan Zhang (1):
> >       crypto/qat: fix digest in buffer
> > 
> > Fei Chen (1):
> >       vhost: fix vid allocation race
> > 
> > Feifei Wang (7):
> >       test/ring: reduce duration of performance tests
> >       app/eventdev: adjust event count order for pipeline test
> >       app/eventdev: remove redundant enqueue in burst Tx
> >       examples/eventdev: check CPU core enabling
> >       examples/eventdev: add info output for main core
> >       examples/eventdev: move ethdev stop to the end
> >       app/eventdev: fix SMP barrier in performance test
> > 
> > Ferruh Yigit (13):
> >       app/procinfo: fix _filters stats reporting
> >       app/procinfo: fix check on xstats-ids
> >       app/procinfo: remove useless memset
> >       app/procinfo: remove useless assignment
> >       net/pcap: remove local variable shadowing outer one
> >       net/bonding: remove local variable shadowing outer one
> >       net/af_xdp: remove useless assignment
> >       net/bnxt: remove redundant return
> >       app/crypto-perf: remove always true condition
> >       net/avp: remove always true condition
> >       net/pcap: fix byte stats for drop Tx
> >       net/pcap: fix infinite Rx with large files
> >       app/testpmd: fix help of metering commands
> > 
> > Gaetan Rivet (2):
> >       net/bonding: fix port id validity check on parsing
> >       net/bonding: fix PCI address comparison on non-PCI ports
> > 
> > Gagandeep Singh (2):
> >       test/ipsec: fix result code for not supported
> >       crypto/dpaa2_sec: fix memory allocation check
> > 
> > George Prekas (1):
> >       app/testpmd: fix IP checksum calculation
> > 
> > Gregory Etelson (5):
> >       net/mlx5: fix Direct Verbs flow descriptor allocation
> >       app/testpmd: release flows left before port stop
> >       net/mlx5: fix tunnel rules validation on VF representor
> >       net/mlx5: fix mark action in active tunnel offload
> >       net/mlx5: fix drop action in tunnel offload mode
> > 
> > Guy Kaneti (1):
> >       regex/octeontx2: fix PCI table overflow
> > 
> > Haiyue Wang (2):
> >       net/ice: drain out DCF AdminQ command queue
> >       net/ixgbe: fix UDP zero checksum on x86
> > 
> > Harman Kalra (1):
> >       examples/l3fwd: remove limitation on Tx queue count
> > 
> > Harry van Haaren (1):
> >       eventdev: fix a return value comment
> > 
> > Heinrich Kuhn (1):
> >       net/nfp: read chip model from PluDevice register
> > 
> > Hemant Agrawal (1):
> >       app/procinfo: fix security context info
> > 
> > Hongbo Zheng (1):
> >       net/hns3: use new opcode for clearing hardware resource
> > 
> > Huisong Li (7):
> >       app/testpmd: fix queue stats mapping configuration
> >       net/hns3: fix xstats with id and names
> >       net/hns3: fix error code in xstats
> >       net/hns3: fix Rx/Tx errors stats
> >       net/hns3: fix link status change from firmware
> >       net/hns3: validate requested maximum Rx frame length
> >       net/hns3: fix query order of link status and link info
> > 
> > Hyong Youb Kim (2):
> >       net/enic: fix filter type used for flow API
> >       net/enic: fix filter log message
> > 
> > Ido Segev (1):
> >       net/ena: flush Rx buffers memory pool cache
> > 
> > Igor Chauskin (2):
> >       net/ena: fix Tx SQ free space assessment
> >       net/ena: prevent double doorbell
> > 
> > Igor Ryzhov (1):
> >       net/i40e: fix stats counters
> > 
> > Ivan Malov (11):
> >       common/sfc_efx/base: remove warnings about inline specifiers
> >       common/sfc_efx/base: fix signed/unsigned mismatch warnings
> >       common/sfc_efx/base: support alternative MAE match fields
> >       common/sfc_efx/base: update MCDI headers for MAE privilege
> >       common/sfc_efx/base: check for MAE privilege
> >       common/sfc_efx/base: fix MPORT related byte order handling
> >       common/sfc_efx/base: fix MAE match spec validation helper
> >       common/sfc_efx/base: fix MAE match spec class comparison API
> >       common/sfc_efx/base: enhance field ID check in field set API
> >       common/sfc_efx/base: apply mask to value on match field set
> >       net/sfc: fix TSO and checksum offloads for EF10
> > 
> > Jiawei Wang (4):
> >       net/mlx5: fix unnecessary checking for RSS action
> >       app/testpmd: fix packets dump overlapping
> >       net/mlx5: fix count actions query in sample flow
> >       net/mlx5: fix counter and age flow action validation
> > 
> > Jiawei Zhu (1):
> >       net/virtio-user: fix run closing stdin and close callfd
> > 
> > Jingjing Wu (1):
> >       net/iavf: fix vector mapping with queue
> > 
> > John McNamara (1):
> >       license: add licenses for exception cases
> > 
> > Joyce Kong (1):
> >       eal/arm: fix debug build with gcc for 128-bit atomics
> > 
> > Junfeng Guo (1):
> >       net/iavf: fix GTPU UL and DL support for flow director
> > 
> > Kalesh AP (4):
> >       net/bnxt: release HWRM lock in error
> >       net/bnxt: propagate FW command failure to application
> >       net/bnxt: fix VNIC RSS configure function
> >       net/bnxt: fix FW version log
> > 
> > Karra Satwik (2):
> >       net/cxgbe: accept VLAN flow items without ethertype
> >       app/testpmd: fix start index for showing FEC array
> > 
> > Lance Richardson (10):
> >       net/bnxt: disable end of packet padding for Rx
> >       net/bnxt: limit Rx representor packets per poll
> >       net/bnxt: fix doorbell write ordering
> >       net/bnxt: fix outer UDP checksum Rx offload capability
> >       net/bnxt: make offload flags mapping per-ring
> >       net/bnxt: set correct checksum status in mbuf
> >       net/bnxt: fix packet type index calculation
> >       net/bnxt: fix null termination of Rx mbuf chain
> >       net/bnxt: fix fallback mbuf allocation logic
> >       net/bnxt: fix Rx completion ring size calculation
> > 
> > Leyi Rong (1):
> >       net/ice: enlarge Rx queue rearm threshold to 64
> > 
> > Lijun Ou (6):
> >       net/hns3: fix interception with flow director
> >       net/hns3: fix memory leak on secondary process exit
> >       net/hns3: adjust some comments
> >       net/hns3: adjust format specifier for enum
> >       doc: fix product link in hns3 guide
> >       net/hns3: fix RSS indirection table size
> > 
> > Liron Himi (5):
> >       net/octeontx2: fix PF flow action for Tx
> >       net/mvpp2: remove debug log on fast-path
> >       net/mvpp2: remove VLAN flush
> >       net/mvpp2: remove CRC length from MRU validation
> >       net/mvpp2: fix frame size checking
> > 
> > Long Li (1):
> >       net/netvsc: ignore unsupported packet on sync command
> > 
> > Lukasz Wojciechowski (1):
> >       test/distributor: fix return buffer queue overload
> > 
> > Marvin Liu (1):
> >       vhost: fix packed ring dequeue offloading
> > 
> > Matan Azrad (1):
> >       vdpa/mlx5: fix configuration mutex cleanup
> > 
> > Maxime Coquelin (3):
> >       net/virtio: add missing backend features negotiation
> >       net/virtio: fix memory init with vDPA backend
> >       net/virtio: fix getting old status on reconnect
> > 
> > Michael Baum (7):
> >       net/mlx5: fix leak on Rx queue creation failure
> >       net/mlx5: fix leak on Tx queue creation failure
> >       common/mlx5: fix completion queue entry size configuration
> >       net/mlx5: remove CQE padding device argument
> >       net/mlx5: fix leak on ASO SQ creation failure
> >       net/mlx4: fix device detach
> >       net/mlx4: fix handling of probing failure
> > 
> > Michal Krawczyk (1):
> >       net/ena: validate Rx req ID upon acquiring descriptor
> > 
> > Min Hu (Connor) (3):
> >       net/hns3: fix FEC state query
> >       net/hns3: fix crash with multi-process
> >       doc: add FEC to NIC features
> > 
> > Murphy Yang (6):
> >       net/ice: fix outer UDP Tx checksum offload
> >       net/i40e: fix L4 checksum flag
> >       net/ice: fix outer checksum flags
> >       net/iavf: fix conflicting RSS combination rules
> >       net/ice: disable IPv4 checksum offload in vector Tx
> >       net/i40e: add null input checks
> > 
> > Nick Connolly (2):
> >       eal/windows: fix debug build with MinGW
> >       eal/windows: fix vfprintf warning with clang
> > 
> > Olivier Matz (5):
> >       build: fix plugin load on static build
> >       net/virtio-user: fix protocol features advertising
> >       service: propagate init error in EAL
> >       test/mcslock: remove unneeded per lcore copy
> >       mempool: fix panic on dump or audit
> > 
> > Ophir Munk (4):
> >       net/mlx5: fix freeing packet pacing
> >       net/mlx5: fix flow action destroy wrapper
> >       net/mlx5: fix flow operation wrapper per OS
> >       net/mlx5: unify operations for all OS
> > 
> > Ori Kam (3):
> >       regex/mlx5: fix memory rule alignment
> >       regex/mlx5: fix support for group id
> >       regex/mlx5: fix number of supported queues
> > 
> > Qi Zhang (4):
> >       doc: fix some statements for ice vector PMD
> >       net/ice/base: fix tunnel destroy
> >       net/ice/base: fix null pointer dereference
> >       net/ice/base: fix memory handling
> > 
> > Ruifeng Wang (4):
> >       lpm: fix vector IPv4 lookup
> >       net/hns3: fix build with SVE
> >       net/octeontx: fix build with SVE
> >       common/octeontx2: fix build with SVE
> > 
> > Samik Gupta (2):
> >       net/bnxt: fix Rx rings in RSS redirection table
> >       net/bnxt: fix VNIC config on Rx queue stop
> > 
> > Shiri Kuzin (2):
> >       net/mlx5: fix VXLAN decap on non-VXLAN flow
> >       net/mlx5: refuse empty VLAN in flow pattern
> > 
> > Somnath Kotur (4):
> >       net/bnxt: fix PF resource query
> >       net/bnxt: fix lock init and destroy
> >       net/bnxt: fix error handling in device start
> >       net/bnxt: refactor init/uninit
> > 
> > Souvik Dey (2):
> >       net/i40e: fix VLAN stripping in VF
> >       common/mlx5: fix storing synced MAC to internal table
> > 
> > Sriharsha Basavapatna (1):
> >       net/bnxt: fix max rings computation
> > 
> > Stephen Hemminger (2):
> >       test/rwlock: fix spelling and missing whitespace
> >       test: fix terminal settings on exit
> > 
> > Steve Yang (23):
> >       ethdev: fix max Rx packet length check
> >       app/testpmd: fix max Rx packet length for VLAN packets
> >       net/dpaa: fix jumbo frame flag condition for MTU set
> >       net/dpaa2: fix jumbo frame flag condition for MTU set
> >       net/e1000: fix jumbo frame flag condition for MTU set
> >       net/hns3: fix jumbo frame flag condition for MTU set
> >       net/i40e: fix jumbo frame flag condition
> >       net/iavf: fix jumbo frame flag condition
> >       net/ice: fix jumbo frame flag condition
> >       net/ipn3ke: fix jumbo frame flag condition for MTU set
> >       net/octeontx: fix jumbo frame flag condition for MTU set
> >       net/octeontx2: fix jumbo frame flag condition for MTU
> >       net/qede: fix jumbo frame flag condition for MTU set
> >       net/sfc: fix jumbo frame flag condition for MTU set
> >       net/thunderx: fix jumbo frame flag condition for MTU set
> >       net/ixgbe: fix jumbo frame flag condition
> >       net/cxgbe: fix jumbo frame flag condition
> >       net/axgbe: fix jumbo frame flag condition for MTU set
> >       net/enetc: fix jumbo frame flag condition for MTU set
> >       net/hinic: fix jumbo frame flag condition for MTU set
> >       net/nfp: fix jumbo frame flag condition for MTU set
> >       net/liquidio: fix jumbo frame flag condition for MTU set
> >       app/testpmd: fix setting maximum packet length
> > 
> > Suanming Mou (5):
> >       net/mlx5: fix shared RSS and mark actions combination
> >       net/mlx5: fix multi-process port ID
> >       net/mlx5: fix crash on secondary process port close
> >       net/mlx5: fix port attach in secondary process
> >       net/mlx4: fix port attach in secondary process
> > 
> > Sunil Kumar Kori (2):
> >       net/octeontx2: fix corruption in segments list
> >       net/octeontx: fix max Rx packet length
> > 
> > Tal Shnaiderman (5):
> >       bus/pci: ignore missing NUMA node on Windows
> >       net/mlx5: fix constant array size
> >       net/mlx5: fix device name size on Windows
> >       net/mlx5: fix comparison sign in flow engine
> >       common/mlx5: fix pointer cast on Windows
> > 
> > Thomas Monjalon (3):
> >       doc: fix figure numbering in graph guide
> >       lib: fix doxygen for parameters of function pointers
> >       ethdev: fix close failure handling
> > 
> > Timothy McDaniel (1):
> >       event/dlb: fix accessing uninitialized variables
> > 
> > Ting Xu (1):
> >       net/iavf: fix memory leak in large VF
> > 
> > Tyler Retzlaff (2):
> >       bus/pci: fix build with Windows SDK >= 10.0.20253
> >       eal/windows: fix C++ compatibility
> > 
> > Viacheslav Galaktionov (1):
> >       net/sfc: fix generic byte statistics to exclude FCS bytes
> > 
> > Viacheslav Ovsiienko (8):
> >       net/mlx5: fix Verbs memory allocation callback
> >       net/mlx5: fix buffer split offload advertising
> >       doc: update flow mark action in mlx5 guide
> >       net/mlx5: fix wire vport hint
> >       app/testpmd: fix queue reconfig request on Rx split update
> >       doc: fix supported feature table in mlx5 guide
> >       doc: fix mark action zero value in mlx5 guide
> >       net/mlx5: fix Tx queue size created with DevX
> > 
> > Vladimir Medvedkin (2):
> >       rib: fix insertion in some cases
> >       crypto/qat: fix access to uninitialized variable
> > 
> > Weifeng Li (1):
> >       net/i40e: fix X722 for 802.1ad frames ability
> > 
> > Wenjun Wu (1):
> >       net/e1000: fix flow control mode setting
> > 
> > Wisam Jaddo (1):
> >       app/flow-perf: simplify objects initialization
> > 
> > Xuan Ding (1):
> >       net/iavf: fix symmetric flow rule creation
> > 
> > Yicai Lu (1):
> >       ip_frag: remove padding length of fragment
> > 
> > Yongxin Liu (1):
> >       usertools: fix binding built-in kernel driver
> > 
> > Yunjian Wang (3):
> >       eal/linux: fix handling of error events from epoll
> >       net/bnxt: fix memory leak when mapping fails
> >       net/mvneta: check allocation in Rx queue flush
> > 
> > Yuri Chipchev (1):
> >       net/mvpp2: fix stack corruption


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] 20.11.1 patches review and test
  2021-02-22 15:09  1% [dpdk-dev] 20.11.1 patches review and test luca.boccassi
                   ` (2 preceding siblings ...)
  2021-03-02  6:23  0% ` Kalesh Anakkur Purayil
@ 2021-03-02 10:52  0% ` Chen, BoX C
  2021-03-02 11:27  0%   ` Luca Boccassi
  2021-03-09 10:36  0% ` Govindharajan, Hariprasad
  4 siblings, 1 reply; 200+ results
From: Chen, BoX C @ 2021-03-02 10:52 UTC (permalink / raw)
  To: luca.boccassi, stable
  Cc: dev, Abhishek Marathe, Akhil Goyal, Ali Alnubani, Walker,
	Benjamin, David Christensen, Govindharajan, Hariprasad,
	Hemant Agrawal, Stokes, Ian, Jerin Jacob, Mcnamara, John,
	Ju-Hyoung Lee, Kevin Traynor, Luca Boccassi, Pei Zhang, Yu,
	PingX, Xu, Qian Q, Raslan Darawsheh, Thomas Monjalon, Peng, Yuan,
	Chen, Zhaoyan

Hi Luca,

Testing with dpdk v20.11.1 from Intel looks good. 

# Basic Intel(R) NIC testing
  *PF(i40e, ixgbe): test scenarios including rte_flow/TSO/Jumboframe/checksum offload/Tunnel, etc. Listed but not all.
    - No new issue are found. 
                             
  *VF(i40e,ixgbe): test scenarios including vf-rte_flow/TSO/Jumboframe/checksum offload/Tunnel, Listed but not all.
    - No new issues are found.        
              
  *PF/VF(ice): test scenarios including Switch features/Flow Director/Advanced RSS/ACL/DCF/Flexible Descriptor and so on, Listed but not all.
    - No new issues are found. one known issue: can't create 512 acl rules after creating a full mask switch rule. This issue is also occurred in dpdk 20.11 and no fix patch.
                             
  * Build or compile:  
              * Build: cover the build test combination with latest GCC/Clang/ICC version and the popular OS revision such as Ubuntu20.04, CentOS 8.3 and so on. Listed but not all.
                - All passed.
              
              * Compile: cover the CFLAGES(O0/O1/O2/O3) with popular OS such as Ubuntu20.04 and CentOS 8.3. 
                - All passed.
              
  * Intel NIC single core/NIC performance: test scenarios including PF/VF single core performance test(AVX2+AVX512),RFC2544 Zero packet loss performance test and so on. Listed but not all.
              - All passed. No big data drop. 

  * Power and IPsec: test scenarios including Telemetry/Empty Poll Lib/Priority Base Frequency and so on.
    - All passed.                                

   
 # Basic cryptodev and virtio testing
    * Virtio: both function and performance test are covered. Such as PVP/Virtio_loopback/virtio-user loopback/virtio-net VM2VM perf testing/VMAWARE ESXI 7.0u1, etc.. Listed but not all.
      - No new issues are found. two known issues:(1)The UDP fragmentation offload feature of Virtio-net device can’t be turned on in the VM, bugzilla has been submited:https://bugzilla.kernel.org/show_bug.cgi?id=207075
	                                              (2)vm2vm virtio-net cbdma enable test scp file between two vm random fail due to lost connection after vhost reconnect. This issue is also occurred in dpdk 20.11 and no fix patch.
                                           
   * Cryptodev: 
              - Function test: test scenarios including Cryptodev API testing/CompressDev ISA-L/QAT/ZLIB PMD Testing/FIPS, etc. Listed but not all.
                - All passed.
              - Performance test: test scenarios including Thoughput Performance /Cryptodev Latency, etc. Listed but not all.
                - No big data drop.

Regards,
Chen Bo

> -----Original Message-----
> From: dev <dev-bounces@dpdk.org> On Behalf Of luca.boccassi@gmail.com
> Sent: February 22, 2021 23:09
> To: stable@dpdk.org
> Cc: dev@dpdk.org; Abhishek Marathe <Abhishek.Marathe@microsoft.com>;
> Akhil Goyal <akhil.goyal@nxp.com>; Ali Alnubani <alialnu@nvidia.com>;
> Walker, Benjamin <benjamin.walker@intel.com>; David Christensen
> <drc@linux.vnet.ibm.com>; Govindharajan, Hariprasad
> <hariprasad.govindharajan@intel.com>; Hemant Agrawal
> <hemant.agrawal@nxp.com>; Stokes, Ian <ian.stokes@intel.com>; Jerin
> Jacob <jerinj@marvell.com>; Mcnamara, John <john.mcnamara@intel.com>;
> Ju-Hyoung Lee <juhlee@microsoft.com>; Kevin Traynor
> <ktraynor@redhat.com>; Luca Boccassi <bluca@debian.org>; Pei Zhang
> <pezhang@redhat.com>; Yu, PingX <pingx.yu@intel.com>; Xu, Qian Q
> <qian.q.xu@intel.com>; Raslan Darawsheh <rasland@nvidia.com>; Thomas
> Monjalon <thomas@monjalon.net>; Peng, Yuan <yuan.peng@intel.com>;
> Chen, Zhaoyan <zhaoyan.chen@intel.com>
> Subject: [dpdk-dev] 20.11.1 patches review and test
> 
> Hi all,
> 
> Here is a list of patches targeted for stable release 20.11.1.
> 
> The planned date for the final release is the 8th of March.
> 
> Please help with testing and validation of your use cases and report any
> issues/results with reply-all to this mail. For the final release the fixes and
> reported validations will be added to the release notes.
> 
> A release candidate tarball can be found at:
> 
>     https://dpdk.org/browse/dpdk-stable/tag/?id=v20.11.1-rc1
> 
> These patches are located at branch 20.11 of dpdk-stable repo:
>     https://dpdk.org/browse/dpdk-stable/
> 
> Thanks.
> 
> Luca Boccassi
> 
> ---
> Ajit Khaparde (3):
>       net/bnxt: fix cleanup on mutex init failure
>       net/bnxt: fix format specifier for unsigned int
>       net/bnxt: fix freeing mbuf
> 
> Alexander Kozyrev (4):
>       net/mlx5: fix mbuf freeing in vectorized MPRQ
>       net/mlx5: fix flow tag decompression
>       net/mlx5: check FW miniCQE format capabilities
>       net/mlx5: fix miniCQE configuration for Verbs
> 
> Alvin Zhang (9):
>       net/ixgbe: detect failed VF MTU set
>       net/i40e: fix Rx bytes statistics
>       net/iavf: fix queue pairs configuration
>       doc: fix RSS flow description in i40e guide
>       net/i40e: fix returned code for RSS hardware failure
>       net/ice: fix RSS lookup table initialization
>       test: fix buffer overflow in Tx burst
>       net/ixgbe: fix configuration of max frame size
>       app/testpmd: fix key for RSS flow rule
> 
> Amit Bernstein (1):
>       net/ena: fix Tx doorbell statistics
> 
> Anatoly Burakov (1):
>       fbarray: fix overlap check
> 
> Andrew Boyer (5):
>       net/ionic: do minor logging fixups
>       net/ionic: fix link speed and autonegotiation
>       net/ionic: allow separate L3 and L4 checksum offload
>       net/ionic: fix up function attribute tags
>       net/ionic: fix address handling in Tx
> 
> Ankur Dwivedi (1):
>       test/event_crypto: set cipher operation in transform
> 
> Ashish Sadanandan (1):
>       mbuf: add C++ include guard for dynamic fields header
> 
> Balazs Nemeth (1):
>       net/qede: fix promiscuous enable
> 
> Beilei Xing (2):
>       net/i40e: fix global register recovery
>       net/i40e: fix flex payload rule conflict
> 
> Bernard Iremonger (1):
>       doc: fix QinQ flow rules in testpmd guide
> 
> Bruce Richardson (29):
>       ethdev: avoid blocking telemetry for link status
>       build: provide suitable error for "both" libraries option
>       eal: fix reciprocal header include
>       telemetry: fix missing header include
>       ethdev: fix missing header include
>       net: fix missing header include
>       mbuf: fix missing header include
>       bitrate: fix missing header include
>       rib: fix missing header includes
>       vhost: fix missing header includes
>       ipsec: fix missing header include
>       fib: fix missing header includes
>       table: fix missing header include
>       pipeline: fix missing header includes
>       metrics: fix variable declaration in header
>       node: fix missing header include
>       app: fix build with extra include paths
>       build: force pkg-config for dependency detection
>       power: create guest channel public header file
>       power: make channel message functions public
>       power: rename public structs
>       power: rename constants
>       power: export guest channel header file
>       power: clean up includes
>       eal: fix MCS lock header include
>       eal: fix internal ABI tag with clang
>       power: fix missing header includes
>       rib: fix missing header include
>       eal: fix automatic loading of drivers as shared libs
> 
> Chengchang Tang (7):
>       net/hns3: fix register length when dumping registers
>       net/hns3: fix data overwriting during register dump
>       net/hns3: fix dump register out of range
>       net/hns3: fix interrupt resources in Rx interrupt mode
>       net/hns3: fix firmware exceptions by concurrent commands
>       net/hns3: fix VF reset on mailbox failure
>       net/hns3: fix stats flip overflow
> 
> Chengwen Feng (3):
>       net/hns3: fix VF query link status in dev init
>       net/hns3: remove MPLS from supported flow items
>       net/hns3: fix flow director rule residue on malloc failure
> 
> Ciara Power (3):
>       app/crypto-perf: fix spelling in output
>       app/crypto-perf: fix latency CSV output
>       app/crypto-perf: fix CSV output format
> 
> Cristian Dumitrescu (1):
>       examples/pipeline: fix CLI parsing crash
> 
> Dapeng Yu (4):
>       net/ixgbe: fix flex bytes flow director rule
>       net/ice: check Rx queue number on RSS init
>       net/ixgbe: disable NFS filtering
>       app/testpmd: avoid exit without terminal restore
> 
> David Marchand (3):
>       net/hinic: restore vectorised code
>       examples/pipeline: fix VXLAN script permission
>       mbuf: remove unneeded atomic generic header include
> 
> Dekel Peled (8):
>       net/mlx5: fix shared age action validation
>       net/mlx5: fix hairpin flow split decision
>       net/mlx5: fix flow split combined with counter
>       net/mlx5: fix flow split combined with age action
>       net/mlx5: fix shared RSS translation and cleanup
>       app/testpmd: support shared age action query
>       net/mlx5: fix shared RSS capability check
>       net/mlx5: validate hash Rx queue pointer
> 
> Dmitry Kozlyuk (4):
>       eal/windows: fix build with MinGW-w64 8
>       bus/pci: fix build with MinGW-w64 8
>       bus/pci: fix hardware ID limit on Windows
>       build: fix linker flags on Windows
> 
> Eugeny Parshutin (1):
>       doc: add vtune profiling config to prog guide
> 
> Fan Zhang (1):
>       crypto/qat: fix digest in buffer
> 
> Fei Chen (1):
>       vhost: fix vid allocation race
> 
> Feifei Wang (7):
>       test/ring: reduce duration of performance tests
>       app/eventdev: adjust event count order for pipeline test
>       app/eventdev: remove redundant enqueue in burst Tx
>       examples/eventdev: check CPU core enabling
>       examples/eventdev: add info output for main core
>       examples/eventdev: move ethdev stop to the end
>       app/eventdev: fix SMP barrier in performance test
> 
> Ferruh Yigit (13):
>       app/procinfo: fix _filters stats reporting
>       app/procinfo: fix check on xstats-ids
>       app/procinfo: remove useless memset
>       app/procinfo: remove useless assignment
>       net/pcap: remove local variable shadowing outer one
>       net/bonding: remove local variable shadowing outer one
>       net/af_xdp: remove useless assignment
>       net/bnxt: remove redundant return
>       app/crypto-perf: remove always true condition
>       net/avp: remove always true condition
>       net/pcap: fix byte stats for drop Tx
>       net/pcap: fix infinite Rx with large files
>       app/testpmd: fix help of metering commands
> 
> Gaetan Rivet (2):
>       net/bonding: fix port id validity check on parsing
>       net/bonding: fix PCI address comparison on non-PCI ports
> 
> Gagandeep Singh (2):
>       test/ipsec: fix result code for not supported
>       crypto/dpaa2_sec: fix memory allocation check
> 
> George Prekas (1):
>       app/testpmd: fix IP checksum calculation
> 
> Gregory Etelson (5):
>       net/mlx5: fix Direct Verbs flow descriptor allocation
>       app/testpmd: release flows left before port stop
>       net/mlx5: fix tunnel rules validation on VF representor
>       net/mlx5: fix mark action in active tunnel offload
>       net/mlx5: fix drop action in tunnel offload mode
> 
> Guy Kaneti (1):
>       regex/octeontx2: fix PCI table overflow
> 
> Haiyue Wang (2):
>       net/ice: drain out DCF AdminQ command queue
>       net/ixgbe: fix UDP zero checksum on x86
> 
> Harman Kalra (1):
>       examples/l3fwd: remove limitation on Tx queue count
> 
> Harry van Haaren (1):
>       eventdev: fix a return value comment
> 
> Heinrich Kuhn (1):
>       net/nfp: read chip model from PluDevice register
> 
> Hemant Agrawal (1):
>       app/procinfo: fix security context info
> 
> Hongbo Zheng (1):
>       net/hns3: use new opcode for clearing hardware resource
> 
> Huisong Li (7):
>       app/testpmd: fix queue stats mapping configuration
>       net/hns3: fix xstats with id and names
>       net/hns3: fix error code in xstats
>       net/hns3: fix Rx/Tx errors stats
>       net/hns3: fix link status change from firmware
>       net/hns3: validate requested maximum Rx frame length
>       net/hns3: fix query order of link status and link info
> 
> Hyong Youb Kim (2):
>       net/enic: fix filter type used for flow API
>       net/enic: fix filter log message
> 
> Ido Segev (1):
>       net/ena: flush Rx buffers memory pool cache
> 
> Igor Chauskin (2):
>       net/ena: fix Tx SQ free space assessment
>       net/ena: prevent double doorbell
> 
> Igor Ryzhov (1):
>       net/i40e: fix stats counters
> 
> Ivan Malov (11):
>       common/sfc_efx/base: remove warnings about inline specifiers
>       common/sfc_efx/base: fix signed/unsigned mismatch warnings
>       common/sfc_efx/base: support alternative MAE match fields
>       common/sfc_efx/base: update MCDI headers for MAE privilege
>       common/sfc_efx/base: check for MAE privilege
>       common/sfc_efx/base: fix MPORT related byte order handling
>       common/sfc_efx/base: fix MAE match spec validation helper
>       common/sfc_efx/base: fix MAE match spec class comparison API
>       common/sfc_efx/base: enhance field ID check in field set API
>       common/sfc_efx/base: apply mask to value on match field set
>       net/sfc: fix TSO and checksum offloads for EF10
> 
> Jiawei Wang (4):
>       net/mlx5: fix unnecessary checking for RSS action
>       app/testpmd: fix packets dump overlapping
>       net/mlx5: fix count actions query in sample flow
>       net/mlx5: fix counter and age flow action validation
> 
> Jiawei Zhu (1):
>       net/virtio-user: fix run closing stdin and close callfd
> 
> Jingjing Wu (1):
>       net/iavf: fix vector mapping with queue
> 
> John McNamara (1):
>       license: add licenses for exception cases
> 
> Joyce Kong (1):
>       eal/arm: fix debug build with gcc for 128-bit atomics
> 
> Junfeng Guo (1):
>       net/iavf: fix GTPU UL and DL support for flow director
> 
> Kalesh AP (4):
>       net/bnxt: release HWRM lock in error
>       net/bnxt: propagate FW command failure to application
>       net/bnxt: fix VNIC RSS configure function
>       net/bnxt: fix FW version log
> 
> Karra Satwik (2):
>       net/cxgbe: accept VLAN flow items without ethertype
>       app/testpmd: fix start index for showing FEC array
> 
> Lance Richardson (10):
>       net/bnxt: disable end of packet padding for Rx
>       net/bnxt: limit Rx representor packets per poll
>       net/bnxt: fix doorbell write ordering
>       net/bnxt: fix outer UDP checksum Rx offload capability
>       net/bnxt: make offload flags mapping per-ring
>       net/bnxt: set correct checksum status in mbuf
>       net/bnxt: fix packet type index calculation
>       net/bnxt: fix null termination of Rx mbuf chain
>       net/bnxt: fix fallback mbuf allocation logic
>       net/bnxt: fix Rx completion ring size calculation
> 
> Leyi Rong (1):
>       net/ice: enlarge Rx queue rearm threshold to 64
> 
> Lijun Ou (6):
>       net/hns3: fix interception with flow director
>       net/hns3: fix memory leak on secondary process exit
>       net/hns3: adjust some comments
>       net/hns3: adjust format specifier for enum
>       doc: fix product link in hns3 guide
>       net/hns3: fix RSS indirection table size
> 
> Liron Himi (5):
>       net/octeontx2: fix PF flow action for Tx
>       net/mvpp2: remove debug log on fast-path
>       net/mvpp2: remove VLAN flush
>       net/mvpp2: remove CRC length from MRU validation
>       net/mvpp2: fix frame size checking
> 
> Long Li (1):
>       net/netvsc: ignore unsupported packet on sync command
> 
> Lukasz Wojciechowski (1):
>       test/distributor: fix return buffer queue overload
> 
> Marvin Liu (1):
>       vhost: fix packed ring dequeue offloading
> 
> Matan Azrad (1):
>       vdpa/mlx5: fix configuration mutex cleanup
> 
> Maxime Coquelin (3):
>       net/virtio: add missing backend features negotiation
>       net/virtio: fix memory init with vDPA backend
>       net/virtio: fix getting old status on reconnect
> 
> Michael Baum (7):
>       net/mlx5: fix leak on Rx queue creation failure
>       net/mlx5: fix leak on Tx queue creation failure
>       common/mlx5: fix completion queue entry size configuration
>       net/mlx5: remove CQE padding device argument
>       net/mlx5: fix leak on ASO SQ creation failure
>       net/mlx4: fix device detach
>       net/mlx4: fix handling of probing failure
> 
> Michal Krawczyk (1):
>       net/ena: validate Rx req ID upon acquiring descriptor
> 
> Min Hu (Connor) (3):
>       net/hns3: fix FEC state query
>       net/hns3: fix crash with multi-process
>       doc: add FEC to NIC features
> 
> Murphy Yang (6):
>       net/ice: fix outer UDP Tx checksum offload
>       net/i40e: fix L4 checksum flag
>       net/ice: fix outer checksum flags
>       net/iavf: fix conflicting RSS combination rules
>       net/ice: disable IPv4 checksum offload in vector Tx
>       net/i40e: add null input checks
> 
> Nick Connolly (2):
>       eal/windows: fix debug build with MinGW
>       eal/windows: fix vfprintf warning with clang
> 
> Olivier Matz (5):
>       build: fix plugin load on static build
>       net/virtio-user: fix protocol features advertising
>       service: propagate init error in EAL
>       test/mcslock: remove unneeded per lcore copy
>       mempool: fix panic on dump or audit
> 
> Ophir Munk (4):
>       net/mlx5: fix freeing packet pacing
>       net/mlx5: fix flow action destroy wrapper
>       net/mlx5: fix flow operation wrapper per OS
>       net/mlx5: unify operations for all OS
> 
> Ori Kam (3):
>       regex/mlx5: fix memory rule alignment
>       regex/mlx5: fix support for group id
>       regex/mlx5: fix number of supported queues
> 
> Qi Zhang (4):
>       doc: fix some statements for ice vector PMD
>       net/ice/base: fix tunnel destroy
>       net/ice/base: fix null pointer dereference
>       net/ice/base: fix memory handling
> 
> Ruifeng Wang (4):
>       lpm: fix vector IPv4 lookup
>       net/hns3: fix build with SVE
>       net/octeontx: fix build with SVE
>       common/octeontx2: fix build with SVE
> 
> Samik Gupta (2):
>       net/bnxt: fix Rx rings in RSS redirection table
>       net/bnxt: fix VNIC config on Rx queue stop
> 
> Shiri Kuzin (2):
>       net/mlx5: fix VXLAN decap on non-VXLAN flow
>       net/mlx5: refuse empty VLAN in flow pattern
> 
> Somnath Kotur (4):
>       net/bnxt: fix PF resource query
>       net/bnxt: fix lock init and destroy
>       net/bnxt: fix error handling in device start
>       net/bnxt: refactor init/uninit
> 
> Souvik Dey (2):
>       net/i40e: fix VLAN stripping in VF
>       common/mlx5: fix storing synced MAC to internal table
> 
> Sriharsha Basavapatna (1):
>       net/bnxt: fix max rings computation
> 
> Stephen Hemminger (2):
>       test/rwlock: fix spelling and missing whitespace
>       test: fix terminal settings on exit
> 
> Steve Yang (23):
>       ethdev: fix max Rx packet length check
>       app/testpmd: fix max Rx packet length for VLAN packets
>       net/dpaa: fix jumbo frame flag condition for MTU set
>       net/dpaa2: fix jumbo frame flag condition for MTU set
>       net/e1000: fix jumbo frame flag condition for MTU set
>       net/hns3: fix jumbo frame flag condition for MTU set
>       net/i40e: fix jumbo frame flag condition
>       net/iavf: fix jumbo frame flag condition
>       net/ice: fix jumbo frame flag condition
>       net/ipn3ke: fix jumbo frame flag condition for MTU set
>       net/octeontx: fix jumbo frame flag condition for MTU set
>       net/octeontx2: fix jumbo frame flag condition for MTU
>       net/qede: fix jumbo frame flag condition for MTU set
>       net/sfc: fix jumbo frame flag condition for MTU set
>       net/thunderx: fix jumbo frame flag condition for MTU set
>       net/ixgbe: fix jumbo frame flag condition
>       net/cxgbe: fix jumbo frame flag condition
>       net/axgbe: fix jumbo frame flag condition for MTU set
>       net/enetc: fix jumbo frame flag condition for MTU set
>       net/hinic: fix jumbo frame flag condition for MTU set
>       net/nfp: fix jumbo frame flag condition for MTU set
>       net/liquidio: fix jumbo frame flag condition for MTU set
>       app/testpmd: fix setting maximum packet length
> 
> Suanming Mou (5):
>       net/mlx5: fix shared RSS and mark actions combination
>       net/mlx5: fix multi-process port ID
>       net/mlx5: fix crash on secondary process port close
>       net/mlx5: fix port attach in secondary process
>       net/mlx4: fix port attach in secondary process
> 
> Sunil Kumar Kori (2):
>       net/octeontx2: fix corruption in segments list
>       net/octeontx: fix max Rx packet length
> 
> Tal Shnaiderman (5):
>       bus/pci: ignore missing NUMA node on Windows
>       net/mlx5: fix constant array size
>       net/mlx5: fix device name size on Windows
>       net/mlx5: fix comparison sign in flow engine
>       common/mlx5: fix pointer cast on Windows
> 
> Thomas Monjalon (3):
>       doc: fix figure numbering in graph guide
>       lib: fix doxygen for parameters of function pointers
>       ethdev: fix close failure handling
> 
> Timothy McDaniel (1):
>       event/dlb: fix accessing uninitialized variables
> 
> Ting Xu (1):
>       net/iavf: fix memory leak in large VF
> 
> Tyler Retzlaff (2):
>       bus/pci: fix build with Windows SDK >= 10.0.20253
>       eal/windows: fix C++ compatibility
> 
> Viacheslav Galaktionov (1):
>       net/sfc: fix generic byte statistics to exclude FCS bytes
> 
> Viacheslav Ovsiienko (8):
>       net/mlx5: fix Verbs memory allocation callback
>       net/mlx5: fix buffer split offload advertising
>       doc: update flow mark action in mlx5 guide
>       net/mlx5: fix wire vport hint
>       app/testpmd: fix queue reconfig request on Rx split update
>       doc: fix supported feature table in mlx5 guide
>       doc: fix mark action zero value in mlx5 guide
>       net/mlx5: fix Tx queue size created with DevX
> 
> Vladimir Medvedkin (2):
>       rib: fix insertion in some cases
>       crypto/qat: fix access to uninitialized variable
> 
> Weifeng Li (1):
>       net/i40e: fix X722 for 802.1ad frames ability
> 
> Wenjun Wu (1):
>       net/e1000: fix flow control mode setting
> 
> Wisam Jaddo (1):
>       app/flow-perf: simplify objects initialization
> 
> Xuan Ding (1):
>       net/iavf: fix symmetric flow rule creation
> 
> Yicai Lu (1):
>       ip_frag: remove padding length of fragment
> 
> Yongxin Liu (1):
>       usertools: fix binding built-in kernel driver
> 
> Yunjian Wang (3):
>       eal/linux: fix handling of error events from epoll
>       net/bnxt: fix memory leak when mapping fails
>       net/mvneta: check allocation in Rx queue flush
> 
> Yuri Chipchev (1):
>       net/mvpp2: fix stack corruption

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] 20.11.1 patches review and test
  2021-03-02  6:23  0% ` Kalesh Anakkur Purayil
@ 2021-03-02 10:29  0%   ` Luca Boccassi
  0 siblings, 0 replies; 200+ results
From: Luca Boccassi @ 2021-03-02 10:29 UTC (permalink / raw)
  To: Kalesh Anakkur Purayil
  Cc: dpdk stable, dpdk-dev, Abhishek Marathe, Akhil Goyal,
	Ali Alnubani, benjamin.walker, David Christensen,
	Hariprasad Govindharajan, Hemant Agrawal, Ian Stokes,
	Jerin Jacob, John McNamara, Ju-Hyoung Lee, Kevin Traynor,
	Pei Zhang, pingx.yu, qian.q.xu, Raslan Darawsheh,
	Thomas Monjalon, yuan.peng, zhaoyan.chen

On Tue, 2021-03-02 at 11:53 +0530, Kalesh Anakkur Purayil wrote:
> Hi Luca,
> 
> Testing with dpdk v20.11.1 from Broadcom looks good.
> 
> - Basic functionality:
>   Send and receive multiple types of traffic.
> - Changing/checking link status through testpmd.
> - RSS tests.
> - TSO tests
> - VLAN filtering tests.
> - MAC filtering test
> - statistics tests
> - Checksum offload tests
> - MTU tests
> - Promiscuous tests
> 
> NIC: BCM57414 NetXtreme-E 10Gb/25Gb Ethernet Controller, Firmware: 218.1.186.0
> NIC: BCM57508 NetXtreme-E 10Gb/25Gb/40Gb/50Gb/100Gb/200Gb Ethernet, Firmware : 219.0.0.74
> 
> Regards,
> Kalesh

Thank you!

> On Mon, Feb 22, 2021 at 8:39 PM <luca.boccassi@gmail.com> wrote:
> > Hi all,
> > 
> > Here is a list of patches targeted for stable release 20.11.1.
> > 
> > The planned date for the final release is the 8th of March.
> > 
> > Please help with testing and validation of your use cases and report
> > any issues/results with reply-all to this mail. For the final release
> > the fixes and reported validations will be added to the release notes.
> > 
> > A release candidate tarball can be found at:
> > 
> >     https://dpdk.org/browse/dpdk-stable/tag/?id=v20.11.1-rc1
> > 
> > These patches are located at branch 20.11 of dpdk-stable repo:
> >     https://dpdk.org/browse/dpdk-stable/
> > 
> > Thanks.
> > 
> > Luca Boccassi
> > 
> > ---
> > Ajit Khaparde (3):
> >       net/bnxt: fix cleanup on mutex init failure
> >       net/bnxt: fix format specifier for unsigned int
> >       net/bnxt: fix freeing mbuf
> > 
> > Alexander Kozyrev (4):
> >       net/mlx5: fix mbuf freeing in vectorized MPRQ
> >       net/mlx5: fix flow tag decompression
> >       net/mlx5: check FW miniCQE format capabilities
> >       net/mlx5: fix miniCQE configuration for Verbs
> > 
> > Alvin Zhang (9):
> >       net/ixgbe: detect failed VF MTU set
> >       net/i40e: fix Rx bytes statistics
> >       net/iavf: fix queue pairs configuration
> >       doc: fix RSS flow description in i40e guide
> >       net/i40e: fix returned code for RSS hardware failure
> >       net/ice: fix RSS lookup table initialization
> >       test: fix buffer overflow in Tx burst
> >       net/ixgbe: fix configuration of max frame size
> >       app/testpmd: fix key for RSS flow rule
> > 
> > Amit Bernstein (1):
> >       net/ena: fix Tx doorbell statistics
> > 
> > Anatoly Burakov (1):
> >       fbarray: fix overlap check
> > 
> > Andrew Boyer (5):
> >       net/ionic: do minor logging fixups
> >       net/ionic: fix link speed and autonegotiation
> >       net/ionic: allow separate L3 and L4 checksum offload
> >       net/ionic: fix up function attribute tags
> >       net/ionic: fix address handling in Tx
> > 
> > Ankur Dwivedi (1):
> >       test/event_crypto: set cipher operation in transform
> > 
> > Ashish Sadanandan (1):
> >       mbuf: add C++ include guard for dynamic fields header
> > 
> > Balazs Nemeth (1):
> >       net/qede: fix promiscuous enable
> > 
> > Beilei Xing (2):
> >       net/i40e: fix global register recovery
> >       net/i40e: fix flex payload rule conflict
> > 
> > Bernard Iremonger (1):
> >       doc: fix QinQ flow rules in testpmd guide
> > 
> > Bruce Richardson (29):
> >       ethdev: avoid blocking telemetry for link status
> >       build: provide suitable error for "both" libraries option
> >       eal: fix reciprocal header include
> >       telemetry: fix missing header include
> >       ethdev: fix missing header include
> >       net: fix missing header include
> >       mbuf: fix missing header include
> >       bitrate: fix missing header include
> >       rib: fix missing header includes
> >       vhost: fix missing header includes
> >       ipsec: fix missing header include
> >       fib: fix missing header includes
> >       table: fix missing header include
> >       pipeline: fix missing header includes
> >       metrics: fix variable declaration in header
> >       node: fix missing header include
> >       app: fix build with extra include paths
> >       build: force pkg-config for dependency detection
> >       power: create guest channel public header file
> >       power: make channel message functions public
> >       power: rename public structs
> >       power: rename constants
> >       power: export guest channel header file
> >       power: clean up includes
> >       eal: fix MCS lock header include
> >       eal: fix internal ABI tag with clang
> >       power: fix missing header includes
> >       rib: fix missing header include
> >       eal: fix automatic loading of drivers as shared libs
> > 
> > Chengchang Tang (7):
> >       net/hns3: fix register length when dumping registers
> >       net/hns3: fix data overwriting during register dump
> >       net/hns3: fix dump register out of range
> >       net/hns3: fix interrupt resources in Rx interrupt mode
> >       net/hns3: fix firmware exceptions by concurrent commands
> >       net/hns3: fix VF reset on mailbox failure
> >       net/hns3: fix stats flip overflow
> > 
> > Chengwen Feng (3):
> >       net/hns3: fix VF query link status in dev init
> >       net/hns3: remove MPLS from supported flow items
> >       net/hns3: fix flow director rule residue on malloc failure
> > 
> > Ciara Power (3):
> >       app/crypto-perf: fix spelling in output
> >       app/crypto-perf: fix latency CSV output
> >       app/crypto-perf: fix CSV output format
> > 
> > Cristian Dumitrescu (1):
> >       examples/pipeline: fix CLI parsing crash
> > 
> > Dapeng Yu (4):
> >       net/ixgbe: fix flex bytes flow director rule
> >       net/ice: check Rx queue number on RSS init
> >       net/ixgbe: disable NFS filtering
> >       app/testpmd: avoid exit without terminal restore
> > 
> > David Marchand (3):
> >       net/hinic: restore vectorised code
> >       examples/pipeline: fix VXLAN script permission
> >       mbuf: remove unneeded atomic generic header include
> > 
> > Dekel Peled (8):
> >       net/mlx5: fix shared age action validation
> >       net/mlx5: fix hairpin flow split decision
> >       net/mlx5: fix flow split combined with counter
> >       net/mlx5: fix flow split combined with age action
> >       net/mlx5: fix shared RSS translation and cleanup
> >       app/testpmd: support shared age action query
> >       net/mlx5: fix shared RSS capability check
> >       net/mlx5: validate hash Rx queue pointer
> > 
> > Dmitry Kozlyuk (4):
> >       eal/windows: fix build with MinGW-w64 8
> >       bus/pci: fix build with MinGW-w64 8
> >       bus/pci: fix hardware ID limit on Windows
> >       build: fix linker flags on Windows
> > 
> > Eugeny Parshutin (1):
> >       doc: add vtune profiling config to prog guide
> > 
> > Fan Zhang (1):
> >       crypto/qat: fix digest in buffer
> > 
> > Fei Chen (1):
> >       vhost: fix vid allocation race
> > 
> > Feifei Wang (7):
> >       test/ring: reduce duration of performance tests
> >       app/eventdev: adjust event count order for pipeline test
> >       app/eventdev: remove redundant enqueue in burst Tx
> >       examples/eventdev: check CPU core enabling
> >       examples/eventdev: add info output for main core
> >       examples/eventdev: move ethdev stop to the end
> >       app/eventdev: fix SMP barrier in performance test
> > 
> > Ferruh Yigit (13):
> >       app/procinfo: fix _filters stats reporting
> >       app/procinfo: fix check on xstats-ids
> >       app/procinfo: remove useless memset
> >       app/procinfo: remove useless assignment
> >       net/pcap: remove local variable shadowing outer one
> >       net/bonding: remove local variable shadowing outer one
> >       net/af_xdp: remove useless assignment
> >       net/bnxt: remove redundant return
> >       app/crypto-perf: remove always true condition
> >       net/avp: remove always true condition
> >       net/pcap: fix byte stats for drop Tx
> >       net/pcap: fix infinite Rx with large files
> >       app/testpmd: fix help of metering commands
> > 
> > Gaetan Rivet (2):
> >       net/bonding: fix port id validity check on parsing
> >       net/bonding: fix PCI address comparison on non-PCI ports
> > 
> > Gagandeep Singh (2):
> >       test/ipsec: fix result code for not supported
> >       crypto/dpaa2_sec: fix memory allocation check
> > 
> > George Prekas (1):
> >       app/testpmd: fix IP checksum calculation
> > 
> > Gregory Etelson (5):
> >       net/mlx5: fix Direct Verbs flow descriptor allocation
> >       app/testpmd: release flows left before port stop
> >       net/mlx5: fix tunnel rules validation on VF representor
> >       net/mlx5: fix mark action in active tunnel offload
> >       net/mlx5: fix drop action in tunnel offload mode
> > 
> > Guy Kaneti (1):
> >       regex/octeontx2: fix PCI table overflow
> > 
> > Haiyue Wang (2):
> >       net/ice: drain out DCF AdminQ command queue
> >       net/ixgbe: fix UDP zero checksum on x86
> > 
> > Harman Kalra (1):
> >       examples/l3fwd: remove limitation on Tx queue count
> > 
> > Harry van Haaren (1):
> >       eventdev: fix a return value comment
> > 
> > Heinrich Kuhn (1):
> >       net/nfp: read chip model from PluDevice register
> > 
> > Hemant Agrawal (1):
> >       app/procinfo: fix security context info
> > 
> > Hongbo Zheng (1):
> >       net/hns3: use new opcode for clearing hardware resource
> > 
> > Huisong Li (7):
> >       app/testpmd: fix queue stats mapping configuration
> >       net/hns3: fix xstats with id and names
> >       net/hns3: fix error code in xstats
> >       net/hns3: fix Rx/Tx errors stats
> >       net/hns3: fix link status change from firmware
> >       net/hns3: validate requested maximum Rx frame length
> >       net/hns3: fix query order of link status and link info
> > 
> > Hyong Youb Kim (2):
> >       net/enic: fix filter type used for flow API
> >       net/enic: fix filter log message
> > 
> > Ido Segev (1):
> >       net/ena: flush Rx buffers memory pool cache
> > 
> > Igor Chauskin (2):
> >       net/ena: fix Tx SQ free space assessment
> >       net/ena: prevent double doorbell
> > 
> > Igor Ryzhov (1):
> >       net/i40e: fix stats counters
> > 
> > Ivan Malov (11):
> >       common/sfc_efx/base: remove warnings about inline specifiers
> >       common/sfc_efx/base: fix signed/unsigned mismatch warnings
> >       common/sfc_efx/base: support alternative MAE match fields
> >       common/sfc_efx/base: update MCDI headers for MAE privilege
> >       common/sfc_efx/base: check for MAE privilege
> >       common/sfc_efx/base: fix MPORT related byte order handling
> >       common/sfc_efx/base: fix MAE match spec validation helper
> >       common/sfc_efx/base: fix MAE match spec class comparison API
> >       common/sfc_efx/base: enhance field ID check in field set API
> >       common/sfc_efx/base: apply mask to value on match field set
> >       net/sfc: fix TSO and checksum offloads for EF10
> > 
> > Jiawei Wang (4):
> >       net/mlx5: fix unnecessary checking for RSS action
> >       app/testpmd: fix packets dump overlapping
> >       net/mlx5: fix count actions query in sample flow
> >       net/mlx5: fix counter and age flow action validation
> > 
> > Jiawei Zhu (1):
> >       net/virtio-user: fix run closing stdin and close callfd
> > 
> > Jingjing Wu (1):
> >       net/iavf: fix vector mapping with queue
> > 
> > John McNamara (1):
> >       license: add licenses for exception cases
> > 
> > Joyce Kong (1):
> >       eal/arm: fix debug build with gcc for 128-bit atomics
> > 
> > Junfeng Guo (1):
> >       net/iavf: fix GTPU UL and DL support for flow director
> > 
> > Kalesh AP (4):
> >       net/bnxt: release HWRM lock in error
> >       net/bnxt: propagate FW command failure to application
> >       net/bnxt: fix VNIC RSS configure function
> >       net/bnxt: fix FW version log
> > 
> > Karra Satwik (2):
> >       net/cxgbe: accept VLAN flow items without ethertype
> >       app/testpmd: fix start index for showing FEC array
> > 
> > Lance Richardson (10):
> >       net/bnxt: disable end of packet padding for Rx
> >       net/bnxt: limit Rx representor packets per poll
> >       net/bnxt: fix doorbell write ordering
> >       net/bnxt: fix outer UDP checksum Rx offload capability
> >       net/bnxt: make offload flags mapping per-ring
> >       net/bnxt: set correct checksum status in mbuf
> >       net/bnxt: fix packet type index calculation
> >       net/bnxt: fix null termination of Rx mbuf chain
> >       net/bnxt: fix fallback mbuf allocation logic
> >       net/bnxt: fix Rx completion ring size calculation
> > 
> > Leyi Rong (1):
> >       net/ice: enlarge Rx queue rearm threshold to 64
> > 
> > Lijun Ou (6):
> >       net/hns3: fix interception with flow director
> >       net/hns3: fix memory leak on secondary process exit
> >       net/hns3: adjust some comments
> >       net/hns3: adjust format specifier for enum
> >       doc: fix product link in hns3 guide
> >       net/hns3: fix RSS indirection table size
> > 
> > Liron Himi (5):
> >       net/octeontx2: fix PF flow action for Tx
> >       net/mvpp2: remove debug log on fast-path
> >       net/mvpp2: remove VLAN flush
> >       net/mvpp2: remove CRC length from MRU validation
> >       net/mvpp2: fix frame size checking
> > 
> > Long Li (1):
> >       net/netvsc: ignore unsupported packet on sync command
> > 
> > Lukasz Wojciechowski (1):
> >       test/distributor: fix return buffer queue overload
> > 
> > Marvin Liu (1):
> >       vhost: fix packed ring dequeue offloading
> > 
> > Matan Azrad (1):
> >       vdpa/mlx5: fix configuration mutex cleanup
> > 
> > Maxime Coquelin (3):
> >       net/virtio: add missing backend features negotiation
> >       net/virtio: fix memory init with vDPA backend
> >       net/virtio: fix getting old status on reconnect
> > 
> > Michael Baum (7):
> >       net/mlx5: fix leak on Rx queue creation failure
> >       net/mlx5: fix leak on Tx queue creation failure
> >       common/mlx5: fix completion queue entry size configuration
> >       net/mlx5: remove CQE padding device argument
> >       net/mlx5: fix leak on ASO SQ creation failure
> >       net/mlx4: fix device detach
> >       net/mlx4: fix handling of probing failure
> > 
> > Michal Krawczyk (1):
> >       net/ena: validate Rx req ID upon acquiring descriptor
> > 
> > Min Hu (Connor) (3):
> >       net/hns3: fix FEC state query
> >       net/hns3: fix crash with multi-process
> >       doc: add FEC to NIC features
> > 
> > Murphy Yang (6):
> >       net/ice: fix outer UDP Tx checksum offload
> >       net/i40e: fix L4 checksum flag
> >       net/ice: fix outer checksum flags
> >       net/iavf: fix conflicting RSS combination rules
> >       net/ice: disable IPv4 checksum offload in vector Tx
> >       net/i40e: add null input checks
> > 
> > Nick Connolly (2):
> >       eal/windows: fix debug build with MinGW
> >       eal/windows: fix vfprintf warning with clang
> > 
> > Olivier Matz (5):
> >       build: fix plugin load on static build
> >       net/virtio-user: fix protocol features advertising
> >       service: propagate init error in EAL
> >       test/mcslock: remove unneeded per lcore copy
> >       mempool: fix panic on dump or audit
> > 
> > Ophir Munk (4):
> >       net/mlx5: fix freeing packet pacing
> >       net/mlx5: fix flow action destroy wrapper
> >       net/mlx5: fix flow operation wrapper per OS
> >       net/mlx5: unify operations for all OS
> > 
> > Ori Kam (3):
> >       regex/mlx5: fix memory rule alignment
> >       regex/mlx5: fix support for group id
> >       regex/mlx5: fix number of supported queues
> > 
> > Qi Zhang (4):
> >       doc: fix some statements for ice vector PMD
> >       net/ice/base: fix tunnel destroy
> >       net/ice/base: fix null pointer dereference
> >       net/ice/base: fix memory handling
> > 
> > Ruifeng Wang (4):
> >       lpm: fix vector IPv4 lookup
> >       net/hns3: fix build with SVE
> >       net/octeontx: fix build with SVE
> >       common/octeontx2: fix build with SVE
> > 
> > Samik Gupta (2):
> >       net/bnxt: fix Rx rings in RSS redirection table
> >       net/bnxt: fix VNIC config on Rx queue stop
> > 
> > Shiri Kuzin (2):
> >       net/mlx5: fix VXLAN decap on non-VXLAN flow
> >       net/mlx5: refuse empty VLAN in flow pattern
> > 
> > Somnath Kotur (4):
> >       net/bnxt: fix PF resource query
> >       net/bnxt: fix lock init and destroy
> >       net/bnxt: fix error handling in device start
> >       net/bnxt: refactor init/uninit
> > 
> > Souvik Dey (2):
> >       net/i40e: fix VLAN stripping in VF
> >       common/mlx5: fix storing synced MAC to internal table
> > 
> > Sriharsha Basavapatna (1):
> >       net/bnxt: fix max rings computation
> > 
> > Stephen Hemminger (2):
> >       test/rwlock: fix spelling and missing whitespace
> >       test: fix terminal settings on exit
> > 
> > Steve Yang (23):
> >       ethdev: fix max Rx packet length check
> >       app/testpmd: fix max Rx packet length for VLAN packets
> >       net/dpaa: fix jumbo frame flag condition for MTU set
> >       net/dpaa2: fix jumbo frame flag condition for MTU set
> >       net/e1000: fix jumbo frame flag condition for MTU set
> >       net/hns3: fix jumbo frame flag condition for MTU set
> >       net/i40e: fix jumbo frame flag condition
> >       net/iavf: fix jumbo frame flag condition
> >       net/ice: fix jumbo frame flag condition
> >       net/ipn3ke: fix jumbo frame flag condition for MTU set
> >       net/octeontx: fix jumbo frame flag condition for MTU set
> >       net/octeontx2: fix jumbo frame flag condition for MTU
> >       net/qede: fix jumbo frame flag condition for MTU set
> >       net/sfc: fix jumbo frame flag condition for MTU set
> >       net/thunderx: fix jumbo frame flag condition for MTU set
> >       net/ixgbe: fix jumbo frame flag condition
> >       net/cxgbe: fix jumbo frame flag condition
> >       net/axgbe: fix jumbo frame flag condition for MTU set
> >       net/enetc: fix jumbo frame flag condition for MTU set
> >       net/hinic: fix jumbo frame flag condition for MTU set
> >       net/nfp: fix jumbo frame flag condition for MTU set
> >       net/liquidio: fix jumbo frame flag condition for MTU set
> >       app/testpmd: fix setting maximum packet length
> > 
> > Suanming Mou (5):
> >       net/mlx5: fix shared RSS and mark actions combination
> >       net/mlx5: fix multi-process port ID
> >       net/mlx5: fix crash on secondary process port close
> >       net/mlx5: fix port attach in secondary process
> >       net/mlx4: fix port attach in secondary process
> > 
> > Sunil Kumar Kori (2):
> >       net/octeontx2: fix corruption in segments list
> >       net/octeontx: fix max Rx packet length
> > 
> > Tal Shnaiderman (5):
> >       bus/pci: ignore missing NUMA node on Windows
> >       net/mlx5: fix constant array size
> >       net/mlx5: fix device name size on Windows
> >       net/mlx5: fix comparison sign in flow engine
> >       common/mlx5: fix pointer cast on Windows
> > 
> > Thomas Monjalon (3):
> >       doc: fix figure numbering in graph guide
> >       lib: fix doxygen for parameters of function pointers
> >       ethdev: fix close failure handling
> > 
> > Timothy McDaniel (1):
> >       event/dlb: fix accessing uninitialized variables
> > 
> > Ting Xu (1):
> >       net/iavf: fix memory leak in large VF
> > 
> > Tyler Retzlaff (2):
> >       bus/pci: fix build with Windows SDK >= 10.0.20253
> >       eal/windows: fix C++ compatibility
> > 
> > Viacheslav Galaktionov (1):
> >       net/sfc: fix generic byte statistics to exclude FCS bytes
> > 
> > Viacheslav Ovsiienko (8):
> >       net/mlx5: fix Verbs memory allocation callback
> >       net/mlx5: fix buffer split offload advertising
> >       doc: update flow mark action in mlx5 guide
> >       net/mlx5: fix wire vport hint
> >       app/testpmd: fix queue reconfig request on Rx split update
> >       doc: fix supported feature table in mlx5 guide
> >       doc: fix mark action zero value in mlx5 guide
> >       net/mlx5: fix Tx queue size created with DevX
> > 
> > Vladimir Medvedkin (2):
> >       rib: fix insertion in some cases
> >       crypto/qat: fix access to uninitialized variable
> > 
> > Weifeng Li (1):
> >       net/i40e: fix X722 for 802.1ad frames ability
> > 
> > Wenjun Wu (1):
> >       net/e1000: fix flow control mode setting
> > 
> > Wisam Jaddo (1):
> >       app/flow-perf: simplify objects initialization
> > 
> > Xuan Ding (1):
> >       net/iavf: fix symmetric flow rule creation
> > 
> > Yicai Lu (1):
> >       ip_frag: remove padding length of fragment
> > 
> > Yongxin Liu (1):
> >       usertools: fix binding built-in kernel driver
> > 
> > Yunjian Wang (3):
> >       eal/linux: fix handling of error events from epoll
> >       net/bnxt: fix memory leak when mapping fails
> >       net/mvneta: check allocation in Rx queue flush
> > 
> > Yuri Chipchev (1):
> >       net/mvpp2: fix stack corruption
> 
> 


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [RFC v4 1/4] ethdev: add meter PPS profile
  @ 2021-03-02  7:02  4%       ` Matan Azrad
  2021-03-02 12:29  3%         ` Dumitrescu, Cristian
  0 siblings, 1 reply; 200+ results
From: Matan Azrad @ 2021-03-02  7:02 UTC (permalink / raw)
  To: Dumitrescu, Cristian, Li Zhang, Dekel Peled, Ori Kam, Slava Ovsiienko
  Cc: dev, NBU-Contact-Thomas Monjalon, Raslan Darawsheh, mb,
	ajit.khaparde, Yigit, Ferruh, Singh, Jasvinder



Hi Cristian

Thank you for review, please see inline.

From: Dumitrescu, Cristian
> > From: dev <dev-bounces@dpdk.org> On Behalf Of Li Zhang
<snip>
> We had this same problem earlier for the rte_tm.h API, where people asked to
> add support for WRED and shaper rates specified in packets to the existing byte
> rate support. I am more than happy to support adding the same here, but
> please let's adopt the same solution here rather than invent a different
> approach.
> 
> Please refer to struct rte_tm_wred_params and struct rte_tm_shaper_params
> from rte_tm.h: the packets vs. bytes mode is explicitly specified through the use
> of a flag called packet_mode that is added to the WRED and shaper profile.
> When packet_mode is 0, the profile rates and bucket sizes are specified in
> bytes per second and bytes, respectively; when packet_mode is not 0, the
> profile rates and bucket sizes are specified in packets and packets per second,
> respectively. The same profile parameters are used, no need to invent
> additional algorithms (such as srTCM - packet mode) or profile data structures.
> Can we do the same here, please?

This flag approach is very intuitive suggestion and it has advantages.

The main problem with the flag approach is that it breaks ABI and API.
The profile structure size is changed due to a new field - ABI breakage.
The user must initialize the flag with zero to get old behavior - API breakage. 
 
I don't see issues with Li suggestion, Do you think Li suggestion has critical issues?

> This is a quick summary of the required API changes to add support for the
> packet mode, they are minimal:
> a) Introduce the packet_mode flag in the profile parameters data structure.
> b) Change the description (comment) of the rate and bucket size parameters in
> the meter profile parameters data structures to reflect that their values
> represents either bytes or packets, depending on the value of the new flag
> packet_mode from the same structure.
> c) Add the relevant capabilities: just search for "packet" in the rte_tm.h
> capabilities data structures and apply the same to the rte_mtr.h capabilities,
> when applicable.
 
> Regards,
> Cristian

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] 20.11.1 patches review and test
  2021-02-22 15:09  1% [dpdk-dev] 20.11.1 patches review and test luca.boccassi
  2021-02-25  9:43  0% ` Christian Ehrhardt
  2021-02-25 13:00  0% ` Pei Zhang
@ 2021-03-02  6:23  0% ` Kalesh Anakkur Purayil
  2021-03-02 10:29  0%   ` Luca Boccassi
  2021-03-02 10:52  0% ` Chen, BoX C
  2021-03-09 10:36  0% ` Govindharajan, Hariprasad
  4 siblings, 1 reply; 200+ results
From: Kalesh Anakkur Purayil @ 2021-03-02  6:23 UTC (permalink / raw)
  To: Luca Boccassi
  Cc: dpdk stable, dpdk-dev, Abhishek Marathe, Akhil Goyal,
	Ali Alnubani, benjamin.walker, David Christensen,
	Hariprasad Govindharajan, Hemant Agrawal, Ian Stokes,
	Jerin Jacob, John McNamara, Ju-Hyoung Lee, Kevin Traynor,
	Luca Boccassi, Pei Zhang, pingx.yu, qian.q.xu, Raslan Darawsheh,
	Thomas Monjalon, yuan.peng, zhaoyan.chen

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

Hi Luca,

Testing with dpdk v20.11.1 from Broadcom looks good.

- Basic functionality:
  Send and receive multiple types of traffic.
- Changing/checking link status through testpmd.
- RSS tests.
- TSO tests
- VLAN filtering tests.
- MAC filtering test
- statistics tests
- Checksum offload tests
- MTU tests
- Promiscuous tests

NIC: BCM57414 NetXtreme-E 10Gb/25Gb Ethernet Controller, Firmware:
218.1.186.0
NIC: BCM57508 NetXtreme-E 10Gb/25Gb/40Gb/50Gb/100Gb/200Gb Ethernet,
Firmware : 219.0.0.74

Regards,
Kalesh

On Mon, Feb 22, 2021 at 8:39 PM <luca.boccassi@gmail.com> wrote:

> Hi all,
>
> Here is a list of patches targeted for stable release 20.11.1.
>
> The planned date for the final release is the 8th of March.
>
> Please help with testing and validation of your use cases and report
> any issues/results with reply-all to this mail. For the final release
> the fixes and reported validations will be added to the release notes.
>
> A release candidate tarball can be found at:
>
>     https://dpdk.org/browse/dpdk-stable/tag/?id=v20.11.1-rc1
>
> These patches are located at branch 20.11 of dpdk-stable repo:
>     https://dpdk.org/browse/dpdk-stable/
>
> Thanks.
>
> Luca Boccassi
>
> ---
> Ajit Khaparde (3):
>       net/bnxt: fix cleanup on mutex init failure
>       net/bnxt: fix format specifier for unsigned int
>       net/bnxt: fix freeing mbuf
>
> Alexander Kozyrev (4):
>       net/mlx5: fix mbuf freeing in vectorized MPRQ
>       net/mlx5: fix flow tag decompression
>       net/mlx5: check FW miniCQE format capabilities
>       net/mlx5: fix miniCQE configuration for Verbs
>
> Alvin Zhang (9):
>       net/ixgbe: detect failed VF MTU set
>       net/i40e: fix Rx bytes statistics
>       net/iavf: fix queue pairs configuration
>       doc: fix RSS flow description in i40e guide
>       net/i40e: fix returned code for RSS hardware failure
>       net/ice: fix RSS lookup table initialization
>       test: fix buffer overflow in Tx burst
>       net/ixgbe: fix configuration of max frame size
>       app/testpmd: fix key for RSS flow rule
>
> Amit Bernstein (1):
>       net/ena: fix Tx doorbell statistics
>
> Anatoly Burakov (1):
>       fbarray: fix overlap check
>
> Andrew Boyer (5):
>       net/ionic: do minor logging fixups
>       net/ionic: fix link speed and autonegotiation
>       net/ionic: allow separate L3 and L4 checksum offload
>       net/ionic: fix up function attribute tags
>       net/ionic: fix address handling in Tx
>
> Ankur Dwivedi (1):
>       test/event_crypto: set cipher operation in transform
>
> Ashish Sadanandan (1):
>       mbuf: add C++ include guard for dynamic fields header
>
> Balazs Nemeth (1):
>       net/qede: fix promiscuous enable
>
> Beilei Xing (2):
>       net/i40e: fix global register recovery
>       net/i40e: fix flex payload rule conflict
>
> Bernard Iremonger (1):
>       doc: fix QinQ flow rules in testpmd guide
>
> Bruce Richardson (29):
>       ethdev: avoid blocking telemetry for link status
>       build: provide suitable error for "both" libraries option
>       eal: fix reciprocal header include
>       telemetry: fix missing header include
>       ethdev: fix missing header include
>       net: fix missing header include
>       mbuf: fix missing header include
>       bitrate: fix missing header include
>       rib: fix missing header includes
>       vhost: fix missing header includes
>       ipsec: fix missing header include
>       fib: fix missing header includes
>       table: fix missing header include
>       pipeline: fix missing header includes
>       metrics: fix variable declaration in header
>       node: fix missing header include
>       app: fix build with extra include paths
>       build: force pkg-config for dependency detection
>       power: create guest channel public header file
>       power: make channel message functions public
>       power: rename public structs
>       power: rename constants
>       power: export guest channel header file
>       power: clean up includes
>       eal: fix MCS lock header include
>       eal: fix internal ABI tag with clang
>       power: fix missing header includes
>       rib: fix missing header include
>       eal: fix automatic loading of drivers as shared libs
>
> Chengchang Tang (7):
>       net/hns3: fix register length when dumping registers
>       net/hns3: fix data overwriting during register dump
>       net/hns3: fix dump register out of range
>       net/hns3: fix interrupt resources in Rx interrupt mode
>       net/hns3: fix firmware exceptions by concurrent commands
>       net/hns3: fix VF reset on mailbox failure
>       net/hns3: fix stats flip overflow
>
> Chengwen Feng (3):
>       net/hns3: fix VF query link status in dev init
>       net/hns3: remove MPLS from supported flow items
>       net/hns3: fix flow director rule residue on malloc failure
>
> Ciara Power (3):
>       app/crypto-perf: fix spelling in output
>       app/crypto-perf: fix latency CSV output
>       app/crypto-perf: fix CSV output format
>
> Cristian Dumitrescu (1):
>       examples/pipeline: fix CLI parsing crash
>
> Dapeng Yu (4):
>       net/ixgbe: fix flex bytes flow director rule
>       net/ice: check Rx queue number on RSS init
>       net/ixgbe: disable NFS filtering
>       app/testpmd: avoid exit without terminal restore
>
> David Marchand (3):
>       net/hinic: restore vectorised code
>       examples/pipeline: fix VXLAN script permission
>       mbuf: remove unneeded atomic generic header include
>
> Dekel Peled (8):
>       net/mlx5: fix shared age action validation
>       net/mlx5: fix hairpin flow split decision
>       net/mlx5: fix flow split combined with counter
>       net/mlx5: fix flow split combined with age action
>       net/mlx5: fix shared RSS translation and cleanup
>       app/testpmd: support shared age action query
>       net/mlx5: fix shared RSS capability check
>       net/mlx5: validate hash Rx queue pointer
>
> Dmitry Kozlyuk (4):
>       eal/windows: fix build with MinGW-w64 8
>       bus/pci: fix build with MinGW-w64 8
>       bus/pci: fix hardware ID limit on Windows
>       build: fix linker flags on Windows
>
> Eugeny Parshutin (1):
>       doc: add vtune profiling config to prog guide
>
> Fan Zhang (1):
>       crypto/qat: fix digest in buffer
>
> Fei Chen (1):
>       vhost: fix vid allocation race
>
> Feifei Wang (7):
>       test/ring: reduce duration of performance tests
>       app/eventdev: adjust event count order for pipeline test
>       app/eventdev: remove redundant enqueue in burst Tx
>       examples/eventdev: check CPU core enabling
>       examples/eventdev: add info output for main core
>       examples/eventdev: move ethdev stop to the end
>       app/eventdev: fix SMP barrier in performance test
>
> Ferruh Yigit (13):
>       app/procinfo: fix _filters stats reporting
>       app/procinfo: fix check on xstats-ids
>       app/procinfo: remove useless memset
>       app/procinfo: remove useless assignment
>       net/pcap: remove local variable shadowing outer one
>       net/bonding: remove local variable shadowing outer one
>       net/af_xdp: remove useless assignment
>       net/bnxt: remove redundant return
>       app/crypto-perf: remove always true condition
>       net/avp: remove always true condition
>       net/pcap: fix byte stats for drop Tx
>       net/pcap: fix infinite Rx with large files
>       app/testpmd: fix help of metering commands
>
> Gaetan Rivet (2):
>       net/bonding: fix port id validity check on parsing
>       net/bonding: fix PCI address comparison on non-PCI ports
>
> Gagandeep Singh (2):
>       test/ipsec: fix result code for not supported
>       crypto/dpaa2_sec: fix memory allocation check
>
> George Prekas (1):
>       app/testpmd: fix IP checksum calculation
>
> Gregory Etelson (5):
>       net/mlx5: fix Direct Verbs flow descriptor allocation
>       app/testpmd: release flows left before port stop
>       net/mlx5: fix tunnel rules validation on VF representor
>       net/mlx5: fix mark action in active tunnel offload
>       net/mlx5: fix drop action in tunnel offload mode
>
> Guy Kaneti (1):
>       regex/octeontx2: fix PCI table overflow
>
> Haiyue Wang (2):
>       net/ice: drain out DCF AdminQ command queue
>       net/ixgbe: fix UDP zero checksum on x86
>
> Harman Kalra (1):
>       examples/l3fwd: remove limitation on Tx queue count
>
> Harry van Haaren (1):
>       eventdev: fix a return value comment
>
> Heinrich Kuhn (1):
>       net/nfp: read chip model from PluDevice register
>
> Hemant Agrawal (1):
>       app/procinfo: fix security context info
>
> Hongbo Zheng (1):
>       net/hns3: use new opcode for clearing hardware resource
>
> Huisong Li (7):
>       app/testpmd: fix queue stats mapping configuration
>       net/hns3: fix xstats with id and names
>       net/hns3: fix error code in xstats
>       net/hns3: fix Rx/Tx errors stats
>       net/hns3: fix link status change from firmware
>       net/hns3: validate requested maximum Rx frame length
>       net/hns3: fix query order of link status and link info
>
> Hyong Youb Kim (2):
>       net/enic: fix filter type used for flow API
>       net/enic: fix filter log message
>
> Ido Segev (1):
>       net/ena: flush Rx buffers memory pool cache
>
> Igor Chauskin (2):
>       net/ena: fix Tx SQ free space assessment
>       net/ena: prevent double doorbell
>
> Igor Ryzhov (1):
>       net/i40e: fix stats counters
>
> Ivan Malov (11):
>       common/sfc_efx/base: remove warnings about inline specifiers
>       common/sfc_efx/base: fix signed/unsigned mismatch warnings
>       common/sfc_efx/base: support alternative MAE match fields
>       common/sfc_efx/base: update MCDI headers for MAE privilege
>       common/sfc_efx/base: check for MAE privilege
>       common/sfc_efx/base: fix MPORT related byte order handling
>       common/sfc_efx/base: fix MAE match spec validation helper
>       common/sfc_efx/base: fix MAE match spec class comparison API
>       common/sfc_efx/base: enhance field ID check in field set API
>       common/sfc_efx/base: apply mask to value on match field set
>       net/sfc: fix TSO and checksum offloads for EF10
>
> Jiawei Wang (4):
>       net/mlx5: fix unnecessary checking for RSS action
>       app/testpmd: fix packets dump overlapping
>       net/mlx5: fix count actions query in sample flow
>       net/mlx5: fix counter and age flow action validation
>
> Jiawei Zhu (1):
>       net/virtio-user: fix run closing stdin and close callfd
>
> Jingjing Wu (1):
>       net/iavf: fix vector mapping with queue
>
> John McNamara (1):
>       license: add licenses for exception cases
>
> Joyce Kong (1):
>       eal/arm: fix debug build with gcc for 128-bit atomics
>
> Junfeng Guo (1):
>       net/iavf: fix GTPU UL and DL support for flow director
>
> Kalesh AP (4):
>       net/bnxt: release HWRM lock in error
>       net/bnxt: propagate FW command failure to application
>       net/bnxt: fix VNIC RSS configure function
>       net/bnxt: fix FW version log
>
> Karra Satwik (2):
>       net/cxgbe: accept VLAN flow items without ethertype
>       app/testpmd: fix start index for showing FEC array
>
> Lance Richardson (10):
>       net/bnxt: disable end of packet padding for Rx
>       net/bnxt: limit Rx representor packets per poll
>       net/bnxt: fix doorbell write ordering
>       net/bnxt: fix outer UDP checksum Rx offload capability
>       net/bnxt: make offload flags mapping per-ring
>       net/bnxt: set correct checksum status in mbuf
>       net/bnxt: fix packet type index calculation
>       net/bnxt: fix null termination of Rx mbuf chain
>       net/bnxt: fix fallback mbuf allocation logic
>       net/bnxt: fix Rx completion ring size calculation
>
> Leyi Rong (1):
>       net/ice: enlarge Rx queue rearm threshold to 64
>
> Lijun Ou (6):
>       net/hns3: fix interception with flow director
>       net/hns3: fix memory leak on secondary process exit
>       net/hns3: adjust some comments
>       net/hns3: adjust format specifier for enum
>       doc: fix product link in hns3 guide
>       net/hns3: fix RSS indirection table size
>
> Liron Himi (5):
>       net/octeontx2: fix PF flow action for Tx
>       net/mvpp2: remove debug log on fast-path
>       net/mvpp2: remove VLAN flush
>       net/mvpp2: remove CRC length from MRU validation
>       net/mvpp2: fix frame size checking
>
> Long Li (1):
>       net/netvsc: ignore unsupported packet on sync command
>
> Lukasz Wojciechowski (1):
>       test/distributor: fix return buffer queue overload
>
> Marvin Liu (1):
>       vhost: fix packed ring dequeue offloading
>
> Matan Azrad (1):
>       vdpa/mlx5: fix configuration mutex cleanup
>
> Maxime Coquelin (3):
>       net/virtio: add missing backend features negotiation
>       net/virtio: fix memory init with vDPA backend
>       net/virtio: fix getting old status on reconnect
>
> Michael Baum (7):
>       net/mlx5: fix leak on Rx queue creation failure
>       net/mlx5: fix leak on Tx queue creation failure
>       common/mlx5: fix completion queue entry size configuration
>       net/mlx5: remove CQE padding device argument
>       net/mlx5: fix leak on ASO SQ creation failure
>       net/mlx4: fix device detach
>       net/mlx4: fix handling of probing failure
>
> Michal Krawczyk (1):
>       net/ena: validate Rx req ID upon acquiring descriptor
>
> Min Hu (Connor) (3):
>       net/hns3: fix FEC state query
>       net/hns3: fix crash with multi-process
>       doc: add FEC to NIC features
>
> Murphy Yang (6):
>       net/ice: fix outer UDP Tx checksum offload
>       net/i40e: fix L4 checksum flag
>       net/ice: fix outer checksum flags
>       net/iavf: fix conflicting RSS combination rules
>       net/ice: disable IPv4 checksum offload in vector Tx
>       net/i40e: add null input checks
>
> Nick Connolly (2):
>       eal/windows: fix debug build with MinGW
>       eal/windows: fix vfprintf warning with clang
>
> Olivier Matz (5):
>       build: fix plugin load on static build
>       net/virtio-user: fix protocol features advertising
>       service: propagate init error in EAL
>       test/mcslock: remove unneeded per lcore copy
>       mempool: fix panic on dump or audit
>
> Ophir Munk (4):
>       net/mlx5: fix freeing packet pacing
>       net/mlx5: fix flow action destroy wrapper
>       net/mlx5: fix flow operation wrapper per OS
>       net/mlx5: unify operations for all OS
>
> Ori Kam (3):
>       regex/mlx5: fix memory rule alignment
>       regex/mlx5: fix support for group id
>       regex/mlx5: fix number of supported queues
>
> Qi Zhang (4):
>       doc: fix some statements for ice vector PMD
>       net/ice/base: fix tunnel destroy
>       net/ice/base: fix null pointer dereference
>       net/ice/base: fix memory handling
>
> Ruifeng Wang (4):
>       lpm: fix vector IPv4 lookup
>       net/hns3: fix build with SVE
>       net/octeontx: fix build with SVE
>       common/octeontx2: fix build with SVE
>
> Samik Gupta (2):
>       net/bnxt: fix Rx rings in RSS redirection table
>       net/bnxt: fix VNIC config on Rx queue stop
>
> Shiri Kuzin (2):
>       net/mlx5: fix VXLAN decap on non-VXLAN flow
>       net/mlx5: refuse empty VLAN in flow pattern
>
> Somnath Kotur (4):
>       net/bnxt: fix PF resource query
>       net/bnxt: fix lock init and destroy
>       net/bnxt: fix error handling in device start
>       net/bnxt: refactor init/uninit
>
> Souvik Dey (2):
>       net/i40e: fix VLAN stripping in VF
>       common/mlx5: fix storing synced MAC to internal table
>
> Sriharsha Basavapatna (1):
>       net/bnxt: fix max rings computation
>
> Stephen Hemminger (2):
>       test/rwlock: fix spelling and missing whitespace
>       test: fix terminal settings on exit
>
> Steve Yang (23):
>       ethdev: fix max Rx packet length check
>       app/testpmd: fix max Rx packet length for VLAN packets
>       net/dpaa: fix jumbo frame flag condition for MTU set
>       net/dpaa2: fix jumbo frame flag condition for MTU set
>       net/e1000: fix jumbo frame flag condition for MTU set
>       net/hns3: fix jumbo frame flag condition for MTU set
>       net/i40e: fix jumbo frame flag condition
>       net/iavf: fix jumbo frame flag condition
>       net/ice: fix jumbo frame flag condition
>       net/ipn3ke: fix jumbo frame flag condition for MTU set
>       net/octeontx: fix jumbo frame flag condition for MTU set
>       net/octeontx2: fix jumbo frame flag condition for MTU
>       net/qede: fix jumbo frame flag condition for MTU set
>       net/sfc: fix jumbo frame flag condition for MTU set
>       net/thunderx: fix jumbo frame flag condition for MTU set
>       net/ixgbe: fix jumbo frame flag condition
>       net/cxgbe: fix jumbo frame flag condition
>       net/axgbe: fix jumbo frame flag condition for MTU set
>       net/enetc: fix jumbo frame flag condition for MTU set
>       net/hinic: fix jumbo frame flag condition for MTU set
>       net/nfp: fix jumbo frame flag condition for MTU set
>       net/liquidio: fix jumbo frame flag condition for MTU set
>       app/testpmd: fix setting maximum packet length
>
> Suanming Mou (5):
>       net/mlx5: fix shared RSS and mark actions combination
>       net/mlx5: fix multi-process port ID
>       net/mlx5: fix crash on secondary process port close
>       net/mlx5: fix port attach in secondary process
>       net/mlx4: fix port attach in secondary process
>
> Sunil Kumar Kori (2):
>       net/octeontx2: fix corruption in segments list
>       net/octeontx: fix max Rx packet length
>
> Tal Shnaiderman (5):
>       bus/pci: ignore missing NUMA node on Windows
>       net/mlx5: fix constant array size
>       net/mlx5: fix device name size on Windows
>       net/mlx5: fix comparison sign in flow engine
>       common/mlx5: fix pointer cast on Windows
>
> Thomas Monjalon (3):
>       doc: fix figure numbering in graph guide
>       lib: fix doxygen for parameters of function pointers
>       ethdev: fix close failure handling
>
> Timothy McDaniel (1):
>       event/dlb: fix accessing uninitialized variables
>
> Ting Xu (1):
>       net/iavf: fix memory leak in large VF
>
> Tyler Retzlaff (2):
>       bus/pci: fix build with Windows SDK >= 10.0.20253
>       eal/windows: fix C++ compatibility
>
> Viacheslav Galaktionov (1):
>       net/sfc: fix generic byte statistics to exclude FCS bytes
>
> Viacheslav Ovsiienko (8):
>       net/mlx5: fix Verbs memory allocation callback
>       net/mlx5: fix buffer split offload advertising
>       doc: update flow mark action in mlx5 guide
>       net/mlx5: fix wire vport hint
>       app/testpmd: fix queue reconfig request on Rx split update
>       doc: fix supported feature table in mlx5 guide
>       doc: fix mark action zero value in mlx5 guide
>       net/mlx5: fix Tx queue size created with DevX
>
> Vladimir Medvedkin (2):
>       rib: fix insertion in some cases
>       crypto/qat: fix access to uninitialized variable
>
> Weifeng Li (1):
>       net/i40e: fix X722 for 802.1ad frames ability
>
> Wenjun Wu (1):
>       net/e1000: fix flow control mode setting
>
> Wisam Jaddo (1):
>       app/flow-perf: simplify objects initialization
>
> Xuan Ding (1):
>       net/iavf: fix symmetric flow rule creation
>
> Yicai Lu (1):
>       ip_frag: remove padding length of fragment
>
> Yongxin Liu (1):
>       usertools: fix binding built-in kernel driver
>
> Yunjian Wang (3):
>       eal/linux: fix handling of error events from epoll
>       net/bnxt: fix memory leak when mapping fails
>       net/mvneta: check allocation in Rx queue flush
>
> Yuri Chipchev (1):
>       net/mvpp2: fix stack corruption
>


-- 
Regards,
Kalesh A P

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v2 4/6] net/pcap: add libpcap wrappers
  @ 2021-02-25 23:10  3%           ` Dmitry Kozlyuk
  0 siblings, 0 replies; 200+ results
From: Dmitry Kozlyuk @ 2021-02-25 23:10 UTC (permalink / raw)
  To: Nick Connolly
  Cc: Ferruh Yigit, dev, Tyler Retzlaff, Mike Wells,
	Narcisa Ana Maria Vasile, Dmitry Malloy, Pallavi Kadam, Jie Zhou

2021-02-25 20:31, Nick Connolly:
> > Your comment made me revise Windows EAL networking shims. Surprisingly, if
> > changed to expose Windows networking headers (specifically, <ws2tcpip.h>) with
> > some additions (but no hacks), they create no issues to any existing code.
> >
> > The only workaround remaining is `#undef s_addr` in <rte_ether.h>.
> >
> > So maybe this commit can be dropped, if Windows EAL networking headers be
> > reworked in the following way:
> >
> > 	#if defined min
> > 	#define USER_EXPLICITLY_WANTS_WINDOWS_H
> > 	#endif
> >
> > 	#include <ws2tcpip.h>
> >
> > 	/* hide definitions that break portable code,
> > 	 * e.g. it had to be done once already for i40e
> > 	 */
> > 	#ifndef USER_EXPLICITLY_WANTS_WINDOWS_H
> > 	#undef min, max, ...
> > 	#endif
> >
> > 	#define what's missing from Windows headers, e.g. IPPROTO_SCTP
> >
> > + Windows maintainers, Nick Connolly, and Jie Zhou to discuss.  
> In my opinion, there are long term maintenance issues either way round.
> 
> Wrapping the system headers hides the details and keeps the code 'clean',
> but has to work with multiple compiler environments and versions of the
> headers - not always straightforward. 

You're probably right.
We had an exchange with Tyler, let me quote:

[DmitryK]
> I'm pretty sure no DPDK header really needs anything beyond standard C,
> but one exception: intrinsic functions for vector instructions.
> Struct in_addr? An oversight, there's rte_ether_addr, should be rte_ip_addr.

Here's a complete list of offending files included from public headers,
with comments on usage:

POSIX

    netinet/in.h
    netinet/ip6.h
    netinet/ip.h
	cmdline:  struct in_addr, struct in6_addr, 6 constants
	net:      ditto
	security: ditto
    pthread.h
	eal:	not used
	ethdev:	pthread_mutex_t flow_ops_mutex;
    sched.h
	eal:       cpu_set_t
	telemetry: rte_cpuset_t (not used?)
    sys/types.h
	ehtdev:   not needed (FILE?)
	net:      not needed
	mbuf:     ditto
	pci:      ditto
	security: ditto
	sched:    ditto

Unix

    sys/queue.h
	(acl, eal, hash, lpm, mempool, pci, ring, table,
	 bus/{fslmc,pci,vdev,vmbus}, net/{memif,tap})
		multiprocessing

Thread-related stuff will go away as rte_thread.h expands.
Network headers are not much needed, as you can see above.
Other headers mostly not needed or can be replaced with standard ones.

Replacing `in_addr` with and `rte_ip_addr` will break API, but not ABI,
because it's essentially the same thing. We can define new types
conditionally, as it was done for struct cmdline, if need be.

Complete removal of non-standard dependencies in headers is within a grasp.
Then we can remove shims and include whatever needed.
Thoughts?

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] 20.11.1 patches review and test
  2021-02-25 13:00  0% ` Pei Zhang
@ 2021-02-25 14:39  0%   ` Luca Boccassi
  0 siblings, 0 replies; 200+ results
From: Luca Boccassi @ 2021-02-25 14:39 UTC (permalink / raw)
  To: Pei Zhang
  Cc: stable, dev, Abhishek Marathe, Akhil Goyal, Ali Alnubani,
	benjamin walker, David Christensen, hariprasad govindharajan,
	Hemant Agrawal, Ian Stokes, Jerin Jacob, John McNamara,
	Ju-Hyoung Lee, Kevin Traynor, pingx yu, qian q xu,
	Raslan Darawsheh, Thomas Monjalon, yuan peng, zhaoyan chen

On Thu, 2021-02-25 at 08:00 -0500, Pei Zhang wrote:
> Hello Luca,
> 
> The testing with dpdk 20.11.1-rc1 from Red Hat looks good. We tested below 17 scenarios and and all got PASS on RHEL8:
> 
> (1)Guest with device assignment(PF) throughput testing(1G hugepage size): PASS
> (2)Guest with device assignment(PF) throughput testing(2M hugepage size) : PASS
> (3)Guest with device assignment(VF) throughput testing: PASS
> (4)PVP (host dpdk testpmd as vswitch) 1Q: throughput testing: PASS
> (5)PVP vhost-user 2Q throughput testing: PASS
> (6)PVP vhost-user 1Q - cross numa node throughput testing: PASS
> (7)Guest with vhost-user 2 queues throughput testing: PASS
> (8)vhost-user reconnect with dpdk-client, qemu-server: qemu reconnect: PASS
> (9)vhost-user reconnect with dpdk-client, qemu-server: ovs reconnect: PASS
> (10)PVP 1Q live migration testing: PASS
> (11)PVP 1Q cross numa node live migration testing: PASS
> (12)Guest with ovs+dpdk+vhost-user 1Q live migration testing: PASS
> (13)Guest with ovs+dpdk+vhost-user 1Q live migration testing (2M): PASS
> (14)Guest with ovs+dpdk+vhost-user 2Q live migration testing: PASS
> (15)Guest with ovs+dpdk+vhost-user 4Q live migration testing: PASS
> (16)Host PF + DPDK testing: PASS
> (17)Host VF + DPDK testing: PASS
> 
> Versions:
> 
> kernel 4.18
> qemu 5.2
> 
> dpdk: git://dpdk.org/dpdk-stable  
> # git log -1
> commit fa27a3c11fba9ff30b2c4c4fcc862cea2b654803 (HEAD, tag: v20.11.1-rc1, origin/20.11)
> Author: Luca Boccassi <luca.boccassi@microsoft.com>
> Date:   Mon Feb 22 14:59:17 2021 +0000
> 
>     version: 20.11.1-rc1
>     
>     Signed-off-by: Luca Boccassi <luca.boccassi@microsoft.com>
> 
> 
> # git branch
> remotes/origin/20.11
> 
> NICs: X540-AT2 NIC(ixgbe, 10G)
> 
> Best regards,
> 
> Pei

Thank you!

> 
> ----- Original Message -----
> > From: "luca boccassi" <luca.boccassi@gmail.com>
> > To: stable@dpdk.org
> > Cc: dev@dpdk.org, "Abhishek Marathe" <Abhishek.Marathe@microsoft.com>, "Akhil Goyal" <akhil.goyal@nxp.com>, "Ali
> > Alnubani" <alialnu@nvidia.com>, "benjamin walker" <benjamin.walker@intel.com>, "David Christensen"
> > <drc@linux.vnet.ibm.com>, "hariprasad govindharajan" <hariprasad.govindharajan@intel.com>, "Hemant Agrawal"
> > <hemant.agrawal@nxp.com>, "Ian Stokes" <ian.stokes@intel.com>, "Jerin Jacob" <jerinj@marvell.com>, "John McNamara"
> > <john.mcnamara@intel.com>, "Ju-Hyoung Lee" <juhlee@microsoft.com>, "Kevin Traynor" <ktraynor@redhat.com>, "Luca
> > Boccassi" <bluca@debian.org>, "Pei Zhang" <pezhang@redhat.com>, "pingx yu" <pingx.yu@intel.com>, "qian q xu"
> > <qian.q.xu@intel.com>, "Raslan Darawsheh" <rasland@nvidia.com>, "Thomas Monjalon" <thomas@monjalon.net>, "yuan peng"
> > <yuan.peng@intel.com>, "zhaoyan chen" <zhaoyan.chen@intel.com>
> > Sent: Monday, February 22, 2021 11:09:18 PM
> > Subject: 20.11.1 patches review and test
> > 
> > Hi all,
> > 
> > Here is a list of patches targeted for stable release 20.11.1.
> > 
> > The planned date for the final release is the 8th of March.
> > 
> > Please help with testing and validation of your use cases and report
> > any issues/results with reply-all to this mail. For the final release
> > the fixes and reported validations will be added to the release notes.
> > 
> > A release candidate tarball can be found at:
> > 
> >     https://dpdk.org/browse/dpdk-stable/tag/?id=v20.11.1-rc1
> > 
> > These patches are located at branch 20.11 of dpdk-stable repo:
> >     https://dpdk.org/browse/dpdk-stable/
> > 
> > Thanks.
> > 
> > Luca Boccassi
> > 
> > ---
> > Ajit Khaparde (3):
> >       net/bnxt: fix cleanup on mutex init failure
> >       net/bnxt: fix format specifier for unsigned int
> >       net/bnxt: fix freeing mbuf
> > 
> > Alexander Kozyrev (4):
> >       net/mlx5: fix mbuf freeing in vectorized MPRQ
> >       net/mlx5: fix flow tag decompression
> >       net/mlx5: check FW miniCQE format capabilities
> >       net/mlx5: fix miniCQE configuration for Verbs
> > 
> > Alvin Zhang (9):
> >       net/ixgbe: detect failed VF MTU set
> >       net/i40e: fix Rx bytes statistics
> >       net/iavf: fix queue pairs configuration
> >       doc: fix RSS flow description in i40e guide
> >       net/i40e: fix returned code for RSS hardware failure
> >       net/ice: fix RSS lookup table initialization
> >       test: fix buffer overflow in Tx burst
> >       net/ixgbe: fix configuration of max frame size
> >       app/testpmd: fix key for RSS flow rule
> > 
> > Amit Bernstein (1):
> >       net/ena: fix Tx doorbell statistics
> > 
> > Anatoly Burakov (1):
> >       fbarray: fix overlap check
> > 
> > Andrew Boyer (5):
> >       net/ionic: do minor logging fixups
> >       net/ionic: fix link speed and autonegotiation
> >       net/ionic: allow separate L3 and L4 checksum offload
> >       net/ionic: fix up function attribute tags
> >       net/ionic: fix address handling in Tx
> > 
> > Ankur Dwivedi (1):
> >       test/event_crypto: set cipher operation in transform
> > 
> > Ashish Sadanandan (1):
> >       mbuf: add C++ include guard for dynamic fields header
> > 
> > Balazs Nemeth (1):
> >       net/qede: fix promiscuous enable
> > 
> > Beilei Xing (2):
> >       net/i40e: fix global register recovery
> >       net/i40e: fix flex payload rule conflict
> > 
> > Bernard Iremonger (1):
> >       doc: fix QinQ flow rules in testpmd guide
> > 
> > Bruce Richardson (29):
> >       ethdev: avoid blocking telemetry for link status
> >       build: provide suitable error for "both" libraries option
> >       eal: fix reciprocal header include
> >       telemetry: fix missing header include
> >       ethdev: fix missing header include
> >       net: fix missing header include
> >       mbuf: fix missing header include
> >       bitrate: fix missing header include
> >       rib: fix missing header includes
> >       vhost: fix missing header includes
> >       ipsec: fix missing header include
> >       fib: fix missing header includes
> >       table: fix missing header include
> >       pipeline: fix missing header includes
> >       metrics: fix variable declaration in header
> >       node: fix missing header include
> >       app: fix build with extra include paths
> >       build: force pkg-config for dependency detection
> >       power: create guest channel public header file
> >       power: make channel message functions public
> >       power: rename public structs
> >       power: rename constants
> >       power: export guest channel header file
> >       power: clean up includes
> >       eal: fix MCS lock header include
> >       eal: fix internal ABI tag with clang
> >       power: fix missing header includes
> >       rib: fix missing header include
> >       eal: fix automatic loading of drivers as shared libs
> > 
> > Chengchang Tang (7):
> >       net/hns3: fix register length when dumping registers
> >       net/hns3: fix data overwriting during register dump
> >       net/hns3: fix dump register out of range
> >       net/hns3: fix interrupt resources in Rx interrupt mode
> >       net/hns3: fix firmware exceptions by concurrent commands
> >       net/hns3: fix VF reset on mailbox failure
> >       net/hns3: fix stats flip overflow
> > 
> > Chengwen Feng (3):
> >       net/hns3: fix VF query link status in dev init
> >       net/hns3: remove MPLS from supported flow items
> >       net/hns3: fix flow director rule residue on malloc failure
> > 
> > Ciara Power (3):
> >       app/crypto-perf: fix spelling in output
> >       app/crypto-perf: fix latency CSV output
> >       app/crypto-perf: fix CSV output format
> > 
> > Cristian Dumitrescu (1):
> >       examples/pipeline: fix CLI parsing crash
> > 
> > Dapeng Yu (4):
> >       net/ixgbe: fix flex bytes flow director rule
> >       net/ice: check Rx queue number on RSS init
> >       net/ixgbe: disable NFS filtering
> >       app/testpmd: avoid exit without terminal restore
> > 
> > David Marchand (3):
> >       net/hinic: restore vectorised code
> >       examples/pipeline: fix VXLAN script permission
> >       mbuf: remove unneeded atomic generic header include
> > 
> > Dekel Peled (8):
> >       net/mlx5: fix shared age action validation
> >       net/mlx5: fix hairpin flow split decision
> >       net/mlx5: fix flow split combined with counter
> >       net/mlx5: fix flow split combined with age action
> >       net/mlx5: fix shared RSS translation and cleanup
> >       app/testpmd: support shared age action query
> >       net/mlx5: fix shared RSS capability check
> >       net/mlx5: validate hash Rx queue pointer
> > 
> > Dmitry Kozlyuk (4):
> >       eal/windows: fix build with MinGW-w64 8
> >       bus/pci: fix build with MinGW-w64 8
> >       bus/pci: fix hardware ID limit on Windows
> >       build: fix linker flags on Windows
> > 
> > Eugeny Parshutin (1):
> >       doc: add vtune profiling config to prog guide
> > 
> > Fan Zhang (1):
> >       crypto/qat: fix digest in buffer
> > 
> > Fei Chen (1):
> >       vhost: fix vid allocation race
> > 
> > Feifei Wang (7):
> >       test/ring: reduce duration of performance tests
> >       app/eventdev: adjust event count order for pipeline test
> >       app/eventdev: remove redundant enqueue in burst Tx
> >       examples/eventdev: check CPU core enabling
> >       examples/eventdev: add info output for main core
> >       examples/eventdev: move ethdev stop to the end
> >       app/eventdev: fix SMP barrier in performance test
> > 
> > Ferruh Yigit (13):
> >       app/procinfo: fix _filters stats reporting
> >       app/procinfo: fix check on xstats-ids
> >       app/procinfo: remove useless memset
> >       app/procinfo: remove useless assignment
> >       net/pcap: remove local variable shadowing outer one
> >       net/bonding: remove local variable shadowing outer one
> >       net/af_xdp: remove useless assignment
> >       net/bnxt: remove redundant return
> >       app/crypto-perf: remove always true condition
> >       net/avp: remove always true condition
> >       net/pcap: fix byte stats for drop Tx
> >       net/pcap: fix infinite Rx with large files
> >       app/testpmd: fix help of metering commands
> > 
> > Gaetan Rivet (2):
> >       net/bonding: fix port id validity check on parsing
> >       net/bonding: fix PCI address comparison on non-PCI ports
> > 
> > Gagandeep Singh (2):
> >       test/ipsec: fix result code for not supported
> >       crypto/dpaa2_sec: fix memory allocation check
> > 
> > George Prekas (1):
> >       app/testpmd: fix IP checksum calculation
> > 
> > Gregory Etelson (5):
> >       net/mlx5: fix Direct Verbs flow descriptor allocation
> >       app/testpmd: release flows left before port stop
> >       net/mlx5: fix tunnel rules validation on VF representor
> >       net/mlx5: fix mark action in active tunnel offload
> >       net/mlx5: fix drop action in tunnel offload mode
> > 
> > Guy Kaneti (1):
> >       regex/octeontx2: fix PCI table overflow
> > 
> > Haiyue Wang (2):
> >       net/ice: drain out DCF AdminQ command queue
> >       net/ixgbe: fix UDP zero checksum on x86
> > 
> > Harman Kalra (1):
> >       examples/l3fwd: remove limitation on Tx queue count
> > 
> > Harry van Haaren (1):
> >       eventdev: fix a return value comment
> > 
> > Heinrich Kuhn (1):
> >       net/nfp: read chip model from PluDevice register
> > 
> > Hemant Agrawal (1):
> >       app/procinfo: fix security context info
> > 
> > Hongbo Zheng (1):
> >       net/hns3: use new opcode for clearing hardware resource
> > 
> > Huisong Li (7):
> >       app/testpmd: fix queue stats mapping configuration
> >       net/hns3: fix xstats with id and names
> >       net/hns3: fix error code in xstats
> >       net/hns3: fix Rx/Tx errors stats
> >       net/hns3: fix link status change from firmware
> >       net/hns3: validate requested maximum Rx frame length
> >       net/hns3: fix query order of link status and link info
> > 
> > Hyong Youb Kim (2):
> >       net/enic: fix filter type used for flow API
> >       net/enic: fix filter log message
> > 
> > Ido Segev (1):
> >       net/ena: flush Rx buffers memory pool cache
> > 
> > Igor Chauskin (2):
> >       net/ena: fix Tx SQ free space assessment
> >       net/ena: prevent double doorbell
> > 
> > Igor Ryzhov (1):
> >       net/i40e: fix stats counters
> > 
> > Ivan Malov (11):
> >       common/sfc_efx/base: remove warnings about inline specifiers
> >       common/sfc_efx/base: fix signed/unsigned mismatch warnings
> >       common/sfc_efx/base: support alternative MAE match fields
> >       common/sfc_efx/base: update MCDI headers for MAE privilege
> >       common/sfc_efx/base: check for MAE privilege
> >       common/sfc_efx/base: fix MPORT related byte order handling
> >       common/sfc_efx/base: fix MAE match spec validation helper
> >       common/sfc_efx/base: fix MAE match spec class comparison API
> >       common/sfc_efx/base: enhance field ID check in field set API
> >       common/sfc_efx/base: apply mask to value on match field set
> >       net/sfc: fix TSO and checksum offloads for EF10
> > 
> > Jiawei Wang (4):
> >       net/mlx5: fix unnecessary checking for RSS action
> >       app/testpmd: fix packets dump overlapping
> >       net/mlx5: fix count actions query in sample flow
> >       net/mlx5: fix counter and age flow action validation
> > 
> > Jiawei Zhu (1):
> >       net/virtio-user: fix run closing stdin and close callfd
> > 
> > Jingjing Wu (1):
> >       net/iavf: fix vector mapping with queue
> > 
> > John McNamara (1):
> >       license: add licenses for exception cases
> > 
> > Joyce Kong (1):
> >       eal/arm: fix debug build with gcc for 128-bit atomics
> > 
> > Junfeng Guo (1):
> >       net/iavf: fix GTPU UL and DL support for flow director
> > 
> > Kalesh AP (4):
> >       net/bnxt: release HWRM lock in error
> >       net/bnxt: propagate FW command failure to application
> >       net/bnxt: fix VNIC RSS configure function
> >       net/bnxt: fix FW version log
> > 
> > Karra Satwik (2):
> >       net/cxgbe: accept VLAN flow items without ethertype
> >       app/testpmd: fix start index for showing FEC array
> > 
> > Lance Richardson (10):
> >       net/bnxt: disable end of packet padding for Rx
> >       net/bnxt: limit Rx representor packets per poll
> >       net/bnxt: fix doorbell write ordering
> >       net/bnxt: fix outer UDP checksum Rx offload capability
> >       net/bnxt: make offload flags mapping per-ring
> >       net/bnxt: set correct checksum status in mbuf
> >       net/bnxt: fix packet type index calculation
> >       net/bnxt: fix null termination of Rx mbuf chain
> >       net/bnxt: fix fallback mbuf allocation logic
> >       net/bnxt: fix Rx completion ring size calculation
> > 
> > Leyi Rong (1):
> >       net/ice: enlarge Rx queue rearm threshold to 64
> > 
> > Lijun Ou (6):
> >       net/hns3: fix interception with flow director
> >       net/hns3: fix memory leak on secondary process exit
> >       net/hns3: adjust some comments
> >       net/hns3: adjust format specifier for enum
> >       doc: fix product link in hns3 guide
> >       net/hns3: fix RSS indirection table size
> > 
> > Liron Himi (5):
> >       net/octeontx2: fix PF flow action for Tx
> >       net/mvpp2: remove debug log on fast-path
> >       net/mvpp2: remove VLAN flush
> >       net/mvpp2: remove CRC length from MRU validation
> >       net/mvpp2: fix frame size checking
> > 
> > Long Li (1):
> >       net/netvsc: ignore unsupported packet on sync command
> > 
> > Lukasz Wojciechowski (1):
> >       test/distributor: fix return buffer queue overload
> > 
> > Marvin Liu (1):
> >       vhost: fix packed ring dequeue offloading
> > 
> > Matan Azrad (1):
> >       vdpa/mlx5: fix configuration mutex cleanup
> > 
> > Maxime Coquelin (3):
> >       net/virtio: add missing backend features negotiation
> >       net/virtio: fix memory init with vDPA backend
> >       net/virtio: fix getting old status on reconnect
> > 
> > Michael Baum (7):
> >       net/mlx5: fix leak on Rx queue creation failure
> >       net/mlx5: fix leak on Tx queue creation failure
> >       common/mlx5: fix completion queue entry size configuration
> >       net/mlx5: remove CQE padding device argument
> >       net/mlx5: fix leak on ASO SQ creation failure
> >       net/mlx4: fix device detach
> >       net/mlx4: fix handling of probing failure
> > 
> > Michal Krawczyk (1):
> >       net/ena: validate Rx req ID upon acquiring descriptor
> > 
> > Min Hu (Connor) (3):
> >       net/hns3: fix FEC state query
> >       net/hns3: fix crash with multi-process
> >       doc: add FEC to NIC features
> > 
> > Murphy Yang (6):
> >       net/ice: fix outer UDP Tx checksum offload
> >       net/i40e: fix L4 checksum flag
> >       net/ice: fix outer checksum flags
> >       net/iavf: fix conflicting RSS combination rules
> >       net/ice: disable IPv4 checksum offload in vector Tx
> >       net/i40e: add null input checks
> > 
> > Nick Connolly (2):
> >       eal/windows: fix debug build with MinGW
> >       eal/windows: fix vfprintf warning with clang
> > 
> > Olivier Matz (5):
> >       build: fix plugin load on static build
> >       net/virtio-user: fix protocol features advertising
> >       service: propagate init error in EAL
> >       test/mcslock: remove unneeded per lcore copy
> >       mempool: fix panic on dump or audit
> > 
> > Ophir Munk (4):
> >       net/mlx5: fix freeing packet pacing
> >       net/mlx5: fix flow action destroy wrapper
> >       net/mlx5: fix flow operation wrapper per OS
> >       net/mlx5: unify operations for all OS
> > 
> > Ori Kam (3):
> >       regex/mlx5: fix memory rule alignment
> >       regex/mlx5: fix support for group id
> >       regex/mlx5: fix number of supported queues
> > 
> > Qi Zhang (4):
> >       doc: fix some statements for ice vector PMD
> >       net/ice/base: fix tunnel destroy
> >       net/ice/base: fix null pointer dereference
> >       net/ice/base: fix memory handling
> > 
> > Ruifeng Wang (4):
> >       lpm: fix vector IPv4 lookup
> >       net/hns3: fix build with SVE
> >       net/octeontx: fix build with SVE
> >       common/octeontx2: fix build with SVE
> > 
> > Samik Gupta (2):
> >       net/bnxt: fix Rx rings in RSS redirection table
> >       net/bnxt: fix VNIC config on Rx queue stop
> > 
> > Shiri Kuzin (2):
> >       net/mlx5: fix VXLAN decap on non-VXLAN flow
> >       net/mlx5: refuse empty VLAN in flow pattern
> > 
> > Somnath Kotur (4):
> >       net/bnxt: fix PF resource query
> >       net/bnxt: fix lock init and destroy
> >       net/bnxt: fix error handling in device start
> >       net/bnxt: refactor init/uninit
> > 
> > Souvik Dey (2):
> >       net/i40e: fix VLAN stripping in VF
> >       common/mlx5: fix storing synced MAC to internal table
> > 
> > Sriharsha Basavapatna (1):
> >       net/bnxt: fix max rings computation
> > 
> > Stephen Hemminger (2):
> >       test/rwlock: fix spelling and missing whitespace
> >       test: fix terminal settings on exit
> > 
> > Steve Yang (23):
> >       ethdev: fix max Rx packet length check
> >       app/testpmd: fix max Rx packet length for VLAN packets
> >       net/dpaa: fix jumbo frame flag condition for MTU set
> >       net/dpaa2: fix jumbo frame flag condition for MTU set
> >       net/e1000: fix jumbo frame flag condition for MTU set
> >       net/hns3: fix jumbo frame flag condition for MTU set
> >       net/i40e: fix jumbo frame flag condition
> >       net/iavf: fix jumbo frame flag condition
> >       net/ice: fix jumbo frame flag condition
> >       net/ipn3ke: fix jumbo frame flag condition for MTU set
> >       net/octeontx: fix jumbo frame flag condition for MTU set
> >       net/octeontx2: fix jumbo frame flag condition for MTU
> >       net/qede: fix jumbo frame flag condition for MTU set
> >       net/sfc: fix jumbo frame flag condition for MTU set
> >       net/thunderx: fix jumbo frame flag condition for MTU set
> >       net/ixgbe: fix jumbo frame flag condition
> >       net/cxgbe: fix jumbo frame flag condition
> >       net/axgbe: fix jumbo frame flag condition for MTU set
> >       net/enetc: fix jumbo frame flag condition for MTU set
> >       net/hinic: fix jumbo frame flag condition for MTU set
> >       net/nfp: fix jumbo frame flag condition for MTU set
> >       net/liquidio: fix jumbo frame flag condition for MTU set
> >       app/testpmd: fix setting maximum packet length
> > 
> > Suanming Mou (5):
> >       net/mlx5: fix shared RSS and mark actions combination
> >       net/mlx5: fix multi-process port ID
> >       net/mlx5: fix crash on secondary process port close
> >       net/mlx5: fix port attach in secondary process
> >       net/mlx4: fix port attach in secondary process
> > 
> > Sunil Kumar Kori (2):
> >       net/octeontx2: fix corruption in segments list
> >       net/octeontx: fix max Rx packet length
> > 
> > Tal Shnaiderman (5):
> >       bus/pci: ignore missing NUMA node on Windows
> >       net/mlx5: fix constant array size
> >       net/mlx5: fix device name size on Windows
> >       net/mlx5: fix comparison sign in flow engine
> >       common/mlx5: fix pointer cast on Windows
> > 
> > Thomas Monjalon (3):
> >       doc: fix figure numbering in graph guide
> >       lib: fix doxygen for parameters of function pointers
> >       ethdev: fix close failure handling
> > 
> > Timothy McDaniel (1):
> >       event/dlb: fix accessing uninitialized variables
> > 
> > Ting Xu (1):
> >       net/iavf: fix memory leak in large VF
> > 
> > Tyler Retzlaff (2):
> >       bus/pci: fix build with Windows SDK >= 10.0.20253
> >       eal/windows: fix C++ compatibility
> > 
> > Viacheslav Galaktionov (1):
> >       net/sfc: fix generic byte statistics to exclude FCS bytes
> > 
> > Viacheslav Ovsiienko (8):
> >       net/mlx5: fix Verbs memory allocation callback
> >       net/mlx5: fix buffer split offload advertising
> >       doc: update flow mark action in mlx5 guide
> >       net/mlx5: fix wire vport hint
> >       app/testpmd: fix queue reconfig request on Rx split update
> >       doc: fix supported feature table in mlx5 guide
> >       doc: fix mark action zero value in mlx5 guide
> >       net/mlx5: fix Tx queue size created with DevX
> > 
> > Vladimir Medvedkin (2):
> >       rib: fix insertion in some cases
> >       crypto/qat: fix access to uninitialized variable
> > 
> > Weifeng Li (1):
> >       net/i40e: fix X722 for 802.1ad frames ability
> > 
> > Wenjun Wu (1):
> >       net/e1000: fix flow control mode setting
> > 
> > Wisam Jaddo (1):
> >       app/flow-perf: simplify objects initialization
> > 
> > Xuan Ding (1):
> >       net/iavf: fix symmetric flow rule creation
> > 
> > Yicai Lu (1):
> >       ip_frag: remove padding length of fragment
> > 
> > Yongxin Liu (1):
> >       usertools: fix binding built-in kernel driver
> > 
> > Yunjian Wang (3):
> >       eal/linux: fix handling of error events from epoll
> >       net/bnxt: fix memory leak when mapping fails
> >       net/mvneta: check allocation in Rx queue flush
> > 
> > Yuri Chipchev (1):
> >       net/mvpp2: fix stack corruption
> > 
> > 

-- 
Kind regards,
Luca Boccassi

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] 20.11.1 patches review and test
  2021-02-22 15:09  1% [dpdk-dev] 20.11.1 patches review and test luca.boccassi
  2021-02-25  9:43  0% ` Christian Ehrhardt
@ 2021-02-25 13:00  0% ` Pei Zhang
  2021-02-25 14:39  0%   ` Luca Boccassi
  2021-03-02  6:23  0% ` Kalesh Anakkur Purayil
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 200+ results
From: Pei Zhang @ 2021-02-25 13:00 UTC (permalink / raw)
  To: luca boccassi
  Cc: stable, dev, Abhishek Marathe, Akhil Goyal, Ali Alnubani,
	benjamin walker, David Christensen, hariprasad govindharajan,
	Hemant Agrawal, Ian Stokes, Jerin Jacob, John McNamara,
	Ju-Hyoung Lee, Kevin Traynor, Luca Boccassi, pingx yu, qian q xu,
	Raslan Darawsheh, Thomas Monjalon, yuan peng, zhaoyan chen

Hello Luca,

The testing with dpdk 20.11.1-rc1 from Red Hat looks good. We tested below 17 scenarios and and all got PASS on RHEL8:

(1)Guest with device assignment(PF) throughput testing(1G hugepage size): PASS
(2)Guest with device assignment(PF) throughput testing(2M hugepage size) : PASS
(3)Guest with device assignment(VF) throughput testing: PASS
(4)PVP (host dpdk testpmd as vswitch) 1Q: throughput testing: PASS
(5)PVP vhost-user 2Q throughput testing: PASS
(6)PVP vhost-user 1Q - cross numa node throughput testing: PASS
(7)Guest with vhost-user 2 queues throughput testing: PASS
(8)vhost-user reconnect with dpdk-client, qemu-server: qemu reconnect: PASS
(9)vhost-user reconnect with dpdk-client, qemu-server: ovs reconnect: PASS
(10)PVP 1Q live migration testing: PASS
(11)PVP 1Q cross numa node live migration testing: PASS
(12)Guest with ovs+dpdk+vhost-user 1Q live migration testing: PASS
(13)Guest with ovs+dpdk+vhost-user 1Q live migration testing (2M): PASS
(14)Guest with ovs+dpdk+vhost-user 2Q live migration testing: PASS
(15)Guest with ovs+dpdk+vhost-user 4Q live migration testing: PASS
(16)Host PF + DPDK testing: PASS
(17)Host VF + DPDK testing: PASS

Versions:

kernel 4.18
qemu 5.2

dpdk: git://dpdk.org/dpdk-stable  
# git log -1
commit fa27a3c11fba9ff30b2c4c4fcc862cea2b654803 (HEAD, tag: v20.11.1-rc1, origin/20.11)
Author: Luca Boccassi <luca.boccassi@microsoft.com>
Date:   Mon Feb 22 14:59:17 2021 +0000

    version: 20.11.1-rc1
    
    Signed-off-by: Luca Boccassi <luca.boccassi@microsoft.com>


# git branch
remotes/origin/20.11

NICs: X540-AT2 NIC(ixgbe, 10G)

Best regards,

Pei



----- Original Message -----
> From: "luca boccassi" <luca.boccassi@gmail.com>
> To: stable@dpdk.org
> Cc: dev@dpdk.org, "Abhishek Marathe" <Abhishek.Marathe@microsoft.com>, "Akhil Goyal" <akhil.goyal@nxp.com>, "Ali
> Alnubani" <alialnu@nvidia.com>, "benjamin walker" <benjamin.walker@intel.com>, "David Christensen"
> <drc@linux.vnet.ibm.com>, "hariprasad govindharajan" <hariprasad.govindharajan@intel.com>, "Hemant Agrawal"
> <hemant.agrawal@nxp.com>, "Ian Stokes" <ian.stokes@intel.com>, "Jerin Jacob" <jerinj@marvell.com>, "John McNamara"
> <john.mcnamara@intel.com>, "Ju-Hyoung Lee" <juhlee@microsoft.com>, "Kevin Traynor" <ktraynor@redhat.com>, "Luca
> Boccassi" <bluca@debian.org>, "Pei Zhang" <pezhang@redhat.com>, "pingx yu" <pingx.yu@intel.com>, "qian q xu"
> <qian.q.xu@intel.com>, "Raslan Darawsheh" <rasland@nvidia.com>, "Thomas Monjalon" <thomas@monjalon.net>, "yuan peng"
> <yuan.peng@intel.com>, "zhaoyan chen" <zhaoyan.chen@intel.com>
> Sent: Monday, February 22, 2021 11:09:18 PM
> Subject: 20.11.1 patches review and test
> 
> Hi all,
> 
> Here is a list of patches targeted for stable release 20.11.1.
> 
> The planned date for the final release is the 8th of March.
> 
> Please help with testing and validation of your use cases and report
> any issues/results with reply-all to this mail. For the final release
> the fixes and reported validations will be added to the release notes.
> 
> A release candidate tarball can be found at:
> 
>     https://dpdk.org/browse/dpdk-stable/tag/?id=v20.11.1-rc1
> 
> These patches are located at branch 20.11 of dpdk-stable repo:
>     https://dpdk.org/browse/dpdk-stable/
> 
> Thanks.
> 
> Luca Boccassi
> 
> ---
> Ajit Khaparde (3):
>       net/bnxt: fix cleanup on mutex init failure
>       net/bnxt: fix format specifier for unsigned int
>       net/bnxt: fix freeing mbuf
> 
> Alexander Kozyrev (4):
>       net/mlx5: fix mbuf freeing in vectorized MPRQ
>       net/mlx5: fix flow tag decompression
>       net/mlx5: check FW miniCQE format capabilities
>       net/mlx5: fix miniCQE configuration for Verbs
> 
> Alvin Zhang (9):
>       net/ixgbe: detect failed VF MTU set
>       net/i40e: fix Rx bytes statistics
>       net/iavf: fix queue pairs configuration
>       doc: fix RSS flow description in i40e guide
>       net/i40e: fix returned code for RSS hardware failure
>       net/ice: fix RSS lookup table initialization
>       test: fix buffer overflow in Tx burst
>       net/ixgbe: fix configuration of max frame size
>       app/testpmd: fix key for RSS flow rule
> 
> Amit Bernstein (1):
>       net/ena: fix Tx doorbell statistics
> 
> Anatoly Burakov (1):
>       fbarray: fix overlap check
> 
> Andrew Boyer (5):
>       net/ionic: do minor logging fixups
>       net/ionic: fix link speed and autonegotiation
>       net/ionic: allow separate L3 and L4 checksum offload
>       net/ionic: fix up function attribute tags
>       net/ionic: fix address handling in Tx
> 
> Ankur Dwivedi (1):
>       test/event_crypto: set cipher operation in transform
> 
> Ashish Sadanandan (1):
>       mbuf: add C++ include guard for dynamic fields header
> 
> Balazs Nemeth (1):
>       net/qede: fix promiscuous enable
> 
> Beilei Xing (2):
>       net/i40e: fix global register recovery
>       net/i40e: fix flex payload rule conflict
> 
> Bernard Iremonger (1):
>       doc: fix QinQ flow rules in testpmd guide
> 
> Bruce Richardson (29):
>       ethdev: avoid blocking telemetry for link status
>       build: provide suitable error for "both" libraries option
>       eal: fix reciprocal header include
>       telemetry: fix missing header include
>       ethdev: fix missing header include
>       net: fix missing header include
>       mbuf: fix missing header include
>       bitrate: fix missing header include
>       rib: fix missing header includes
>       vhost: fix missing header includes
>       ipsec: fix missing header include
>       fib: fix missing header includes
>       table: fix missing header include
>       pipeline: fix missing header includes
>       metrics: fix variable declaration in header
>       node: fix missing header include
>       app: fix build with extra include paths
>       build: force pkg-config for dependency detection
>       power: create guest channel public header file
>       power: make channel message functions public
>       power: rename public structs
>       power: rename constants
>       power: export guest channel header file
>       power: clean up includes
>       eal: fix MCS lock header include
>       eal: fix internal ABI tag with clang
>       power: fix missing header includes
>       rib: fix missing header include
>       eal: fix automatic loading of drivers as shared libs
> 
> Chengchang Tang (7):
>       net/hns3: fix register length when dumping registers
>       net/hns3: fix data overwriting during register dump
>       net/hns3: fix dump register out of range
>       net/hns3: fix interrupt resources in Rx interrupt mode
>       net/hns3: fix firmware exceptions by concurrent commands
>       net/hns3: fix VF reset on mailbox failure
>       net/hns3: fix stats flip overflow
> 
> Chengwen Feng (3):
>       net/hns3: fix VF query link status in dev init
>       net/hns3: remove MPLS from supported flow items
>       net/hns3: fix flow director rule residue on malloc failure
> 
> Ciara Power (3):
>       app/crypto-perf: fix spelling in output
>       app/crypto-perf: fix latency CSV output
>       app/crypto-perf: fix CSV output format
> 
> Cristian Dumitrescu (1):
>       examples/pipeline: fix CLI parsing crash
> 
> Dapeng Yu (4):
>       net/ixgbe: fix flex bytes flow director rule
>       net/ice: check Rx queue number on RSS init
>       net/ixgbe: disable NFS filtering
>       app/testpmd: avoid exit without terminal restore
> 
> David Marchand (3):
>       net/hinic: restore vectorised code
>       examples/pipeline: fix VXLAN script permission
>       mbuf: remove unneeded atomic generic header include
> 
> Dekel Peled (8):
>       net/mlx5: fix shared age action validation
>       net/mlx5: fix hairpin flow split decision
>       net/mlx5: fix flow split combined with counter
>       net/mlx5: fix flow split combined with age action
>       net/mlx5: fix shared RSS translation and cleanup
>       app/testpmd: support shared age action query
>       net/mlx5: fix shared RSS capability check
>       net/mlx5: validate hash Rx queue pointer
> 
> Dmitry Kozlyuk (4):
>       eal/windows: fix build with MinGW-w64 8
>       bus/pci: fix build with MinGW-w64 8
>       bus/pci: fix hardware ID limit on Windows
>       build: fix linker flags on Windows
> 
> Eugeny Parshutin (1):
>       doc: add vtune profiling config to prog guide
> 
> Fan Zhang (1):
>       crypto/qat: fix digest in buffer
> 
> Fei Chen (1):
>       vhost: fix vid allocation race
> 
> Feifei Wang (7):
>       test/ring: reduce duration of performance tests
>       app/eventdev: adjust event count order for pipeline test
>       app/eventdev: remove redundant enqueue in burst Tx
>       examples/eventdev: check CPU core enabling
>       examples/eventdev: add info output for main core
>       examples/eventdev: move ethdev stop to the end
>       app/eventdev: fix SMP barrier in performance test
> 
> Ferruh Yigit (13):
>       app/procinfo: fix _filters stats reporting
>       app/procinfo: fix check on xstats-ids
>       app/procinfo: remove useless memset
>       app/procinfo: remove useless assignment
>       net/pcap: remove local variable shadowing outer one
>       net/bonding: remove local variable shadowing outer one
>       net/af_xdp: remove useless assignment
>       net/bnxt: remove redundant return
>       app/crypto-perf: remove always true condition
>       net/avp: remove always true condition
>       net/pcap: fix byte stats for drop Tx
>       net/pcap: fix infinite Rx with large files
>       app/testpmd: fix help of metering commands
> 
> Gaetan Rivet (2):
>       net/bonding: fix port id validity check on parsing
>       net/bonding: fix PCI address comparison on non-PCI ports
> 
> Gagandeep Singh (2):
>       test/ipsec: fix result code for not supported
>       crypto/dpaa2_sec: fix memory allocation check
> 
> George Prekas (1):
>       app/testpmd: fix IP checksum calculation
> 
> Gregory Etelson (5):
>       net/mlx5: fix Direct Verbs flow descriptor allocation
>       app/testpmd: release flows left before port stop
>       net/mlx5: fix tunnel rules validation on VF representor
>       net/mlx5: fix mark action in active tunnel offload
>       net/mlx5: fix drop action in tunnel offload mode
> 
> Guy Kaneti (1):
>       regex/octeontx2: fix PCI table overflow
> 
> Haiyue Wang (2):
>       net/ice: drain out DCF AdminQ command queue
>       net/ixgbe: fix UDP zero checksum on x86
> 
> Harman Kalra (1):
>       examples/l3fwd: remove limitation on Tx queue count
> 
> Harry van Haaren (1):
>       eventdev: fix a return value comment
> 
> Heinrich Kuhn (1):
>       net/nfp: read chip model from PluDevice register
> 
> Hemant Agrawal (1):
>       app/procinfo: fix security context info
> 
> Hongbo Zheng (1):
>       net/hns3: use new opcode for clearing hardware resource
> 
> Huisong Li (7):
>       app/testpmd: fix queue stats mapping configuration
>       net/hns3: fix xstats with id and names
>       net/hns3: fix error code in xstats
>       net/hns3: fix Rx/Tx errors stats
>       net/hns3: fix link status change from firmware
>       net/hns3: validate requested maximum Rx frame length
>       net/hns3: fix query order of link status and link info
> 
> Hyong Youb Kim (2):
>       net/enic: fix filter type used for flow API
>       net/enic: fix filter log message
> 
> Ido Segev (1):
>       net/ena: flush Rx buffers memory pool cache
> 
> Igor Chauskin (2):
>       net/ena: fix Tx SQ free space assessment
>       net/ena: prevent double doorbell
> 
> Igor Ryzhov (1):
>       net/i40e: fix stats counters
> 
> Ivan Malov (11):
>       common/sfc_efx/base: remove warnings about inline specifiers
>       common/sfc_efx/base: fix signed/unsigned mismatch warnings
>       common/sfc_efx/base: support alternative MAE match fields
>       common/sfc_efx/base: update MCDI headers for MAE privilege
>       common/sfc_efx/base: check for MAE privilege
>       common/sfc_efx/base: fix MPORT related byte order handling
>       common/sfc_efx/base: fix MAE match spec validation helper
>       common/sfc_efx/base: fix MAE match spec class comparison API
>       common/sfc_efx/base: enhance field ID check in field set API
>       common/sfc_efx/base: apply mask to value on match field set
>       net/sfc: fix TSO and checksum offloads for EF10
> 
> Jiawei Wang (4):
>       net/mlx5: fix unnecessary checking for RSS action
>       app/testpmd: fix packets dump overlapping
>       net/mlx5: fix count actions query in sample flow
>       net/mlx5: fix counter and age flow action validation
> 
> Jiawei Zhu (1):
>       net/virtio-user: fix run closing stdin and close callfd
> 
> Jingjing Wu (1):
>       net/iavf: fix vector mapping with queue
> 
> John McNamara (1):
>       license: add licenses for exception cases
> 
> Joyce Kong (1):
>       eal/arm: fix debug build with gcc for 128-bit atomics
> 
> Junfeng Guo (1):
>       net/iavf: fix GTPU UL and DL support for flow director
> 
> Kalesh AP (4):
>       net/bnxt: release HWRM lock in error
>       net/bnxt: propagate FW command failure to application
>       net/bnxt: fix VNIC RSS configure function
>       net/bnxt: fix FW version log
> 
> Karra Satwik (2):
>       net/cxgbe: accept VLAN flow items without ethertype
>       app/testpmd: fix start index for showing FEC array
> 
> Lance Richardson (10):
>       net/bnxt: disable end of packet padding for Rx
>       net/bnxt: limit Rx representor packets per poll
>       net/bnxt: fix doorbell write ordering
>       net/bnxt: fix outer UDP checksum Rx offload capability
>       net/bnxt: make offload flags mapping per-ring
>       net/bnxt: set correct checksum status in mbuf
>       net/bnxt: fix packet type index calculation
>       net/bnxt: fix null termination of Rx mbuf chain
>       net/bnxt: fix fallback mbuf allocation logic
>       net/bnxt: fix Rx completion ring size calculation
> 
> Leyi Rong (1):
>       net/ice: enlarge Rx queue rearm threshold to 64
> 
> Lijun Ou (6):
>       net/hns3: fix interception with flow director
>       net/hns3: fix memory leak on secondary process exit
>       net/hns3: adjust some comments
>       net/hns3: adjust format specifier for enum
>       doc: fix product link in hns3 guide
>       net/hns3: fix RSS indirection table size
> 
> Liron Himi (5):
>       net/octeontx2: fix PF flow action for Tx
>       net/mvpp2: remove debug log on fast-path
>       net/mvpp2: remove VLAN flush
>       net/mvpp2: remove CRC length from MRU validation
>       net/mvpp2: fix frame size checking
> 
> Long Li (1):
>       net/netvsc: ignore unsupported packet on sync command
> 
> Lukasz Wojciechowski (1):
>       test/distributor: fix return buffer queue overload
> 
> Marvin Liu (1):
>       vhost: fix packed ring dequeue offloading
> 
> Matan Azrad (1):
>       vdpa/mlx5: fix configuration mutex cleanup
> 
> Maxime Coquelin (3):
>       net/virtio: add missing backend features negotiation
>       net/virtio: fix memory init with vDPA backend
>       net/virtio: fix getting old status on reconnect
> 
> Michael Baum (7):
>       net/mlx5: fix leak on Rx queue creation failure
>       net/mlx5: fix leak on Tx queue creation failure
>       common/mlx5: fix completion queue entry size configuration
>       net/mlx5: remove CQE padding device argument
>       net/mlx5: fix leak on ASO SQ creation failure
>       net/mlx4: fix device detach
>       net/mlx4: fix handling of probing failure
> 
> Michal Krawczyk (1):
>       net/ena: validate Rx req ID upon acquiring descriptor
> 
> Min Hu (Connor) (3):
>       net/hns3: fix FEC state query
>       net/hns3: fix crash with multi-process
>       doc: add FEC to NIC features
> 
> Murphy Yang (6):
>       net/ice: fix outer UDP Tx checksum offload
>       net/i40e: fix L4 checksum flag
>       net/ice: fix outer checksum flags
>       net/iavf: fix conflicting RSS combination rules
>       net/ice: disable IPv4 checksum offload in vector Tx
>       net/i40e: add null input checks
> 
> Nick Connolly (2):
>       eal/windows: fix debug build with MinGW
>       eal/windows: fix vfprintf warning with clang
> 
> Olivier Matz (5):
>       build: fix plugin load on static build
>       net/virtio-user: fix protocol features advertising
>       service: propagate init error in EAL
>       test/mcslock: remove unneeded per lcore copy
>       mempool: fix panic on dump or audit
> 
> Ophir Munk (4):
>       net/mlx5: fix freeing packet pacing
>       net/mlx5: fix flow action destroy wrapper
>       net/mlx5: fix flow operation wrapper per OS
>       net/mlx5: unify operations for all OS
> 
> Ori Kam (3):
>       regex/mlx5: fix memory rule alignment
>       regex/mlx5: fix support for group id
>       regex/mlx5: fix number of supported queues
> 
> Qi Zhang (4):
>       doc: fix some statements for ice vector PMD
>       net/ice/base: fix tunnel destroy
>       net/ice/base: fix null pointer dereference
>       net/ice/base: fix memory handling
> 
> Ruifeng Wang (4):
>       lpm: fix vector IPv4 lookup
>       net/hns3: fix build with SVE
>       net/octeontx: fix build with SVE
>       common/octeontx2: fix build with SVE
> 
> Samik Gupta (2):
>       net/bnxt: fix Rx rings in RSS redirection table
>       net/bnxt: fix VNIC config on Rx queue stop
> 
> Shiri Kuzin (2):
>       net/mlx5: fix VXLAN decap on non-VXLAN flow
>       net/mlx5: refuse empty VLAN in flow pattern
> 
> Somnath Kotur (4):
>       net/bnxt: fix PF resource query
>       net/bnxt: fix lock init and destroy
>       net/bnxt: fix error handling in device start
>       net/bnxt: refactor init/uninit
> 
> Souvik Dey (2):
>       net/i40e: fix VLAN stripping in VF
>       common/mlx5: fix storing synced MAC to internal table
> 
> Sriharsha Basavapatna (1):
>       net/bnxt: fix max rings computation
> 
> Stephen Hemminger (2):
>       test/rwlock: fix spelling and missing whitespace
>       test: fix terminal settings on exit
> 
> Steve Yang (23):
>       ethdev: fix max Rx packet length check
>       app/testpmd: fix max Rx packet length for VLAN packets
>       net/dpaa: fix jumbo frame flag condition for MTU set
>       net/dpaa2: fix jumbo frame flag condition for MTU set
>       net/e1000: fix jumbo frame flag condition for MTU set
>       net/hns3: fix jumbo frame flag condition for MTU set
>       net/i40e: fix jumbo frame flag condition
>       net/iavf: fix jumbo frame flag condition
>       net/ice: fix jumbo frame flag condition
>       net/ipn3ke: fix jumbo frame flag condition for MTU set
>       net/octeontx: fix jumbo frame flag condition for MTU set
>       net/octeontx2: fix jumbo frame flag condition for MTU
>       net/qede: fix jumbo frame flag condition for MTU set
>       net/sfc: fix jumbo frame flag condition for MTU set
>       net/thunderx: fix jumbo frame flag condition for MTU set
>       net/ixgbe: fix jumbo frame flag condition
>       net/cxgbe: fix jumbo frame flag condition
>       net/axgbe: fix jumbo frame flag condition for MTU set
>       net/enetc: fix jumbo frame flag condition for MTU set
>       net/hinic: fix jumbo frame flag condition for MTU set
>       net/nfp: fix jumbo frame flag condition for MTU set
>       net/liquidio: fix jumbo frame flag condition for MTU set
>       app/testpmd: fix setting maximum packet length
> 
> Suanming Mou (5):
>       net/mlx5: fix shared RSS and mark actions combination
>       net/mlx5: fix multi-process port ID
>       net/mlx5: fix crash on secondary process port close
>       net/mlx5: fix port attach in secondary process
>       net/mlx4: fix port attach in secondary process
> 
> Sunil Kumar Kori (2):
>       net/octeontx2: fix corruption in segments list
>       net/octeontx: fix max Rx packet length
> 
> Tal Shnaiderman (5):
>       bus/pci: ignore missing NUMA node on Windows
>       net/mlx5: fix constant array size
>       net/mlx5: fix device name size on Windows
>       net/mlx5: fix comparison sign in flow engine
>       common/mlx5: fix pointer cast on Windows
> 
> Thomas Monjalon (3):
>       doc: fix figure numbering in graph guide
>       lib: fix doxygen for parameters of function pointers
>       ethdev: fix close failure handling
> 
> Timothy McDaniel (1):
>       event/dlb: fix accessing uninitialized variables
> 
> Ting Xu (1):
>       net/iavf: fix memory leak in large VF
> 
> Tyler Retzlaff (2):
>       bus/pci: fix build with Windows SDK >= 10.0.20253
>       eal/windows: fix C++ compatibility
> 
> Viacheslav Galaktionov (1):
>       net/sfc: fix generic byte statistics to exclude FCS bytes
> 
> Viacheslav Ovsiienko (8):
>       net/mlx5: fix Verbs memory allocation callback
>       net/mlx5: fix buffer split offload advertising
>       doc: update flow mark action in mlx5 guide
>       net/mlx5: fix wire vport hint
>       app/testpmd: fix queue reconfig request on Rx split update
>       doc: fix supported feature table in mlx5 guide
>       doc: fix mark action zero value in mlx5 guide
>       net/mlx5: fix Tx queue size created with DevX
> 
> Vladimir Medvedkin (2):
>       rib: fix insertion in some cases
>       crypto/qat: fix access to uninitialized variable
> 
> Weifeng Li (1):
>       net/i40e: fix X722 for 802.1ad frames ability
> 
> Wenjun Wu (1):
>       net/e1000: fix flow control mode setting
> 
> Wisam Jaddo (1):
>       app/flow-perf: simplify objects initialization
> 
> Xuan Ding (1):
>       net/iavf: fix symmetric flow rule creation
> 
> Yicai Lu (1):
>       ip_frag: remove padding length of fragment
> 
> Yongxin Liu (1):
>       usertools: fix binding built-in kernel driver
> 
> Yunjian Wang (3):
>       eal/linux: fix handling of error events from epoll
>       net/bnxt: fix memory leak when mapping fails
>       net/mvneta: check allocation in Rx queue flush
> 
> Yuri Chipchev (1):
>       net/mvpp2: fix stack corruption
> 
> 


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] 20.11.1 patches review and test
  2021-02-22 15:09  1% [dpdk-dev] 20.11.1 patches review and test luca.boccassi
@ 2021-02-25  9:43  0% ` Christian Ehrhardt
  2021-02-25 13:00  0% ` Pei Zhang
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 200+ results
From: Christian Ehrhardt @ 2021-02-25  9:43 UTC (permalink / raw)
  To: Luca Boccassi
  Cc: dpdk stable, dev, Abhishek Marathe, Akhil Goyal, Ali Alnubani,
	benjamin.walker, David Christensen, hariprasad.govindharajan,
	Hemant Agrawal, Ian Stokes, Jerin Jacob, John McNamara,
	Ju-Hyoung Lee, Kevin Traynor, Luca Boccassi, Pei Zhang, pingx.yu,
	qian.q.xu, Raslan Darawsheh, Thomas Monjalon, yuan.peng,
	zhaoyan.chen

On Mon, Feb 22, 2021 at 4:09 PM <luca.boccassi@gmail.com> wrote:
>
> Hi all,
>
> Here is a list of patches targeted for stable release 20.11.1.
>
> The planned date for the final release is the 8th of March.
>
> Please help with testing and validation of your use cases and report
> any issues/results with reply-all to this mail. For the final release
> the fixes and reported validations will be added to the release notes.
>
> A release candidate tarball can be found at:
>
>     https://dpdk.org/browse/dpdk-stable/tag/?id=v20.11.1-rc1
>
> These patches are located at branch 20.11 of dpdk-stable repo:
>     https://dpdk.org/browse/dpdk-stable/

Hi Luca,
while my tests won't achieve the coverage of the bigger labs I still
wanted to mention
that I've built this for Ubuntu 21.04 and successfully ran some
OVS-DPDK based tests on it.

1.0.0 (07:05:12): phys (BM) tests
  1.1.0 (07:05:12): initialize environment
    1.1.1 (07:09:32): testpmd  => Pass
    1.1.2 (07:11:12): check testpmd output  => Pass
2.0.0 (07:11:12): prep virtual test environment

1.0.0 (07:14:14): virt tests
  1.1.0 (07:14:14): initialize environment
3.0.0 (07:15:30): performance tests
  3.1.0 (07:15:30): prep benchmarks
  3.2.0 (07:15:51): performance tests
    3.2.1 (07:16:01): test guest-openvswitch for OVS-5CPU  => Pass
    3.2.2 (07:35:44): test guest-dpdk-vhost-user-client-multiq for
OVSDPDK-VUC  => Pass
4.0.0 (07:57:11): VUC endurance checks
  4.1.0 (07:57:11): prep VUC endurance tests
    4.1.1 (08:12:38): start stop guests (client)  => Pass
    4.1.2 (09:25:59): add/remove ports (client)  => Pass
  4.2.0 (09:35:04): Final cleanup

P.S. 3.2.1 is actually not a DPDK case, but used for e.g speed comparisons

> Thanks.
>
> Luca Boccassi
>
> ---
> Ajit Khaparde (3):
>       net/bnxt: fix cleanup on mutex init failure
>       net/bnxt: fix format specifier for unsigned int
>       net/bnxt: fix freeing mbuf
>
> Alexander Kozyrev (4):
>       net/mlx5: fix mbuf freeing in vectorized MPRQ
>       net/mlx5: fix flow tag decompression
>       net/mlx5: check FW miniCQE format capabilities
>       net/mlx5: fix miniCQE configuration for Verbs
>
> Alvin Zhang (9):
>       net/ixgbe: detect failed VF MTU set
>       net/i40e: fix Rx bytes statistics
>       net/iavf: fix queue pairs configuration
>       doc: fix RSS flow description in i40e guide
>       net/i40e: fix returned code for RSS hardware failure
>       net/ice: fix RSS lookup table initialization
>       test: fix buffer overflow in Tx burst
>       net/ixgbe: fix configuration of max frame size
>       app/testpmd: fix key for RSS flow rule
>
> Amit Bernstein (1):
>       net/ena: fix Tx doorbell statistics
>
> Anatoly Burakov (1):
>       fbarray: fix overlap check
>
> Andrew Boyer (5):
>       net/ionic: do minor logging fixups
>       net/ionic: fix link speed and autonegotiation
>       net/ionic: allow separate L3 and L4 checksum offload
>       net/ionic: fix up function attribute tags
>       net/ionic: fix address handling in Tx
>
> Ankur Dwivedi (1):
>       test/event_crypto: set cipher operation in transform
>
> Ashish Sadanandan (1):
>       mbuf: add C++ include guard for dynamic fields header
>
> Balazs Nemeth (1):
>       net/qede: fix promiscuous enable
>
> Beilei Xing (2):
>       net/i40e: fix global register recovery
>       net/i40e: fix flex payload rule conflict
>
> Bernard Iremonger (1):
>       doc: fix QinQ flow rules in testpmd guide
>
> Bruce Richardson (29):
>       ethdev: avoid blocking telemetry for link status
>       build: provide suitable error for "both" libraries option
>       eal: fix reciprocal header include
>       telemetry: fix missing header include
>       ethdev: fix missing header include
>       net: fix missing header include
>       mbuf: fix missing header include
>       bitrate: fix missing header include
>       rib: fix missing header includes
>       vhost: fix missing header includes
>       ipsec: fix missing header include
>       fib: fix missing header includes
>       table: fix missing header include
>       pipeline: fix missing header includes
>       metrics: fix variable declaration in header
>       node: fix missing header include
>       app: fix build with extra include paths
>       build: force pkg-config for dependency detection
>       power: create guest channel public header file
>       power: make channel message functions public
>       power: rename public structs
>       power: rename constants
>       power: export guest channel header file
>       power: clean up includes
>       eal: fix MCS lock header include
>       eal: fix internal ABI tag with clang
>       power: fix missing header includes
>       rib: fix missing header include
>       eal: fix automatic loading of drivers as shared libs
>
> Chengchang Tang (7):
>       net/hns3: fix register length when dumping registers
>       net/hns3: fix data overwriting during register dump
>       net/hns3: fix dump register out of range
>       net/hns3: fix interrupt resources in Rx interrupt mode
>       net/hns3: fix firmware exceptions by concurrent commands
>       net/hns3: fix VF reset on mailbox failure
>       net/hns3: fix stats flip overflow
>
> Chengwen Feng (3):
>       net/hns3: fix VF query link status in dev init
>       net/hns3: remove MPLS from supported flow items
>       net/hns3: fix flow director rule residue on malloc failure
>
> Ciara Power (3):
>       app/crypto-perf: fix spelling in output
>       app/crypto-perf: fix latency CSV output
>       app/crypto-perf: fix CSV output format
>
> Cristian Dumitrescu (1):
>       examples/pipeline: fix CLI parsing crash
>
> Dapeng Yu (4):
>       net/ixgbe: fix flex bytes flow director rule
>       net/ice: check Rx queue number on RSS init
>       net/ixgbe: disable NFS filtering
>       app/testpmd: avoid exit without terminal restore
>
> David Marchand (3):
>       net/hinic: restore vectorised code
>       examples/pipeline: fix VXLAN script permission
>       mbuf: remove unneeded atomic generic header include
>
> Dekel Peled (8):
>       net/mlx5: fix shared age action validation
>       net/mlx5: fix hairpin flow split decision
>       net/mlx5: fix flow split combined with counter
>       net/mlx5: fix flow split combined with age action
>       net/mlx5: fix shared RSS translation and cleanup
>       app/testpmd: support shared age action query
>       net/mlx5: fix shared RSS capability check
>       net/mlx5: validate hash Rx queue pointer
>
> Dmitry Kozlyuk (4):
>       eal/windows: fix build with MinGW-w64 8
>       bus/pci: fix build with MinGW-w64 8
>       bus/pci: fix hardware ID limit on Windows
>       build: fix linker flags on Windows
>
> Eugeny Parshutin (1):
>       doc: add vtune profiling config to prog guide
>
> Fan Zhang (1):
>       crypto/qat: fix digest in buffer
>
> Fei Chen (1):
>       vhost: fix vid allocation race
>
> Feifei Wang (7):
>       test/ring: reduce duration of performance tests
>       app/eventdev: adjust event count order for pipeline test
>       app/eventdev: remove redundant enqueue in burst Tx
>       examples/eventdev: check CPU core enabling
>       examples/eventdev: add info output for main core
>       examples/eventdev: move ethdev stop to the end
>       app/eventdev: fix SMP barrier in performance test
>
> Ferruh Yigit (13):
>       app/procinfo: fix _filters stats reporting
>       app/procinfo: fix check on xstats-ids
>       app/procinfo: remove useless memset
>       app/procinfo: remove useless assignment
>       net/pcap: remove local variable shadowing outer one
>       net/bonding: remove local variable shadowing outer one
>       net/af_xdp: remove useless assignment
>       net/bnxt: remove redundant return
>       app/crypto-perf: remove always true condition
>       net/avp: remove always true condition
>       net/pcap: fix byte stats for drop Tx
>       net/pcap: fix infinite Rx with large files
>       app/testpmd: fix help of metering commands
>
> Gaetan Rivet (2):
>       net/bonding: fix port id validity check on parsing
>       net/bonding: fix PCI address comparison on non-PCI ports
>
> Gagandeep Singh (2):
>       test/ipsec: fix result code for not supported
>       crypto/dpaa2_sec: fix memory allocation check
>
> George Prekas (1):
>       app/testpmd: fix IP checksum calculation
>
> Gregory Etelson (5):
>       net/mlx5: fix Direct Verbs flow descriptor allocation
>       app/testpmd: release flows left before port stop
>       net/mlx5: fix tunnel rules validation on VF representor
>       net/mlx5: fix mark action in active tunnel offload
>       net/mlx5: fix drop action in tunnel offload mode
>
> Guy Kaneti (1):
>       regex/octeontx2: fix PCI table overflow
>
> Haiyue Wang (2):
>       net/ice: drain out DCF AdminQ command queue
>       net/ixgbe: fix UDP zero checksum on x86
>
> Harman Kalra (1):
>       examples/l3fwd: remove limitation on Tx queue count
>
> Harry van Haaren (1):
>       eventdev: fix a return value comment
>
> Heinrich Kuhn (1):
>       net/nfp: read chip model from PluDevice register
>
> Hemant Agrawal (1):
>       app/procinfo: fix security context info
>
> Hongbo Zheng (1):
>       net/hns3: use new opcode for clearing hardware resource
>
> Huisong Li (7):
>       app/testpmd: fix queue stats mapping configuration
>       net/hns3: fix xstats with id and names
>       net/hns3: fix error code in xstats
>       net/hns3: fix Rx/Tx errors stats
>       net/hns3: fix link status change from firmware
>       net/hns3: validate requested maximum Rx frame length
>       net/hns3: fix query order of link status and link info
>
> Hyong Youb Kim (2):
>       net/enic: fix filter type used for flow API
>       net/enic: fix filter log message
>
> Ido Segev (1):
>       net/ena: flush Rx buffers memory pool cache
>
> Igor Chauskin (2):
>       net/ena: fix Tx SQ free space assessment
>       net/ena: prevent double doorbell
>
> Igor Ryzhov (1):
>       net/i40e: fix stats counters
>
> Ivan Malov (11):
>       common/sfc_efx/base: remove warnings about inline specifiers
>       common/sfc_efx/base: fix signed/unsigned mismatch warnings
>       common/sfc_efx/base: support alternative MAE match fields
>       common/sfc_efx/base: update MCDI headers for MAE privilege
>       common/sfc_efx/base: check for MAE privilege
>       common/sfc_efx/base: fix MPORT related byte order handling
>       common/sfc_efx/base: fix MAE match spec validation helper
>       common/sfc_efx/base: fix MAE match spec class comparison API
>       common/sfc_efx/base: enhance field ID check in field set API
>       common/sfc_efx/base: apply mask to value on match field set
>       net/sfc: fix TSO and checksum offloads for EF10
>
> Jiawei Wang (4):
>       net/mlx5: fix unnecessary checking for RSS action
>       app/testpmd: fix packets dump overlapping
>       net/mlx5: fix count actions query in sample flow
>       net/mlx5: fix counter and age flow action validation
>
> Jiawei Zhu (1):
>       net/virtio-user: fix run closing stdin and close callfd
>
> Jingjing Wu (1):
>       net/iavf: fix vector mapping with queue
>
> John McNamara (1):
>       license: add licenses for exception cases
>
> Joyce Kong (1):
>       eal/arm: fix debug build with gcc for 128-bit atomics
>
> Junfeng Guo (1):
>       net/iavf: fix GTPU UL and DL support for flow director
>
> Kalesh AP (4):
>       net/bnxt: release HWRM lock in error
>       net/bnxt: propagate FW command failure to application
>       net/bnxt: fix VNIC RSS configure function
>       net/bnxt: fix FW version log
>
> Karra Satwik (2):
>       net/cxgbe: accept VLAN flow items without ethertype
>       app/testpmd: fix start index for showing FEC array
>
> Lance Richardson (10):
>       net/bnxt: disable end of packet padding for Rx
>       net/bnxt: limit Rx representor packets per poll
>       net/bnxt: fix doorbell write ordering
>       net/bnxt: fix outer UDP checksum Rx offload capability
>       net/bnxt: make offload flags mapping per-ring
>       net/bnxt: set correct checksum status in mbuf
>       net/bnxt: fix packet type index calculation
>       net/bnxt: fix null termination of Rx mbuf chain
>       net/bnxt: fix fallback mbuf allocation logic
>       net/bnxt: fix Rx completion ring size calculation
>
> Leyi Rong (1):
>       net/ice: enlarge Rx queue rearm threshold to 64
>
> Lijun Ou (6):
>       net/hns3: fix interception with flow director
>       net/hns3: fix memory leak on secondary process exit
>       net/hns3: adjust some comments
>       net/hns3: adjust format specifier for enum
>       doc: fix product link in hns3 guide
>       net/hns3: fix RSS indirection table size
>
> Liron Himi (5):
>       net/octeontx2: fix PF flow action for Tx
>       net/mvpp2: remove debug log on fast-path
>       net/mvpp2: remove VLAN flush
>       net/mvpp2: remove CRC length from MRU validation
>       net/mvpp2: fix frame size checking
>
> Long Li (1):
>       net/netvsc: ignore unsupported packet on sync command
>
> Lukasz Wojciechowski (1):
>       test/distributor: fix return buffer queue overload
>
> Marvin Liu (1):
>       vhost: fix packed ring dequeue offloading
>
> Matan Azrad (1):
>       vdpa/mlx5: fix configuration mutex cleanup
>
> Maxime Coquelin (3):
>       net/virtio: add missing backend features negotiation
>       net/virtio: fix memory init with vDPA backend
>       net/virtio: fix getting old status on reconnect
>
> Michael Baum (7):
>       net/mlx5: fix leak on Rx queue creation failure
>       net/mlx5: fix leak on Tx queue creation failure
>       common/mlx5: fix completion queue entry size configuration
>       net/mlx5: remove CQE padding device argument
>       net/mlx5: fix leak on ASO SQ creation failure
>       net/mlx4: fix device detach
>       net/mlx4: fix handling of probing failure
>
> Michal Krawczyk (1):
>       net/ena: validate Rx req ID upon acquiring descriptor
>
> Min Hu (Connor) (3):
>       net/hns3: fix FEC state query
>       net/hns3: fix crash with multi-process
>       doc: add FEC to NIC features
>
> Murphy Yang (6):
>       net/ice: fix outer UDP Tx checksum offload
>       net/i40e: fix L4 checksum flag
>       net/ice: fix outer checksum flags
>       net/iavf: fix conflicting RSS combination rules
>       net/ice: disable IPv4 checksum offload in vector Tx
>       net/i40e: add null input checks
>
> Nick Connolly (2):
>       eal/windows: fix debug build with MinGW
>       eal/windows: fix vfprintf warning with clang
>
> Olivier Matz (5):
>       build: fix plugin load on static build
>       net/virtio-user: fix protocol features advertising
>       service: propagate init error in EAL
>       test/mcslock: remove unneeded per lcore copy
>       mempool: fix panic on dump or audit
>
> Ophir Munk (4):
>       net/mlx5: fix freeing packet pacing
>       net/mlx5: fix flow action destroy wrapper
>       net/mlx5: fix flow operation wrapper per OS
>       net/mlx5: unify operations for all OS
>
> Ori Kam (3):
>       regex/mlx5: fix memory rule alignment
>       regex/mlx5: fix support for group id
>       regex/mlx5: fix number of supported queues
>
> Qi Zhang (4):
>       doc: fix some statements for ice vector PMD
>       net/ice/base: fix tunnel destroy
>       net/ice/base: fix null pointer dereference
>       net/ice/base: fix memory handling
>
> Ruifeng Wang (4):
>       lpm: fix vector IPv4 lookup
>       net/hns3: fix build with SVE
>       net/octeontx: fix build with SVE
>       common/octeontx2: fix build with SVE
>
> Samik Gupta (2):
>       net/bnxt: fix Rx rings in RSS redirection table
>       net/bnxt: fix VNIC config on Rx queue stop
>
> Shiri Kuzin (2):
>       net/mlx5: fix VXLAN decap on non-VXLAN flow
>       net/mlx5: refuse empty VLAN in flow pattern
>
> Somnath Kotur (4):
>       net/bnxt: fix PF resource query
>       net/bnxt: fix lock init and destroy
>       net/bnxt: fix error handling in device start
>       net/bnxt: refactor init/uninit
>
> Souvik Dey (2):
>       net/i40e: fix VLAN stripping in VF
>       common/mlx5: fix storing synced MAC to internal table
>
> Sriharsha Basavapatna (1):
>       net/bnxt: fix max rings computation
>
> Stephen Hemminger (2):
>       test/rwlock: fix spelling and missing whitespace
>       test: fix terminal settings on exit
>
> Steve Yang (23):
>       ethdev: fix max Rx packet length check
>       app/testpmd: fix max Rx packet length for VLAN packets
>       net/dpaa: fix jumbo frame flag condition for MTU set
>       net/dpaa2: fix jumbo frame flag condition for MTU set
>       net/e1000: fix jumbo frame flag condition for MTU set
>       net/hns3: fix jumbo frame flag condition for MTU set
>       net/i40e: fix jumbo frame flag condition
>       net/iavf: fix jumbo frame flag condition
>       net/ice: fix jumbo frame flag condition
>       net/ipn3ke: fix jumbo frame flag condition for MTU set
>       net/octeontx: fix jumbo frame flag condition for MTU set
>       net/octeontx2: fix jumbo frame flag condition for MTU
>       net/qede: fix jumbo frame flag condition for MTU set
>       net/sfc: fix jumbo frame flag condition for MTU set
>       net/thunderx: fix jumbo frame flag condition for MTU set
>       net/ixgbe: fix jumbo frame flag condition
>       net/cxgbe: fix jumbo frame flag condition
>       net/axgbe: fix jumbo frame flag condition for MTU set
>       net/enetc: fix jumbo frame flag condition for MTU set
>       net/hinic: fix jumbo frame flag condition for MTU set
>       net/nfp: fix jumbo frame flag condition for MTU set
>       net/liquidio: fix jumbo frame flag condition for MTU set
>       app/testpmd: fix setting maximum packet length
>
> Suanming Mou (5):
>       net/mlx5: fix shared RSS and mark actions combination
>       net/mlx5: fix multi-process port ID
>       net/mlx5: fix crash on secondary process port close
>       net/mlx5: fix port attach in secondary process
>       net/mlx4: fix port attach in secondary process
>
> Sunil Kumar Kori (2):
>       net/octeontx2: fix corruption in segments list
>       net/octeontx: fix max Rx packet length
>
> Tal Shnaiderman (5):
>       bus/pci: ignore missing NUMA node on Windows
>       net/mlx5: fix constant array size
>       net/mlx5: fix device name size on Windows
>       net/mlx5: fix comparison sign in flow engine
>       common/mlx5: fix pointer cast on Windows
>
> Thomas Monjalon (3):
>       doc: fix figure numbering in graph guide
>       lib: fix doxygen for parameters of function pointers
>       ethdev: fix close failure handling
>
> Timothy McDaniel (1):
>       event/dlb: fix accessing uninitialized variables
>
> Ting Xu (1):
>       net/iavf: fix memory leak in large VF
>
> Tyler Retzlaff (2):
>       bus/pci: fix build with Windows SDK >= 10.0.20253
>       eal/windows: fix C++ compatibility
>
> Viacheslav Galaktionov (1):
>       net/sfc: fix generic byte statistics to exclude FCS bytes
>
> Viacheslav Ovsiienko (8):
>       net/mlx5: fix Verbs memory allocation callback
>       net/mlx5: fix buffer split offload advertising
>       doc: update flow mark action in mlx5 guide
>       net/mlx5: fix wire vport hint
>       app/testpmd: fix queue reconfig request on Rx split update
>       doc: fix supported feature table in mlx5 guide
>       doc: fix mark action zero value in mlx5 guide
>       net/mlx5: fix Tx queue size created with DevX
>
> Vladimir Medvedkin (2):
>       rib: fix insertion in some cases
>       crypto/qat: fix access to uninitialized variable
>
> Weifeng Li (1):
>       net/i40e: fix X722 for 802.1ad frames ability
>
> Wenjun Wu (1):
>       net/e1000: fix flow control mode setting
>
> Wisam Jaddo (1):
>       app/flow-perf: simplify objects initialization
>
> Xuan Ding (1):
>       net/iavf: fix symmetric flow rule creation
>
> Yicai Lu (1):
>       ip_frag: remove padding length of fragment
>
> Yongxin Liu (1):
>       usertools: fix binding built-in kernel driver
>
> Yunjian Wang (3):
>       eal/linux: fix handling of error events from epoll
>       net/bnxt: fix memory leak when mapping fails
>       net/mvneta: check allocation in Rx queue flush
>
> Yuri Chipchev (1):
>       net/mvpp2: fix stack corruption



-- 
Christian Ehrhardt
Staff Engineer, Ubuntu Server
Canonical Ltd

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v7 06/10] eventdev: make driver-only headers private
  @ 2021-02-22 22:34  3%     ` Stephen Hemminger
  0 siblings, 0 replies; 200+ results
From: Stephen Hemminger @ 2021-02-22 22:34 UTC (permalink / raw)
  To: Bruce Richardson
  Cc: dev, david.marchand, Timothy McDaniel, Hemant Agrawal,
	Nipun Gupta, Mattias Rönnblom, Jerin Jacob, Pavan Nikhilesh,
	Liang Ma, Peter Mccarthy, Harry van Haaren, Abhinandan Gujjar,
	Jay Jayatheerthan, Erik Gabriel Carrillo

There are many vendors (including some internal Microsoft projects) with drivers
that are not in the DPDK tree. Breaking them is not something that should be
done, and certainly not in a release that claims API/ABI compatibility.

Although these fields should not have been exposed
to user in normal header files, you can't just remove them now.
Please revert this commit before 20.02 final release.

A better solution (like __rte_internal) can be added in the 21.11 release.


^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] Build errors due to duplicate version.map entries in librte_power
  2021-02-22 10:31  0% ` Juraj Linkeš
@ 2021-02-22 19:50  0%   ` Aaron Conole
  0 siblings, 0 replies; 200+ results
From: Aaron Conole @ 2021-02-22 19:50 UTC (permalink / raw)
  To: Juraj Linkeš; +Cc: dev, Bruce Richardson, David Hunt, Anatoly Burakov

Juraj Linkeš <juraj.linkes@pantheon.tech> writes:

> This seems to have gone unnoticed.
>
> lib/librte_power/version.map specifies
> rte_power_guest_channel_send_msg both under DPDK_21 and EXPERIMENTAL.
>
> This is causing the clang cross-compile job to always fail with the error Aaron provided:
> ld.lld: error: duplicate symbol 'rte_power_guest_channel_send_msg' in version script
>
> Only the clang cross compile jobs are failing. This could be due to
> them using the LLVM linker (ld.lld) and the other clang jobs using the
> default linker.

The LLVM linker might not support all the same symbol versioning - but
ALSO I don't find what we're doing particularly correct - at least
according to:

   https://www.akkadia.org/drepper/dsohowto.pdf

There doesn't seem to be any case where we would have the symbol appear
in multiple versions without using an alias in the code.  And if the
symbol is changed in an incompatible way, then we've really done the
wrong thing.

> I have two questions about this:
> 1. Is this a real failure?

Maybe.  I think we probably wrote a bad version.map, but I don't know
the history of these symbols.  David?  Anything?

> 2. If this is a real failure, should we also use ld.lld in the other clang jobs?

We need to know if this is also an area where the LLVM linker doesn't
support the same featureset as GNU.

> Thanks,
> Juraj
>
>> -----Original Message-----
>> From: dev <dev-bounces@dpdk.org> On Behalf Of Aaron Conole
>> Sent: Monday, February 15, 2021 8:18 PM
>> To: dev@dpdk.org
>> Cc: Bruce Richardson <bruce.richardson@intel.com>; David Hunt
>> <david.hunt@intel.com>; Anatoly Burakov <anatoly.burakov@intel.com>
>> Subject: [dpdk-dev] Build errors due to duplicate version.map entries in
>> librte_power
>> 
>> Greetings,
>> 
>> During CI runs, I've noticed lots of failures from the Travis-CI side all related to
>> librte_power/version.map containing some duplicate symbols.  It seems commit
>> 4d3892dcd77b ("power: make channel message functions public") made the
>> following hunk:
>> 
>> diff --git a/lib/librte_power/version.map b/lib/librte_power/version.map index
>> 69ca9af616..13f0af3b2d 100644
>> --- a/lib/librte_power/version.map
>> +++ b/lib/librte_power/version.map
>> @@ -34,4 +34,8 @@ EXPERIMENTAL {
>>         rte_power_guest_channel_receive_msg;
>>         rte_power_poll_stat_fetch;
>>         rte_power_poll_stat_update;
>> +
>> +       # added in 21.02
>> +       rte_power_guest_channel_receive_msg;
>> +       rte_power_guest_channel_send_msg;
>>  };
>> 
>> 
>> As can be seen, rte_power_guest_channel_receive_msg was added already (it's
>> present in the hunk itself).  The rte_power_guest_channel_send_msg function
>> was added as part of 85ff364f3bd3 ("build: align symbols with global ABI
>> version").
>> 
>> I guess it may not be allowed to have duplicate symbols here, because in travis, I
>> see (only for some builds):
>> 
>> clang  -o lib/librte_power.so.21.1
>> 'lib/lib@@rte_power@sta/librte_power_rte_power.c.o'
>> 'lib/lib@@rte_power@sta/librte_power_power_acpi_cpufreq.c.o'
>> 'lib/lib@@rte_power@sta/librte_power_power_kvm_vm.c.o'
>> 'lib/lib@@rte_power@sta/librte_power_guest_channel.c.o'
>> 'lib/lib@@rte_power@sta/librte_power_rte_power_empty_poll.c.o'
>> 'lib/lib@@rte_power@sta/librte_power_power_pstate_cpufreq.c.o'
>> 'lib/lib@@rte_power@sta/librte_power_rte_power_pmd_mgmt.c.o'
>> 'lib/lib@@rte_power@sta/librte_power_power_common.c.o' -Wl,--no-
>> undefined -Wl,--as-needed -shared -fPIC -Wl,--start-group -Wl,-
>> soname,librte_power.so.21 -Wl,--no-as-needed -pthread -lm -ldl
>> lib/librte_eal.so.21.1 lib/librte_kvargs.so.21.1 lib/librte_telemetry.so.21.1
>> lib/librte_timer.so.21.1 lib/librte_ethdev.so.21.1 lib/librte_net.so.21.1
>> lib/librte_mbuf.so.21.1 lib/librte_mempool.so.21.1 lib/librte_ring.so.21.1
>> lib/librte_meter.so.21.1 -Wl,--end-group -Wl,--version-
>> script=/home/travis/build/ovsrobot/dpdk/lib/librte_power/version.map '-Wl,-
>> rpath,$ORIGIN/' -Wl,-rpath-link,/home/travis/build/ovsrobot/dpdk/build/lib -
>> target aarch64-linux-gnu -fuse-ld=lld --gcc-toolchain=/usr
>> 
>> ld.lld: error: duplicate symbol 'rte_power_guest_channel_send_msg' in version
>> script
>> 
>> Thoughts?
>> 


^ permalink raw reply	[relevance 0%]

* [dpdk-dev] 20.11.1 patches review and test
@ 2021-02-22 15:09  1% luca.boccassi
  2021-02-25  9:43  0% ` Christian Ehrhardt
                   ` (4 more replies)
  0 siblings, 5 replies; 200+ results
From: luca.boccassi @ 2021-02-22 15:09 UTC (permalink / raw)
  To: stable
  Cc: dev, Abhishek Marathe, Akhil Goyal, Ali Alnubani,
	benjamin.walker, David Christensen, hariprasad.govindharajan,
	Hemant Agrawal, Ian Stokes, Jerin Jacob, John McNamara,
	Ju-Hyoung Lee, Kevin Traynor, Luca Boccassi, Pei Zhang, pingx.yu,
	qian.q.xu, Raslan Darawsheh, Thomas Monjalon, yuan.peng,
	zhaoyan.chen

Hi all,

Here is a list of patches targeted for stable release 20.11.1.

The planned date for the final release is the 8th of March.

Please help with testing and validation of your use cases and report
any issues/results with reply-all to this mail. For the final release
the fixes and reported validations will be added to the release notes.

A release candidate tarball can be found at:

    https://dpdk.org/browse/dpdk-stable/tag/?id=v20.11.1-rc1

These patches are located at branch 20.11 of dpdk-stable repo:
    https://dpdk.org/browse/dpdk-stable/

Thanks.

Luca Boccassi

---
Ajit Khaparde (3):
      net/bnxt: fix cleanup on mutex init failure
      net/bnxt: fix format specifier for unsigned int
      net/bnxt: fix freeing mbuf

Alexander Kozyrev (4):
      net/mlx5: fix mbuf freeing in vectorized MPRQ
      net/mlx5: fix flow tag decompression
      net/mlx5: check FW miniCQE format capabilities
      net/mlx5: fix miniCQE configuration for Verbs

Alvin Zhang (9):
      net/ixgbe: detect failed VF MTU set
      net/i40e: fix Rx bytes statistics
      net/iavf: fix queue pairs configuration
      doc: fix RSS flow description in i40e guide
      net/i40e: fix returned code for RSS hardware failure
      net/ice: fix RSS lookup table initialization
      test: fix buffer overflow in Tx burst
      net/ixgbe: fix configuration of max frame size
      app/testpmd: fix key for RSS flow rule

Amit Bernstein (1):
      net/ena: fix Tx doorbell statistics

Anatoly Burakov (1):
      fbarray: fix overlap check

Andrew Boyer (5):
      net/ionic: do minor logging fixups
      net/ionic: fix link speed and autonegotiation
      net/ionic: allow separate L3 and L4 checksum offload
      net/ionic: fix up function attribute tags
      net/ionic: fix address handling in Tx

Ankur Dwivedi (1):
      test/event_crypto: set cipher operation in transform

Ashish Sadanandan (1):
      mbuf: add C++ include guard for dynamic fields header

Balazs Nemeth (1):
      net/qede: fix promiscuous enable

Beilei Xing (2):
      net/i40e: fix global register recovery
      net/i40e: fix flex payload rule conflict

Bernard Iremonger (1):
      doc: fix QinQ flow rules in testpmd guide

Bruce Richardson (29):
      ethdev: avoid blocking telemetry for link status
      build: provide suitable error for "both" libraries option
      eal: fix reciprocal header include
      telemetry: fix missing header include
      ethdev: fix missing header include
      net: fix missing header include
      mbuf: fix missing header include
      bitrate: fix missing header include
      rib: fix missing header includes
      vhost: fix missing header includes
      ipsec: fix missing header include
      fib: fix missing header includes
      table: fix missing header include
      pipeline: fix missing header includes
      metrics: fix variable declaration in header
      node: fix missing header include
      app: fix build with extra include paths
      build: force pkg-config for dependency detection
      power: create guest channel public header file
      power: make channel message functions public
      power: rename public structs
      power: rename constants
      power: export guest channel header file
      power: clean up includes
      eal: fix MCS lock header include
      eal: fix internal ABI tag with clang
      power: fix missing header includes
      rib: fix missing header include
      eal: fix automatic loading of drivers as shared libs

Chengchang Tang (7):
      net/hns3: fix register length when dumping registers
      net/hns3: fix data overwriting during register dump
      net/hns3: fix dump register out of range
      net/hns3: fix interrupt resources in Rx interrupt mode
      net/hns3: fix firmware exceptions by concurrent commands
      net/hns3: fix VF reset on mailbox failure
      net/hns3: fix stats flip overflow

Chengwen Feng (3):
      net/hns3: fix VF query link status in dev init
      net/hns3: remove MPLS from supported flow items
      net/hns3: fix flow director rule residue on malloc failure

Ciara Power (3):
      app/crypto-perf: fix spelling in output
      app/crypto-perf: fix latency CSV output
      app/crypto-perf: fix CSV output format

Cristian Dumitrescu (1):
      examples/pipeline: fix CLI parsing crash

Dapeng Yu (4):
      net/ixgbe: fix flex bytes flow director rule
      net/ice: check Rx queue number on RSS init
      net/ixgbe: disable NFS filtering
      app/testpmd: avoid exit without terminal restore

David Marchand (3):
      net/hinic: restore vectorised code
      examples/pipeline: fix VXLAN script permission
      mbuf: remove unneeded atomic generic header include

Dekel Peled (8):
      net/mlx5: fix shared age action validation
      net/mlx5: fix hairpin flow split decision
      net/mlx5: fix flow split combined with counter
      net/mlx5: fix flow split combined with age action
      net/mlx5: fix shared RSS translation and cleanup
      app/testpmd: support shared age action query
      net/mlx5: fix shared RSS capability check
      net/mlx5: validate hash Rx queue pointer

Dmitry Kozlyuk (4):
      eal/windows: fix build with MinGW-w64 8
      bus/pci: fix build with MinGW-w64 8
      bus/pci: fix hardware ID limit on Windows
      build: fix linker flags on Windows

Eugeny Parshutin (1):
      doc: add vtune profiling config to prog guide

Fan Zhang (1):
      crypto/qat: fix digest in buffer

Fei Chen (1):
      vhost: fix vid allocation race

Feifei Wang (7):
      test/ring: reduce duration of performance tests
      app/eventdev: adjust event count order for pipeline test
      app/eventdev: remove redundant enqueue in burst Tx
      examples/eventdev: check CPU core enabling
      examples/eventdev: add info output for main core
      examples/eventdev: move ethdev stop to the end
      app/eventdev: fix SMP barrier in performance test

Ferruh Yigit (13):
      app/procinfo: fix _filters stats reporting
      app/procinfo: fix check on xstats-ids
      app/procinfo: remove useless memset
      app/procinfo: remove useless assignment
      net/pcap: remove local variable shadowing outer one
      net/bonding: remove local variable shadowing outer one
      net/af_xdp: remove useless assignment
      net/bnxt: remove redundant return
      app/crypto-perf: remove always true condition
      net/avp: remove always true condition
      net/pcap: fix byte stats for drop Tx
      net/pcap: fix infinite Rx with large files
      app/testpmd: fix help of metering commands

Gaetan Rivet (2):
      net/bonding: fix port id validity check on parsing
      net/bonding: fix PCI address comparison on non-PCI ports

Gagandeep Singh (2):
      test/ipsec: fix result code for not supported
      crypto/dpaa2_sec: fix memory allocation check

George Prekas (1):
      app/testpmd: fix IP checksum calculation

Gregory Etelson (5):
      net/mlx5: fix Direct Verbs flow descriptor allocation
      app/testpmd: release flows left before port stop
      net/mlx5: fix tunnel rules validation on VF representor
      net/mlx5: fix mark action in active tunnel offload
      net/mlx5: fix drop action in tunnel offload mode

Guy Kaneti (1):
      regex/octeontx2: fix PCI table overflow

Haiyue Wang (2):
      net/ice: drain out DCF AdminQ command queue
      net/ixgbe: fix UDP zero checksum on x86

Harman Kalra (1):
      examples/l3fwd: remove limitation on Tx queue count

Harry van Haaren (1):
      eventdev: fix a return value comment

Heinrich Kuhn (1):
      net/nfp: read chip model from PluDevice register

Hemant Agrawal (1):
      app/procinfo: fix security context info

Hongbo Zheng (1):
      net/hns3: use new opcode for clearing hardware resource

Huisong Li (7):
      app/testpmd: fix queue stats mapping configuration
      net/hns3: fix xstats with id and names
      net/hns3: fix error code in xstats
      net/hns3: fix Rx/Tx errors stats
      net/hns3: fix link status change from firmware
      net/hns3: validate requested maximum Rx frame length
      net/hns3: fix query order of link status and link info

Hyong Youb Kim (2):
      net/enic: fix filter type used for flow API
      net/enic: fix filter log message

Ido Segev (1):
      net/ena: flush Rx buffers memory pool cache

Igor Chauskin (2):
      net/ena: fix Tx SQ free space assessment
      net/ena: prevent double doorbell

Igor Ryzhov (1):
      net/i40e: fix stats counters

Ivan Malov (11):
      common/sfc_efx/base: remove warnings about inline specifiers
      common/sfc_efx/base: fix signed/unsigned mismatch warnings
      common/sfc_efx/base: support alternative MAE match fields
      common/sfc_efx/base: update MCDI headers for MAE privilege
      common/sfc_efx/base: check for MAE privilege
      common/sfc_efx/base: fix MPORT related byte order handling
      common/sfc_efx/base: fix MAE match spec validation helper
      common/sfc_efx/base: fix MAE match spec class comparison API
      common/sfc_efx/base: enhance field ID check in field set API
      common/sfc_efx/base: apply mask to value on match field set
      net/sfc: fix TSO and checksum offloads for EF10

Jiawei Wang (4):
      net/mlx5: fix unnecessary checking for RSS action
      app/testpmd: fix packets dump overlapping
      net/mlx5: fix count actions query in sample flow
      net/mlx5: fix counter and age flow action validation

Jiawei Zhu (1):
      net/virtio-user: fix run closing stdin and close callfd

Jingjing Wu (1):
      net/iavf: fix vector mapping with queue

John McNamara (1):
      license: add licenses for exception cases

Joyce Kong (1):
      eal/arm: fix debug build with gcc for 128-bit atomics

Junfeng Guo (1):
      net/iavf: fix GTPU UL and DL support for flow director

Kalesh AP (4):
      net/bnxt: release HWRM lock in error
      net/bnxt: propagate FW command failure to application
      net/bnxt: fix VNIC RSS configure function
      net/bnxt: fix FW version log

Karra Satwik (2):
      net/cxgbe: accept VLAN flow items without ethertype
      app/testpmd: fix start index for showing FEC array

Lance Richardson (10):
      net/bnxt: disable end of packet padding for Rx
      net/bnxt: limit Rx representor packets per poll
      net/bnxt: fix doorbell write ordering
      net/bnxt: fix outer UDP checksum Rx offload capability
      net/bnxt: make offload flags mapping per-ring
      net/bnxt: set correct checksum status in mbuf
      net/bnxt: fix packet type index calculation
      net/bnxt: fix null termination of Rx mbuf chain
      net/bnxt: fix fallback mbuf allocation logic
      net/bnxt: fix Rx completion ring size calculation

Leyi Rong (1):
      net/ice: enlarge Rx queue rearm threshold to 64

Lijun Ou (6):
      net/hns3: fix interception with flow director
      net/hns3: fix memory leak on secondary process exit
      net/hns3: adjust some comments
      net/hns3: adjust format specifier for enum
      doc: fix product link in hns3 guide
      net/hns3: fix RSS indirection table size

Liron Himi (5):
      net/octeontx2: fix PF flow action for Tx
      net/mvpp2: remove debug log on fast-path
      net/mvpp2: remove VLAN flush
      net/mvpp2: remove CRC length from MRU validation
      net/mvpp2: fix frame size checking

Long Li (1):
      net/netvsc: ignore unsupported packet on sync command

Lukasz Wojciechowski (1):
      test/distributor: fix return buffer queue overload

Marvin Liu (1):
      vhost: fix packed ring dequeue offloading

Matan Azrad (1):
      vdpa/mlx5: fix configuration mutex cleanup

Maxime Coquelin (3):
      net/virtio: add missing backend features negotiation
      net/virtio: fix memory init with vDPA backend
      net/virtio: fix getting old status on reconnect

Michael Baum (7):
      net/mlx5: fix leak on Rx queue creation failure
      net/mlx5: fix leak on Tx queue creation failure
      common/mlx5: fix completion queue entry size configuration
      net/mlx5: remove CQE padding device argument
      net/mlx5: fix leak on ASO SQ creation failure
      net/mlx4: fix device detach
      net/mlx4: fix handling of probing failure

Michal Krawczyk (1):
      net/ena: validate Rx req ID upon acquiring descriptor

Min Hu (Connor) (3):
      net/hns3: fix FEC state query
      net/hns3: fix crash with multi-process
      doc: add FEC to NIC features

Murphy Yang (6):
      net/ice: fix outer UDP Tx checksum offload
      net/i40e: fix L4 checksum flag
      net/ice: fix outer checksum flags
      net/iavf: fix conflicting RSS combination rules
      net/ice: disable IPv4 checksum offload in vector Tx
      net/i40e: add null input checks

Nick Connolly (2):
      eal/windows: fix debug build with MinGW
      eal/windows: fix vfprintf warning with clang

Olivier Matz (5):
      build: fix plugin load on static build
      net/virtio-user: fix protocol features advertising
      service: propagate init error in EAL
      test/mcslock: remove unneeded per lcore copy
      mempool: fix panic on dump or audit

Ophir Munk (4):
      net/mlx5: fix freeing packet pacing
      net/mlx5: fix flow action destroy wrapper
      net/mlx5: fix flow operation wrapper per OS
      net/mlx5: unify operations for all OS

Ori Kam (3):
      regex/mlx5: fix memory rule alignment
      regex/mlx5: fix support for group id
      regex/mlx5: fix number of supported queues

Qi Zhang (4):
      doc: fix some statements for ice vector PMD
      net/ice/base: fix tunnel destroy
      net/ice/base: fix null pointer dereference
      net/ice/base: fix memory handling

Ruifeng Wang (4):
      lpm: fix vector IPv4 lookup
      net/hns3: fix build with SVE
      net/octeontx: fix build with SVE
      common/octeontx2: fix build with SVE

Samik Gupta (2):
      net/bnxt: fix Rx rings in RSS redirection table
      net/bnxt: fix VNIC config on Rx queue stop

Shiri Kuzin (2):
      net/mlx5: fix VXLAN decap on non-VXLAN flow
      net/mlx5: refuse empty VLAN in flow pattern

Somnath Kotur (4):
      net/bnxt: fix PF resource query
      net/bnxt: fix lock init and destroy
      net/bnxt: fix error handling in device start
      net/bnxt: refactor init/uninit

Souvik Dey (2):
      net/i40e: fix VLAN stripping in VF
      common/mlx5: fix storing synced MAC to internal table

Sriharsha Basavapatna (1):
      net/bnxt: fix max rings computation

Stephen Hemminger (2):
      test/rwlock: fix spelling and missing whitespace
      test: fix terminal settings on exit

Steve Yang (23):
      ethdev: fix max Rx packet length check
      app/testpmd: fix max Rx packet length for VLAN packets
      net/dpaa: fix jumbo frame flag condition for MTU set
      net/dpaa2: fix jumbo frame flag condition for MTU set
      net/e1000: fix jumbo frame flag condition for MTU set
      net/hns3: fix jumbo frame flag condition for MTU set
      net/i40e: fix jumbo frame flag condition
      net/iavf: fix jumbo frame flag condition
      net/ice: fix jumbo frame flag condition
      net/ipn3ke: fix jumbo frame flag condition for MTU set
      net/octeontx: fix jumbo frame flag condition for MTU set
      net/octeontx2: fix jumbo frame flag condition for MTU
      net/qede: fix jumbo frame flag condition for MTU set
      net/sfc: fix jumbo frame flag condition for MTU set
      net/thunderx: fix jumbo frame flag condition for MTU set
      net/ixgbe: fix jumbo frame flag condition
      net/cxgbe: fix jumbo frame flag condition
      net/axgbe: fix jumbo frame flag condition for MTU set
      net/enetc: fix jumbo frame flag condition for MTU set
      net/hinic: fix jumbo frame flag condition for MTU set
      net/nfp: fix jumbo frame flag condition for MTU set
      net/liquidio: fix jumbo frame flag condition for MTU set
      app/testpmd: fix setting maximum packet length

Suanming Mou (5):
      net/mlx5: fix shared RSS and mark actions combination
      net/mlx5: fix multi-process port ID
      net/mlx5: fix crash on secondary process port close
      net/mlx5: fix port attach in secondary process
      net/mlx4: fix port attach in secondary process

Sunil Kumar Kori (2):
      net/octeontx2: fix corruption in segments list
      net/octeontx: fix max Rx packet length

Tal Shnaiderman (5):
      bus/pci: ignore missing NUMA node on Windows
      net/mlx5: fix constant array size
      net/mlx5: fix device name size on Windows
      net/mlx5: fix comparison sign in flow engine
      common/mlx5: fix pointer cast on Windows

Thomas Monjalon (3):
      doc: fix figure numbering in graph guide
      lib: fix doxygen for parameters of function pointers
      ethdev: fix close failure handling

Timothy McDaniel (1):
      event/dlb: fix accessing uninitialized variables

Ting Xu (1):
      net/iavf: fix memory leak in large VF

Tyler Retzlaff (2):
      bus/pci: fix build with Windows SDK >= 10.0.20253
      eal/windows: fix C++ compatibility

Viacheslav Galaktionov (1):
      net/sfc: fix generic byte statistics to exclude FCS bytes

Viacheslav Ovsiienko (8):
      net/mlx5: fix Verbs memory allocation callback
      net/mlx5: fix buffer split offload advertising
      doc: update flow mark action in mlx5 guide
      net/mlx5: fix wire vport hint
      app/testpmd: fix queue reconfig request on Rx split update
      doc: fix supported feature table in mlx5 guide
      doc: fix mark action zero value in mlx5 guide
      net/mlx5: fix Tx queue size created with DevX

Vladimir Medvedkin (2):
      rib: fix insertion in some cases
      crypto/qat: fix access to uninitialized variable

Weifeng Li (1):
      net/i40e: fix X722 for 802.1ad frames ability

Wenjun Wu (1):
      net/e1000: fix flow control mode setting

Wisam Jaddo (1):
      app/flow-perf: simplify objects initialization

Xuan Ding (1):
      net/iavf: fix symmetric flow rule creation

Yicai Lu (1):
      ip_frag: remove padding length of fragment

Yongxin Liu (1):
      usertools: fix binding built-in kernel driver

Yunjian Wang (3):
      eal/linux: fix handling of error events from epoll
      net/bnxt: fix memory leak when mapping fails
      net/mvneta: check allocation in Rx queue flush

Yuri Chipchev (1):
      net/mvpp2: fix stack corruption

^ permalink raw reply	[relevance 1%]

* Re: [dpdk-dev] Build errors due to duplicate version.map entries in librte_power
  2021-02-15 19:18  3% [dpdk-dev] Build errors due to duplicate version.map entries in librte_power Aaron Conole
@ 2021-02-22 10:31  0% ` Juraj Linkeš
  2021-02-22 19:50  0%   ` Aaron Conole
  0 siblings, 1 reply; 200+ results
From: Juraj Linkeš @ 2021-02-22 10:31 UTC (permalink / raw)
  To: Aaron Conole, dev; +Cc: Bruce Richardson, David Hunt, Anatoly Burakov

This seems to have gone unnoticed.

lib/librte_power/version.map specifies rte_power_guest_channel_send_msg both under DPDK_21 and EXPERIMENTAL.

This is causing the clang cross-compile job to always fail with the error Aaron provided:
ld.lld: error: duplicate symbol 'rte_power_guest_channel_send_msg' in version script

Only the clang cross compile jobs are failing. This could be due to them using the LLVM linker (ld.lld) and the other clang jobs using the default linker.

I have two questions about this:
1. Is this a real failure?
2. If this is a real failure, should we also use ld.lld in the other clang jobs?

Thanks,
Juraj

> -----Original Message-----
> From: dev <dev-bounces@dpdk.org> On Behalf Of Aaron Conole
> Sent: Monday, February 15, 2021 8:18 PM
> To: dev@dpdk.org
> Cc: Bruce Richardson <bruce.richardson@intel.com>; David Hunt
> <david.hunt@intel.com>; Anatoly Burakov <anatoly.burakov@intel.com>
> Subject: [dpdk-dev] Build errors due to duplicate version.map entries in
> librte_power
> 
> Greetings,
> 
> During CI runs, I've noticed lots of failures from the Travis-CI side all related to
> librte_power/version.map containing some duplicate symbols.  It seems commit
> 4d3892dcd77b ("power: make channel message functions public") made the
> following hunk:
> 
> diff --git a/lib/librte_power/version.map b/lib/librte_power/version.map index
> 69ca9af616..13f0af3b2d 100644
> --- a/lib/librte_power/version.map
> +++ b/lib/librte_power/version.map
> @@ -34,4 +34,8 @@ EXPERIMENTAL {
>         rte_power_guest_channel_receive_msg;
>         rte_power_poll_stat_fetch;
>         rte_power_poll_stat_update;
> +
> +       # added in 21.02
> +       rte_power_guest_channel_receive_msg;
> +       rte_power_guest_channel_send_msg;
>  };
> 
> 
> As can be seen, rte_power_guest_channel_receive_msg was added already (it's
> present in the hunk itself).  The rte_power_guest_channel_send_msg function
> was added as part of 85ff364f3bd3 ("build: align symbols with global ABI
> version").
> 
> I guess it may not be allowed to have duplicate symbols here, because in travis, I
> see (only for some builds):
> 
> clang  -o lib/librte_power.so.21.1
> 'lib/lib@@rte_power@sta/librte_power_rte_power.c.o'
> 'lib/lib@@rte_power@sta/librte_power_power_acpi_cpufreq.c.o'
> 'lib/lib@@rte_power@sta/librte_power_power_kvm_vm.c.o'
> 'lib/lib@@rte_power@sta/librte_power_guest_channel.c.o'
> 'lib/lib@@rte_power@sta/librte_power_rte_power_empty_poll.c.o'
> 'lib/lib@@rte_power@sta/librte_power_power_pstate_cpufreq.c.o'
> 'lib/lib@@rte_power@sta/librte_power_rte_power_pmd_mgmt.c.o'
> 'lib/lib@@rte_power@sta/librte_power_power_common.c.o' -Wl,--no-
> undefined -Wl,--as-needed -shared -fPIC -Wl,--start-group -Wl,-
> soname,librte_power.so.21 -Wl,--no-as-needed -pthread -lm -ldl
> lib/librte_eal.so.21.1 lib/librte_kvargs.so.21.1 lib/librte_telemetry.so.21.1
> lib/librte_timer.so.21.1 lib/librte_ethdev.so.21.1 lib/librte_net.so.21.1
> lib/librte_mbuf.so.21.1 lib/librte_mempool.so.21.1 lib/librte_ring.so.21.1
> lib/librte_meter.so.21.1 -Wl,--end-group -Wl,--version-
> script=/home/travis/build/ovsrobot/dpdk/lib/librte_power/version.map '-Wl,-
> rpath,$ORIGIN/' -Wl,-rpath-link,/home/travis/build/ovsrobot/dpdk/build/lib -
> target aarch64-linux-gnu -fuse-ld=lld --gcc-toolchain=/usr
> 
> ld.lld: error: duplicate symbol 'rte_power_guest_channel_send_msg' in version
> script
> 
> Thoughts?
> 



^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v3 7/7] eal/windows: do not expose POSIX symbols
  @ 2021-02-21 14:28  3%     ` Dmitry Kozlyuk
    1 sibling, 0 replies; 200+ results
From: Dmitry Kozlyuk @ 2021-02-21 14:28 UTC (permalink / raw)
  To: dev
  Cc: Tal Shnaiderman, Dmitry Kozlyuk, Bruce Richardson,
	Narcisa Ana Maria Vasile, Dmitry Malloy, Pallavi Kadam

Exposing POSIX symbols could break consumer POSIX compatibility code.

* Make renaming of close() and unlink() private to EAL.

* Remove renaming of strncasecmp(), strtok_r(), and sleep()
  in favor of using EAL wrappers. Similarly remove PATH_MAX macro.

* Replace index(3p), which is not available on Windows, with strchr(3),
  as recommended by POSIX.1-2008. strerror_r() is only used inside EAL,
  rename it only where it's needed. Same for asprintf(), it has an
  internal EAL wrapper and is removed from public API.

Signed-off-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
---
 doc/guides/rel_notes/release_21_05.rst     |  9 ++
 lib/librte_eal/common/eal_common_errno.c   |  4 +
 lib/librte_eal/common/eal_common_options.c |  2 +-
 lib/librte_eal/common/eal_private.h        |  5 ++
 lib/librte_eal/freebsd/include/rte_os.h    |  4 +-
 lib/librte_eal/linux/include/rte_os.h      |  4 +-
 lib/librte_eal/windows/include/rte_os.h    | 99 ++--------------------
 7 files changed, 29 insertions(+), 98 deletions(-)

diff --git a/doc/guides/rel_notes/release_21_05.rst b/doc/guides/rel_notes/release_21_05.rst
index 5aa9ed7db..6380dfa53 100644
--- a/doc/guides/rel_notes/release_21_05.rst
+++ b/doc/guides/rel_notes/release_21_05.rst
@@ -84,6 +84,15 @@ API Changes
    Also, make sure to start the actual text at the margin.
    =======================================================
 
+* eal/windows: Removed POSIX symbols from EAL headers. Exposing POSIX symbols
+  has been incorrect and could conflict with consumer POSIX implementations.
+  Wrappers are provided for
+  ``strtok_r(3p)`` (``rte_strtok``),
+  ``strncasecmp(3p)`` (``rte_strncasecmp``),
+  ``sleep(3p)`` (``rte_thread_sleep``),
+  ``PATH_MAX`` (``RTE_PATH_MAX``).
+  Removed are ``strerror_r(3p)`` and ``asprintf(3p)``.
+
 
 ABI Changes
 -----------
diff --git a/lib/librte_eal/common/eal_common_errno.c b/lib/librte_eal/common/eal_common_errno.c
index 2a10fb823..536eea0c3 100644
--- a/lib/librte_eal/common/eal_common_errno.c
+++ b/lib/librte_eal/common/eal_common_errno.c
@@ -15,6 +15,10 @@
 #include <rte_errno.h>
 #include <rte_string_fns.h>
 
+#ifdef RTE_EXEC_ENV_WINDOWS
+#define strerror_r(a, b, c) strerror_s(b, c, a)
+#endif
+
 RTE_DEFINE_PER_LCORE(int, _rte_errno);
 
 const char *
diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c
index 275f879d7..fd3b22e8a 100644
--- a/lib/librte_eal/common/eal_common_options.c
+++ b/lib/librte_eal/common/eal_common_options.c
@@ -1936,7 +1936,7 @@ eal_check_common_options(struct internal_config *internal_cfg)
 		RTE_LOG(ERR, EAL, "Invalid length of --" OPT_MBUF_POOL_OPS_NAME" option\n");
 		return -1;
 	}
-	if (index(eal_get_hugefile_prefix(), '%') != NULL) {
+	if (strchr(eal_get_hugefile_prefix(), '%') != NULL) {
 		RTE_LOG(ERR, EAL, "Invalid char, '%%', in --"OPT_FILE_PREFIX" "
 			"option\n");
 		return -1;
diff --git a/lib/librte_eal/common/eal_private.h b/lib/librte_eal/common/eal_private.h
index a5d9c5123..860551661 100644
--- a/lib/librte_eal/common/eal_private.h
+++ b/lib/librte_eal/common/eal_private.h
@@ -756,4 +756,9 @@ int eal_asprintf(char **buffer, const char *format, ...);
 #define eal_asprintf asprintf
 #endif
 
+#ifdef RTE_EXEC_ENV_WINDOWS
+#define close _close
+#define unlink _unlink
+#endif
+
 #endif /* _EAL_PRIVATE_H_ */
diff --git a/lib/librte_eal/freebsd/include/rte_os.h b/lib/librte_eal/freebsd/include/rte_os.h
index b37d59b5e..a5bf10021 100644
--- a/lib/librte_eal/freebsd/include/rte_os.h
+++ b/lib/librte_eal/freebsd/include/rte_os.h
@@ -6,9 +6,9 @@
 #define _RTE_OS_H_
 
 /**
- * This is header should contain any function/macro definition
+ * This header should contain any function/macro definition
  * which are not supported natively or named differently in the
- * freebsd OS. Functions will be added in future releases.
+ * freebsd OS. It must not define symbols without "rte_" prefix.
  */
 
 #include <pthread_np.h>
diff --git a/lib/librte_eal/linux/include/rte_os.h b/lib/librte_eal/linux/include/rte_os.h
index af7d052d9..04f510eec 100644
--- a/lib/librte_eal/linux/include/rte_os.h
+++ b/lib/librte_eal/linux/include/rte_os.h
@@ -6,9 +6,9 @@
 #define _RTE_OS_H_
 
 /**
- * This is header should contain any function/macro definition
+ * This header should contain any function/macro definition
  * which are not supported natively or named differently in the
- * linux OS. Functions will be added in future releases.
+ * linux OS. It must not define symbols without "rte_" prefix.
  */
 
 #include <sched.h>
diff --git a/lib/librte_eal/windows/include/rte_os.h b/lib/librte_eal/windows/include/rte_os.h
index edca11bd2..9c9c31214 100644
--- a/lib/librte_eal/windows/include/rte_os.h
+++ b/lib/librte_eal/windows/include/rte_os.h
@@ -6,15 +6,11 @@
 #define _RTE_OS_H_
 
 /**
- * This is header should contain any function/macro definition
- * which are not supported natively or named differently in the
- * Windows OS. It must not include Windows-specific headers.
+ * This header should contain any function/macro definition
+ * which are not supported natively or named differently in Windows OS.
  */
 
-#include <stdarg.h>
-#include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -22,101 +18,18 @@ extern "C" {
 
 #define RTE_PATH_MAX _MAX_PATH
 
-/* limits.h replacement, value as in <windows.h> */
-#ifndef PATH_MAX
-#define PATH_MAX _MAX_PATH
-#endif
-
-#ifndef sleep
-#define sleep(x) Sleep(1000 * (x))
-#endif
-
-#ifndef strerror_r
-#define strerror_r(a, b, c) strerror_s(b, c, a)
-#endif
-
-#ifndef strdup
-/* strdup is deprecated in Microsoft libc and _strdup is preferred */
-#define strdup(str) _strdup(str)
-#endif
-
-#ifndef strtok_r
-#define strtok_r(str, delim, saveptr) strtok_s(str, delim, saveptr)
-#endif
-
-#ifndef index
-#define index(a, b)     strchr(a, b)
-#endif
-
-#ifndef rindex
-#define rindex(a, b)    strrchr(a, b)
-#endif
-
-#ifndef strncasecmp
-#define strncasecmp(s1, s2, count)        _strnicmp(s1, s2, count)
-#endif
-
-#ifndef close
-#define close _close
-#endif
-
-#ifndef unlink
-#define unlink _unlink
-#endif
-
 /* cpu_set macros implementation */
 #define RTE_CPU_AND(dst, src1, src2) CPU_AND(dst, src1, src2)
 #define RTE_CPU_OR(dst, src1, src2) CPU_OR(dst, src1, src2)
 #define RTE_CPU_FILL(set) CPU_FILL(set)
 #define RTE_CPU_NOT(dst, src) CPU_NOT(dst, src)
 
-/* as in <windows.h> */
+/* This is an exception without "rte_" prefix, because Windows does have
+ * ssize_t, but it's defined in <windows.h> which we avoid to expose.
+ * If ssize_t is defined in user code, it necessarily has the same type.
+ */
 typedef long long ssize_t;
 
-#ifndef RTE_TOOLCHAIN_GCC
-
-static inline int
-asprintf(char **buffer, const char *format, ...)
-{
-	int size, ret;
-	va_list arg;
-
-	va_start(arg, format);
-	size = vsnprintf(NULL, 0, format, arg);
-	va_end(arg);
-	if (size < 0)
-		return -1;
-	size++;
-
-	*buffer = (char *)malloc(size);
-	if (*buffer == NULL)
-		return -1;
-
-	va_start(arg, format);
-	ret = vsnprintf(*buffer, size, format, arg);
-	va_end(arg);
-	if (ret != size - 1) {
-		free(*buffer);
-		return -1;
-	}
-	return ret;
-}
-
-static inline const char *
-eal_strerror(int code)
-{
-	static char buffer[128];
-
-	strerror_s(buffer, sizeof(buffer), code);
-	return buffer;
-}
-
-#ifndef strerror
-#define strerror eal_strerror
-#endif
-
-#endif /* RTE_TOOLCHAIN_GCC */
-
 #ifdef __cplusplus
 }
 #endif
-- 
2.29.2


^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v2 7/7] eal/windows: do not expose POSIX symbols
  @ 2021-02-21  1:28  3%   ` Dmitry Kozlyuk
    1 sibling, 0 replies; 200+ results
From: Dmitry Kozlyuk @ 2021-02-21  1:28 UTC (permalink / raw)
  To: dev
  Cc: Tyler Retzlaff, Nick Connolly, Dmitry Kozlyuk, Bruce Richardson,
	Narcisa Ana Maria Vasile, Dmitry Malloy, Pallavi Kadam

Exposing POSIX symbols could break consumer POSIX compatibility code.

* Make renaming of close() and unlink() private to EAL.

* Remove renaming of strncasecmp(), strtok_r(), and sleep()
  in favor of using EAL wrappers. Similarly remove PATH_MAX macro.

* Replace index(3p), which is not available on Windows, with strchr(3),
  as recommended by POSIX.1-2008. strerror_r() is only used inside EAL,
  rename it only where it's needed. Same for asprintf(), it has an
  internal EAL wrapper and is removed from public API.

Signed-off-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
---
 doc/guides/rel_notes/release_21_05.rst     |  9 ++
 lib/librte_eal/common/eal_common_errno.c   |  4 +
 lib/librte_eal/common/eal_common_options.c |  2 +-
 lib/librte_eal/common/eal_private.h        |  5 ++
 lib/librte_eal/freebsd/include/rte_os.h    |  4 +-
 lib/librte_eal/linux/include/rte_os.h      |  4 +-
 lib/librte_eal/windows/include/rte_os.h    | 99 ++--------------------
 7 files changed, 29 insertions(+), 98 deletions(-)

diff --git a/doc/guides/rel_notes/release_21_05.rst b/doc/guides/rel_notes/release_21_05.rst
index 5aa9ed7db..6380dfa53 100644
--- a/doc/guides/rel_notes/release_21_05.rst
+++ b/doc/guides/rel_notes/release_21_05.rst
@@ -84,6 +84,15 @@ API Changes
    Also, make sure to start the actual text at the margin.
    =======================================================
 
+* eal/windows: Removed POSIX symbols from EAL headers. Exposing POSIX symbols
+  has been incorrect and could conflict with consumer POSIX implementations.
+  Wrappers are provided for
+  ``strtok_r(3p)`` (``rte_strtok``),
+  ``strncasecmp(3p)`` (``rte_strncasecmp``),
+  ``sleep(3p)`` (``rte_thread_sleep``),
+  ``PATH_MAX`` (``RTE_PATH_MAX``).
+  Removed are ``strerror_r(3p)`` and ``asprintf(3p)``.
+
 
 ABI Changes
 -----------
diff --git a/lib/librte_eal/common/eal_common_errno.c b/lib/librte_eal/common/eal_common_errno.c
index 2a10fb823..536eea0c3 100644
--- a/lib/librte_eal/common/eal_common_errno.c
+++ b/lib/librte_eal/common/eal_common_errno.c
@@ -15,6 +15,10 @@
 #include <rte_errno.h>
 #include <rte_string_fns.h>
 
+#ifdef RTE_EXEC_ENV_WINDOWS
+#define strerror_r(a, b, c) strerror_s(b, c, a)
+#endif
+
 RTE_DEFINE_PER_LCORE(int, _rte_errno);
 
 const char *
diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c
index 275f879d7..fd3b22e8a 100644
--- a/lib/librte_eal/common/eal_common_options.c
+++ b/lib/librte_eal/common/eal_common_options.c
@@ -1936,7 +1936,7 @@ eal_check_common_options(struct internal_config *internal_cfg)
 		RTE_LOG(ERR, EAL, "Invalid length of --" OPT_MBUF_POOL_OPS_NAME" option\n");
 		return -1;
 	}
-	if (index(eal_get_hugefile_prefix(), '%') != NULL) {
+	if (strchr(eal_get_hugefile_prefix(), '%') != NULL) {
 		RTE_LOG(ERR, EAL, "Invalid char, '%%', in --"OPT_FILE_PREFIX" "
 			"option\n");
 		return -1;
diff --git a/lib/librte_eal/common/eal_private.h b/lib/librte_eal/common/eal_private.h
index a5d9c5123..860551661 100644
--- a/lib/librte_eal/common/eal_private.h
+++ b/lib/librte_eal/common/eal_private.h
@@ -756,4 +756,9 @@ int eal_asprintf(char **buffer, const char *format, ...);
 #define eal_asprintf asprintf
 #endif
 
+#ifdef RTE_EXEC_ENV_WINDOWS
+#define close _close
+#define unlink _unlink
+#endif
+
 #endif /* _EAL_PRIVATE_H_ */
diff --git a/lib/librte_eal/freebsd/include/rte_os.h b/lib/librte_eal/freebsd/include/rte_os.h
index b37d59b5e..a5bf10021 100644
--- a/lib/librte_eal/freebsd/include/rte_os.h
+++ b/lib/librte_eal/freebsd/include/rte_os.h
@@ -6,9 +6,9 @@
 #define _RTE_OS_H_
 
 /**
- * This is header should contain any function/macro definition
+ * This header should contain any function/macro definition
  * which are not supported natively or named differently in the
- * freebsd OS. Functions will be added in future releases.
+ * freebsd OS. It must not define symbols without "rte_" prefix.
  */
 
 #include <pthread_np.h>
diff --git a/lib/librte_eal/linux/include/rte_os.h b/lib/librte_eal/linux/include/rte_os.h
index af7d052d9..04f510eec 100644
--- a/lib/librte_eal/linux/include/rte_os.h
+++ b/lib/librte_eal/linux/include/rte_os.h
@@ -6,9 +6,9 @@
 #define _RTE_OS_H_
 
 /**
- * This is header should contain any function/macro definition
+ * This header should contain any function/macro definition
  * which are not supported natively or named differently in the
- * linux OS. Functions will be added in future releases.
+ * linux OS. It must not define symbols without "rte_" prefix.
  */
 
 #include <sched.h>
diff --git a/lib/librte_eal/windows/include/rte_os.h b/lib/librte_eal/windows/include/rte_os.h
index edca11bd2..9c9c31214 100644
--- a/lib/librte_eal/windows/include/rte_os.h
+++ b/lib/librte_eal/windows/include/rte_os.h
@@ -6,15 +6,11 @@
 #define _RTE_OS_H_
 
 /**
- * This is header should contain any function/macro definition
- * which are not supported natively or named differently in the
- * Windows OS. It must not include Windows-specific headers.
+ * This header should contain any function/macro definition
+ * which are not supported natively or named differently in Windows OS.
  */
 
-#include <stdarg.h>
-#include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -22,101 +18,18 @@ extern "C" {
 
 #define RTE_PATH_MAX _MAX_PATH
 
-/* limits.h replacement, value as in <windows.h> */
-#ifndef PATH_MAX
-#define PATH_MAX _MAX_PATH
-#endif
-
-#ifndef sleep
-#define sleep(x) Sleep(1000 * (x))
-#endif
-
-#ifndef strerror_r
-#define strerror_r(a, b, c) strerror_s(b, c, a)
-#endif
-
-#ifndef strdup
-/* strdup is deprecated in Microsoft libc and _strdup is preferred */
-#define strdup(str) _strdup(str)
-#endif
-
-#ifndef strtok_r
-#define strtok_r(str, delim, saveptr) strtok_s(str, delim, saveptr)
-#endif
-
-#ifndef index
-#define index(a, b)     strchr(a, b)
-#endif
-
-#ifndef rindex
-#define rindex(a, b)    strrchr(a, b)
-#endif
-
-#ifndef strncasecmp
-#define strncasecmp(s1, s2, count)        _strnicmp(s1, s2, count)
-#endif
-
-#ifndef close
-#define close _close
-#endif
-
-#ifndef unlink
-#define unlink _unlink
-#endif
-
 /* cpu_set macros implementation */
 #define RTE_CPU_AND(dst, src1, src2) CPU_AND(dst, src1, src2)
 #define RTE_CPU_OR(dst, src1, src2) CPU_OR(dst, src1, src2)
 #define RTE_CPU_FILL(set) CPU_FILL(set)
 #define RTE_CPU_NOT(dst, src) CPU_NOT(dst, src)
 
-/* as in <windows.h> */
+/* This is an exception without "rte_" prefix, because Windows does have
+ * ssize_t, but it's defined in <windows.h> which we avoid to expose.
+ * If ssize_t is defined in user code, it necessarily has the same type.
+ */
 typedef long long ssize_t;
 
-#ifndef RTE_TOOLCHAIN_GCC
-
-static inline int
-asprintf(char **buffer, const char *format, ...)
-{
-	int size, ret;
-	va_list arg;
-
-	va_start(arg, format);
-	size = vsnprintf(NULL, 0, format, arg);
-	va_end(arg);
-	if (size < 0)
-		return -1;
-	size++;
-
-	*buffer = (char *)malloc(size);
-	if (*buffer == NULL)
-		return -1;
-
-	va_start(arg, format);
-	ret = vsnprintf(*buffer, size, format, arg);
-	va_end(arg);
-	if (ret != size - 1) {
-		free(*buffer);
-		return -1;
-	}
-	return ret;
-}
-
-static inline const char *
-eal_strerror(int code)
-{
-	static char buffer[128];
-
-	strerror_s(buffer, sizeof(buffer), code);
-	return buffer;
-}
-
-#ifndef strerror
-#define strerror eal_strerror
-#endif
-
-#endif /* RTE_TOOLCHAIN_GCC */
-
 #ifdef __cplusplus
 }
 #endif
-- 
2.29.2


^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH 7/7] eal/windows: do not expose POSIX symbols
  @ 2021-02-20 23:29  3% ` Dmitry Kozlyuk
    1 sibling, 0 replies; 200+ results
From: Dmitry Kozlyuk @ 2021-02-20 23:29 UTC (permalink / raw)
  To: dev
  Cc: Tyler Retzlaff, Nick Connolly, Dmitry Kozlyuk, Bruce Richardson,
	Narcisa Ana Maria Vasile, Dmitry Malloy, Pallavi Kadam

Exposing POSIX symbols could break consumer POSIX compatibility code.

* Make renaming of close() and unlink() private to EAL.

* Remove renaming of strncasecmp(), strtok_r(), and sleep()
  in favor of using EAL wrappers. Similarly remove PATH_MAX macro.

* Replace index(3p), which is not available on Windows, with strchr(3),
  as recommended by POSIX.1-2008. strerror_r() is only used inside EAL,
  rename it only where it's needed. Same for asprintf(), it has an
  internal EAL wrapper and is removed from public API.

Signed-off-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
---
 doc/guides/rel_notes/release_21_05.rst     |  9 ++
 lib/librte_eal/common/eal_common_errno.c   |  4 +
 lib/librte_eal/common/eal_common_options.c |  2 +-
 lib/librte_eal/common/eal_private.h        |  5 ++
 lib/librte_eal/freebsd/include/rte_os.h    |  4 +-
 lib/librte_eal/linux/include/rte_os.h      |  4 +-
 lib/librte_eal/windows/include/rte_os.h    | 99 ++--------------------
 7 files changed, 29 insertions(+), 98 deletions(-)

diff --git a/doc/guides/rel_notes/release_21_05.rst b/doc/guides/rel_notes/release_21_05.rst
index 5aa9ed7db..6380dfa53 100644
--- a/doc/guides/rel_notes/release_21_05.rst
+++ b/doc/guides/rel_notes/release_21_05.rst
@@ -84,6 +84,15 @@ API Changes
    Also, make sure to start the actual text at the margin.
    =======================================================
 
+* eal/windows: Removed POSIX symbols from EAL headers. Exposing POSIX symbols
+  has been incorrect and could conflict with consumer POSIX implementations.
+  Wrappers are provided for
+  ``strtok_r(3p)`` (``rte_strtok``),
+  ``strncasecmp(3p)`` (``rte_strncasecmp``),
+  ``sleep(3p)`` (``rte_thread_sleep``),
+  ``PATH_MAX`` (``RTE_PATH_MAX``).
+  Removed are ``strerror_r(3p)`` and ``asprintf(3p)``.
+
 
 ABI Changes
 -----------
diff --git a/lib/librte_eal/common/eal_common_errno.c b/lib/librte_eal/common/eal_common_errno.c
index 2a10fb823..536eea0c3 100644
--- a/lib/librte_eal/common/eal_common_errno.c
+++ b/lib/librte_eal/common/eal_common_errno.c
@@ -15,6 +15,10 @@
 #include <rte_errno.h>
 #include <rte_string_fns.h>
 
+#ifdef RTE_EXEC_ENV_WINDOWS
+#define strerror_r(a, b, c) strerror_s(b, c, a)
+#endif
+
 RTE_DEFINE_PER_LCORE(int, _rte_errno);
 
 const char *
diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c
index 275f879d7..fd3b22e8a 100644
--- a/lib/librte_eal/common/eal_common_options.c
+++ b/lib/librte_eal/common/eal_common_options.c
@@ -1936,7 +1936,7 @@ eal_check_common_options(struct internal_config *internal_cfg)
 		RTE_LOG(ERR, EAL, "Invalid length of --" OPT_MBUF_POOL_OPS_NAME" option\n");
 		return -1;
 	}
-	if (index(eal_get_hugefile_prefix(), '%') != NULL) {
+	if (strchr(eal_get_hugefile_prefix(), '%') != NULL) {
 		RTE_LOG(ERR, EAL, "Invalid char, '%%', in --"OPT_FILE_PREFIX" "
 			"option\n");
 		return -1;
diff --git a/lib/librte_eal/common/eal_private.h b/lib/librte_eal/common/eal_private.h
index a5d9c5123..860551661 100644
--- a/lib/librte_eal/common/eal_private.h
+++ b/lib/librte_eal/common/eal_private.h
@@ -756,4 +756,9 @@ int eal_asprintf(char **buffer, const char *format, ...);
 #define eal_asprintf asprintf
 #endif
 
+#ifdef RTE_EXEC_ENV_WINDOWS
+#define close _close
+#define unlink _unlink
+#endif
+
 #endif /* _EAL_PRIVATE_H_ */
diff --git a/lib/librte_eal/freebsd/include/rte_os.h b/lib/librte_eal/freebsd/include/rte_os.h
index b37d59b5e..a5bf10021 100644
--- a/lib/librte_eal/freebsd/include/rte_os.h
+++ b/lib/librte_eal/freebsd/include/rte_os.h
@@ -6,9 +6,9 @@
 #define _RTE_OS_H_
 
 /**
- * This is header should contain any function/macro definition
+ * This header should contain any function/macro definition
  * which are not supported natively or named differently in the
- * freebsd OS. Functions will be added in future releases.
+ * freebsd OS. It must not define symbols without "rte_" prefix.
  */
 
 #include <pthread_np.h>
diff --git a/lib/librte_eal/linux/include/rte_os.h b/lib/librte_eal/linux/include/rte_os.h
index af7d052d9..04f510eec 100644
--- a/lib/librte_eal/linux/include/rte_os.h
+++ b/lib/librte_eal/linux/include/rte_os.h
@@ -6,9 +6,9 @@
 #define _RTE_OS_H_
 
 /**
- * This is header should contain any function/macro definition
+ * This header should contain any function/macro definition
  * which are not supported natively or named differently in the
- * linux OS. Functions will be added in future releases.
+ * linux OS. It must not define symbols without "rte_" prefix.
  */
 
 #include <sched.h>
diff --git a/lib/librte_eal/windows/include/rte_os.h b/lib/librte_eal/windows/include/rte_os.h
index edca11bd2..9c9c31214 100644
--- a/lib/librte_eal/windows/include/rte_os.h
+++ b/lib/librte_eal/windows/include/rte_os.h
@@ -6,15 +6,11 @@
 #define _RTE_OS_H_
 
 /**
- * This is header should contain any function/macro definition
- * which are not supported natively or named differently in the
- * Windows OS. It must not include Windows-specific headers.
+ * This header should contain any function/macro definition
+ * which are not supported natively or named differently in Windows OS.
  */
 
-#include <stdarg.h>
-#include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -22,101 +18,18 @@ extern "C" {
 
 #define RTE_PATH_MAX _MAX_PATH
 
-/* limits.h replacement, value as in <windows.h> */
-#ifndef PATH_MAX
-#define PATH_MAX _MAX_PATH
-#endif
-
-#ifndef sleep
-#define sleep(x) Sleep(1000 * (x))
-#endif
-
-#ifndef strerror_r
-#define strerror_r(a, b, c) strerror_s(b, c, a)
-#endif
-
-#ifndef strdup
-/* strdup is deprecated in Microsoft libc and _strdup is preferred */
-#define strdup(str) _strdup(str)
-#endif
-
-#ifndef strtok_r
-#define strtok_r(str, delim, saveptr) strtok_s(str, delim, saveptr)
-#endif
-
-#ifndef index
-#define index(a, b)     strchr(a, b)
-#endif
-
-#ifndef rindex
-#define rindex(a, b)    strrchr(a, b)
-#endif
-
-#ifndef strncasecmp
-#define strncasecmp(s1, s2, count)        _strnicmp(s1, s2, count)
-#endif
-
-#ifndef close
-#define close _close
-#endif
-
-#ifndef unlink
-#define unlink _unlink
-#endif
-
 /* cpu_set macros implementation */
 #define RTE_CPU_AND(dst, src1, src2) CPU_AND(dst, src1, src2)
 #define RTE_CPU_OR(dst, src1, src2) CPU_OR(dst, src1, src2)
 #define RTE_CPU_FILL(set) CPU_FILL(set)
 #define RTE_CPU_NOT(dst, src) CPU_NOT(dst, src)
 
-/* as in <windows.h> */
+/* This is an exception without "rte_" prefix, because Windows does have
+ * ssize_t, but it's defined in <windows.h> which we avoid to expose.
+ * If ssize_t is defined in user code, it necessarily has the same type.
+ */
 typedef long long ssize_t;
 
-#ifndef RTE_TOOLCHAIN_GCC
-
-static inline int
-asprintf(char **buffer, const char *format, ...)
-{
-	int size, ret;
-	va_list arg;
-
-	va_start(arg, format);
-	size = vsnprintf(NULL, 0, format, arg);
-	va_end(arg);
-	if (size < 0)
-		return -1;
-	size++;
-
-	*buffer = (char *)malloc(size);
-	if (*buffer == NULL)
-		return -1;
-
-	va_start(arg, format);
-	ret = vsnprintf(*buffer, size, format, arg);
-	va_end(arg);
-	if (ret != size - 1) {
-		free(*buffer);
-		return -1;
-	}
-	return ret;
-}
-
-static inline const char *
-eal_strerror(int code)
-{
-	static char buffer[128];
-
-	strerror_s(buffer, sizeof(buffer), code);
-	return buffer;
-}
-
-#ifndef strerror
-#define strerror eal_strerror
-#endif
-
-#endif /* RTE_TOOLCHAIN_GCC */
-
 #ifdef __cplusplus
 }
 #endif
-- 
2.29.2


^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH 7/7] eventdev: fix ABI breakage due to event vector
  2021-02-20 22:09  3% [dpdk-dev] [PATCH 0/7] Introduce event vectorization pbhagavatula
@ 2021-02-20 22:09  5% ` pbhagavatula
  2021-03-08 18:44  9%   ` Jerin Jacob
  2021-03-08 16:41  0% ` [dpdk-dev] [PATCH 0/7] Introduce event vectorization Jerin Jacob
  2021-03-16 15:48  4% ` [dpdk-dev] [PATCH v2 0/8] " pbhagavatula
  2 siblings, 1 reply; 200+ results
From: pbhagavatula @ 2021-02-20 22:09 UTC (permalink / raw)
  To: jerinj, jay.jayatheerthan, erik.g.carrillo, abhinandan.gujjar,
	timothy.mcdaniel, hemant.agrawal, harry.van.haaren,
	mattias.ronnblom, liang.j.ma, Ray Kinsella, Neil Horman
  Cc: dev, Pavan Nikhilesh

From: Pavan Nikhilesh <pbhagavatula@marvell.com>

Fix ABI breakage due to event vector configuration by moving
the vector configuration into a new structure and having a separate
function for enabling the vector config on a given ethernet device and
queue pair.
This vector config and function can be merged to queue config in
v21.11.

Fixes: 44c81670cf0a ("eventdev: introduce event vector Rx capability")

Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
---
 app/test-eventdev/test_pipeline_common.c      |  16 +-
 lib/librte_eventdev/eventdev_pmd.h            |  29 +++
 .../rte_event_eth_rx_adapter.c                | 168 ++++++++++++------
 .../rte_event_eth_rx_adapter.h                |  27 +++
 lib/librte_eventdev/version.map               |   1 +
 5 files changed, 184 insertions(+), 57 deletions(-)

diff --git a/app/test-eventdev/test_pipeline_common.c b/app/test-eventdev/test_pipeline_common.c
index 89f73be86..9aeefdd5f 100644
--- a/app/test-eventdev/test_pipeline_common.c
+++ b/app/test-eventdev/test_pipeline_common.c
@@ -331,6 +331,7 @@ pipeline_event_rx_adapter_setup(struct evt_options *opt, uint8_t stride,
 	uint16_t prod;
 	struct rte_mempool *vector_pool = NULL;
 	struct rte_event_eth_rx_adapter_queue_conf queue_conf;
+	struct rte_event_eth_rx_adapter_event_vector_config vec_conf;

 	memset(&queue_conf, 0,
 			sizeof(struct rte_event_eth_rx_adapter_queue_conf));
@@ -360,12 +361,8 @@ pipeline_event_rx_adapter_setup(struct evt_options *opt, uint8_t stride,
 		}
 		if (opt->ena_vector) {
 			if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR) {
-				queue_conf.vector_sz = opt->vector_size;
-				queue_conf.vector_timeout_ns =
-					opt->vector_tmo_nsec;
 				queue_conf.rx_queue_flags |=
 				RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR;
-				queue_conf.vector_mp = vector_pool;
 			} else {
 				evt_err("Rx adapter doesn't support event vector");
 				return -EINVAL;
@@ -385,6 +382,17 @@ pipeline_event_rx_adapter_setup(struct evt_options *opt, uint8_t stride,
 			return ret;
 		}

+		if (opt->ena_vector) {
+			vec_conf.vector_sz = opt->vector_size;
+			vec_conf.vector_timeout_ns = opt->vector_tmo_nsec;
+			vec_conf.vector_mp = vector_pool;
+			if (rte_event_eth_rx_adapter_queue_event_vector_config(
+				    prod, prod, -1, &vec_conf) < 0) {
+				evt_err("Failed to configure event vectorization for Rx adapter");
+				return -EINVAL;
+			}
+		}
+
 		if (!(cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_INTERNAL_PORT)) {
 			uint32_t service_id = -1U;

diff --git a/lib/librte_eventdev/eventdev_pmd.h b/lib/librte_eventdev/eventdev_pmd.h
index 60bfaebc0..d79dfd612 100644
--- a/lib/librte_eventdev/eventdev_pmd.h
+++ b/lib/librte_eventdev/eventdev_pmd.h
@@ -667,6 +667,32 @@ typedef int (*eventdev_eth_rx_adapter_vector_limits_get_t)(
 	const struct rte_eventdev *dev, const struct rte_eth_dev *eth_dev,
 	struct rte_event_eth_rx_adapter_vector_limits *limits);

+struct rte_event_eth_rx_adapter_event_vector_config;
+/**
+ * Enable event vector on an given Rx queue of a ethernet devices belonging to
+ * the Rx adapter.
+ *
+ * @param dev
+ *   Event device pointer
+ *
+ * @param eth_dev
+ *   Ethernet device pointer
+ *
+ * @param rx_queue_id
+ *   The Rx queue identifier
+ *
+ * @param config
+ *   Pointer to the event vector configuration structure.
+ *
+ * @return
+ *   - 0: Success.
+ *   - <0: Error code returned by the driver function.
+ */
+typedef int (*eventdev_eth_rx_adapter_event_vector_config_t)(
+	const struct rte_eventdev *dev, const struct rte_eth_dev *eth_dev,
+	int32_t rx_queue_id,
+	const struct rte_event_eth_rx_adapter_event_vector_config *config);
+
 typedef uint32_t rte_event_pmd_selftest_seqn_t;
 extern int rte_event_pmd_selftest_seqn_dynfield_offset;

@@ -1092,6 +1118,9 @@ struct rte_eventdev_ops {
 	eventdev_eth_rx_adapter_vector_limits_get_t
 		eth_rx_adapter_vector_limits_get;
 	/**< Get event vector limits for the Rx adapter */
+	eventdev_eth_rx_adapter_event_vector_config_t
+		eth_rx_adapter_event_vector_config;
+	/**< Configure Rx adapter with event vector */

 	eventdev_timer_adapter_caps_get_t timer_adapter_caps_get;
 	/**< Get timer adapter capabilities */
diff --git a/lib/librte_eventdev/rte_event_eth_rx_adapter.c b/lib/librte_eventdev/rte_event_eth_rx_adapter.c
index a1990637f..c71990078 100644
--- a/lib/librte_eventdev/rte_event_eth_rx_adapter.c
+++ b/lib/librte_eventdev/rte_event_eth_rx_adapter.c
@@ -1882,25 +1882,6 @@ rxa_add_queue(struct rte_event_eth_rx_adapter *rx_adapter,
 	} else
 		qi_ev->flow_id = 0;

-	if (conf->rx_queue_flags &
-	    RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR) {
-		queue_info->ena_vector = 1;
-		qi_ev->event_type = RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR;
-		rxa_set_vector_data(queue_info, conf->vector_sz,
-				    conf->vector_timeout_ns, conf->vector_mp,
-				    rx_queue_id, dev_info->dev->data->port_id);
-		rx_adapter->ena_vector = 1;
-		rx_adapter->vector_tmo_ticks =
-			rx_adapter->vector_tmo_ticks
-				? RTE_MIN(queue_info->vector_data
-						  .vector_timeout_ticks,
-					  rx_adapter->vector_tmo_ticks)
-				: queue_info->vector_data.vector_timeout_ticks;
-		rx_adapter->vector_tmo_ticks <<= 1;
-		TAILQ_INIT(&rx_adapter->vector_list);
-		rx_adapter->prev_expiry_ts = 0;
-	}
-
 	rxa_update_queue(rx_adapter, dev_info, rx_queue_id, 1);
 	if (rxa_polled_queue(dev_info, rx_queue_id)) {
 		rx_adapter->num_rx_polled += !pollq;
@@ -1926,6 +1907,44 @@ rxa_add_queue(struct rte_event_eth_rx_adapter *rx_adapter,
 	}
 }

+static void
+rxa_sw_event_vector_configure(
+	struct rte_event_eth_rx_adapter *rx_adapter, uint16_t eth_dev_id,
+	int rx_queue_id,
+	const struct rte_event_eth_rx_adapter_event_vector_config *config)
+{
+	struct eth_device_info *dev_info = &rx_adapter->eth_devices[eth_dev_id];
+	struct eth_rx_queue_info *queue_info;
+	struct rte_event *qi_ev;
+
+	if (rx_queue_id == -1) {
+		uint16_t nb_rx_queues;
+		uint16_t i;
+
+		nb_rx_queues = dev_info->dev->data->nb_rx_queues;
+		for (i = 0; i < nb_rx_queues; i++)
+			rxa_sw_event_vector_configure(rx_adapter, eth_dev_id, i,
+						      config);
+		return;
+	}
+
+	queue_info = &dev_info->rx_queue[rx_queue_id];
+	qi_ev = (struct rte_event *)&queue_info->event;
+	queue_info->ena_vector = 1;
+	qi_ev->event_type = RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR;
+	rxa_set_vector_data(queue_info, config->vector_sz,
+			    config->vector_timeout_ns, config->vector_mp,
+			    rx_queue_id, dev_info->dev->data->port_id);
+	rx_adapter->ena_vector = 1;
+	rx_adapter->vector_tmo_ticks =
+		rx_adapter->vector_tmo_ticks ?
+			      RTE_MIN(config->vector_timeout_ns << 1,
+				      rx_adapter->vector_tmo_ticks) :
+			      config->vector_timeout_ns << 1;
+	rx_adapter->prev_expiry_ts = 0;
+	TAILQ_INIT(&rx_adapter->vector_list);
+}
+
 static int rxa_sw_add(struct rte_event_eth_rx_adapter *rx_adapter,
 		uint16_t eth_dev_id,
 		int rx_queue_id,
@@ -2239,7 +2258,6 @@ rte_event_eth_rx_adapter_queue_add(uint8_t id,
 	struct rte_event_eth_rx_adapter *rx_adapter;
 	struct rte_eventdev *dev;
 	struct eth_device_info *dev_info;
-	struct rte_event_eth_rx_adapter_vector_limits limits;

 	RTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_ERR_RET(id, -EINVAL);
 	RTE_ETH_VALID_PORTID_OR_ERR_RET(eth_dev_id, -EINVAL);
@@ -2276,39 +2294,6 @@ rte_event_eth_rx_adapter_queue_add(uint8_t id,
 		return -EINVAL;
 	}

-	if (queue_conf->rx_queue_flags &
-	    RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR) {
-		ret = rte_event_eth_rx_adapter_vector_limits_get(
-			rx_adapter->eventdev_id, eth_dev_id, &limits);
-		if (ret < 0) {
-			RTE_EDEV_LOG_ERR("Failed to get event device vector limits,"
-					 " eth port: %" PRIu16
-					 " adapter id: %" PRIu8,
-					 eth_dev_id, id);
-			return -EINVAL;
-		}
-		if (queue_conf->vector_sz < limits.min_sz ||
-		    queue_conf->vector_sz > limits.max_sz ||
-		    queue_conf->vector_timeout_ns < limits.min_timeout_ns ||
-		    queue_conf->vector_timeout_ns > limits.max_timeout_ns ||
-		    queue_conf->vector_mp == NULL) {
-			RTE_EDEV_LOG_ERR("Invalid event vector configuration,"
-					 " eth port: %" PRIu16
-					 " adapter id: %" PRIu8,
-					 eth_dev_id, id);
-			return -EINVAL;
-		}
-		if (queue_conf->vector_mp->elt_size <
-		    (sizeof(struct rte_event_vector) +
-		     (sizeof(uintptr_t) * queue_conf->vector_sz))) {
-			RTE_EDEV_LOG_ERR("Invalid event vector configuration,"
-					 " eth port: %" PRIu16
-					 " adapter id: %" PRIu8,
-					 eth_dev_id, id);
-			return -EINVAL;
-		}
-	}
-
 	if ((cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_MULTI_EVENTQ) == 0 &&
 		(rx_queue_id != -1)) {
 		RTE_EDEV_LOG_ERR("Rx queues can only be connected to single "
@@ -2502,6 +2487,83 @@ rte_event_eth_rx_adapter_queue_del(uint8_t id, uint16_t eth_dev_id,
 	return ret;
 }

+int
+rte_event_eth_rx_adapter_queue_event_vector_config(
+	uint8_t id, uint16_t eth_dev_id, int32_t rx_queue_id,
+	struct rte_event_eth_rx_adapter_event_vector_config *config)
+{
+	struct rte_event_eth_rx_adapter_vector_limits limits;
+	struct rte_event_eth_rx_adapter *rx_adapter;
+	struct rte_eventdev *dev;
+	uint32_t cap;
+	int ret;
+
+	RTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_ERR_RET(id, -EINVAL);
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(eth_dev_id, -EINVAL);
+
+	rx_adapter = rxa_id_to_adapter(id);
+	if ((rx_adapter == NULL) || (config == NULL))
+		return -EINVAL;
+
+	dev = &rte_eventdevs[rx_adapter->eventdev_id];
+	ret = rte_event_eth_rx_adapter_caps_get(rx_adapter->eventdev_id,
+						eth_dev_id, &cap);
+	if (ret) {
+		RTE_EDEV_LOG_ERR("Failed to get adapter caps edev %" PRIu8
+				 "eth port %" PRIu16,
+				 id, eth_dev_id);
+		return ret;
+	}
+
+	if (!(cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR)) {
+		RTE_EDEV_LOG_ERR("Event vectorization is not supported,"
+				 " eth port: %" PRIu16 " adapter id: %" PRIu8,
+				 eth_dev_id, id);
+		return -EINVAL;
+	}
+
+	ret = rte_event_eth_rx_adapter_vector_limits_get(
+		rx_adapter->eventdev_id, eth_dev_id, &limits);
+	if (ret) {
+		RTE_EDEV_LOG_ERR("Failed to get vector limits edev %" PRIu8
+				 "eth port %" PRIu16,
+				 rx_adapter->eventdev_id, eth_dev_id);
+		return ret;
+	}
+
+	if (config->vector_sz < limits.min_sz ||
+	    config->vector_sz > limits.max_sz ||
+	    config->vector_timeout_ns < limits.min_timeout_ns ||
+	    config->vector_timeout_ns > limits.max_timeout_ns ||
+	    config->vector_mp == NULL) {
+		RTE_EDEV_LOG_ERR("Invalid event vector configuration,"
+				 " eth port: %" PRIu16 " adapter id: %" PRIu8,
+				 eth_dev_id, id);
+		return -EINVAL;
+	}
+	if (config->vector_mp->elt_size <
+	    (sizeof(struct rte_event_vector) +
+	     (sizeof(uintptr_t) * config->vector_sz))) {
+		RTE_EDEV_LOG_ERR("Invalid event vector configuration,"
+				 " eth port: %" PRIu16 " adapter id: %" PRIu8,
+				 eth_dev_id, id);
+		return -EINVAL;
+	}
+
+	if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_INTERNAL_PORT) {
+		RTE_FUNC_PTR_OR_ERR_RET(
+			*dev->dev_ops->eth_rx_adapter_event_vector_config,
+			-ENOTSUP);
+		ret = dev->dev_ops->eth_rx_adapter_event_vector_config(
+			dev, &rte_eth_devices[eth_dev_id], rx_queue_id, config);
+	} else {
+		rxa_sw_event_vector_configure(rx_adapter, eth_dev_id,
+					      rx_queue_id, config);
+	}
+
+	return ret;
+}
+
 int
 rte_event_eth_rx_adapter_vector_limits_get(
 	uint8_t dev_id, uint16_t eth_port_id,
diff --git a/lib/librte_eventdev/rte_event_eth_rx_adapter.h b/lib/librte_eventdev/rte_event_eth_rx_adapter.h
index 4bdb38f08..ceef6d565 100644
--- a/lib/librte_eventdev/rte_event_eth_rx_adapter.h
+++ b/lib/librte_eventdev/rte_event_eth_rx_adapter.h
@@ -171,6 +171,9 @@ struct rte_event_eth_rx_adapter_queue_conf {
 	 * The event adapter sets ev.event_type to RTE_EVENT_TYPE_ETHDEV in the
 	 * enqueued event.
 	 */
+};
+
+struct rte_event_eth_rx_adapter_event_vector_config {
 	uint16_t vector_sz;
 	/**<
 	 * Indicates the maximum number for mbufs to combine and form a vector.
@@ -418,6 +421,30 @@ int rte_event_eth_rx_adapter_queue_add(uint8_t id,
 int rte_event_eth_rx_adapter_queue_del(uint8_t id, uint16_t eth_dev_id,
 				       int32_t rx_queue_id);

+/**
+ * Configure event vectorization for a given ethernet device queue, that has
+ * been added to a event eth Rx adapter.
+ *
+ * @param id
+ *  The identifier of the ethernet Rx event adapter.
+ *
+ * @param eth_dev_id
+ *  The identifier of the ethernet device.
+ *
+ * @param rx_queue_id
+ *  Ethernet device receive queue index.
+ *  If rx_queue_id is -1, then all Rx queues configured for the ethernet device
+ *  are configured with event vectorization.
+ *
+ * @return
+ *  - 0: Success, Receive queue configured correctly.
+ *  - <0: Error code on failure.
+ */
+__rte_experimental
+int rte_event_eth_rx_adapter_queue_event_vector_config(
+	uint8_t id, uint16_t eth_dev_id, int32_t rx_queue_id,
+	struct rte_event_eth_rx_adapter_event_vector_config *config);
+
 /**
  * Start ethernet Rx event adapter
  *
diff --git a/lib/librte_eventdev/version.map b/lib/librte_eventdev/version.map
index 34c1c830e..902df0ae3 100644
--- a/lib/librte_eventdev/version.map
+++ b/lib/librte_eventdev/version.map
@@ -142,6 +142,7 @@ EXPERIMENTAL {
 	#added in 21.05
 	rte_event_vector_pool_create;
 	rte_event_eth_rx_adapter_vector_limits_get;
+	rte_event_eth_rx_adapter_queue_event_vector_config;
 };

 INTERNAL {
--
2.17.1


^ permalink raw reply	[relevance 5%]

* [dpdk-dev] [PATCH 0/7] Introduce event vectorization
@ 2021-02-20 22:09  3% pbhagavatula
  2021-02-20 22:09  5% ` [dpdk-dev] [PATCH 7/7] eventdev: fix ABI breakage due to event vector pbhagavatula
                   ` (2 more replies)
  0 siblings, 3 replies; 200+ results
From: pbhagavatula @ 2021-02-20 22:09 UTC (permalink / raw)
  To: jerinj, jay.jayatheerthan, erik.g.carrillo, abhinandan.gujjar,
	timothy.mcdaniel, hemant.agrawal, harry.van.haaren,
	mattias.ronnblom, liang.j.ma
  Cc: dev, Pavan Nikhilesh

From: Pavan Nikhilesh <pbhagavatula@marvell.com>

In traditional event programming model, events are identified by a
flow-id and a uintptr_t. The flow-id uniquely identifies a given event
and determines the order of scheduling based on schedule type, the
uintptr_t holds a single object.

Event devices also support burst mode with configurable dequeue depth,
i.e. each dequeue call would return multiple events and each event
might be at a different stage of the pipeline.
Having a burst of events belonging to different stages in a dequeue
burst is not only difficult to vectorize but also increases the scheduler
overhead and application overhead of pipelining events further.
Using event vectors we see a performance gain of ~150% as shown in [1].

By introducing event vectorization, each event will be capable of holding
multiple uintptr_t of the same flow thereby allowing applications
to vectorize their pipeline and reduce the complexity of pipelining
events across multiple stages. This also reduces the complexity of handling
enqueue and dequeue on an event device.

Since event devices are transparent to the events they are scheduling
so the event producers such as eth_rx_adapter, crypto_adapter , etc..
are responsible for vectorizing the buffers of the same flow into a single
event.

The series also breaks ABI in [2/7] patch which we fix in [7/7]. The patch
[7/7] can be changed in the next major release i.e. v21.11.

The dpdk-test-eventdev application has been updated with options to test
multiple vector sizes and timeouts.

[1]
As for performance improvement, with a ARM Cortex-A72 equivalent processer,
software event device (--vdev=event_sw0), single worker core, single stage
and using one service core for Rx adapter, Tx adapter, Scheduling.

Without event vectorization:
    ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
         --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
         --stlist=a --wlcores=20
    Port[0] using Rx adapter[0] configured
    Port[0] using Tx adapter[0] Configured
    4.728 mpps avg 4.728 mpps

With event vectorization:
    ./build/app/dpdk-test-eventdev -l 7-23 -s 0x700 --vdev="event_sw0" --
        --prod_type_ethdev --nb_pkts=0 --verbose 2 --test=pipeline_queue
        --stlist=a --wlcores=20 --enable_vector --nb_eth_queues 1
        --vector_size 256
    Port[0] using Rx adapter[0] configured
    Port[0] using Tx adapter[0] Configured
    34.383 mpps avg 34.383 mpps

Having dedicated service cores for each Rx queues and tweaking the vector,
dequeue burst size would further improve performance.

API usage is shown below:

Configuration:

	struct rte_event_eth_rx_adapter_event_vector_config vec_conf;

	vector_pool = rte_event_vector_pool_create("vector_pool",
			nb_elem, 0, vector_size, socket_id);

	rte_event_eth_rx_adapter_create(id, event_id, &adptr_conf);
	rte_event_eth_rx_adapter_queue_add(id, eth_id, -1, &queue_conf);
	if (cap & RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR) {
		vec_conf.vector_sz = vector_size;
		vec_conf.vector_timeout_ns = vector_tmo_nsec;
		vec_conf.vector_mp = vector_pool;
		rte_event_eth_rx_adapter_queue_event_vector_config(id,
				eth_id, -1, &vec_conf);
	}

Fastpath:

	num = rte_event_dequeue_burst(event_id, port_id, &ev, 1, 0);
	if (!num)
		continue;

	if (ev.event_type & RTE_EVENT_TYPE_VECTOR) {
		switch (ev.event_type) {
		case RTE_EVENT_TYPE_ETHDEV_VECTOR:
		case RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR:
			struct rte_mbuf **mbufs;

			mbufs = ev.vector_ev->mbufs;
			for (i = 0; i < ev.vector_ev->nb_elem; i++)
				//Process mbufs.
			break;
		case ...
		}
	}
	...

Pavan Nikhilesh (7):
  eventdev: introduce event vector capability
  eventdev: introduce event vector Rx capability
  eventdev: introduce event vector Tx capability
  eventdev: add Rx adapter event vector support
  eventdev: add Tx adapter event vector support
  app/eventdev: add event vector mode in pipeline test
  eventdev: fix ABI breakage due to event vector

 app/test-eventdev/evt_common.h                |   4 +
 app/test-eventdev/evt_options.c               |  52 +++
 app/test-eventdev/evt_options.h               |   4 +
 app/test-eventdev/test_pipeline_atq.c         | 310 +++++++++++++--
 app/test-eventdev/test_pipeline_common.c      |  77 +++-
 app/test-eventdev/test_pipeline_common.h      |  18 +
 app/test-eventdev/test_pipeline_queue.c       | 320 +++++++++++++--
 .../prog_guide/event_ethernet_rx_adapter.rst  |  38 ++
 .../prog_guide/event_ethernet_tx_adapter.rst  |  12 +
 doc/guides/prog_guide/eventdev.rst            |  36 +-
 doc/guides/tools/testeventdev.rst             |  28 ++
 lib/librte_eventdev/eventdev_pmd.h            |  60 ++-
 .../rte_event_eth_rx_adapter.c                | 367 +++++++++++++++++-
 .../rte_event_eth_rx_adapter.h                |  93 +++++
 .../rte_event_eth_tx_adapter.c                |  66 +++-
 lib/librte_eventdev/rte_eventdev.c            |  11 +-
 lib/librte_eventdev/rte_eventdev.h            | 145 ++++++-
 lib/librte_eventdev/version.map               |   5 +
 18 files changed, 1560 insertions(+), 86 deletions(-)

--
2.17.1


^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v2] doc: update stable section
@ 2021-02-19 11:17  4% Kevin Traynor
  0 siblings, 0 replies; 200+ results
From: Kevin Traynor @ 2021-02-19 11:17 UTC (permalink / raw)
  To: dev; +Cc: stable, bluca, christian.ehrhardt, Kevin Traynor

Updating the docs to elaborate on the stable release
characteristics and better document the current practice
about new features in stable releases.

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

---
v2: Send to right dev list this time.  Fix typo.
---
 doc/guides/contributing/stable.rst | 33 ++++++++++++++++++++++++------
 1 file changed, 27 insertions(+), 6 deletions(-)

diff --git a/doc/guides/contributing/stable.rst b/doc/guides/contributing/stable.rst
index 20b081670..7a0a505aa 100644
--- a/doc/guides/contributing/stable.rst
+++ b/doc/guides/contributing/stable.rst
@@ -19,4 +19,8 @@ consumers of DPDK with a stable target on which to base applications or
 packages.
 
+The primary characteristics of stable releases is that they attempt to
+fix issues and not introduce any new regressions while keeping backwards
+compatibility with the initial release of the stable version.
+
 The Long Term Support release (LTS) is a designation applied to a Stable
 Release to indicate longer term support.
@@ -94,12 +98,29 @@ commit message body as follows::
 Fixes not suitable for backport should not include the ``Cc: stable@dpdk.org`` tag.
 
-Features should not be backported to stable releases. It may be acceptable, in
-limited cases, to back port features for the LTS release where:
+To support the goal of stability and not introducing regressions, new code
+being introduced is limited to bug fixes. New features should not be backported
+to stable releases.
 
-* There is a justifiable use case (for example a new PMD).
-* The change is non-invasive.
-* The work of preparing the backport is done by the proposer.
-* There is support within the community.
+In some limited cases, it may be acceptable to backport a new feature
+to a stable release. Some of the factors which impact the decision by
+stable maintainers are as follows:
 
+* Does the feature break API/ABI?
+* Does the feature break backwards compatibility?
+* Is it for the latest LTS release (to avoid LTS upgrade issues)?
+* Is there a commitment from the proposer or affiliation to validate the feature and check for regressions in related functionality?
+* Is there a track record of the proposer or affiliation validating stable releases?
+* Is it obvious that the feature will not impact existing functionality?
+* How intrusive is the code change?
+* What is the scope of the code change?
+* Does it impact common components or vendor specific?
+* Is there a justifiable use case (a clear user need)?
+* Is there a community consensus about the backport?
+
+Performance improvements are generally not considered to be fixes, but may be considered
+in some cases where:
+
+* It is fixing a performance regression that occurred previously.
+* An existing feature in LTS is not usable as intended without it.
 
 The Stable Mailing List
-- 
2.26.2


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH 1/3 v4] ethdev: add Rx offload to drop error packets
  @ 2021-02-18 20:32  4%   ` Ferruh Yigit
  0 siblings, 0 replies; 200+ results
From: Ferruh Yigit @ 2021-02-18 20:32 UTC (permalink / raw)
  To: nipun.gupta, dev
  Cc: thomas, arybchenko, hemant.agrawal, sachin.saxena, rohit.raj,
	jerinjacobk, stephen, asafp

On 10/15/2020 2:23 PM, nipun.gupta@nxp.com wrote:
> From: Nipun Gupta <nipun.gupta@nxp.com>
> 
> This change adds a Rx offload capability and configuration to
> enable hardware to drop the packets in case of any error in the
> packets such as L3 checksum error or L4 checksum.
> 
> Signed-off-by: Nipun Gupta <nipun.gupta@nxp.com>
> Signed-off-by: Rohit Raj <rohit.raj@nxp.com>
> Reviewed-by: Asaf Penso <asafp@nvidia.com>
> ---
> 
> v4:
>   - renamed 'rte_rx_err_pkt_drop_conf' to
>     'rte_eth_rx_err_pkt_drop_conf'
>   - updated function 'port_offload_cap_display' to display newly
>     added offloads
>   - added placeholder for L1 FCS, L3 Checksum, L4 Checksum error
>     packet drops
>   - updated doc/guides/nics/features.rst
>   - updated new added 'DEV_RX_OFFLOAD_*' to 'RTE_DEV_RX_OFFLOAD*'
>   - updated RX to Rx
> 
> v3:
>   - Add additional rx_err_drop_offload_capa, which is specific
>     capability flag for RX packets error drop offload. Currently
>     only 'all' error packet drops are enabled, but can be extended
>     to provide capability to drop any specific errors like L1 FCS,
>     L3 Checksum etc.
>   - Added separate config structure to enable the drop configuration.
>   - Updated doc with the new updated option in testbbdev (patch 3/3)
> 
> v2:
>   - Add support in DPAA1 driver (patch 2/3)
>   - Add support and config parameter in testpmd (patch 3/3)
> 
>   lib/librte_ethdev/rte_ethdev.c |  1 +
>   lib/librte_ethdev/rte_ethdev.h | 39 +++++++++++++++++++++++++++++++++-
>   2 files changed, 39 insertions(+), 1 deletion(-)
> 
> diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c


This feature touches many main parts,
- new config item for 'rte_eth_dev_configure()'
- a new offload flag
- new capability reporting for 'rte_eth_dev_info_get()'

The feature doesn't look very mainstream to touch all these main parts and add 
complexity to them, which will affect almost all users.

And has some inconsistencies, like configuration is done via config struct, but 
capability is returned as bit-wise.
Or I think config option taken into account only if offload is requested has a 
chance to confuse people in both app and driver end.

What do you think having two specific APIs to get_capabilities and set drop config?
The responsibility of those APIs will be clear and narrowed down, which makes it 
harder to make it wrong.


Also it is an ABI break as it is and needs to wait 21.11, and even after that it 
has a potential to cause more ABI breaks, like trying to add a new error type to 
drop will need to wait 22.11 ..., but if we can have them as separate APIs we 
can have them as experimental without waiting next LTS.

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v3] build: alias default build as generic
  @ 2021-02-18 14:12  3% ` Juraj Linkeš
  2021-03-09  8:43  0%   ` Juraj Linkeš
  2021-03-29 10:49  3%   ` [dpdk-dev] [PATCH v4] " Juraj Linkeš
  0 siblings, 2 replies; 200+ results
From: Juraj Linkeš @ 2021-02-18 14:12 UTC (permalink / raw)
  To: bruce.richardson, thomas, Ruifeng.Wang, Honnappa.Nagarahalli,
	jerinjacobk, ferruh.yigit
  Cc: dev, Juraj Linkeš

The current machine='default' build name is not descriptive. The actual
default build is machine='native'. Add an alternative string which does
the same build and better describes what we're building:
machine='generic'. Leave machine='default' for backwards compatibility.

Signed-off-by: Juraj Linkeš <juraj.linkes@pantheon.tech>
Reviewed-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---
 config/arm/meson.build                    |  7 ++++---
 config/meson.build                        | 13 +++++++------
 devtools/test-meson-builds.sh             | 14 +++++++-------
 doc/guides/prog_guide/build-sdk-meson.rst |  4 ++--
 meson_options.txt                         |  2 +-
 5 files changed, 21 insertions(+), 19 deletions(-)

diff --git a/config/arm/meson.build b/config/arm/meson.build
index 00bc4610a3..aaed89bd5b 100644
--- a/config/arm/meson.build
+++ b/config/arm/meson.build
@@ -1,6 +1,7 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation.
 # Copyright(c) 2017 Cavium, Inc
+# Copyright(c) 2021 PANTHEON.tech s.r.o.
 
 # common flags to all aarch64 builds, with lowest priority
 flags_common = [
@@ -208,8 +209,8 @@ if dpdk_conf.get('RTE_ARCH_32')
 else
 	# aarch64 build
 	if not meson.is_cross_build()
-		if machine == 'default'
-			# default build
+		if machine == 'generic'
+			# generic build
 			implementer_id = 'generic'
 			part_number = 'generic'
 		else
@@ -256,7 +257,7 @@ else
 		      '(-Dmachine=generic) build.')
 	endif
 
-	# use default flags with implementer flags
+	# use common flags with implementer flags
 	dpdk_flags = flags_common + implementer_config['flags'] + part_number_config.get('flags', [])
 
 	# apply supported machine args
diff --git a/config/meson.build b/config/meson.build
index 3cf560b8a3..ed4de62b37 100644
--- a/config/meson.build
+++ b/config/meson.build
@@ -70,21 +70,22 @@ else
 	machine = get_option('machine')
 endif
 
-# machine type 'default' is special, it defaults to the per arch agreed common
-# minimal baseline needed for DPDK.
+# machine type 'generic' is special, it selects the per arch agreed common
+# minimal baseline needed for DPDK. Machine type 'default' is also supported
+# with the same meaning for backwards compatibility.
 # That might not be the most optimized, but the most portable version while
 # still being able to support the CPU features required for DPDK.
 # This can be bumped up by the DPDK project, but it can never be an
 # invariant like 'native'
-if machine == 'default'
+if machine == 'default' or machine == 'generic'
 	if host_machine.cpu_family().startswith('x86')
-		# matches the old pre-meson build systems default
+		# matches the old pre-meson build systems generic machine
 		machine = 'corei7'
 	elif host_machine.cpu_family().startswith('arm')
 		machine = 'armv7-a'
 	elif host_machine.cpu_family().startswith('aarch')
-		# arm64 manages defaults in config/arm/meson.build
-		machine = 'default'
+		# arm64 manages generic config in config/arm/meson.build
+		machine = 'generic'
 	elif host_machine.cpu_family().startswith('ppc')
 		machine = 'power8'
 	endif
diff --git a/devtools/test-meson-builds.sh b/devtools/test-meson-builds.sh
index c11ae87e0d..daf817ac3e 100755
--- a/devtools/test-meson-builds.sh
+++ b/devtools/test-meson-builds.sh
@@ -223,12 +223,12 @@ done
 # test compilation with minimal x86 instruction set
 # Set the install path for libraries to "lib" explicitly to prevent problems
 # with pkg-config prefixes if installed in "lib/x86_64-linux-gnu" later.
-default_machine='nehalem'
-if ! check_cc_flags "-march=$default_machine" ; then
-	default_machine='corei7'
+generic_machine='nehalem'
+if ! check_cc_flags "-march=$generic_machine" ; then
+	generic_machine='corei7'
 fi
-build build-x86-default cc skipABI -Dcheck_includes=true \
-	-Dlibdir=lib -Dmachine=$default_machine $use_shared
+build build-x86-generic cc skipABI -Dcheck_includes=true \
+	-Dlibdir=lib -Dmachine=$generic_machine $use_shared
 
 # 32-bit with default compiler
 if check_cc_flags '-m32' ; then
@@ -271,10 +271,10 @@ for f in $srcdir/config/ppc/ppc* ; do
 	build $targetdir $f ABI $use_shared
 done
 
-# Test installation of the x86-default target, to be used for checking
+# Test installation of the x86-generic target, to be used for checking
 # the sample apps build using the pkg-config file for cflags and libs
 load_env cc
-build_path=$(readlink -f $builds_dir/build-x86-default)
+build_path=$(readlink -f $builds_dir/build-x86-generic)
 export DESTDIR=$build_path/install
 install_target $build_path $DESTDIR
 pc_file=$(find $DESTDIR -name libdpdk.pc)
diff --git a/doc/guides/prog_guide/build-sdk-meson.rst b/doc/guides/prog_guide/build-sdk-meson.rst
index 3429e26479..c7e12eedfb 100644
--- a/doc/guides/prog_guide/build-sdk-meson.rst
+++ b/doc/guides/prog_guide/build-sdk-meson.rst
@@ -85,7 +85,7 @@ Project-specific options are passed used -Doption=value::
 
 	meson -Denable_docs=true fullbuild  # build and install docs
 
-	meson -Dmachine=default  # use builder-independent baseline -march
+	meson -Dmachine=generic  # use builder-independent baseline -march
 
 	meson -Ddisable_drivers=event/*,net/tap  # disable tap driver and all
 					# eventdev PMDs for a smaller build
@@ -114,7 +114,7 @@ Examples of setting some of the same options using meson configure::
         re-scan from meson.
 
 .. note::
-        machine=default uses a config that works on all supported architectures
+        machine=generic uses a config that works on all supported architectures
         regardless of the capabilities of the machine where the build is happening.
 
 As well as those settings taken from ``meson configure``, other options
diff --git a/meson_options.txt b/meson_options.txt
index 6eff62e47d..2c7b46ef07 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -21,7 +21,7 @@ option('include_subdir_arch', type: 'string', value: '',
 option('kernel_dir', type: 'string', value: '',
 	description: 'Path to the kernel for building kernel modules. Headers must be in $kernel_dir/build. Modules will be installed in $DEST_DIR/$kernel_dir/extra/dpdk.')
 option('machine', type: 'string', value: 'native',
-	description: 'set the target machine type')
+	description: 'set the target machine type or "generic", a build usable on all machines of the build machine architecture or "native", which lets the compiler pick the architecture of the build machine.')
 option('max_ethports', type: 'integer', value: 32,
 	description: 'maximum number of Ethernet devices')
 option('max_lcores', type: 'integer', value: 128,
-- 
2.20.1


^ permalink raw reply	[relevance 3%]

* [dpdk-dev] Build errors due to duplicate version.map entries in librte_power
@ 2021-02-15 19:18  3% Aaron Conole
  2021-02-22 10:31  0% ` Juraj Linkeš
  0 siblings, 1 reply; 200+ results
From: Aaron Conole @ 2021-02-15 19:18 UTC (permalink / raw)
  To: dev; +Cc: Bruce Richardson, David Hunt, Anatoly Burakov

Greetings,

During CI runs, I've noticed lots of failures from the Travis-CI side
all related to librte_power/version.map containing some duplicate
symbols.  It seems commit 4d3892dcd77b ("power: make channel message
functions public") made the following hunk:

diff --git a/lib/librte_power/version.map b/lib/librte_power/version.map
index 69ca9af616..13f0af3b2d 100644
--- a/lib/librte_power/version.map
+++ b/lib/librte_power/version.map
@@ -34,4 +34,8 @@ EXPERIMENTAL {
        rte_power_guest_channel_receive_msg;
        rte_power_poll_stat_fetch;
        rte_power_poll_stat_update;
+
+       # added in 21.02
+       rte_power_guest_channel_receive_msg;
+       rte_power_guest_channel_send_msg;
 };


As can be seen, rte_power_guest_channel_receive_msg was added already
(it's present in the hunk itself).  The rte_power_guest_channel_send_msg
function was added as part of 85ff364f3bd3 ("build: align symbols with
global ABI version").

I guess it may not be allowed to have duplicate symbols here, because in
travis, I see (only for some builds):

clang  -o lib/librte_power.so.21.1 'lib/lib@@rte_power@sta/librte_power_rte_power.c.o' 'lib/lib@@rte_power@sta/librte_power_power_acpi_cpufreq.c.o' 'lib/lib@@rte_power@sta/librte_power_power_kvm_vm.c.o' 'lib/lib@@rte_power@sta/librte_power_guest_channel.c.o' 'lib/lib@@rte_power@sta/librte_power_rte_power_empty_poll.c.o' 'lib/lib@@rte_power@sta/librte_power_power_pstate_cpufreq.c.o' 'lib/lib@@rte_power@sta/librte_power_rte_power_pmd_mgmt.c.o' 'lib/lib@@rte_power@sta/librte_power_power_common.c.o' -Wl,--no-undefined -Wl,--as-needed -shared -fPIC -Wl,--start-group -Wl,-soname,librte_power.so.21 -Wl,--no-as-needed -pthread -lm -ldl lib/librte_eal.so.21.1 lib/librte_kvargs.so.21.1 lib/librte_telemetry.so.21.1 lib/librte_timer.so.21.1 lib/librte_ethdev.so.21.1 lib/librte_net.so.21.1 lib/librte_mbuf.so.21.1 lib/librte_mempool.so.21.1 lib/librte_ring.so.21.1 lib/librte_meter.so.21.1 -Wl,--end-group -Wl,--version-script=/home/travis/build/ovsrobot/dpdk/lib/librte_power/version.map '-Wl,-rpath,$ORIGIN/' -Wl,-rpath-link,/home/travis/build/ovsrobot/dpdk/build/lib -target aarch64-linux-gnu -fuse-ld=lld --gcc-toolchain=/usr 

ld.lld: error: duplicate symbol 'rte_power_guest_channel_send_msg' in version script

Thoughts?


^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH] version: 21.05-rc0
@ 2021-02-15  9:14  7% Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2021-02-15  9:14 UTC (permalink / raw)
  To: dev

Start a new release cycle with empty release notes.

Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
---
 ABI_VERSION                            |   2 +-
 VERSION                                |   2 +-
 doc/guides/rel_notes/index.rst         |   1 +
 doc/guides/rel_notes/release_21_05.rst | 138 +++++++++++++++++++++++++
 4 files changed, 141 insertions(+), 2 deletions(-)
 create mode 100644 doc/guides/rel_notes/release_21_05.rst

diff --git a/ABI_VERSION b/ABI_VERSION
index ea8c92af65..c598172d8d 100644
--- a/ABI_VERSION
+++ b/ABI_VERSION
@@ -1 +1 @@
-21.1
+21.2
diff --git a/VERSION b/VERSION
index 02e8cfea89..5a12c01a05 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-21.02.0
+21.05.0-rc0
diff --git a/doc/guides/rel_notes/index.rst b/doc/guides/rel_notes/index.rst
index 3f485c2de2..4c423c8d9a 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_21_05
     release_21_02
     release_20_11
     release_20_08
diff --git a/doc/guides/rel_notes/release_21_05.rst b/doc/guides/rel_notes/release_21_05.rst
new file mode 100644
index 0000000000..5aa9ed7db6
--- /dev/null
+++ b/doc/guides/rel_notes/release_21_05.rst
@@ -0,0 +1,138 @@
+.. SPDX-License-Identifier: BSD-3-Clause
+   Copyright 2021 The DPDK contributors
+
+.. include:: <isonum.txt>
+
+DPDK Release 21.05
+==================
+
+.. **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::
+
+      make doc-guides-html
+      xdg-open build/doc/html/guides/rel_notes/release_21_05.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
+       - 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.
+   =======================================================
+
+* No ABI change that would break compatibility with 20.11.
+
+
+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.
+   =======================================================
-- 
2.30.0


^ permalink raw reply	[relevance 7%]

* [dpdk-dev] [dpdk-announce] DPDK 21.02 released
@ 2021-02-14 19:19  3% Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2021-02-14 19:19 UTC (permalink / raw)
  To: announce

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

It was a light period as February releases of the 2 previous years:
	941 commits from 140 authors
	1208 files changed, 53571 insertions(+), 21946 deletions(-)

It is not planned to start a maintenance branch for 21.02.
This version is ABI-compatible with 20.11.

Note 1: you may need pyelftools to compile DPDK drivers.
Note 2: a cleanup made out-of-tree drivers more difficult to compile.

Below are some new features, grouped by category.
* Networking
        - power management for core polling single ethdev queue
        - generic modify action in flow API
        - GENEVE TLV option in flow API
        - Marvell OCTEON TX EP net PMD
        - Virtio PMD rework
        - Windows support of i40e and mlx5
* Cryptography
        - callback API for enqueue/dequeue
* Compression
        - Mellanox compress PMD
* Others
        - new pmdinfogen with Windows support

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


There are 34 new contributors (including authors, reviewers and testers).
Welcome to Andrew Boyer, Andrii Pypchenko, Ashish Sadanandan, Barry Cao,
Dana Vardi, Dapeng Yu, Fabio Pricoco, Fei Chen, Francis Kelly,
Fredrik A Lindgren, George Prekas, Jacek Bułatek, Jiawei Zhu, Kiran KN,
Lingyu Liu, Louis Peens, Mateusz Pacuszka, Meir Levi, Milena Olech,
Murphy Yang, Nalla Pradeep, Neel Patel, Odi Assli, Paolo Valerio,
Peng He, Samik Gupta, Simon Ellmann, Somalapuram Amaranath, Subhi Masri,
Szymon T Cudzilo, Tyler Retzlaff, Viacheslav Galaktionov, Wenjun Wu and
Yongxin Liu.

Below is the number of commits per employer (with authors count):
	257     Intel (41)
	228     Nvidia (19)
	 68     Red Hat (4)
	 65     Marvell (15)
	 51     Huawei (9)
	 44     Arm (4)
	 43     Broadcom (7)
	 36     Pensando (1)
	 33     Trustnet (1)
	 16     BIFIT (1)
	 14     PANTHEON.tech (1)
	 13     OKTET Labs (2)
	 13     Microsoft (4)
	 12     NXP (4)
	  6     Chelsio (1)
	  5     Amazon (4)
	  5     6WIND (1)
	  4     Netronome (1)
	  4     Cisco (2)
	  4     AMD (3)
	  3     MayaData (1)
	  3     Emumba (1)

Based on Reviewed-by and Acked-by tags, the top non-PMD reviewers are:
	 31     Ruifeng Wang <ruifeng.wang@arm.com>
	 29     Ferruh Yigit <ferruh.yigit@intel.com>
	 25     David Marchand <david.marchand@redhat.com>
	 23     Maxime Coquelin <maxime.coquelin@redhat.com>
	 17     Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
	 16     Ori Kam <orika@nvidia.com>
	 15     Jerin Jacob <jerinj@marvell.com>
	 13     Konstantin Ananyev <konstantin.ananyev@intel.com>
	 11     Viacheslav Ovsiienko <viacheslavo@nvidia.com>


The new features for 21.05 may be submitted until mid-March,
in order to be reviewed and integrated before mid-April.
DPDK 21.05 should be released at mid-May:
	https://core.dpdk.org/roadmap#dates
Please share your features roadmap.


Thanks everyone, enjoy Spring Festival and Valentine's Day,
and let's share as much love as we can.
	https://fast.dpdk.org/download/ilovefs.jpg



^ permalink raw reply	[relevance 3%]

* [dpdk-dev] officially support building driver plugins externally
@ 2021-02-12 19:09  3% Tyler Retzlaff
  2021-03-10 20:52  0% ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Tyler Retzlaff @ 2021-02-12 19:09 UTC (permalink / raw)
  To: dev; +Cc: thomas

Hi,

Recently installation of driver headers and export of functions was                                       pulled back from being public to private                                                                  (commit df96fd0d73955bdc7ca3909e772ff2ad903249c6). From a discussion                                      with Thomas Monjalon we understand that it was not the design intent                                      to ever have these headers exposed publicly, but it was allowing us to                                    maintain the drivers we do implement outside of the normal dpdk tree.

We would like to propose that building driver plugins external to the                                     dpdk source tree be officially supported / restored and it is is our                                      understanding there there are asks from other DPDK consumers for the                                      same.  We understand the main concern is that it might incorrectly convey                                 that the API/ABI of the driver interface is stable or promised to be                                      compatible when no such promise exists.

Can the broader community help us with an acceptable solution to building                                 the drivers out of the tree? Aside from installing the needed headers                                     what other mechanical things can we do to achieve this?  We are happy to                                  do the work/submit the required patches as necessary.

Thank you


^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v2] eal/rwlock: add note about writer starvation
  2021-02-11 22:51  0%   ` Thomas Monjalon
@ 2021-02-12  0:21  0%     ` Honnappa Nagarahalli
  0 siblings, 0 replies; 200+ results
From: Honnappa Nagarahalli @ 2021-02-12  0:21 UTC (permalink / raw)
  To: thomas, Stephen Hemminger
  Cc: dev, Joyce Kong, konstantin.ananyev, nd, Honnappa Nagarahalli, nd

<snip>

> 
> 14/01/2021 17:55, Stephen Hemminger:
> > The implementation of reader/writer locks in DPDK (from first release)
> > is simple and fast. But it can lead to writer starvation issues.
> >
> > It is not easy to fix this without changing ABI and potentially
> > breaking customer applications that are expect the unfair behavior.
> 
> typo: "are expect"
> 
> > The wikipedia page on reader-writer problem has a similar example
> > which summarizes the problem pretty well.
> 
> Maybe add the URL in the commit message?
> 
> >
> > Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> > ---
> > --- a/lib/librte_eal/include/generic/rte_rwlock.h
> > +++ b/lib/librte_eal/include/generic/rte_rwlock.h
> > + * Note: This version of reader/writer locks is not fair because
                                ^^^^^^ may be "implementation" would be better?

> > + * readers do not block for pending writers. A stream of readers can
> > + * subsequently lock out all potential writers and starve them.
> > + * This is because after the first reader locks the resource,
> > + * no writer can lock it. The writer will only be able to get the
> > + lock
> > + * when it will only be released by the last reader.
This looks good. Though the writer starvation is prominent, the reader starvation is possible if there is a stream of writers when a writer holds the lock. Should we call this out too?

> 
> You did not get review, probably because nobody was Cc'ed.
> +Cc Honnappa, Joyce and Konstantin
> 


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v2] eal/rwlock: add note about writer starvation
  @ 2021-02-11 22:51  0%   ` Thomas Monjalon
  2021-02-12  0:21  0%     ` Honnappa Nagarahalli
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2021-02-11 22:51 UTC (permalink / raw)
  To: Stephen Hemminger
  Cc: dev, honnappa.nagarahalli, joyce.kong, konstantin.ananyev

14/01/2021 17:55, Stephen Hemminger:
> The implementation of reader/writer locks in DPDK (from first release)
> is simple and fast. But it can lead to writer starvation issues.
> 
> It is not easy to fix this without changing ABI and potentially
> breaking customer applications that are expect the unfair behavior.

typo: "are expect"

> The wikipedia page on reader-writer problem has a similar example
> which summarizes the problem pretty well.

Maybe add the URL in the commit message?

> 
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
> --- a/lib/librte_eal/include/generic/rte_rwlock.h
> +++ b/lib/librte_eal/include/generic/rte_rwlock.h
> + * Note: This version of reader/writer locks is not fair because
> + * readers do not block for pending writers. A stream of readers can
> + * subsequently lock out all potential writers and starve them.
> + * This is because after the first reader locks the resource,
> + * no writer can lock it. The writer will only be able to get the lock
> + * when it will only be released by the last reader.

You did not get review, probably because nobody was Cc'ed.
+Cc Honnappa, Joyce and Konstantin



^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] eal: fix detection of static or shared DPDK builds
  2021-02-08 16:33  4% [dpdk-dev] [PATCH] eal: fix detection of static or shared DPDK builds Bruce Richardson
@ 2021-02-09 12:49  0% ` Bruce Richardson
  0 siblings, 0 replies; 200+ results
From: Bruce Richardson @ 2021-02-09 12:49 UTC (permalink / raw)
  To: dev; +Cc: tredaelli, stable, Maxime Coquelin, David Marchand, bluca

On Mon, Feb 08, 2021 at 04:33:19PM +0000, Bruce Richardson wrote:
> When checking the loading of EAL shared lib to see if we have a shared
> DPDK build, we only want to include part of the ABI version in the check
> rather than the whole thing. For example, with ABI version 21.1 for DPDK
> release 21.02, the linker links the binary against librte_eal.so.21,
> without the ".1".
> 
> To avoid any further brittleness in this area, we can check for multiple
> versions when doing the check, since just about any version of EAL implies
> a shared build. Therefore we check for presence of librte_eal.so with full
> ABI_VERSION extension, and then repeatedly remove the end part of the
> filename after the last dot, checking each time. For example (debug log
> output for static build):
> 
>   EAL: Checking presence of .so 'librte_eal.so.21.1'
>   EAL: Checking presence of .so 'librte_eal.so.21'
>   EAL: Checking presence of .so 'librte_eal.so'
>   EAL: Detected static linkage of DPDK
> 
> Fixes: 7781950f4d38 ("eal: fix shared lib mode detection")
> Cc: tredaelli@redhat.com
> Cc: stable@dpdk.org
> 
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> ---

I saw this issue with OVS, where I was getting weird failures about ports
not being bound (in case of physical ports) or not being created (in case
of virtio ports), when using a shared build. Since it's potentially
serious, I'd appreciate if someone can reproduce the issue and verify the
fix so we can consider it for 21.02 inclusion.

To demonstrate this with regular DPDK, do a usual build of DPDK and then do
"ninja install" to install system-wide. Then build an example app, e.g.
l2fwd, using "make" from the examples/l2fwd directory. Running the example
normally, e.g. ./build/l2fwd -c F00, leads to no drivers being loaded or
ports being found. Adding "-d /path/to/drivers" e.g.
"/usr/local/lib/x86_64-linux-gnu/dpdk/pmds-21.1" on my system works as
expected. This shows the driver loading is not correct.

After applying this patch and re-running "ninja install", l2fwd should run
the same with and without the "-d" flag.

/Bruce

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH] eal: fix detection of static or shared DPDK builds
@ 2021-02-08 16:33  4% Bruce Richardson
  2021-02-09 12:49  0% ` Bruce Richardson
  0 siblings, 1 reply; 200+ results
From: Bruce Richardson @ 2021-02-08 16:33 UTC (permalink / raw)
  To: dev; +Cc: Bruce Richardson, tredaelli, stable, Maxime Coquelin, David Marchand

When checking the loading of EAL shared lib to see if we have a shared
DPDK build, we only want to include part of the ABI version in the check
rather than the whole thing. For example, with ABI version 21.1 for DPDK
release 21.02, the linker links the binary against librte_eal.so.21,
without the ".1".

To avoid any further brittleness in this area, we can check for multiple
versions when doing the check, since just about any version of EAL implies
a shared build. Therefore we check for presence of librte_eal.so with full
ABI_VERSION extension, and then repeatedly remove the end part of the
filename after the last dot, checking each time. For example (debug log
output for static build):

  EAL: Checking presence of .so 'librte_eal.so.21.1'
  EAL: Checking presence of .so 'librte_eal.so.21'
  EAL: Checking presence of .so 'librte_eal.so'
  EAL: Detected static linkage of DPDK

Fixes: 7781950f4d38 ("eal: fix shared lib mode detection")
Cc: tredaelli@redhat.com
Cc: stable@dpdk.org

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
 lib/librte_eal/common/eal_common_options.c | 35 +++++++++++++++++++++-
 1 file changed, 34 insertions(+), 1 deletion(-)

diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c
index 6b3707725f..94029bf7f1 100644
--- a/lib/librte_eal/common/eal_common_options.c
+++ b/lib/librte_eal/common/eal_common_options.c
@@ -494,6 +494,39 @@ eal_dlopen(const char *pathname)
 	return retval;
 }

+static int
+is_shared_build(void)
+{
+#define EAL_SO "librte_eal.so"
+	char soname[32];
+	size_t len, minlen = strlen(EAL_SO);
+
+	len = strlcpy(soname, EAL_SO"."ABI_VERSION, sizeof(soname));
+	if (len > sizeof(soname)) {
+		RTE_LOG(ERR, EAL, "Shared lib name too long in shared build check\n");
+		len = sizeof(soname) - 1;
+	}
+
+	while (len >= minlen) {
+		/* check if we have this .so loaded, if so - shared build */
+		RTE_LOG(DEBUG, EAL, "Checking presence of .so '%s'\n", soname);
+		if (dlopen(soname, RTLD_LAZY | RTLD_NOLOAD) != NULL) {
+			RTE_LOG(INFO, EAL, "Detected shared linkage of DPDK\n");
+			return 1;
+		}
+
+		/* remove any version numbers off the end to retry */
+		while (len-- > 0)
+			if (soname[len] == '.') {
+				soname[len] = '\0';
+				break;
+			}
+	}
+
+	RTE_LOG(INFO, EAL, "Detected static linkage of DPDK\n");
+	return 0;
+}
+
 int
 eal_plugins_init(void)
 {
@@ -505,7 +538,7 @@ eal_plugins_init(void)
 	 * (Using dlopen with NOLOAD flag on EAL, will return NULL if the EAL
 	 * shared library is not already loaded i.e. it's statically linked.)
 	 */
-	if (dlopen("librte_eal.so."ABI_VERSION, RTLD_LAZY | RTLD_NOLOAD) != NULL &&
+	if (is_shared_build() &&
 			*default_solib_dir != '\0' &&
 			stat(default_solib_dir, &sb) == 0 &&
 			S_ISDIR(sb.st_mode))
--
2.27.0


^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [RFC PATCH v4] build: kni cross-compilation support
  2021-02-08 10:17  0%     ` Juraj Linkeš
@ 2021-02-08 10:26  0%       ` Bruce Richardson
  0 siblings, 0 replies; 200+ results
From: Bruce Richardson @ 2021-02-08 10:26 UTC (permalink / raw)
  To: Juraj Linkeš
  Cc: thomas, Ruifeng.Wang, Honnappa.Nagarahalli, jerinjacobk,
	hemant.agrawal, ferruh.yigit, aboyer, dev, david.marchand, bluca

On Mon, Feb 08, 2021 at 10:17:56AM +0000, Juraj Linkeš wrote:
> 
> 
> > -----Original Message-----
> > From: Bruce Richardson <bruce.richardson@intel.com>
> > Sent: Friday, February 5, 2021 4:27 PM
> > To: Juraj Linkeš <juraj.linkes@pantheon.tech>
> > Cc: thomas@monjalon.net; Ruifeng.Wang@arm.com;
> > Honnappa.Nagarahalli@arm.com; jerinjacobk@gmail.com;
> > hemant.agrawal@nxp.com; ferruh.yigit@intel.com; aboyer@pensando.io;
> > dev@dpdk.org; david.marchand@redhat.com; bluca@debian.org
> > Subject: Re: [RFC PATCH v4] build: kni cross-compilation support
> > 
> > On Fri, Feb 05, 2021 at 04:04:32PM +0100, Juraj Linkeš wrote:
> > > The kni linux module is using a custom target for building, which
> > > doesn't take into account any cross compilation arguments. The
> > > arguments in question are ARCH, CROSS_COMPILE (for gcc, clang) and CC,
> > > LD (for clang). Get those from the cross file and pass them to the
> > > custom target.
> > >
> > > The user supplied path may not contain the 'build' directory, such as
> > > when using cross-compiled headers, so only append that in the default
> > > case (when no path is supplied in native builds) and use the
> > > unmodified path from the user otherwise. Also modify the install path
> > accordingly.
> > >
> > > Signed-off-by: Juraj Linkeš <juraj.linkes@pantheon.tech>
> > > ---
> > 
> > Thanks, this all looks ok to me now, bar one very minor nit below. Doing a native
> > build on my system with the running kernel also works fine.
> > 
> > However, the bigger question is one of compatibility for this change. The current
> > documentation for the kernel_dir option is:
> >   option('kernel_dir', type: 'string', value: '',
> > 	description: 'Path to the kernel for building kernel modules. \
> > 	Headers must be in $kernel_dir/build. Modules will be installed \
> > 	in $DEST_DIR/$kernel_dir/extra/dpdk.')
> > 
> > Obviously the description now needs an update to reflect the new use
> 
> I'll change the description. The current patch version is always installing the modules into '/lib/modules/' + kernel_version + '/extra/dpdk', though. I don't think we want to change the behavior this way, so I'll make the changes to preserve to original behavior ('/lib/modules/' + kernel_version + '/extra/dpdk' when kernel_dir is not supplied, kernel_dir + '/extra/dpdk' when it is).
> 

In the absense of an explicit kernel_install_dir, I actually think the new
way is better. However, I'd be interested in other opinions on this.


> > , but I'm
> > not sure if changing the behaviour counts as an "ABI" change or not, and
> > whether it needs to wait for a new LTS release. Any scripts that were compiling
> > using e.g. kernel_dir='/lib/modules/<version>' need to be changed to use
> > kernel_dir='/lib/modules/<version>/build' instead.
> > 
> 
> I'm not sure what to do with this. Should I make it backwards compatible by checking the build dir as well (i.e. trying make kernelversion in both $kernel_dir and $kernel_dir/build)?
> 
That's an interesting proposal. Might be worth doing to check both.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [RFC PATCH v4] build: kni cross-compilation support
  2021-02-05 15:27  3%   ` Bruce Richardson
@ 2021-02-08 10:17  0%     ` Juraj Linkeš
  2021-02-08 10:26  0%       ` Bruce Richardson
  0 siblings, 1 reply; 200+ results
From: Juraj Linkeš @ 2021-02-08 10:17 UTC (permalink / raw)
  To: Bruce Richardson
  Cc: thomas, Ruifeng.Wang, Honnappa.Nagarahalli, jerinjacobk,
	hemant.agrawal, ferruh.yigit, aboyer, dev, david.marchand, bluca



> -----Original Message-----
> From: Bruce Richardson <bruce.richardson@intel.com>
> Sent: Friday, February 5, 2021 4:27 PM
> To: Juraj Linkeš <juraj.linkes@pantheon.tech>
> Cc: thomas@monjalon.net; Ruifeng.Wang@arm.com;
> Honnappa.Nagarahalli@arm.com; jerinjacobk@gmail.com;
> hemant.agrawal@nxp.com; ferruh.yigit@intel.com; aboyer@pensando.io;
> dev@dpdk.org; david.marchand@redhat.com; bluca@debian.org
> Subject: Re: [RFC PATCH v4] build: kni cross-compilation support
> 
> On Fri, Feb 05, 2021 at 04:04:32PM +0100, Juraj Linkeš wrote:
> > The kni linux module is using a custom target for building, which
> > doesn't take into account any cross compilation arguments. The
> > arguments in question are ARCH, CROSS_COMPILE (for gcc, clang) and CC,
> > LD (for clang). Get those from the cross file and pass them to the
> > custom target.
> >
> > The user supplied path may not contain the 'build' directory, such as
> > when using cross-compiled headers, so only append that in the default
> > case (when no path is supplied in native builds) and use the
> > unmodified path from the user otherwise. Also modify the install path
> accordingly.
> >
> > Signed-off-by: Juraj Linkeš <juraj.linkes@pantheon.tech>
> > ---
> 
> Thanks, this all looks ok to me now, bar one very minor nit below. Doing a native
> build on my system with the running kernel also works fine.
> 
> However, the bigger question is one of compatibility for this change. The current
> documentation for the kernel_dir option is:
>   option('kernel_dir', type: 'string', value: '',
> 	description: 'Path to the kernel for building kernel modules. \
> 	Headers must be in $kernel_dir/build. Modules will be installed \
> 	in $DEST_DIR/$kernel_dir/extra/dpdk.')
> 
> Obviously the description now needs an update to reflect the new use

I'll change the description. The current patch version is always installing the modules into '/lib/modules/' + kernel_version + '/extra/dpdk', though. I don't think we want to change the behavior this way, so I'll make the changes to preserve to original behavior ('/lib/modules/' + kernel_version + '/extra/dpdk' when kernel_dir is not supplied, kernel_dir + '/extra/dpdk' when it is).

> , but I'm
> not sure if changing the behaviour counts as an "ABI" change or not, and
> whether it needs to wait for a new LTS release. Any scripts that were compiling
> using e.g. kernel_dir='/lib/modules/<version>' need to be changed to use
> kernel_dir='/lib/modules/<version>/build' instead.
> 

I'm not sure what to do with this. Should I make it backwards compatible by checking the build dir as well (i.e. trying make kernelversion in both $kernel_dir and $kernel_dir/build)?

> /Bruce
> 
> >  kernel/linux/kni/meson.build |  8 ++--
> >  kernel/linux/meson.build     | 80 ++++++++++++++++++++++++++++++------
> >  2 files changed, 71 insertions(+), 17 deletions(-)
> >
> > diff --git a/kernel/linux/kni/meson.build
> > b/kernel/linux/kni/meson.build index 07e0c9dae7..46b71c7418 100644
> > --- a/kernel/linux/kni/meson.build
> > +++ b/kernel/linux/kni/meson.build
> > @@ -13,7 +13,7 @@ kni_sources = files(  custom_target('rte_kni',
> >  	input: kni_sources,
> >  	output: 'rte_kni.ko',
> > -	command: ['make', '-j4', '-C', kernel_dir + '/build',
> > +	command: ['make', '-j4', '-C', kernel_build_dir,
> >  		'M=' + meson.current_build_dir(),
> >  		'src=' + meson.current_source_dir(),
> >  		'MODULE_CFLAGS=-include ' + meson.source_root() +
> > '/config/rte_config.h' + @@ -21,8 +21,8 @@ custom_target('rte_kni',
> >  		' -I' + meson.source_root() + '/lib/librte_kni' +
> >  		' -I' + meson.build_root() +
> >  		' -I' + meson.current_source_dir(),
> > -		'modules'],
> > +		'modules'] + cross_args,
> >  	depends: kni_mkfile,
> > -	install: true,
> > -	install_dir: kernel_dir + '/extra/dpdk',
> > +	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
> > 5c864a4653..7acb52944f 100644
> > --- a/kernel/linux/meson.build
> > +++ b/kernel/linux/meson.build
> > @@ -3,25 +3,79 @@
> >
> >  subdirs = ['kni']
> >
> > -# if we are cross-compiling we need kernel_dir specified -if
> > get_option('kernel_dir') == '' and meson.is_cross_build()
> > -	error('Need "kernel_dir" option for kmod compilation when cross-
> compiling')
> > -endif
> > +kernel_build_dir = get_option('kernel_dir') install = not
> > +meson.is_cross_build() cross_args = [] kernel_install_dir = ''
> 
> Minor nit, I'd have kernel_install_dir immediately after kernel_build_dir in the list
> above.
> 

Sure.

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH] telemetry: mark init function as internal-only
@ 2021-02-05 21:23 10% Bruce Richardson
  0 siblings, 0 replies; 200+ results
From: Bruce Richardson @ 2021-02-05 21:23 UTC (permalink / raw)
  To: dev; +Cc: thomas, Bruce Richardson, stable

The "rte_telemetry_init()" function is for use by "rte_eal_init()" and
should not be part of the public API. Mark it as internal only.

Fixes: 6dd571fd07c3 ("telemetry: introduce new functionality")
Cc: stable@dpdk.org

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
 doc/guides/rel_notes/release_21_02.rst | 5 +++++
 lib/librte_telemetry/rte_telemetry.h   | 2 +-
 lib/librte_telemetry/version.map       | 5 ++++-
 3 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/doc/guides/rel_notes/release_21_02.rst b/doc/guides/rel_notes/release_21_02.rst
index baf32151f..84b04a018 100644
--- a/doc/guides/rel_notes/release_21_02.rst
+++ b/doc/guides/rel_notes/release_21_02.rst
@@ -266,6 +266,11 @@ ABI Changes
 
 * No ABI change that would break compatibility with 20.11.
 
+* The experimental function ``rte_telemetry_init`` has been removed from the
+  public API and is now an internal-only function. Where telemetry library is
+  available, it is called automatically from ``rte_eal_init()`` and so no end
+  application need use it.
+
 
 Known Issues
 ------------
diff --git a/lib/librte_telemetry/rte_telemetry.h b/lib/librte_telemetry/rte_telemetry.h
index f6c3992a9..f7c8534b8 100644
--- a/lib/librte_telemetry/rte_telemetry.h
+++ b/lib/librte_telemetry/rte_telemetry.h
@@ -309,7 +309,7 @@ rte_telemetry_register_cmd(const char *cmd, telemetry_cb fn, const char *help);
  * @return
  *  -1 on failure.
  */
-__rte_experimental
+__rte_internal
 int
 rte_telemetry_init(const char *runtime_dir, const char *rte_version, rte_cpuset_t *cpuset,
 		const char **err_str);
diff --git a/lib/librte_telemetry/version.map b/lib/librte_telemetry/version.map
index d1dbf8d58..ec0ebc1be 100644
--- a/lib/librte_telemetry/version.map
+++ b/lib/librte_telemetry/version.map
@@ -14,9 +14,12 @@ EXPERIMENTAL {
 	rte_tel_data_start_array;
 	rte_tel_data_start_dict;
 	rte_tel_data_string;
-	rte_telemetry_init;
 	rte_telemetry_legacy_register;
 	rte_telemetry_register_cmd;
 
 	local: *;
 };
+
+INTERNAL {
+	rte_telemetry_init;
+};
-- 
2.27.0


^ permalink raw reply	[relevance 10%]

* Re: [dpdk-dev] [PATCH] devtools: remove ethdev ABI exception
  @ 2021-02-05 16:48  4%   ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2021-02-05 16:48 UTC (permalink / raw)
  To: David Marchand
  Cc: dev, dodji, Ray Kinsella, Neil Horman, Maxime Coquelin,
	Bruce Richardson, Steven Webster, Ferruh Yigit

01/02/2021 20:03, Ferruh Yigit:
> On 2/1/2021 6:08 PM, David Marchand wrote:
> > Now that the ethernet driver dev_ops structure definition is not
> > exported anymore, there is no need for an exception.
> > abidiff will only consider structures defined in the installed headers
> > (passed with --headers-dirX options).
> > 
> > Fixes: df96fd0d7395 ("ethdev: make driver-only headers private")
> > 
> > Signed-off-by: David Marchand <david.marchand@redhat.com>
> 
> Acked-by: Ferruh Yigit <ferruh.yigit@intel.com>

Applied, thanks




^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [RFC PATCH v4] build: kni cross-compilation support
  @ 2021-02-05 15:27  3%   ` Bruce Richardson
  2021-02-08 10:17  0%     ` Juraj Linkeš
  0 siblings, 1 reply; 200+ results
From: Bruce Richardson @ 2021-02-05 15:27 UTC (permalink / raw)
  To: Juraj Linkeš
  Cc: thomas, Ruifeng.Wang, Honnappa.Nagarahalli, jerinjacobk,
	hemant.agrawal, ferruh.yigit, aboyer, dev, david.marchand, bluca

On Fri, Feb 05, 2021 at 04:04:32PM +0100, Juraj Linkeš wrote:
> The kni linux module is using a custom target for building, which
> doesn't take into account any cross compilation arguments. The arguments
> in question are ARCH, CROSS_COMPILE (for gcc, clang) and CC, LD (for
> clang). Get those from the cross file and pass them to the custom
> target.
> 
> The user supplied path may not contain the 'build' directory, such as
> when using cross-compiled headers, so only append that in the default
> case (when no path is supplied in native builds) and use the unmodified
> path from the user otherwise. Also modify the install path accordingly.
> 
> Signed-off-by: Juraj Linkeš <juraj.linkes@pantheon.tech>
> ---

Thanks, this all looks ok to me now, bar one very minor nit below. Doing a
native build on my system with the running kernel also works fine. 

However, the bigger question is one of compatibility for this change. The
current documentation for the kernel_dir option is:
  option('kernel_dir', type: 'string', value: '',
	description: 'Path to the kernel for building kernel modules. \
	Headers must be in $kernel_dir/build. Modules will be installed \
	in $DEST_DIR/$kernel_dir/extra/dpdk.')

Obviously the description now needs an update to reflect the new use, but
I'm not sure if changing the behaviour counts as an "ABI" change or not,
and whether it needs to wait for a new LTS release. Any scripts that were
compiling using e.g. kernel_dir='/lib/modules/<version>' need to be changed
to use kernel_dir='/lib/modules/<version>/build' instead.

/Bruce

>  kernel/linux/kni/meson.build |  8 ++--
>  kernel/linux/meson.build     | 80 ++++++++++++++++++++++++++++++------
>  2 files changed, 71 insertions(+), 17 deletions(-)
> 
> diff --git a/kernel/linux/kni/meson.build b/kernel/linux/kni/meson.build
> index 07e0c9dae7..46b71c7418 100644
> --- a/kernel/linux/kni/meson.build
> +++ b/kernel/linux/kni/meson.build
> @@ -13,7 +13,7 @@ kni_sources = files(
>  custom_target('rte_kni',
>  	input: kni_sources,
>  	output: 'rte_kni.ko',
> -	command: ['make', '-j4', '-C', kernel_dir + '/build',
> +	command: ['make', '-j4', '-C', kernel_build_dir,
>  		'M=' + meson.current_build_dir(),
>  		'src=' + meson.current_source_dir(),
>  		'MODULE_CFLAGS=-include ' + meson.source_root() + '/config/rte_config.h' +
> @@ -21,8 +21,8 @@ custom_target('rte_kni',
>  		' -I' + meson.source_root() + '/lib/librte_kni' +
>  		' -I' + meson.build_root() +
>  		' -I' + meson.current_source_dir(),
> -		'modules'],
> +		'modules'] + cross_args,
>  	depends: kni_mkfile,
> -	install: true,
> -	install_dir: kernel_dir + '/extra/dpdk',
> +	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 5c864a4653..7acb52944f 100644
> --- a/kernel/linux/meson.build
> +++ b/kernel/linux/meson.build
> @@ -3,25 +3,79 @@
>  
>  subdirs = ['kni']
>  
> -# if we are cross-compiling we need kernel_dir specified
> -if get_option('kernel_dir') == '' and meson.is_cross_build()
> -	error('Need "kernel_dir" option for kmod compilation when cross-compiling')
> -endif
> +kernel_build_dir = get_option('kernel_dir')
> +install = not meson.is_cross_build()
> +cross_args = []
> +kernel_install_dir = ''

Minor nit, I'd have kernel_install_dir immediately after kernel_build_dir
in the list above.

>  
> -kernel_dir = get_option('kernel_dir')
> -if kernel_dir == ''
> -	# use default path for native builds
> +if not meson.is_cross_build()
> +	# native build
>  	kernel_version = run_command('uname', '-r').stdout().strip()
> -	kernel_dir = '/lib/modules/' + kernel_version
> +	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').returncode()
> +	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
>  
> -# test running make in kernel directory, using "make kernelversion"
> -make_returncode = run_command('make', '-sC', kernel_dir + '/build',
> -		'kernelversion').returncode()
> -if make_returncode != 0
> -	error('Cannot compile kernel modules as requested - are kernel headers installed?')
> +# 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])']).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('Didn\'t 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)
> -- 
> 2.20.1
> 

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v5 0/9] ethdev: support SubFunction representor
  2021-02-05  9:13  3%                     ` Xueming(Steven) Li
@ 2021-02-05  9:37  0%                       ` Andrew Rybchenko
  0 siblings, 0 replies; 200+ results
From: Andrew Rybchenko @ 2021-02-05  9:37 UTC (permalink / raw)
  To: Xueming(Steven) Li; +Cc: dev, Slava Ovsiienko, Asaf Penso, Thomas Monjalon

On 2/5/21 12:13 PM, Xueming(Steven) Li wrote:
> 
>> -----Original Message-----
>> From: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
>> Sent: Friday, February 5, 2021 3:35 PM
>> To: Xueming(Steven) Li <xuemingl@nvidia.com>
>> Cc: dev@dpdk.org; Slava Ovsiienko <viacheslavo@nvidia.com>; Asaf Penso <asafp@nvidia.com>; Thomas Monjalon
>> <tmonjalon@nvidia.com>
>> Subject: Re: [dpdk-dev] [PATCH v5 0/9] ethdev: support SubFunction representor
>>
>> On 2/4/21 5:15 PM, Xueming(Steven) Li wrote:
>>>
>>>> -----Original Message-----
>>>> From: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
>>>> Sent: Monday, February 1, 2021 4:39 PM
>>>> To: Xueming(Steven) Li <xuemingl@nvidia.com>
>>>> Cc: dev@dpdk.org; Slava Ovsiienko <viacheslavo@nvidia.com>; Asaf
>>>> Penso <asafp@nvidia.com>
>>>> Subject: Re: [dpdk-dev] [PATCH v5 0/9] ethdev: support SubFunction
>>>> representor
>>>>
>>>> On 1/28/21 5:31 PM, Xueming(Steven) Li wrote:
>>>>> <snip>
>>>>>>> The patch of device SF capability, but seems I misunderstood your suggestion.
>>>>>>> Let me explain process to create a SF:
>>>>>>> 1. SF can be created on the fly with scripts, unlike VF which is statically pre-created.
>>>>>>
>>>>>> Is there a maximum index and maximum total number of SF's created? How to find it?
>>>>>
>>>>> The maximum index is defined by firmware configuration, all SF's
>>>>> information could be found from sysfs. To create a SF, both PCI and sfnum have to be specified.
>>>>
>>>> sysfs is obviously Linux specific. I think the information should be available via DPDK API.
>>>
>>> Yes, the new api discussed below should resolve this issue.
>>>
>>>>
>>>>>>
>>>>>>> 2. SF is created on a PF with a SF number. SF number is named per PF, different PF may have same SF number.
>>>>>>> 3. For standalone PF, hot plug to DPDK using "PF#_BDF,representor=sf#", no need to use pf#sf# here.
>>>>>>> 4. For bonding netdev, hot plug to DPDK using "PF0_BDF,representor=pf#sf#"
>>>>>>> If using new api to return all representor IDs, need some way
>>>>>>> locate the new created SF by PF and SF number, that's why "pf#sf#" is used in this patch set.
>>>>>>
>>>>>> I think the API should simply reserve/report space for maximum
>>>>>> number of SFs. So, IDs are stable across restart/reboot in
>>>>>> assumption that NIC is not reconfigured (changed maximum number of
>>>>>> VF or
>>>> maximum number of SFs of any PF).
>>>>>
>>>>> Yes, IDs should be stable as long as no  NIC firmware configuration change.
>>>>>
>>>>> Just clarify, this api should be common enough to report all devices that a bus device supports:
>>>>> 1. name, might contains controller and pf info, example: "eth:representor:c0pf1vf"
>>>>> 2. ID range, example: 0-127
>>>>> The api describes ID ranges for each sub device type, users have to query the api and choose representor ID to probe.
>>>>>
>>>>> Prototype:
>>>>> struct rte_bus_device_range {
>>>>> 	char name[64];
>>>>> 	uint32_t base;
>>>>> 	uint32_t number;
>>>>> }
>>>>> /* return number of ranges filled, or number of ranges if list is
>>>>> NULL. */ int rte_bus_ dev_range_get(struct rte_bus_device_range
>>>>> *list, int n);
>>>>
>>>> Hm, I thought about more port representor specific API.
>>>> For me it is hard to tell if such generic naming is good or bad. I
>>>> think it should be proven that such generic API makes sense. Any other potential users / use cases?
>>>
>>> I was thinking about SF, but SF is PCI specific, not suitable for this api. So I'm fine to make it as ethdev api.
>>> To append new api into eth_dev_ops, is there ABI concern?
>>
>> No, eth_dev_ops are internal
>>
>>>> I've considered ethdev API which returns (in similar way as
>>>> above) list of possible port representors which could be controlled
>>>> by the device. Also I think it would be useful to include type information (enum with PF, VF, SF), controller ID.
>>>
>>> Agree.
>>>
>>> There is a new concern from orchestration side, currently, no
>>> interface in openstack and OVS to retrieve representor ID range info,
>>> It will take time to adapt this solution. To probe a representor,
>>> orchestration need to know how to calculate representor ID, and the ID might vary on different max SF number, i.e. VF4 on PP1
>> might got different ID. Representor ID change before that will break the product.
>>
>> I see.
>>
>>> Considering both orchestration and testpmd users, how about keeping both solution together? This will bring max flexibility IMHO.
>>
>> As I said before I don't mind and I really think it is a good idea to add suggested interface to specify representor (i.e. cXpfYvfZ), but the
>> problem is making bitmap from representor ID.
>>
>> ethdev API should use new representor info API to make a representor ID from controller/PF/{VF,SF}.
>> Or do you see any problems with such approach?
> 
> Sorry I thought the user to figure out representor ID from api.
> This combination look good, thanks for clarification :)
> 
> So the new api looks like this:

Roughly speaking - yes

> struct rte_eth_representor_info {
>   Enum representor_type;
>   Uint16_t controller; // -1 for any

I'm not sure that I understand what does "any" mean in this
case. I think it should be the zero in examples below.
I think that API should return caller controller ID and
PF ID. It would allow to interpret "vf5" correctly when
caller is not controller #0 and/or PF #0.

>   Uint16_t port; // -1 for any

port sounds like physical port, but it should be PF
 (pf, phys_fn or something like this). It could be many
PFs per physical network port.

>   Uint16_t representor_id;

May be base_id? Or rep_base_id?

The question is what to do if range for VF or SF is
not contiguous. Should we have one more index after phys_fn
to  represent it? E.g.
union {
    uint16_t vf;
    uint16_t sf;
};

>   Uint16_t count;

May be id_range which should be 1 to show one function.
It could be convenient to treat 0 this way as well,
but I doubt that it is a good idea.

>   char name[N];
> 
> int rte_eth_representor_info_get(struct rte_eth_representor_info *infos);
> - Return number of entries.
> - NULL infos just return number of entries supported.
> Sample outputs:
>  VF, -1, 0, 0, 		128, 	"pf0vf"
>  SF, -1, 0, 128, 		2048, 	"pf0sf"
>  PF, -1, 0, 32767, 	1, 	"pf"
>  VF, -1, 1, 32768, 	128, 	"pf1vf"
>  SF, -1, 0, (32768+128), 	2048, 	"pf1sf"
>  PF, -1, 0, 65535, 	1,	 "pf"
> 
>>
>>> In struct rte_eth_dev_data, reserved bits could be used to define controller and port, this will avoid bitmap. How do you think?
>>
>> Could you add a bit more on it? Just a bit more details to the idea since I don't understand what exactly you mean and how it could
>> help.
> 
> The idea is replacing reserved_64s and adding more device location info in rte_eth-dev_data like this:
>   Uint16_t representor_id;
>   Uint16_t port_id;
>   Uint16_t controller_id;
>   Enum representor_type;
> Compare them all when matching a device, this will also avoid bitmap encoding. 
> Reserved_64s[] was added to mitigate ABI conflicts, IIRC.
> But seems no need if making representor info API to make ID.
> 
>>
>>>>
>>>> There is one more bit which is not in the picture yet -
>>>> switch_info.port_id. Should it be equal to representor ID? Or different and provided in the info structure?
>>>
>>> Not exactly same AFAIK, the id used in e-switch.
>>>
>>>
> 


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v5 0/9] ethdev: support SubFunction representor
  2021-02-05  7:34  0%                   ` Andrew Rybchenko
@ 2021-02-05  9:13  3%                     ` Xueming(Steven) Li
  2021-02-05  9:37  0%                       ` Andrew Rybchenko
  0 siblings, 1 reply; 200+ results
From: Xueming(Steven) Li @ 2021-02-05  9:13 UTC (permalink / raw)
  To: Andrew Rybchenko; +Cc: dev, Slava Ovsiienko, Asaf Penso, Thomas Monjalon


>-----Original Message-----
>From: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
>Sent: Friday, February 5, 2021 3:35 PM
>To: Xueming(Steven) Li <xuemingl@nvidia.com>
>Cc: dev@dpdk.org; Slava Ovsiienko <viacheslavo@nvidia.com>; Asaf Penso <asafp@nvidia.com>; Thomas Monjalon
><tmonjalon@nvidia.com>
>Subject: Re: [dpdk-dev] [PATCH v5 0/9] ethdev: support SubFunction representor
>
>On 2/4/21 5:15 PM, Xueming(Steven) Li wrote:
>>
>>> -----Original Message-----
>>> From: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
>>> Sent: Monday, February 1, 2021 4:39 PM
>>> To: Xueming(Steven) Li <xuemingl@nvidia.com>
>>> Cc: dev@dpdk.org; Slava Ovsiienko <viacheslavo@nvidia.com>; Asaf
>>> Penso <asafp@nvidia.com>
>>> Subject: Re: [dpdk-dev] [PATCH v5 0/9] ethdev: support SubFunction
>>> representor
>>>
>>> On 1/28/21 5:31 PM, Xueming(Steven) Li wrote:
>>>> <snip>
>>>>>> The patch of device SF capability, but seems I misunderstood your suggestion.
>>>>>> Let me explain process to create a SF:
>>>>>> 1. SF can be created on the fly with scripts, unlike VF which is statically pre-created.
>>>>>
>>>>> Is there a maximum index and maximum total number of SF's created? How to find it?
>>>>
>>>> The maximum index is defined by firmware configuration, all SF's
>>>> information could be found from sysfs. To create a SF, both PCI and sfnum have to be specified.
>>>
>>> sysfs is obviously Linux specific. I think the information should be available via DPDK API.
>>
>> Yes, the new api discussed below should resolve this issue.
>>
>>>
>>>>>
>>>>>> 2. SF is created on a PF with a SF number. SF number is named per PF, different PF may have same SF number.
>>>>>> 3. For standalone PF, hot plug to DPDK using "PF#_BDF,representor=sf#", no need to use pf#sf# here.
>>>>>> 4. For bonding netdev, hot plug to DPDK using "PF0_BDF,representor=pf#sf#"
>>>>>> If using new api to return all representor IDs, need some way
>>>>>> locate the new created SF by PF and SF number, that's why "pf#sf#" is used in this patch set.
>>>>>
>>>>> I think the API should simply reserve/report space for maximum
>>>>> number of SFs. So, IDs are stable across restart/reboot in
>>>>> assumption that NIC is not reconfigured (changed maximum number of
>>>>> VF or
>>> maximum number of SFs of any PF).
>>>>
>>>> Yes, IDs should be stable as long as no  NIC firmware configuration change.
>>>>
>>>> Just clarify, this api should be common enough to report all devices that a bus device supports:
>>>> 1. name, might contains controller and pf info, example: "eth:representor:c0pf1vf"
>>>> 2. ID range, example: 0-127
>>>> The api describes ID ranges for each sub device type, users have to query the api and choose representor ID to probe.
>>>>
>>>> Prototype:
>>>> struct rte_bus_device_range {
>>>> 	char name[64];
>>>> 	uint32_t base;
>>>> 	uint32_t number;
>>>> }
>>>> /* return number of ranges filled, or number of ranges if list is
>>>> NULL. */ int rte_bus_ dev_range_get(struct rte_bus_device_range
>>>> *list, int n);
>>>
>>> Hm, I thought about more port representor specific API.
>>> For me it is hard to tell if such generic naming is good or bad. I
>>> think it should be proven that such generic API makes sense. Any other potential users / use cases?
>>
>> I was thinking about SF, but SF is PCI specific, not suitable for this api. So I'm fine to make it as ethdev api.
>> To append new api into eth_dev_ops, is there ABI concern?
>
>No, eth_dev_ops are internal
>
>>> I've considered ethdev API which returns (in similar way as
>>> above) list of possible port representors which could be controlled
>>> by the device. Also I think it would be useful to include type information (enum with PF, VF, SF), controller ID.
>>
>> Agree.
>>
>> There is a new concern from orchestration side, currently, no
>> interface in openstack and OVS to retrieve representor ID range info,
>> It will take time to adapt this solution. To probe a representor,
>> orchestration need to know how to calculate representor ID, and the ID might vary on different max SF number, i.e. VF4 on PP1
>might got different ID. Representor ID change before that will break the product.
>
>I see.
>
>> Considering both orchestration and testpmd users, how about keeping both solution together? This will bring max flexibility IMHO.
>
>As I said before I don't mind and I really think it is a good idea to add suggested interface to specify representor (i.e. cXpfYvfZ), but the
>problem is making bitmap from representor ID.
>
>ethdev API should use new representor info API to make a representor ID from controller/PF/{VF,SF}.
>Or do you see any problems with such approach?

Sorry I thought the user to figure out representor ID from api.
This combination look good, thanks for clarification :)

So the new api looks like this:
struct rte_eth_representor_info {
  Enum representor_type;
  Uint16_t controller; // -1 for any
  Uint16_t port; // -1 for any
  Uint16_t representor_id;
  Uint16_t count;
  char name[N];

int rte_eth_representor_info_get(struct rte_eth_representor_info *infos);
- Return number of entries.
- NULL infos just return number of entries supported.
Sample outputs:
 VF, -1, 0, 0, 		128, 	"pf0vf"
 SF, -1, 0, 128, 		2048, 	"pf0sf"
 PF, -1, 0, 32767, 	1, 	"pf"
 VF, -1, 1, 32768, 	128, 	"pf1vf"
 SF, -1, 0, (32768+128), 	2048, 	"pf1sf"
 PF, -1, 0, 65535, 	1,	 "pf"

>
>> In struct rte_eth_dev_data, reserved bits could be used to define controller and port, this will avoid bitmap. How do you think?
>
>Could you add a bit more on it? Just a bit more details to the idea since I don't understand what exactly you mean and how it could
>help.

The idea is replacing reserved_64s and adding more device location info in rte_eth-dev_data like this:
  Uint16_t representor_id;
  Uint16_t port_id;
  Uint16_t controller_id;
  Enum representor_type;
Compare them all when matching a device, this will also avoid bitmap encoding. 
Reserved_64s[] was added to mitigate ABI conflicts, IIRC.
But seems no need if making representor info API to make ID.

>
>>>
>>> There is one more bit which is not in the picture yet -
>>> switch_info.port_id. Should it be equal to representor ID? Or different and provided in the info structure?
>>
>> Not exactly same AFAIK, the id used in e-switch.
>>
>>


^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v5 0/9] ethdev: support SubFunction representor
  2021-02-04 14:15  3%                 ` Xueming(Steven) Li
@ 2021-02-05  7:34  0%                   ` Andrew Rybchenko
  2021-02-05  9:13  3%                     ` Xueming(Steven) Li
  0 siblings, 1 reply; 200+ results
From: Andrew Rybchenko @ 2021-02-05  7:34 UTC (permalink / raw)
  To: Xueming(Steven) Li; +Cc: dev, Slava Ovsiienko, Asaf Penso, Thomas Monjalon

On 2/4/21 5:15 PM, Xueming(Steven) Li wrote:
> 
>> -----Original Message-----
>> From: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
>> Sent: Monday, February 1, 2021 4:39 PM
>> To: Xueming(Steven) Li <xuemingl@nvidia.com>
>> Cc: dev@dpdk.org; Slava Ovsiienko <viacheslavo@nvidia.com>; Asaf Penso <asafp@nvidia.com>
>> Subject: Re: [dpdk-dev] [PATCH v5 0/9] ethdev: support SubFunction representor
>>
>> On 1/28/21 5:31 PM, Xueming(Steven) Li wrote:
>>> <snip>
>>>>> The patch of device SF capability, but seems I misunderstood your suggestion.
>>>>> Let me explain process to create a SF:
>>>>> 1. SF can be created on the fly with scripts, unlike VF which is statically pre-created.
>>>>
>>>> Is there a maximum index and maximum total number of SF's created? How to find it?
>>>
>>> The maximum index is defined by firmware configuration, all SF's
>>> information could be found from sysfs. To create a SF, both PCI and sfnum have to be specified.
>>
>> sysfs is obviously Linux specific. I think the information should be available via DPDK API.
> 
> Yes, the new api discussed below should resolve this issue.
> 
>>
>>>>
>>>>> 2. SF is created on a PF with a SF number. SF number is named per PF, different PF may have same SF number.
>>>>> 3. For standalone PF, hot plug to DPDK using "PF#_BDF,representor=sf#", no need to use pf#sf# here.
>>>>> 4. For bonding netdev, hot plug to DPDK using "PF0_BDF,representor=pf#sf#"
>>>>> If using new api to return all representor IDs, need some way locate
>>>>> the new created SF by PF and SF number, that's why "pf#sf#" is used in this patch set.
>>>>
>>>> I think the API should simply reserve/report space for maximum number
>>>> of SFs. So, IDs are stable across restart/reboot in assumption that NIC is not reconfigured (changed maximum number of VF or
>> maximum number of SFs of any PF).
>>>
>>> Yes, IDs should be stable as long as no  NIC firmware configuration change.
>>>
>>> Just clarify, this api should be common enough to report all devices that a bus device supports:
>>> 1. name, might contains controller and pf info, example: "eth:representor:c0pf1vf"
>>> 2. ID range, example: 0-127
>>> The api describes ID ranges for each sub device type, users have to query the api and choose representor ID to probe.
>>>
>>> Prototype:
>>> struct rte_bus_device_range {
>>> 	char name[64];
>>> 	uint32_t base;
>>> 	uint32_t number;
>>> }
>>> /* return number of ranges filled, or number of ranges if list is
>>> NULL. */ int rte_bus_ dev_range_get(struct rte_bus_device_range *list,
>>> int n);
>>
>> Hm, I thought about more port representor specific API.
>> For me it is hard to tell if such generic naming is good or bad. I think it should be proven that such generic API makes sense. Any other
>> potential users / use cases?
> 
> I was thinking about SF, but SF is PCI specific, not suitable for this api. So I'm fine to make it as ethdev api.
> To append new api into eth_dev_ops, is there ABI concern?

No, eth_dev_ops are internal

>> I've considered ethdev API which returns (in similar way as
>> above) list of possible port representors which could be controlled by the device. Also I think it would be useful to include type
>> information (enum with PF, VF, SF), controller ID.
> 
> Agree. 
> 
> There is a new concern from orchestration side, currently, no interface in openstack and OVS to retrieve representor ID range info,
> It will take time to adapt this solution. To probe a representor, orchestration need to know how to calculate representor ID, 
> and the ID might vary on different max SF number, i.e. VF4 on PP1 might got different ID. Representor ID change before that will
> break the product.

I see.

> Considering both orchestration and testpmd users, how about keeping both solution together? This will bring max flexibility IMHO.

As I said before I don't mind and I really think it is a good
idea to add suggested interface to specify representor
(i.e. cXpfYvfZ), but the problem is making bitmap from
representor ID.

ethdev API should use new representor info API to
make a representor ID from controller/PF/{VF,SF}.
Or do you see any problems with such approach?

> In struct rte_eth_dev_data, reserved bits could be used to define controller and port, this will avoid bitmap. How do you think?

Could you add a bit more on it? Just a bit more details to
the idea since I don't understand what exactly you mean and
how it could help.

>>
>> There is one more bit which is not in the picture yet - switch_info.port_id. Should it be equal to representor ID? Or different and
>> provided in the info structure?
> 
> Not exactly same AFAIK, the id used in e-switch.
> 
> 


^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v5 0/9] ethdev: support SubFunction representor
  @ 2021-02-04 14:15  3%                 ` Xueming(Steven) Li
  2021-02-05  7:34  0%                   ` Andrew Rybchenko
  0 siblings, 1 reply; 200+ results
From: Xueming(Steven) Li @ 2021-02-04 14:15 UTC (permalink / raw)
  To: Andrew Rybchenko; +Cc: dev, Slava Ovsiienko, Asaf Penso, Thomas Monjalon


>-----Original Message-----
>From: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
>Sent: Monday, February 1, 2021 4:39 PM
>To: Xueming(Steven) Li <xuemingl@nvidia.com>
>Cc: dev@dpdk.org; Slava Ovsiienko <viacheslavo@nvidia.com>; Asaf Penso <asafp@nvidia.com>
>Subject: Re: [dpdk-dev] [PATCH v5 0/9] ethdev: support SubFunction representor
>
>On 1/28/21 5:31 PM, Xueming(Steven) Li wrote:
>> <snip>
>>>> The patch of device SF capability, but seems I misunderstood your suggestion.
>>>> Let me explain process to create a SF:
>>>> 1. SF can be created on the fly with scripts, unlike VF which is statically pre-created.
>>>
>>> Is there a maximum index and maximum total number of SF's created? How to find it?
>>
>> The maximum index is defined by firmware configuration, all SF's
>> information could be found from sysfs. To create a SF, both PCI and sfnum have to be specified.
>
>sysfs is obviously Linux specific. I think the information should be available via DPDK API.

Yes, the new api discussed below should resolve this issue.

>
>>>
>>>> 2. SF is created on a PF with a SF number. SF number is named per PF, different PF may have same SF number.
>>>> 3. For standalone PF, hot plug to DPDK using "PF#_BDF,representor=sf#", no need to use pf#sf# here.
>>>> 4. For bonding netdev, hot plug to DPDK using "PF0_BDF,representor=pf#sf#"
>>>> If using new api to return all representor IDs, need some way locate
>>>> the new created SF by PF and SF number, that's why "pf#sf#" is used in this patch set.
>>>
>>> I think the API should simply reserve/report space for maximum number
>>> of SFs. So, IDs are stable across restart/reboot in assumption that NIC is not reconfigured (changed maximum number of VF or
>maximum number of SFs of any PF).
>>
>> Yes, IDs should be stable as long as no  NIC firmware configuration change.
>>
>> Just clarify, this api should be common enough to report all devices that a bus device supports:
>> 1. name, might contains controller and pf info, example: "eth:representor:c0pf1vf"
>> 2. ID range, example: 0-127
>> The api describes ID ranges for each sub device type, users have to query the api and choose representor ID to probe.
>>
>> Prototype:
>> struct rte_bus_device_range {
>> 	char name[64];
>> 	uint32_t base;
>> 	uint32_t number;
>> }
>> /* return number of ranges filled, or number of ranges if list is
>> NULL. */ int rte_bus_ dev_range_get(struct rte_bus_device_range *list,
>> int n);
>
>Hm, I thought about more port representor specific API.
>For me it is hard to tell if such generic naming is good or bad. I think it should be proven that such generic API makes sense. Any other
>potential users / use cases?

I was thinking about SF, but SF is PCI specific, not suitable for this api. So I'm fine to make it as ethdev api.
To append new api into eth_dev_ops, is there ABI concern?

>
>I've considered ethdev API which returns (in similar way as
>above) list of possible port representors which could be controlled by the device. Also I think it would be useful to include type
>information (enum with PF, VF, SF), controller ID.

Agree. 

There is a new concern from orchestration side, currently, no interface in openstack and OVS to retrieve representor ID range info,
It will take time to adapt this solution. To probe a representor, orchestration need to know how to calculate representor ID, 
and the ID might vary on different max SF number, i.e. VF4 on PP1 might got different ID. Representor ID change before that will
break the product.

Considering both orchestration and testpmd users, how about keeping both solution together? This will bring max flexibility IMHO.

In struct rte_eth_dev_data, reserved bits could be used to define controller and port, this will avoid bitmap. How do you think?

>
>There is one more bit which is not in the picture yet - switch_info.port_id. Should it be equal to representor ID? Or different and
>provided in the info structure?

Not exactly same AFAIK, the id used in e-switch.



^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH] devtools: select targets in build test
@ 2021-02-04 13:34  5% David Marchand
  0 siblings, 0 replies; 200+ results
From: David Marchand @ 2021-02-04 13:34 UTC (permalink / raw)
  To: dev; +Cc: thomas, Bruce Richardson

When a target compilation is broken, one way to skip the target is to
uninstall the associated toolchain.
But it is not always possible and you end up with hacking the script to
avoid this target until a fix is ready.

It is also often quicker to check a fix on a failing target before
checking compilation on all targets.

Introduce a variable to select targets.

Example:
$ DPDK_BUILD_TEST_TARGETS=build-x86-mingw \
    ./devtools/test-meson-builds.sh
ninja: Entering directory `/home/dmarchan/builds/build-x86-mingw'
[...]
Found ninja-1.10.1 at /usr/bin/ninja
[19/19] Linking target examples/dpdk-helloworld.exe

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
 devtools/test-meson-builds.sh | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/devtools/test-meson-builds.sh b/devtools/test-meson-builds.sh
index c11ae87e0d..3e88e8291e 100755
--- a/devtools/test-meson-builds.sh
+++ b/devtools/test-meson-builds.sh
@@ -92,6 +92,15 @@ load_env () # <target compiler>
 	command -v $targetcc >/dev/null 2>&1 || return 1
 }
 
+target_is_selected()
+{
+	if [ -z "${DPDK_BUILD_TEST_TARGETS:-}" ]; then
+		return 0
+	fi
+	target_filter=" $DPDK_BUILD_TEST_TARGETS "
+	! [ "${target_filter##* $1 }" = "${target_filter}" ]
+}
+
 config () # <dir> <builddir> <meson options>
 {
 	dir=$1
@@ -149,6 +158,7 @@ install_target () # <builddir> <installdir>
 build () # <directory> <target cc | cross file> <ABI check> [meson options]
 {
 	targetdir=$1
+	target_is_selected $targetdir || return 0
 	shift
 	crossfile=
 	[ -r $1 ] && crossfile=$1 || targetcc=$1
@@ -271,6 +281,8 @@ for f in $srcdir/config/ppc/ppc* ; do
 	build $targetdir $f ABI $use_shared
 done
 
+target_is_selected build-x86-default || exit 0
+
 # Test installation of the x86-default target, to be used for checking
 # the sample apps build using the pkg-config file for cflags and libs
 load_env cc
-- 
2.23.0


^ permalink raw reply	[relevance 5%]

* Re: [dpdk-dev] [PATCH] devtools: fix examples external compilation for x86-default
  @ 2021-02-02 22:54  0% ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2021-02-02 22:54 UTC (permalink / raw)
  To: David Marchand; +Cc: dev, Bruce Richardson

02/02/2021 11:54, David Marchand:
> Since we don't check ABI on the x86-default target anymore, installation
> of the target must always happen for examples external compilation check
> to work.

Otherwise the error is:
find: ‘build-x86-default/install’: No such file or directory
> 
> Fixes: 6a426d733ec0 ("devtools: reduce ABI checks and static binaries")
> 
> Signed-off-by: David Marchand <david.marchand@redhat.com>

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

Applied, thanks




^ permalink raw reply	[relevance 0%]

Results 4001-4200 of ~18000   |  | reverse | sort options + mbox downloads above
-- links below jump to the message on this page --
2020-01-04  1:33     [dpdk-dev] [PATCH 00/14] cleanup resources on shutdown Stephen Hemminger
2020-05-03 17:21     ` [dpdk-dev] [PATCH v3 0/8] eal: " David Marchand
2020-10-19 22:24       ` Thomas Monjalon
2021-03-24 21:30  0%     ` Thomas Monjalon
2020-04-16 11:00     [dpdk-dev] [PATCH] ci: remove aarch64 from Travis jobs Thomas Monjalon
2021-03-25 15:46     ` Thomas Monjalon
2021-03-25 16:40  3%   ` Aaron Conole
2021-03-25 17:11  0%     ` Thomas Monjalon
2020-06-07 12:26     [dpdk-dev] Handling missing export functions in MSVC linkage Tal Shnaiderman
2020-06-08  0:09     ` Dmitry Kozlyuk
2020-06-08  8:33       ` David Marchand
2021-03-26  8:39  0%     ` Thomas Monjalon
2021-03-26 14:14  0%       ` [dpdk-dev] [EXTERNAL] " Tyler Retzlaff
2020-08-31  7:53     [dpdk-dev] [PATCH] ethdev: add rx offload to drop error packets Nipun Gupta
2020-10-15 13:23     ` [dpdk-dev] [PATCH 1/3 v4] ethdev: add Rx " nipun.gupta
2021-02-18 20:32  4%   ` Ferruh Yigit
2020-11-24  7:52     [dpdk-dev] [PATCH v2] build: alias default build as generic Juraj Linkeš
2021-02-18 14:12  3% ` [dpdk-dev] [PATCH v3] " Juraj Linkeš
2021-03-09  8:43  0%   ` Juraj Linkeš
2021-03-29 10:49  3%   ` [dpdk-dev] [PATCH v4] " Juraj Linkeš
2021-03-30  6:40  3%     ` [dpdk-dev] [PATCH v5] " Juraj Linkeš
2020-12-18 14:55     [dpdk-dev] [RFC 1/7] ethdev: support sub function representor Xueming Li
2021-01-19  7:13     ` [dpdk-dev] [PATCH v5 0/9] ethdev: support SubFunction representor Xueming Li
2021-01-19  8:40       ` Andrew Rybchenko
2021-01-19 14:24         ` Xueming(Steven) Li
2021-01-22  8:21           ` Andrew Rybchenko
2021-01-27  3:04             ` Xueming(Steven) Li
2021-01-27 12:10               ` Andrew Rybchenko
2021-01-28 14:31                 ` Xueming(Steven) Li
2021-02-01  8:39                   ` Andrew Rybchenko
2021-02-04 14:15  3%                 ` Xueming(Steven) Li
2021-02-05  7:34  0%                   ` Andrew Rybchenko
2021-02-05  9:13  3%                     ` Xueming(Steven) Li
2021-02-05  9:37  0%                       ` Andrew Rybchenko
2021-01-12  1:04     [dpdk-dev] [PATCH] eal/rwlock: add note about writer starvation Stephen Hemminger
2021-01-14 16:55     ` [dpdk-dev] [PATCH v2] " Stephen Hemminger
2021-02-11 22:51  0%   ` Thomas Monjalon
2021-02-12  0:21  0%     ` Honnappa Nagarahalli
2021-01-14 11:05     [dpdk-dev] [PATCH 00/20] ensure headers have correct includes Bruce Richardson
2021-01-29 16:48     ` [dpdk-dev] [PATCH v7 00/10] add checking of header includes Bruce Richardson
2021-01-29 16:48       ` [dpdk-dev] [PATCH v7 06/10] eventdev: make driver-only headers private Bruce Richardson
2021-02-22 22:34  3%     ` Stephen Hemminger
2021-01-18 15:16     [dpdk-dev] [PATCH v2 0/5] eal: enable global device syntax Xueming Li
2021-01-18 15:16     ` [dpdk-dev] [PATCH v2 2/5] devargs: refactor scratch buffer storage Xueming Li
2021-03-18  9:14  3%   ` Thomas Monjalon
2021-01-25  1:02     [dpdk-dev] [RFC 0/1] lib/librte_ethdev: Meter algorithms support packet per second Li Zhang
2021-03-01 10:35     ` [dpdk-dev] [RFC v4 0/4] adds support PPS(packet per second) on meter Li Zhang
2021-03-01 10:35       ` [dpdk-dev] [RFC v4 1/4] ethdev: add meter PPS profile Li Zhang
2021-03-01 13:20         ` Dumitrescu, Cristian
2021-03-02  7:02  4%       ` Matan Azrad
2021-03-02 12:29  3%         ` Dumitrescu, Cristian
2021-03-02 12:37  0%           ` Matan Azrad
2021-03-02 14:33  0%             ` Dumitrescu, Cristian
2021-03-02 18:10  3%               ` Matan Azrad
2021-03-03 20:35  0%                 ` Dumitrescu, Cristian
2021-03-04  6:34  0%                   ` Matan Azrad
2021-03-05 18:44  0%                     ` Dumitrescu, Cristian
2021-02-01 18:08     [dpdk-dev] [PATCH] devtools: remove ethdev ABI exception David Marchand
2021-02-01 19:03     ` Ferruh Yigit
2021-02-05 16:48  4%   ` Thomas Monjalon
2021-02-02 10:54     [dpdk-dev] [PATCH] devtools: fix examples external compilation for x86-default David Marchand
2021-02-02 22:54  0% ` Thomas Monjalon
2021-02-04 13:34  5% [dpdk-dev] [PATCH] devtools: select targets in build test David Marchand
2021-02-05 14:46     [dpdk-dev] [RFC PATCH v3] build: kni cross-compilation support Juraj Linkeš
2021-02-05 15:04     ` [dpdk-dev] [RFC PATCH v4] " Juraj Linkeš
2021-02-05 15:27  3%   ` Bruce Richardson
2021-02-08 10:17  0%     ` Juraj Linkeš
2021-02-08 10:26  0%       ` Bruce Richardson
2021-02-05 21:23 10% [dpdk-dev] [PATCH] telemetry: mark init function as internal-only Bruce Richardson
2021-02-08 16:33  4% [dpdk-dev] [PATCH] eal: fix detection of static or shared DPDK builds Bruce Richardson
2021-02-09 12:49  0% ` Bruce Richardson
2021-02-12 19:09  3% [dpdk-dev] officially support building driver plugins externally Tyler Retzlaff
2021-03-10 20:52  0% ` Thomas Monjalon
2021-03-10 21:24  0%   ` Tyler Retzlaff
2021-02-14  1:20     [dpdk-dev] [PATCH 0/6] net/pcap: build on Windows Dmitry Kozlyuk
2021-02-14  2:16     ` [dpdk-dev] [PATCH v2 " Dmitry Kozlyuk
2021-02-14  2:16       ` [dpdk-dev] [PATCH v2 4/6] net/pcap: add libpcap wrappers Dmitry Kozlyuk
2021-02-25 14:59         ` Ferruh Yigit
2021-02-25 19:04           ` Dmitry Kozlyuk
2021-02-25 20:31             ` Nick Connolly
2021-02-25 23:10  3%           ` Dmitry Kozlyuk
2021-02-14 19:19  3% [dpdk-dev] [dpdk-announce] DPDK 21.02 released Thomas Monjalon
2021-02-15  9:14  7% [dpdk-dev] [PATCH] version: 21.05-rc0 Thomas Monjalon
2021-02-15 19:18  3% [dpdk-dev] Build errors due to duplicate version.map entries in librte_power Aaron Conole
2021-02-22 10:31  0% ` Juraj Linkeš
2021-02-22 19:50  0%   ` Aaron Conole
2021-02-19 11:17  4% [dpdk-dev] [PATCH v2] doc: update stable section Kevin Traynor
2021-02-20 22:09  3% [dpdk-dev] [PATCH 0/7] Introduce event vectorization pbhagavatula
2021-02-20 22:09  5% ` [dpdk-dev] [PATCH 7/7] eventdev: fix ABI breakage due to event vector pbhagavatula
2021-03-08 18:44  9%   ` Jerin Jacob
2021-03-12 14:28  9%     ` David Marchand
2021-03-16  5:54  7%       ` [dpdk-dev] [EXT] " Pavan Nikhilesh Bhagavatula
2021-03-15 10:01  7%     ` [dpdk-dev] " Kinsella, Ray
2021-03-08 16:41  0% ` [dpdk-dev] [PATCH 0/7] Introduce event vectorization Jerin Jacob
2021-03-16 15:48  4% ` [dpdk-dev] [PATCH v2 0/8] " pbhagavatula
2021-03-16 20:01  4%   ` [dpdk-dev] [PATCH v3 " pbhagavatula
2021-03-19 20:57  4%     ` [dpdk-dev] [PATCH v4 " pbhagavatula
2021-03-19 20:57           ` [dpdk-dev] [PATCH v4 1/8] eventdev: introduce event vector capability pbhagavatula
2021-03-22  9:06  3%         ` Kinsella, Ray
2021-03-22  9:10  0%           ` [dpdk-dev] [EXT] " Pavan Nikhilesh Bhagavatula
2021-03-23 18:44  0%       ` [dpdk-dev] [PATCH v4 0/8] Introduce event vectorization Jerin Jacob
2021-03-24  5:05  4%       ` [dpdk-dev] [PATCH v5 " pbhagavatula
2021-03-24  5:39  0%         ` Jayatheerthan, Jay
2021-03-24  6:44  0%           ` Pavan Nikhilesh Bhagavatula
2021-03-24  8:10  0%             ` Jayatheerthan, Jay
2021-03-24 19:28  4%         ` [dpdk-dev] [PATCH v6 " pbhagavatula
2021-03-25 17:10  4%           ` [dpdk-dev] [PATCH v7 " pbhagavatula
2021-03-26 14:08  4%             ` [dpdk-dev] [PATCH v8 " pbhagavatula
2021-03-30  8:22  4%               ` [dpdk-dev] [PATCH v9 " pbhagavatula
2021-03-31  9:29  4%                 ` [dpdk-dev] [PATCH v10 " pbhagavatula
2021-04-03  9:44  0%                   ` Jerin Jacob
2021-02-20 23:29     [dpdk-dev] [PATCH 0/7] eal/windows: do not expose POSIX symbols Dmitry Kozlyuk
2021-02-20 23:29  3% ` [dpdk-dev] [PATCH 7/7] " Dmitry Kozlyuk
2021-02-21  1:28     ` [dpdk-dev] [PATCH v2 0/7] " Dmitry Kozlyuk
2021-02-21  1:28  3%   ` [dpdk-dev] [PATCH v2 7/7] " Dmitry Kozlyuk
2021-02-21 14:28       ` [dpdk-dev] [PATCH v3 0/7] " Dmitry Kozlyuk
2021-02-21 14:28  3%     ` [dpdk-dev] [PATCH v3 7/7] " Dmitry Kozlyuk
2021-03-06  0:04         ` [dpdk-dev] [PATCH v4 0/4] " Dmitry Kozlyuk
2021-03-06  0:05  3%       ` [dpdk-dev] [PATCH v4 4/4] " Dmitry Kozlyuk
2021-02-22 15:09  1% [dpdk-dev] 20.11.1 patches review and test luca.boccassi
2021-02-25  9:43  0% ` Christian Ehrhardt
2021-02-25 13:00  0% ` Pei Zhang
2021-02-25 14:39  0%   ` Luca Boccassi
2021-03-02  6:23  0% ` Kalesh Anakkur Purayil
2021-03-02 10:29  0%   ` Luca Boccassi
2021-03-02 10:52  0% ` Chen, BoX C
2021-03-02 11:27  0%   ` Luca Boccassi
2021-03-03  1:57  0%     ` Chen, BoX C
2021-03-09 10:36  0% ` Govindharajan, Hariprasad
2021-02-24 21:20     [dpdk-dev] [RFC 0/5] Use correct memory ordering in eal functions Honnappa Nagarahalli
2021-02-25  8:44     ` [dpdk-dev] 回复: [RFC 3/5] eal: lcore state FINISHED is not required Feifei Wang
2021-02-25 23:33       ` [dpdk-dev] " Honnappa Nagarahalli
2021-02-26  8:26         ` Thomas Monjalon
2021-03-02  3:13           ` Honnappa Nagarahalli
2021-03-19 13:42  3%         ` Ananyev, Konstantin
2021-03-30  2:54  0%           ` Honnappa Nagarahalli
2021-02-25 17:02     [dpdk-dev] [PATCH 1/7] common/octeontx: enable build only on 64bit Linux pbhagavatula
2021-03-24 10:55     ` Jerin Jacob
2021-03-25 10:42       ` Thomas Monjalon
2021-03-25 10:46  3%     ` Thomas Monjalon
2021-03-25 10:58  4%       ` Kinsella, Ray
2021-03-25 11:03  0%         ` Thomas Monjalon
2021-03-25 12:46  4%           ` Jerin Jacob
2021-03-25 12:47  0%             ` Kinsella, Ray
2021-03-25 12:58  0%               ` Jerin Jacob
2021-03-25 13:02  3%                 ` Kinsella, Ray
2021-03-26 10:50  0%                   ` Jerin Jacob
2021-03-25 14:57  0%             ` Thomas Monjalon
2021-03-25 15:01  0%               ` David Marchand
2021-03-25 14:52  3% ` [dpdk-dev] [PATCH 21.11 v2 0/3] octeontx build only on 64-bit Linux Thomas Monjalon
2021-02-25 19:01     [dpdk-dev] [PATCH 1/2] eal: make max interrupt vector id configurable pbhagavatula
2021-03-24 11:01     ` Jerin Jacob
2021-03-24 11:14  3%   ` David Marchand
2021-03-24 12:54  4%     ` Jerin Jacob
2021-03-24 15:25  0%       ` David Marchand
2021-03-24 16:20  0%         ` Jerin Jacob
2021-02-28 19:48     [dpdk-dev] [RFC] ethdev: add sanity packet checks Ori Kam
2021-02-28 20:14     ` Thomas Monjalon
2021-03-04 10:00       ` Ori Kam
2021-03-04 10:46  3%     ` Thomas Monjalon
2021-03-07 18:46  3%       ` Ori Kam
2021-03-08 23:05  0%         ` Ajit Khaparde
2021-03-09 19:21  0%           ` Ori Kam
2021-03-09  9:01     ` Andrew Rybchenko
2021-03-09  9:11       ` Thomas Monjalon
2021-03-09 15:08         ` Ori Kam
2021-03-09 15:27           ` Andrew Rybchenko
2021-03-09 19:46  4%         ` Ori Kam
2021-03-02 11:24     [dpdk-dev] [PATCH 0/2] EAL Thread TLS API enhancements Tal Shnaiderman
2021-03-02 11:24     ` [dpdk-dev] [PATCH 2/2] eal: rename key opaque pointer in TLS API Tal Shnaiderman
2021-03-02 12:41       ` Morten Brørup
2021-03-02 13:13         ` Tal Shnaiderman
2021-03-02 13:46  3%       ` Morten Brørup
2021-03-08 18:13  1% [dpdk-dev] [dpdk-announce] DPDK 20.11.1 released luca.boccassi
2021-03-09  8:15     [dpdk-dev] [PATCH 0/4] *** Support for one flow dump *** Haifei Luo
2021-04-07  6:09     ` [dpdk-dev] [PATCH v2 0/5] support single flow dump Haifei Luo
2021-04-07  6:09  4%   ` [dpdk-dev] [PATCH v2 5/5] doc: add single flow dump to guides Haifei Luo
2021-03-10  6:41     [dpdk-dev] [PATCH] librte_eal/common: fix return type of rte_bsf64 Tyler Retzlaff
2021-03-10 18:49     ` Stephen Hemminger
2021-03-10 22:52       ` Tyler Retzlaff
2021-03-12  7:34  3%     ` Morten Brørup
2021-03-12 11:46  0%       ` Kinsella, Ray
2021-03-12 18:10  3%         ` Tyler Retzlaff
2021-03-12 18:24  0%       ` Tyler Retzlaff
2021-03-12 21:13  0%         ` Morten Brørup
2021-03-10 12:48     [dpdk-dev] [PATCH v4 1/2] eal: error number enhancement for thread TLS API Tal Shnaiderman
2021-03-16  9:15  3% ` [dpdk-dev] [PATCH v5 0/2] EAL Thread TLS API enhancements Tal Shnaiderman
2021-03-16  9:15  3%   ` [dpdk-dev] [PATCH v5 2/2] eal: rename key opaque pointer and functions in TLS API Tal Shnaiderman
2021-03-10 17:24     [dpdk-dev] [PATCH 0/4] telemetry logging improvements and cleanup Bruce Richardson
2021-03-10 17:24 10% ` [dpdk-dev] [PATCH 2/4] telemetry: make the legacy registration function internal Bruce Richardson
2021-03-25 13:57     ` [dpdk-dev] [PATCH v2 0/4] telemetry logging improvements and cleanup Bruce Richardson
2021-03-25 13:57 10%   ` [dpdk-dev] [PATCH v2 2/4] telemetry: make the legacy registration function internal Bruce Richardson
2021-03-11 19:27  3% [dpdk-dev] [PATCH] ethdev: introduce enable_driver_sdk to install driver headers Tyler Retzlaff
2021-03-12 15:19  0% ` Ferruh Yigit
2021-03-12 15:25  0%   ` David Marchand
2021-03-12 15:34  0%     ` Bruce Richardson
2021-03-12 15:52  0%       ` Thomas Monjalon
2021-03-12 22:20  3% ` [dpdk-dev] [PATCH v2] " Tyler Retzlaff
2021-03-15 10:06  0%   ` Bruce Richardson
2021-03-23 17:04  0%   ` Ferruh Yigit
2021-03-24  4:32  3%     ` Tyler Retzlaff
2021-03-24 11:27  0%       ` Ferruh Yigit
2021-03-24 11:30  0%         ` Thomas Monjalon
2021-03-30 12:50  0%         ` Ferruh Yigit
2021-03-11 22:17     [dpdk-dev] [PATCH 0/2] ethdev: remove some use of legacy filtering interface Thomas Monjalon
2021-03-11 22:17  1% ` [dpdk-dev] [PATCH 1/2] ethdev: replace callback getting filter operations Thomas Monjalon
2021-03-12 17:46     ` [dpdk-dev] [PATCH v2 0/2] ethdev: remove some use of legacy filtering interface Thomas Monjalon
2021-03-12 17:46  1%   ` [dpdk-dev] [PATCH v2 1/2] ethdev: replace callback getting filter operations Thomas Monjalon
2021-03-21  8:59     ` [dpdk-dev] [PATCH v3 0/2] ethdev: remove some use of legacy filtering Thomas Monjalon
2021-03-21  9:00  1%   ` [dpdk-dev] [PATCH v3 1/2] ethdev: replace callback getting filter operations Thomas Monjalon
2021-03-16  9:15     [dpdk-dev] [PATCH v5 1/2] eal: error number enhancement for thread TLS API Tal Shnaiderman
2021-03-16 13:28  3% ` [dpdk-dev] [PATCH v6 0/2] EAL Thread TLS API enhancements Tal Shnaiderman
2021-03-16 13:28  3%   ` [dpdk-dev] [PATCH v6 2/2] eal: rename key opaque pointer and functions in TLS API Tal Shnaiderman
2021-03-26  8:24  0%   ` [dpdk-dev] [PATCH v6 0/2] EAL Thread TLS API enhancements Thomas Monjalon
2021-03-16 11:14  9% [dpdk-dev] cryptodev: change raw data path dequeue API Fan Zhang
2021-03-31 17:20  4% ` [dpdk-dev] [dpdk-dev v2] " Fan Zhang
2021-03-16 23:11     [dpdk-dev] [PATCH] bus/pci: fix Windows kernel driver categories Thomas Monjalon
2021-03-17 23:17     ` Ranjit Menon
2021-03-18  7:49  3%   ` Thomas Monjalon
2021-03-18 22:00  0%     ` Ranjit Menon
2021-03-18 10:48  3% ` [dpdk-dev] [PATCH v2] " Thomas Monjalon
2021-03-18 12:00  0%   ` Tal Shnaiderman
2021-03-18 22:07  0%   ` Ranjit Menon
2021-03-19 15:24  0%     ` Thomas Monjalon
2021-03-17  9:31     [dpdk-dev] [PATCH] eal: fix version macro Thomas Monjalon
2021-03-17  9:48     ` David Marchand
2021-03-17 10:01       ` Thomas Monjalon
2021-03-18 12:28  3%     ` Bruce Richardson
2021-03-18 14:41  0%       ` Thomas Monjalon
2021-03-18 15:45  0%         ` Bruce Richardson
2021-03-17 15:15  3% [dpdk-dev] [PATCH] eal: mark version parts API as experimental Thomas Monjalon
2021-03-18 12:29  0% ` Bruce Richardson
2021-03-19 15:21  0%   ` Thomas Monjalon
2021-03-18  1:00     [dpdk-dev] [PATCH 0/3] eal: Add new API for threading Narcisa Ana Maria Vasile
2021-03-18  1:00     ` [dpdk-dev] [PATCH 1/3] Add EAL threads API Narcisa Ana Maria Vasile
2021-03-18 15:48  5%   ` David Marchand
2021-03-18 19:40  4%     ` Narcisa Ana Maria Vasile
2021-03-23  0:20  2%   ` [dpdk-dev] [PATCH v2 00/10] eal: Add new API for threading Narcisa Ana Maria Vasile
2021-03-25  3:46  2%     ` [dpdk-dev] [PATCH v3 " Narcisa Ana Maria Vasile
2021-03-18 12:25 13% [dpdk-dev] [PATCH] ethdev: add queue state when retrieve queue information Lijun Ou
2021-03-22  9:22  3% ` Ferruh Yigit
2021-03-22  9:38  0%   ` Kinsella, Ray
2021-03-22  9:39  0%   ` oulijun
2021-03-22 14:49  0%   ` Andrew Rybchenko
2021-03-22 15:45  0%     ` Ananyev, Konstantin
2021-03-22 16:02  0%       ` Andrew Rybchenko
2021-03-22 16:53  0%         ` Ananyev, Konstantin
2021-03-22 17:07  3%           ` Andrew Rybchenko
2021-03-22 18:53  0%             ` Ananyev, Konstantin
2021-03-23 10:13  0%               ` Ferruh Yigit
2021-03-23 10:19  0%                 ` Ferruh Yigit
2021-03-23 11:07  0%                 ` Ananyev, Konstantin
2021-03-25 10:01  0%       ` oulijun
2021-03-25 10:18  0%         ` Ananyev, Konstantin
2021-03-25 11:09 13% ` [dpdk-dev] [PATCH V2] " Lijun Ou
2021-04-06  0:49  0%   ` oulijun
2021-04-06 14:02  0%   ` Ananyev, Konstantin
2021-03-23 12:11     [dpdk-dev] [PATCH] ethdev: update qfi definition Raslan Darawsheh
2021-03-26 13:12     ` Ferruh Yigit
2021-03-29  8:53       ` Ori Kam
2021-03-29  9:06  3%     ` Raslan Darawsheh
2021-03-29 11:14  0%       ` Ferruh Yigit
2021-03-25  3:47     [dpdk-dev] [PATCH v3 10/10] Enable the new EAL thread API Narcisa Ana Maria Vasile
2021-03-26 23:52  2% ` [dpdk-dev] [PATCH v4 00/10] eal: Add new API for threading Narcisa Ana Maria Vasile
2021-03-26 23:52     [dpdk-dev] [PATCH v4 09/10] eal: add EAL argument for setting thread priority Narcisa Ana Maria Vasile
2021-03-29 22:40  2% ` [dpdk-dev] [PATCH v5 00/10] eal: Add new API for threading Narcisa Ana Maria Vasile
2021-03-29 22:40     [dpdk-dev] [PATCH v5 01/10] eal: add thread id and simple thread functions Narcisa Ana Maria Vasile
2021-04-03  1:38  2% ` [dpdk-dev] [PATCH v6 00/10] eal: Add new API for threading Narcisa Ana Maria Vasile
2021-03-30  8:07  4% [dpdk-dev] cryptodev: change raw data path dequeue API Akhil Goyal
2021-03-31  0:44  3% [dpdk-dev] Minutes of Technical Board Meeting, 2021-03-10 Honnappa Nagarahalli
2021-03-31  8:52  0% ` Tom Barbette
2021-04-06 13:13  0%   ` Morten Brørup
2021-04-07  0:47  0%     ` Honnappa Nagarahalli
2021-04-07  7:11  0%       ` Morten Brørup
2021-04-07  9:58  0%         ` Bruce Richardson
2021-04-07 10:29  0%           ` Morten Brørup
2021-03-31 22:34     [dpdk-dev] [PATCH 0/2] pci: add rte prefix Thomas Monjalon
2021-04-06 10:28     ` [dpdk-dev] [PATCH v3 " Thomas Monjalon
2021-04-06 10:28  4%   ` [dpdk-dev] [PATCH v3 1/2] pci: rename catch-all ID Thomas Monjalon
2021-03-31 22:45     [dpdk-dev] [PATCH] eal: move DMA mapping from bus-specific to generic driver Thomas Monjalon
2021-03-31 22:53  4% ` Thomas Monjalon
2021-04-01  8:40  0%   ` Kinsella, Ray
2021-04-12 15:03  0%   ` Kinsella, Ray
2021-04-01  6:54     [dpdk-dev] [PATCH 0/2] Support meter policy API Li Zhang
2021-04-01  6:54  1% ` [dpdk-dev] [PATCH 1/2] ethdev: add pre-defined " Li Zhang
2021-04-01  9:52     [dpdk-dev] [PATCH 0/5] Offload flags fixes David Marchand
2021-04-01  9:52     ` [dpdk-dev] [PATCH 2/5] net/tap: do not touch Tx offload flags David Marchand
2021-04-07 20:15       ` Flavio Leitner
2021-04-08  7:41         ` Olivier Matz
2021-04-08 11:21           ` Flavio Leitner
2021-04-08 12:16  3%         ` Ananyev, Konstantin
2021-04-01 11:49     [dpdk-dev] [RFC PATCH 00/14] Build file update proposals Bruce Richardson
2021-04-01 11:50  1% ` [dpdk-dev] [RFC PATCH 13/14] lib: remove librte_ prefix from directory names Bruce Richardson
2021-04-06 16:32     [dpdk-dev] [PATCH] build: list symbols exports in a single file David Marchand
2021-04-06 17:59  2% ` [dpdk-dev] [PATCH v2] " David Marchand
2021-04-07  9:06     [dpdk-dev] [PATCH] service: clean references to removed symbol David Marchand
2021-04-08 12:54  4% ` Van Haaren, Harry
2021-04-08 12:58  0%   ` David Marchand
2021-04-08 13:06  4%     ` Van Haaren, Harry
2021-04-08 14:04  0%       ` David Marchand
2021-04-08 14:54  3%         ` Thomas Monjalon
     [not found]     <1615967952-228321-1-git-send-email-bingz@nvidia.com>
2021-04-08 14:46  2% ` [dpdk-dev] [RFC PATCH v2] ethdev: introduce indirect action APIs Bing Zhao
2021-04-09  3:54  4% ` [dpdk-dev] [PATCH] " Bing Zhao
2021-04-10 14:03       ` [dpdk-dev] [PATCH v2 0/4] Change shared action API to action handle API Bing Zhao
2021-04-10 14:03  4%     ` [dpdk-dev] [PATCH v2 1/4] ethdev: introduce indirect action APIs Bing Zhao
2021-04-12  8:28     [dpdk-dev] [PATCH 0/3] add lock-free stack support discovery Stanislaw Kardach
2021-04-12  8:29  4% ` [dpdk-dev] [PATCH 2/3] stack: add lock-free support indication Stanislaw Kardach

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).