diff mbox series

[v4,2/8] eventdev: introduce event vector Rx capability

Message ID 20210319205718.1436-3-pbhagavatula@marvell.com (mailing list archive)
State Changes Requested
Delegated to: Jerin Jacob
Headers show
Series Introduce event vectorization | expand

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Pavan Nikhilesh Bhagavatula March 19, 2021, 8:57 p.m. UTC
From: Pavan Nikhilesh <pbhagavatula@marvell.com>

Introduce event ethernet Rx adapter event vector capability.

If an event eth Rx adapter has the capability of
RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR then a given Rx queue
can be configured to enable event vectorization by passing the
flag RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR to
rte_event_eth_rx_adapter_queue_conf::rx_queue_flags while configuring
Rx adapter through rte_event_eth_rx_adapter_queue_add.

The max vector size, vector timeout define the vector size and
mempool used for allocating vector event are configured through
rte_event_eth_rx_adapter_queue_add. The element size of the element
in the vector pool should be equal to
    sizeof(struct rte_event_vector) + (vector_sz * sizeof(uintptr_t))

Application can use `rte_event_vector_pool_create` to create the
vector mempool used for
rte_event_eth_rx_adapter_queue_conf::vector_mp.

The Rx adapter would be responsible for vectorizing the mbufs
based on the flow, the vector limits configured by the application
and add the vector event of mbufs to the event queue set via
rte_event_eth_rx_adapter_queue_conf::ev::queue_id.
It should also mark rte_event_vector::union_valid and fill
rte_event_vector::port, rte_event_vector::queue.

Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
---
 .../prog_guide/event_ethernet_rx_adapter.rst  | 38 ++++++++
 .../rte_event_eth_rx_adapter.h                | 95 +++++++++++++++++++
 lib/librte_eventdev/rte_eventdev.h            | 30 +++++-
 lib/librte_eventdev/version.map               |  2 +
 4 files changed, 163 insertions(+), 2 deletions(-)

Comments

Kinsella, Ray March 22, 2021, 9:12 a.m. UTC | #1
On 19/03/2021 20:57, pbhagavatula@marvell.com wrote:
> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
> 
> Introduce event ethernet Rx adapter event vector capability.
> 
> If an event eth Rx adapter has the capability of
> RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR then a given Rx queue
> can be configured to enable event vectorization by passing the
> flag RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR to
> rte_event_eth_rx_adapter_queue_conf::rx_queue_flags while configuring
> Rx adapter through rte_event_eth_rx_adapter_queue_add.
> 
> The max vector size, vector timeout define the vector size and
> mempool used for allocating vector event are configured through
> rte_event_eth_rx_adapter_queue_add. The element size of the element
> in the vector pool should be equal to
>     sizeof(struct rte_event_vector) + (vector_sz * sizeof(uintptr_t))
> 
> Application can use `rte_event_vector_pool_create` to create the
> vector mempool used for
> rte_event_eth_rx_adapter_queue_conf::vector_mp.
> 
> The Rx adapter would be responsible for vectorizing the mbufs
> based on the flow, the vector limits configured by the application
> and add the vector event of mbufs to the event queue set via
> rte_event_eth_rx_adapter_queue_conf::ev::queue_id.
> It should also mark rte_event_vector::union_valid and fill
> rte_event_vector::port, rte_event_vector::queue.
> 
> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
> ---
>  .../prog_guide/event_ethernet_rx_adapter.rst  | 38 ++++++++
>  .../rte_event_eth_rx_adapter.h                | 95 +++++++++++++++++++
>  lib/librte_eventdev/rte_eventdev.h            | 30 +++++-
>  lib/librte_eventdev/version.map               |  2 +
>  4 files changed, 163 insertions(+), 2 deletions(-)
> 

Seems strange that you add the forward declaration of the symbol,
and you also detail the symbol in the map file, indicating how the symbol should be treated. 

But the patch is missing the symbol implementation itself, it should be here right?
Pavan Nikhilesh Bhagavatula March 22, 2021, 10:07 a.m. UTC | #2
>On 19/03/2021 20:57, pbhagavatula@marvell.com wrote:
>> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
>>
>> Introduce event ethernet Rx adapter event vector capability.
>>
>> If an event eth Rx adapter has the capability of
>> RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR then a given Rx
>queue
>> can be configured to enable event vectorization by passing the
>> flag RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR to
>> rte_event_eth_rx_adapter_queue_conf::rx_queue_flags while
>configuring
>> Rx adapter through rte_event_eth_rx_adapter_queue_add.
>>
>> The max vector size, vector timeout define the vector size and
>> mempool used for allocating vector event are configured through
>> rte_event_eth_rx_adapter_queue_add. The element size of the
>element
>> in the vector pool should be equal to
>>     sizeof(struct rte_event_vector) + (vector_sz * sizeof(uintptr_t))
>>
>> Application can use `rte_event_vector_pool_create` to create the
>> vector mempool used for
>> rte_event_eth_rx_adapter_queue_conf::vector_mp.
>>
>> The Rx adapter would be responsible for vectorizing the mbufs
>> based on the flow, the vector limits configured by the application
>> and add the vector event of mbufs to the event queue set via
>> rte_event_eth_rx_adapter_queue_conf::ev::queue_id.
>> It should also mark rte_event_vector::union_valid and fill
>> rte_event_vector::port, rte_event_vector::queue.
>>
>> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
>> ---
>>  .../prog_guide/event_ethernet_rx_adapter.rst  | 38 ++++++++
>>  .../rte_event_eth_rx_adapter.h                | 95 +++++++++++++++++++
>>  lib/librte_eventdev/rte_eventdev.h            | 30 +++++-
>>  lib/librte_eventdev/version.map               |  2 +
>>  4 files changed, 163 insertions(+), 2 deletions(-)
>>
>
>Seems strange that you add the forward declaration of the symbol,
>and you also detail the symbol in the map file, indicating how the
>symbol should be treated.

I wanted to have only spec change here to make it easier for review,
the actual implementation is in [4/8].

>
>But the patch is missing the symbol implementation itself, it should be
>here right?
>

I will add a skeleton implementation here.

>
Kinsella, Ray March 22, 2021, 11:07 a.m. UTC | #3
On 22/03/2021 10:07, Pavan Nikhilesh Bhagavatula wrote:
> 
>> On 19/03/2021 20:57, pbhagavatula@marvell.com wrote:
>>> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
>>>
>>> Introduce event ethernet Rx adapter event vector capability.
>>>
>>> If an event eth Rx adapter has the capability of
>>> RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR then a given Rx
>> queue
>>> can be configured to enable event vectorization by passing the
>>> flag RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR to
>>> rte_event_eth_rx_adapter_queue_conf::rx_queue_flags while
>> configuring
>>> Rx adapter through rte_event_eth_rx_adapter_queue_add.
>>>
>>> The max vector size, vector timeout define the vector size and
>>> mempool used for allocating vector event are configured through
>>> rte_event_eth_rx_adapter_queue_add. The element size of the
>> element
>>> in the vector pool should be equal to
>>>     sizeof(struct rte_event_vector) + (vector_sz * sizeof(uintptr_t))
>>>
>>> Application can use `rte_event_vector_pool_create` to create the
>>> vector mempool used for
>>> rte_event_eth_rx_adapter_queue_conf::vector_mp.
>>>
>>> The Rx adapter would be responsible for vectorizing the mbufs
>>> based on the flow, the vector limits configured by the application
>>> and add the vector event of mbufs to the event queue set via
>>> rte_event_eth_rx_adapter_queue_conf::ev::queue_id.
>>> It should also mark rte_event_vector::union_valid and fill
>>> rte_event_vector::port, rte_event_vector::queue.
>>>
>>> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
>>> ---
>>>  .../prog_guide/event_ethernet_rx_adapter.rst  | 38 ++++++++
>>>  .../rte_event_eth_rx_adapter.h                | 95 +++++++++++++++++++
>>>  lib/librte_eventdev/rte_eventdev.h            | 30 +++++-
>>>  lib/librte_eventdev/version.map               |  2 +
>>>  4 files changed, 163 insertions(+), 2 deletions(-)
>>>
>>
>> Seems strange that you add the forward declaration of the symbol,
>> and you also detail the symbol in the map file, indicating how the
>> symbol should be treated.
> 
> I wanted to have only spec change here to make it easier for review,
> the actual implementation is in [4/8].
> 
>>
>> But the patch is missing the symbol implementation itself, it should be
>> here right?
>>
> 
> I will add a skeleton implementation here.

perfect.
> 
>>
>
Jerin Jacob March 23, 2021, 4:56 p.m. UTC | #4
On Sat, Mar 20, 2021 at 2:27 AM <pbhagavatula@marvell.com> wrote:
>
> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
>
> Introduce event ethernet Rx adapter event vector capability.
>
> If an event eth Rx adapter has the capability of
> RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR then a given Rx queue
> can be configured to enable event vectorization by passing the
> flag RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR to
> rte_event_eth_rx_adapter_queue_conf::rx_queue_flags while configuring
> Rx adapter through rte_event_eth_rx_adapter_queue_add.

through rte_event_eth_rx_adapter_queue_add()

>
> The max vector size, vector timeout define the vector size and
> mempool used for allocating vector event are configured through
> rte_event_eth_rx_adapter_queue_add. The element size of the element
> in the vector pool should be equal to
>     sizeof(struct rte_event_vector) + (vector_sz * sizeof(uintptr_t))
>
> Application can use `rte_event_vector_pool_create` to create the
> vector mempool used for
> rte_event_eth_rx_adapter_queue_conf::vector_mp.
>
> The Rx adapter would be responsible for vectorizing the mbufs
> based on the flow, the vector limits configured by the application
> and add the vector event of mbufs to the event queue set via
> rte_event_eth_rx_adapter_queue_conf::ev::queue_id.
> It should also mark rte_event_vector::union_valid and fill
> rte_event_vector::port, rte_event_vector::queue.
>
> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>


Please find below some comments.
Feel free to add Acked-by: Jerin Jacob <jerinj@marvell.com> after
addressing those and Ray's comment.


> ---
>  .../prog_guide/event_ethernet_rx_adapter.rst  | 38 ++++++++
>  .../rte_event_eth_rx_adapter.h                | 95 +++++++++++++++++++
>  lib/librte_eventdev/rte_eventdev.h            | 30 +++++-
>  lib/librte_eventdev/version.map               |  2 +
>  4 files changed, 163 insertions(+), 2 deletions(-)
>

>  /**
>   * A structure used to retrieve statistics for an eth rx adapter instance.
>   */
> @@ -199,6 +233,22 @@ struct rte_event_eth_rx_adapter_stats {
>         /**< Received packet count for interrupt mode Rx queues */
>  };
>
> +/**
> + * A structure used to retrieve eth rx adapter vector limits.
> + */
> +struct rte_event_eth_rx_adapter_vector_limits {
> +       uint16_t min_sz;
> +       /**< Minimum vector limit configurable. */

Please add @see to rte_event_eth_rx_adapter_event_vector_config::vector_sz

> +       uint16_t max_sz;

Please add @see to rte_event_eth_rx_adapter_event_vector_config::vector_sz

> +       /**< Maximum vector limit configurable. */
> +       uint8_t log2_sz;

I think, we can change to bool and comment as "True if  the size
configured should be in log2"

Please add @see to rte_event_eth_rx_adapter_event_vector_config::vector_sz


> +       /**< The size configured should be in log2. */
> +       uint64_t min_timeout_ns;
> +       /**< Minimum vector timeout configurable. */

Please add @see to
rte_event_eth_rx_adapter_event_vector_config::vector_timeout_ns

> +       uint64_t max_timeout_ns;
> +       /**< Maximum vector timeout configurable. */

Please add @see to
rte_event_eth_rx_adapter_event_vector_config::vector_timeout_ns

> +};
> +
>  /**
>   *
>   * Callback function invoked by the SW adapter before it continues
> @@ -467,6 +517,51 @@ int rte_event_eth_rx_adapter_cb_register(uint8_t id, uint16_t eth_dev_id,
>                                          rte_event_eth_rx_adapter_cb_fn cb_fn,
>                                          void *cb_arg);
>
> +/**
> + * Retrieve vector limits for a given event dev and eth dev pair.
> + * @see rte_event_eth_rx_adapter_vector_limits
> + *
> + * @param dev_id
> + *  Event device identifier.
> + * @param eth_port_id
> + *  Port identifier of the ethernet device.
> + * @param [out] limits
> + *  A pointer to rte_event_eth_rx_adapter_vector_limits structure that has to
> + * be filled.
> + *
> + * @return
> + *  - 0: Success.
> + *  - <0: Error code on failure.
> + */
> +__rte_experimental
> +int rte_event_eth_rx_adapter_vector_limits_get(
> +       uint8_t dev_id, uint16_t eth_port_id,
> +       struct rte_event_eth_rx_adapter_vector_limits *limits);
> +
> +/**
> + * 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);
> +
>  #ifdef __cplusplus
>  }
>  #endif
> diff --git a/lib/librte_eventdev/rte_eventdev.h b/lib/librte_eventdev/rte_eventdev.h
> index 5586a3f15..1be79b856 100644
> --- a/lib/librte_eventdev/rte_eventdev.h
> +++ b/lib/librte_eventdev/rte_eventdev.h
> @@ -919,9 +919,27 @@ rte_event_dev_close(uint8_t dev_id);
>   * Event vector structure.
>   */
>  struct rte_event_vector {
> -       uint64_t nb_elem : 16;
> +       uint16_t nb_elem;
>         /**< Number of elements in this event vector. */
> -       uint64_t rsvd : 48;
> +       uint16_t rsvd : 15;
> +       uint16_t attr_valid : 1;
> +       /**< Indicates that the below union attributes have valid information.
> +        */
> +       union {
> +               /* Used by Rx adapter.
> +                * Indicats that all the elements in this vector belong to same

Indicats -> Indicates
to same -> to the same

> +                * port and queue pair when originating from Rx adapter, valid
> +                * only when event type is ETHDEV_VECTOR or
> +                * ETH_RX_ADAPTER_VECTOR.
> +                */
> +               struct {
> +                       uint16_t port;
> +                       /* Ethernet device port id. */
> +                       uint16_t queue;
> +                       /* Ethernet device queue id. */
> +               };
> +       };
> +       /**< Union to hold common attributes of the vector array. */
>         uint64_t impl_opaque;
>         union {
>                 struct rte_mbuf *mbufs[0];
> @@ -1019,8 +1037,14 @@ struct rte_event_vector {
>   *             // Classify and handle event.
>   *     }
>   */
> +#define RTE_EVENT_TYPE_ETHDEV_VECTOR                                           \
> +       (RTE_EVENT_TYPE_VECTOR | RTE_EVENT_TYPE_ETHDEV)
> +/**< The event vector generated from ethdev subsystem */
>  #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_ETH_RX_ADAPTER_VECTOR                                   \
> +       (RTE_EVENT_TYPE_VECTOR | RTE_EVENT_TYPE_ETH_RX_ADAPTER)
> +/**< The event vector generated from eth Rx adapter. */
>
>  #define RTE_EVENT_TYPE_MAX              0x10
>  /**< Maximum number of event types */
> @@ -1165,6 +1189,8 @@ struct rte_event {
>   * @see struct rte_event_eth_rx_adapter_queue_conf::ev
>   * @see struct rte_event_eth_rx_adapter_queue_conf::rx_queue_flags
>   */
> +#define RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR      0x8
> +/**< Adapter supports event vectorization per ethdev. */
>
>  /**
>   * Retrieve the event device's ethdev Rx adapter capabilities for the
> diff --git a/lib/librte_eventdev/version.map b/lib/librte_eventdev/version.map
> index a070ef56e..902df0ae3 100644
> --- a/lib/librte_eventdev/version.map
> +++ b/lib/librte_eventdev/version.map
> @@ -141,6 +141,8 @@ 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
>
diff mbox series

Patch

diff --git a/doc/guides/prog_guide/event_ethernet_rx_adapter.rst b/doc/guides/prog_guide/event_ethernet_rx_adapter.rst
index cb44ce0e4..5eefef355 100644
--- a/doc/guides/prog_guide/event_ethernet_rx_adapter.rst
+++ b/doc/guides/prog_guide/event_ethernet_rx_adapter.rst
@@ -186,3 +186,41 @@  the event buffer fill level is low. The
 ``rte_event_eth_rx_adapter_cb_register()`` function allow the application
 to register a callback that selects which packets to enqueue to the event
 device.
+
+Rx event vectorization
+~~~~~~~~~~~~~~~~~~~~~~
+
+The event devices, ethernet device pairs which support the capability
+``RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR`` can aggregate packets based on
+flow characteristics and generate a ``rte_event`` containing ``rte_event_vector``
+whose event type is either ``RTE_EVENT_TYPE_ETHDEV_VECTOR`` or
+``RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR``.
+The aggregation size and timeout are configurable at a queue level and the
+maximum, minimum vector sizes and timeouts vary based on the device capability
+and can be queried using ``rte_event_eth_rx_adapter_vector_limits_get``.
+The Rx adapter additionally might include useful data such as ethernet device
+port and queue identifier in the ``rte_event_vector::port`` and
+``rte_event_vector::queue`` and mark ``rte_event_vector::attr_valid`` as true.
+
+A loop processing ``rte_event_vector`` containing mbufs is shown below.
+
+.. code-block:: c
+
+        event = rte_event_dequeue_burst(event_dev, event_port, &event,
+                                        1, 0);
+        if (!event)
+                continue;
+
+        switch (ev.event_type) {
+        case RTE_EVENT_TYPE_ETH_RX_ADAPTER_VECTOR:
+        case RTE_EVENT_TYPE_ETHDEV_VECTOR:
+                struct rte_mbufs **mbufs;
+
+                mbufs = (struct rte_mbufs **)ev[i].vec->mbufs;
+                for (i = 0; i < ev.vec->nb_elem; i++) {
+                        /* Process each mbuf. */
+                }
+        break;
+        case ...
+        ...
+        }
diff --git a/lib/librte_eventdev/rte_event_eth_rx_adapter.h b/lib/librte_eventdev/rte_event_eth_rx_adapter.h
index 21bb1e54c..dda846f57 100644
--- a/lib/librte_eventdev/rte_event_eth_rx_adapter.h
+++ b/lib/librte_eventdev/rte_event_eth_rx_adapter.h
@@ -92,6 +92,10 @@  extern "C" {
 /**< This flag indicates the flow identifier is valid
  * @see rte_event_eth_rx_adapter_queue_conf::rx_queue_flags
  */
+#define RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR	0x2
+/**< This flag indicates that mbufs arriving on the queue need to be vectorized
+ * @see rte_event_eth_rx_adapter_queue_conf::rx_queue_flags
+ */
 
 /**
  * Adapter configuration structure that the adapter configuration callback
@@ -169,6 +173,36 @@  struct rte_event_eth_rx_adapter_queue_conf {
 	 */
 };
 
+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.
+	 * Should be within
+	 * @see rte_event_eth_rx_adapter_vector_limits::min_vector_sz
+	 * @see rte_event_eth_rx_adapter_vector_limits::max_vector_sz
+	 * Valid when RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR flag is set in
+	 * @see rte_event_eth_rx_adapter_queue_conf::rx_queue_flags
+	 */
+	uint64_t vector_timeout_ns;
+	/**<
+	 * Indicates the maximum number of nanoseconds to wait for receiving
+	 * mbufs. Should be within vectorization limits of the
+	 * adapter
+	 * @see rte_event_eth_rx_adapter_vector_limits::min_vector_ns
+	 * @see rte_event_eth_rx_adapter_vector_limits::max_vector_ns
+	 * Valid when RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR flag is set in
+	 * @see rte_event_eth_rx_adapter_queue_conf::rx_queue_flags
+	 */
+	struct rte_mempool *vector_mp;
+	/**<
+	 * Indicates the mempool that should be used for allocating
+	 * rte_event_vector container.
+	 * Should be created by using `rte_event_vector_pool_create`.
+	 * Valid when RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR flag is set in
+	 * @see rte_event_eth_rx_adapter_queue_conf::rx_queue_flags.
+	 */
+};
+
 /**
  * A structure used to retrieve statistics for an eth rx adapter instance.
  */
@@ -199,6 +233,22 @@  struct rte_event_eth_rx_adapter_stats {
 	/**< Received packet count for interrupt mode Rx queues */
 };
 
+/**
+ * A structure used to retrieve eth rx adapter vector limits.
+ */
+struct rte_event_eth_rx_adapter_vector_limits {
+	uint16_t min_sz;
+	/**< Minimum vector limit configurable. */
+	uint16_t max_sz;
+	/**< Maximum vector limit configurable. */
+	uint8_t log2_sz;
+	/**< The size configured should be in log2. */
+	uint64_t min_timeout_ns;
+	/**< Minimum vector timeout configurable. */
+	uint64_t max_timeout_ns;
+	/**< Maximum vector timeout configurable. */
+};
+
 /**
  *
  * Callback function invoked by the SW adapter before it continues
@@ -467,6 +517,51 @@  int rte_event_eth_rx_adapter_cb_register(uint8_t id, uint16_t eth_dev_id,
 					 rte_event_eth_rx_adapter_cb_fn cb_fn,
 					 void *cb_arg);
 
+/**
+ * Retrieve vector limits for a given event dev and eth dev pair.
+ * @see rte_event_eth_rx_adapter_vector_limits
+ *
+ * @param dev_id
+ *  Event device identifier.
+ * @param eth_port_id
+ *  Port identifier of the ethernet device.
+ * @param [out] limits
+ *  A pointer to rte_event_eth_rx_adapter_vector_limits structure that has to
+ * be filled.
+ *
+ * @return
+ *  - 0: Success.
+ *  - <0: Error code on failure.
+ */
+__rte_experimental
+int rte_event_eth_rx_adapter_vector_limits_get(
+	uint8_t dev_id, uint16_t eth_port_id,
+	struct rte_event_eth_rx_adapter_vector_limits *limits);
+
+/**
+ * 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);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/lib/librte_eventdev/rte_eventdev.h b/lib/librte_eventdev/rte_eventdev.h
index 5586a3f15..1be79b856 100644
--- a/lib/librte_eventdev/rte_eventdev.h
+++ b/lib/librte_eventdev/rte_eventdev.h
@@ -919,9 +919,27 @@  rte_event_dev_close(uint8_t dev_id);
  * Event vector structure.
  */
 struct rte_event_vector {
-	uint64_t nb_elem : 16;
+	uint16_t nb_elem;
 	/**< Number of elements in this event vector. */
-	uint64_t rsvd : 48;
+	uint16_t rsvd : 15;
+	uint16_t attr_valid : 1;
+	/**< Indicates that the below union attributes have valid information.
+	 */
+	union {
+		/* Used by Rx adapter.
+		 * Indicats that all the elements in this vector belong to same
+		 * port and queue pair when originating from Rx adapter, valid
+		 * only when event type is ETHDEV_VECTOR or
+		 * ETH_RX_ADAPTER_VECTOR.
+		 */
+		struct {
+			uint16_t port;
+			/* Ethernet device port id. */
+			uint16_t queue;
+			/* Ethernet device queue id. */
+		};
+	};
+	/**< Union to hold common attributes of the vector array. */
 	uint64_t impl_opaque;
 	union {
 		struct rte_mbuf *mbufs[0];
@@ -1019,8 +1037,14 @@  struct rte_event_vector {
  *		// Classify and handle event.
  *	}
  */
+#define RTE_EVENT_TYPE_ETHDEV_VECTOR                                           \
+	(RTE_EVENT_TYPE_VECTOR | RTE_EVENT_TYPE_ETHDEV)
+/**< The event vector generated from ethdev subsystem */
 #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_ETH_RX_ADAPTER_VECTOR                                   \
+	(RTE_EVENT_TYPE_VECTOR | RTE_EVENT_TYPE_ETH_RX_ADAPTER)
+/**< The event vector generated from eth Rx adapter. */
 
 #define RTE_EVENT_TYPE_MAX              0x10
 /**< Maximum number of event types */
@@ -1165,6 +1189,8 @@  struct rte_event {
  * @see struct rte_event_eth_rx_adapter_queue_conf::ev
  * @see struct rte_event_eth_rx_adapter_queue_conf::rx_queue_flags
  */
+#define RTE_EVENT_ETH_RX_ADAPTER_CAP_EVENT_VECTOR	0x8
+/**< Adapter supports event vectorization per ethdev. */
 
 /**
  * Retrieve the event device's ethdev Rx adapter capabilities for the
diff --git a/lib/librte_eventdev/version.map b/lib/librte_eventdev/version.map
index a070ef56e..902df0ae3 100644
--- a/lib/librte_eventdev/version.map
+++ b/lib/librte_eventdev/version.map
@@ -141,6 +141,8 @@  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 {