[1/6] eventdev: support to set queue attributes at runtime

Message ID 159a14ece2480a3704ee34ee0d81dda331c16957.1648549553.git.sthotton@marvell.com (mailing list archive)
State Superseded, archived
Delegated to: Jerin Jacob
Headers
Series Extend and set event queue attributes at runtime |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Shijith Thotton March 29, 2022, 1:11 p.m. UTC
  Added a new eventdev API rte_event_queue_attr_set(), to set event queue
attributes at runtime from the values set during initialization using
rte_event_queue_setup(). PMD's supporting this feature should expose the
capability RTE_EVENT_DEV_CAP_RUNTIME_QUEUE_ATTR.

Signed-off-by: Shijith Thotton <sthotton@marvell.com>
---
 doc/guides/eventdevs/features/default.ini |  1 +
 lib/eventdev/eventdev_pmd.h               | 22 +++++++++++++
 lib/eventdev/rte_eventdev.c               | 31 ++++++++++++++++++
 lib/eventdev/rte_eventdev.h               | 38 ++++++++++++++++++++++-
 lib/eventdev/version.map                  |  3 ++
 5 files changed, 94 insertions(+), 1 deletion(-)
  

Comments

Van Haaren, Harry March 30, 2022, 10:58 a.m. UTC | #1
> -----Original Message-----
> From: Shijith Thotton <sthotton@marvell.com>
> Sent: Tuesday, March 29, 2022 2:11 PM
> To: dev@dpdk.org; jerinj@marvell.com
> Cc: Shijith Thotton <sthotton@marvell.com>; pbhagavatula@marvell.com; Ray
> Kinsella <mdr@ashroe.eu>
> Subject: [PATCH 1/6] eventdev: support to set queue attributes at runtime

<snip>

> +/**
> + * Set an event queue attribute at runtime.
> + *
> + * @param dev
> + *   Event device pointer
> + * @param queue_id
> + *   Event queue index
> + * @param attr_id
> + *   Event queue attribute id
> + * @param attr_value
> + *   Event queue attribute value
> + *
> + * @return
> + *  - 0: Success.
> + *  - <0: Error code on failure.
> + */
> +typedef int (*eventdev_queue_attr_set_t)(struct rte_eventdev *dev,
> +					 uint8_t queue_id, uint32_t attr_id,
> +					 uint32_t attr_value);

Is using a uint64_t a better type for attr_value? Given there might be more in future,
limiting to 32-bits now may cause headaches later, and uint64_t doesn't cost extra?

I think 32-bits of attr_id is enough :)

Same comment on the _get() API in patch 2/6, a uint64_t * would be a better fit there in my opinion.

<snip>
  
Mattias Rönnblom March 30, 2022, 12:14 p.m. UTC | #2
On 2022-03-29 15:11, Shijith Thotton wrote:
> Added a new eventdev API rte_event_queue_attr_set(), to set event queue
> attributes at runtime from the values set during initialization using
> rte_event_queue_setup(). PMD's supporting this feature should expose the
> capability RTE_EVENT_DEV_CAP_RUNTIME_QUEUE_ATTR.
>
> Signed-off-by: Shijith Thotton <sthotton@marvell.com>
> ---
>   doc/guides/eventdevs/features/default.ini |  1 +
>   lib/eventdev/eventdev_pmd.h               | 22 +++++++++++++
>   lib/eventdev/rte_eventdev.c               | 31 ++++++++++++++++++
>   lib/eventdev/rte_eventdev.h               | 38 ++++++++++++++++++++++-
>   lib/eventdev/version.map                  |  3 ++
>   5 files changed, 94 insertions(+), 1 deletion(-)
>
> diff --git a/doc/guides/eventdevs/features/default.ini b/doc/guides/eventdevs/features/default.ini
> index 2ea233463a..00360f60c6 100644
> --- a/doc/guides/eventdevs/features/default.ini
> +++ b/doc/guides/eventdevs/features/default.ini
> @@ -17,6 +17,7 @@ runtime_port_link          =
>   multiple_queue_port        =
>   carry_flow_id              =
>   maintenance_free           =
> +runtime_queue_attr         =
>   
>   ;
>   ; Features of a default Ethernet Rx adapter.
> diff --git a/lib/eventdev/eventdev_pmd.h b/lib/eventdev/eventdev_pmd.h
> index ce469d47a6..6182749503 100644
> --- a/lib/eventdev/eventdev_pmd.h
> +++ b/lib/eventdev/eventdev_pmd.h
> @@ -341,6 +341,26 @@ typedef int (*eventdev_queue_setup_t)(struct rte_eventdev *dev,
>   typedef void (*eventdev_queue_release_t)(struct rte_eventdev *dev,
>   		uint8_t queue_id);
>   
> +/**
> + * Set an event queue attribute at runtime.
> + *
> + * @param dev
> + *   Event device pointer
> + * @param queue_id
> + *   Event queue index
> + * @param attr_id
> + *   Event queue attribute id
> + * @param attr_value
> + *   Event queue attribute value
> + *
> + * @return
> + *  - 0: Success.
> + *  - <0: Error code on failure.
> + */
> +typedef int (*eventdev_queue_attr_set_t)(struct rte_eventdev *dev,
> +					 uint8_t queue_id, uint32_t attr_id,
> +					 uint32_t attr_value);
> +
>   /**
>    * Retrieve the default event port configuration.
>    *
> @@ -1211,6 +1231,8 @@ struct eventdev_ops {
>   	/**< Set up an event queue. */
>   	eventdev_queue_release_t queue_release;
>   	/**< Release an event queue. */
> +	eventdev_queue_attr_set_t queue_attr_set;
> +	/**< Set an event queue attribute. */
>   
>   	eventdev_port_default_conf_get_t port_def_conf;
>   	/**< Get default port configuration. */
> diff --git a/lib/eventdev/rte_eventdev.c b/lib/eventdev/rte_eventdev.c
> index 532a253553..13c8af877e 100644
> --- a/lib/eventdev/rte_eventdev.c
> +++ b/lib/eventdev/rte_eventdev.c
> @@ -844,6 +844,37 @@ rte_event_queue_attr_get(uint8_t dev_id, uint8_t queue_id, uint32_t attr_id,
>   	return 0;
>   }
>   
> +int
> +rte_event_queue_attr_set(uint8_t dev_id, uint8_t queue_id, uint32_t attr_id,
> +			 uint32_t attr_value)
> +{
> +	struct rte_eventdev *dev;
> +
> +	RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
> +	dev = &rte_eventdevs[dev_id];
> +	if (!is_valid_queue(dev, queue_id)) {
> +		RTE_EDEV_LOG_ERR("Invalid queue_id=%" PRIu8, queue_id);
> +		return -EINVAL;
> +	}
> +
> +	if (attr_id > RTE_EVENT_QUEUE_ATTR_MAX) {
> +		RTE_EDEV_LOG_ERR("Invalid attribute ID %" PRIu8, attr_id);
> +		return -EINVAL;
> +	}
> +
> +	if (!(dev->data->event_dev_cap &
> +	      RTE_EVENT_DEV_CAP_RUNTIME_QUEUE_ATTR)) {
> +		RTE_EDEV_LOG_ERR(
> +			"Device %" PRIu8 "does not support changing queue attributes at runtime",
> +			dev_id);
> +		return -ENOTSUP;
> +	}
> +
> +	RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->queue_attr_set, -ENOTSUP);
> +	return (*dev->dev_ops->queue_attr_set)(dev, queue_id, attr_id,
> +					       attr_value);
> +}
> +
>   int
>   rte_event_port_link(uint8_t dev_id, uint8_t port_id,
>   		    const uint8_t queues[], const uint8_t priorities[],
> diff --git a/lib/eventdev/rte_eventdev.h b/lib/eventdev/rte_eventdev.h
> index 42a5660169..19710cd0c5 100644
> --- a/lib/eventdev/rte_eventdev.h
> +++ b/lib/eventdev/rte_eventdev.h
> @@ -225,7 +225,7 @@ struct rte_event;
>   /**< Event scheduling prioritization is based on the priority associated with
>    *  each event queue.
>    *
> - *  @see rte_event_queue_setup()
> + *  @see rte_event_queue_setup(), rte_event_queue_attr_set()
>    */
>   #define RTE_EVENT_DEV_CAP_EVENT_QOS           (1ULL << 1)
>   /**< Event scheduling prioritization is based on the priority associated with
> @@ -307,6 +307,13 @@ struct rte_event;
>    * global pool, or process signaling related to load balancing.
>    */
>   
> +#define RTE_EVENT_DEV_CAP_RUNTIME_QUEUE_ATTR (1ULL << 11)
> +/**< Event device is capable of changing the queue attributes at runtime i.e after
> + * rte_event_queue_setup() or rte_event_start() call sequence. If this flag is
> + * not set, eventdev queue attributes can only be configured during
> + * rte_event_queue_setup().
> + */
> +
>   /* Event device priority levels */
>   #define RTE_EVENT_DEV_PRIORITY_HIGHEST   0
>   /**< Highest priority expressed across eventdev subsystem
> @@ -678,6 +685,11 @@ rte_event_queue_setup(uint8_t dev_id, uint8_t queue_id,
>    */
>   #define RTE_EVENT_QUEUE_ATTR_SCHEDULE_TYPE 4
>   
> +/**
> + * Maximum supported attribute ID.
> + */
> +#define RTE_EVENT_QUEUE_ATTR_MAX RTE_EVENT_QUEUE_ATTR_SCHEDULE_TYPE
> +

This #define will assure that every new attribute breaks the ABI. Is 
that intentional?

>   /**
>    * Get an attribute from a queue.
>    *
> @@ -702,6 +714,30 @@ int
>   rte_event_queue_attr_get(uint8_t dev_id, uint8_t queue_id, uint32_t attr_id,
>   			uint32_t *attr_value);
>   
> +/**
> + * Set an event queue attribute.
> + *
> + * @param dev_id
> + *   Eventdev id
> + * @param queue_id
> + *   Eventdev queue id
> + * @param attr_id
> + *   The attribute ID to set
> + * @param attr_value
> + *   The attribute value to set
> + *
> + * @return
> + *   - 0: Successfully set attribute.
> + *   - -EINVAL: invalid device, queue or attr_id.
> + *   - -ENOTSUP: device does not support setting event attribute.
> + *   - -EBUSY: device is in running state
> + *   - <0: failed to set event queue attribute
> + */
> +__rte_experimental
> +int
> +rte_event_queue_attr_set(uint8_t dev_id, uint8_t queue_id, uint32_t attr_id,
> +			 uint32_t attr_value);
> +
>   /* Event port specific APIs */
>   
>   /* Event port configuration bitmap flags */
> diff --git a/lib/eventdev/version.map b/lib/eventdev/version.map
> index cd5dada07f..c581b75c18 100644
> --- a/lib/eventdev/version.map
> +++ b/lib/eventdev/version.map
> @@ -108,6 +108,9 @@ EXPERIMENTAL {
>   
>   	# added in 22.03
>   	rte_event_eth_rx_adapter_event_port_get;
> +
> +	# added in 22.07
> +	rte_event_queue_attr_set;
>   };
>   
>   INTERNAL {
  
Shijith Thotton April 4, 2022, 9:35 a.m. UTC | #3
><snip>
>
>> +/**
>> + * Set an event queue attribute at runtime.
>> + *
>> + * @param dev
>> + *   Event device pointer
>> + * @param queue_id
>> + *   Event queue index
>> + * @param attr_id
>> + *   Event queue attribute id
>> + * @param attr_value
>> + *   Event queue attribute value
>> + *
>> + * @return
>> + *  - 0: Success.
>> + *  - <0: Error code on failure.
>> + */
>> +typedef int (*eventdev_queue_attr_set_t)(struct rte_eventdev *dev,
>> +					 uint8_t queue_id, uint32_t attr_id,
>> +					 uint32_t attr_value);
>
>Is using a uint64_t a better type for attr_value? Given there might be more in
>future,
>limiting to 32-bits now may cause headaches later, and uint64_t doesn't cost
>extra?
>
>I think 32-bits of attr_id is enough :)
>
>Same comment on the _get() API in patch 2/6, a uint64_t * would be a better fit
>there in my opinion.
>
><snip>
 
Changing size of attr_value will an ABI break. Can we wait till a need arises ?
  
Van Haaren, Harry April 4, 2022, 9:45 a.m. UTC | #4
> -----Original Message-----
> From: Shijith Thotton <sthotton@marvell.com>
> Sent: Monday, April 4, 2022 10:36 AM
> To: Van Haaren, Harry <harry.van.haaren@intel.com>; dev@dpdk.org; Jerin Jacob
> Kollanukkaran <jerinj@marvell.com>
> Cc: Pavan Nikhilesh Bhagavatula <pbhagavatula@marvell.com>; Ray Kinsella
> <mdr@ashroe.eu>
> Subject: RE: [PATCH 1/6] eventdev: support to set queue attributes at runtime
> 
> ><snip>
> >
> >> +/**
> >> + * Set an event queue attribute at runtime.
> >> + *
> >> + * @param dev
> >> + *   Event device pointer
> >> + * @param queue_id
> >> + *   Event queue index
> >> + * @param attr_id
> >> + *   Event queue attribute id
> >> + * @param attr_value
> >> + *   Event queue attribute value
> >> + *
> >> + * @return
> >> + *  - 0: Success.
> >> + *  - <0: Error code on failure.
> >> + */
> >> +typedef int (*eventdev_queue_attr_set_t)(struct rte_eventdev *dev,
> >> +					 uint8_t queue_id, uint32_t attr_id,
> >> +					 uint32_t attr_value);
> >
> >Is using a uint64_t a better type for attr_value? Given there might be more in
> >future,
> >limiting to 32-bits now may cause headaches later, and uint64_t doesn't cost
> >extra?
> >
> >I think 32-bits of attr_id is enough :)
> >
> >Same comment on the _get() API in patch 2/6, a uint64_t * would be a better fit
> >there in my opinion.
> >
> ><snip>
> 
> Changing size of attr_value will an ABI break. Can we wait till a need arises ?

Ah, I forgot that the _get() function is already upstream in DPDK today.

Its actually an API *and* ABI break, which is worse, as user code would have to
change (not just a re-compile against the newer DPDK version...). Any application
attempting source-compatibility with 21.11 and 22.11 would have to #ifdef the
parameter, switching uint32_t* and uint64_t*... or use some magic void* hacks.

Yes I suppose that waiting until a u64 is required for a real-world use-case is probably
better than breaking existing users code today (or in next ABI breaking release) with the
intent of getting to "perfect" API/ABIs...

Suggest to use a u64 for _set() to avoid getting into this same situation again,
but leave _get() as is, until it is required to change for a real use-case?
  
Shijith Thotton April 4, 2022, 11:45 a.m. UTC | #5
>> Added a new eventdev API rte_event_queue_attr_set(), to set event queue
>> attributes at runtime from the values set during initialization using
>> rte_event_queue_setup(). PMD's supporting this feature should expose the
>> capability RTE_EVENT_DEV_CAP_RUNTIME_QUEUE_ATTR.
>>
>> Signed-off-by: Shijith Thotton <sthotton@marvell.com>
>> ---
>>   doc/guides/eventdevs/features/default.ini |  1 +
>>   lib/eventdev/eventdev_pmd.h               | 22 +++++++++++++
>>   lib/eventdev/rte_eventdev.c               | 31 ++++++++++++++++++
>>   lib/eventdev/rte_eventdev.h               | 38 ++++++++++++++++++++++-
>>   lib/eventdev/version.map                  |  3 ++
>>   5 files changed, 94 insertions(+), 1 deletion(-)
>>
>> diff --git a/doc/guides/eventdevs/features/default.ini
>b/doc/guides/eventdevs/features/default.ini
>> index 2ea233463a..00360f60c6 100644
>> --- a/doc/guides/eventdevs/features/default.ini
>> +++ b/doc/guides/eventdevs/features/default.ini
>> @@ -17,6 +17,7 @@ runtime_port_link          =
>>   multiple_queue_port        =
>>   carry_flow_id              =
>>   maintenance_free           =
>> +runtime_queue_attr         =
>>
>>   ;
>>   ; Features of a default Ethernet Rx adapter.
>> diff --git a/lib/eventdev/eventdev_pmd.h b/lib/eventdev/eventdev_pmd.h
>> index ce469d47a6..6182749503 100644
>> --- a/lib/eventdev/eventdev_pmd.h
>> +++ b/lib/eventdev/eventdev_pmd.h
>> @@ -341,6 +341,26 @@ typedef int (*eventdev_queue_setup_t)(struct
>rte_eventdev *dev,
>>   typedef void (*eventdev_queue_release_t)(struct rte_eventdev *dev,
>>   		uint8_t queue_id);
>>
>> +/**
>> + * Set an event queue attribute at runtime.
>> + *
>> + * @param dev
>> + *   Event device pointer
>> + * @param queue_id
>> + *   Event queue index
>> + * @param attr_id
>> + *   Event queue attribute id
>> + * @param attr_value
>> + *   Event queue attribute value
>> + *
>> + * @return
>> + *  - 0: Success.
>> + *  - <0: Error code on failure.
>> + */
>> +typedef int (*eventdev_queue_attr_set_t)(struct rte_eventdev *dev,
>> +					 uint8_t queue_id, uint32_t attr_id,
>> +					 uint32_t attr_value);
>> +
>>   /**
>>    * Retrieve the default event port configuration.
>>    *
>> @@ -1211,6 +1231,8 @@ struct eventdev_ops {
>>   	/**< Set up an event queue. */
>>   	eventdev_queue_release_t queue_release;
>>   	/**< Release an event queue. */
>> +	eventdev_queue_attr_set_t queue_attr_set;
>> +	/**< Set an event queue attribute. */
>>
>>   	eventdev_port_default_conf_get_t port_def_conf;
>>   	/**< Get default port configuration. */
>> diff --git a/lib/eventdev/rte_eventdev.c b/lib/eventdev/rte_eventdev.c
>> index 532a253553..13c8af877e 100644
>> --- a/lib/eventdev/rte_eventdev.c
>> +++ b/lib/eventdev/rte_eventdev.c
>> @@ -844,6 +844,37 @@ rte_event_queue_attr_get(uint8_t dev_id, uint8_t
>queue_id, uint32_t attr_id,
>>   	return 0;
>>   }
>>
>> +int
>> +rte_event_queue_attr_set(uint8_t dev_id, uint8_t queue_id, uint32_t attr_id,
>> +			 uint32_t attr_value)
>> +{
>> +	struct rte_eventdev *dev;
>> +
>> +	RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
>> +	dev = &rte_eventdevs[dev_id];
>> +	if (!is_valid_queue(dev, queue_id)) {
>> +		RTE_EDEV_LOG_ERR("Invalid queue_id=%" PRIu8, queue_id);
>> +		return -EINVAL;
>> +	}
>> +
>> +	if (attr_id > RTE_EVENT_QUEUE_ATTR_MAX) {
>> +		RTE_EDEV_LOG_ERR("Invalid attribute ID %" PRIu8, attr_id);
>> +		return -EINVAL;
>> +	}
>> +
>> +	if (!(dev->data->event_dev_cap &
>> +	      RTE_EVENT_DEV_CAP_RUNTIME_QUEUE_ATTR)) {
>> +		RTE_EDEV_LOG_ERR(
>> +			"Device %" PRIu8 "does not support changing queue
>attributes at runtime",
>> +			dev_id);
>> +		return -ENOTSUP;
>> +	}
>> +
>> +	RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->queue_attr_set, -
>ENOTSUP);
>> +	return (*dev->dev_ops->queue_attr_set)(dev, queue_id, attr_id,
>> +					       attr_value);
>> +}
>> +
>>   int
>>   rte_event_port_link(uint8_t dev_id, uint8_t port_id,
>>   		    const uint8_t queues[], const uint8_t priorities[],
>> diff --git a/lib/eventdev/rte_eventdev.h b/lib/eventdev/rte_eventdev.h
>> index 42a5660169..19710cd0c5 100644
>> --- a/lib/eventdev/rte_eventdev.h
>> +++ b/lib/eventdev/rte_eventdev.h
>> @@ -225,7 +225,7 @@ struct rte_event;
>>   /**< Event scheduling prioritization is based on the priority associated with
>>    *  each event queue.
>>    *
>> - *  @see rte_event_queue_setup()
>> + *  @see rte_event_queue_setup(), rte_event_queue_attr_set()
>>    */
>>   #define RTE_EVENT_DEV_CAP_EVENT_QOS           (1ULL << 1)
>>   /**< Event scheduling prioritization is based on the priority associated with
>> @@ -307,6 +307,13 @@ struct rte_event;
>>    * global pool, or process signaling related to load balancing.
>>    */
>>
>> +#define RTE_EVENT_DEV_CAP_RUNTIME_QUEUE_ATTR (1ULL << 11)
>> +/**< Event device is capable of changing the queue attributes at runtime i.e
>after
>> + * rte_event_queue_setup() or rte_event_start() call sequence. If this flag is
>> + * not set, eventdev queue attributes can only be configured during
>> + * rte_event_queue_setup().
>> + */
>> +
>>   /* Event device priority levels */
>>   #define RTE_EVENT_DEV_PRIORITY_HIGHEST   0
>>   /**< Highest priority expressed across eventdev subsystem
>> @@ -678,6 +685,11 @@ rte_event_queue_setup(uint8_t dev_id, uint8_t
>queue_id,
>>    */
>>   #define RTE_EVENT_QUEUE_ATTR_SCHEDULE_TYPE 4
>>
>> +/**
>> + * Maximum supported attribute ID.
>> + */
>> +#define RTE_EVENT_QUEUE_ATTR_MAX
>RTE_EVENT_QUEUE_ATTR_SCHEDULE_TYPE
>> +
>
>This #define will assure that every new attribute breaks the ABI. Is
>that intentional?
>
 
Will remove .

>>   /**
>>    * Get an attribute from a queue.
>>    *
>> @@ -702,6 +714,30 @@ int
>>   rte_event_queue_attr_get(uint8_t dev_id, uint8_t queue_id, uint32_t attr_id,
>>   			uint32_t *attr_value);
>>
>> +/**
>> + * Set an event queue attribute.
>> + *
>> + * @param dev_id
>> + *   Eventdev id
>> + * @param queue_id
>> + *   Eventdev queue id
>> + * @param attr_id
>> + *   The attribute ID to set
>> + * @param attr_value
>> + *   The attribute value to set
>> + *
>> + * @return
>> + *   - 0: Successfully set attribute.
>> + *   - -EINVAL: invalid device, queue or attr_id.
>> + *   - -ENOTSUP: device does not support setting event attribute.
>> + *   - -EBUSY: device is in running state
>> + *   - <0: failed to set event queue attribute
>> + */
>> +__rte_experimental
>> +int
>> +rte_event_queue_attr_set(uint8_t dev_id, uint8_t queue_id, uint32_t attr_id,
>> +			 uint32_t attr_value);
>> +
>>   /* Event port specific APIs */
>>
>>   /* Event port configuration bitmap flags */
>> diff --git a/lib/eventdev/version.map b/lib/eventdev/version.map
>> index cd5dada07f..c581b75c18 100644
>> --- a/lib/eventdev/version.map
>> +++ b/lib/eventdev/version.map
>> @@ -108,6 +108,9 @@ EXPERIMENTAL {
>>
>>   	# added in 22.03
>>   	rte_event_eth_rx_adapter_event_port_get;
>> +
>> +	# added in 22.07
>> +	rte_event_queue_attr_set;
>>   };
>>
>>   INTERNAL {
  

Patch

diff --git a/doc/guides/eventdevs/features/default.ini b/doc/guides/eventdevs/features/default.ini
index 2ea233463a..00360f60c6 100644
--- a/doc/guides/eventdevs/features/default.ini
+++ b/doc/guides/eventdevs/features/default.ini
@@ -17,6 +17,7 @@  runtime_port_link          =
 multiple_queue_port        =
 carry_flow_id              =
 maintenance_free           =
+runtime_queue_attr         =
 
 ;
 ; Features of a default Ethernet Rx adapter.
diff --git a/lib/eventdev/eventdev_pmd.h b/lib/eventdev/eventdev_pmd.h
index ce469d47a6..6182749503 100644
--- a/lib/eventdev/eventdev_pmd.h
+++ b/lib/eventdev/eventdev_pmd.h
@@ -341,6 +341,26 @@  typedef int (*eventdev_queue_setup_t)(struct rte_eventdev *dev,
 typedef void (*eventdev_queue_release_t)(struct rte_eventdev *dev,
 		uint8_t queue_id);
 
+/**
+ * Set an event queue attribute at runtime.
+ *
+ * @param dev
+ *   Event device pointer
+ * @param queue_id
+ *   Event queue index
+ * @param attr_id
+ *   Event queue attribute id
+ * @param attr_value
+ *   Event queue attribute value
+ *
+ * @return
+ *  - 0: Success.
+ *  - <0: Error code on failure.
+ */
+typedef int (*eventdev_queue_attr_set_t)(struct rte_eventdev *dev,
+					 uint8_t queue_id, uint32_t attr_id,
+					 uint32_t attr_value);
+
 /**
  * Retrieve the default event port configuration.
  *
@@ -1211,6 +1231,8 @@  struct eventdev_ops {
 	/**< Set up an event queue. */
 	eventdev_queue_release_t queue_release;
 	/**< Release an event queue. */
+	eventdev_queue_attr_set_t queue_attr_set;
+	/**< Set an event queue attribute. */
 
 	eventdev_port_default_conf_get_t port_def_conf;
 	/**< Get default port configuration. */
diff --git a/lib/eventdev/rte_eventdev.c b/lib/eventdev/rte_eventdev.c
index 532a253553..13c8af877e 100644
--- a/lib/eventdev/rte_eventdev.c
+++ b/lib/eventdev/rte_eventdev.c
@@ -844,6 +844,37 @@  rte_event_queue_attr_get(uint8_t dev_id, uint8_t queue_id, uint32_t attr_id,
 	return 0;
 }
 
+int
+rte_event_queue_attr_set(uint8_t dev_id, uint8_t queue_id, uint32_t attr_id,
+			 uint32_t attr_value)
+{
+	struct rte_eventdev *dev;
+
+	RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
+	dev = &rte_eventdevs[dev_id];
+	if (!is_valid_queue(dev, queue_id)) {
+		RTE_EDEV_LOG_ERR("Invalid queue_id=%" PRIu8, queue_id);
+		return -EINVAL;
+	}
+
+	if (attr_id > RTE_EVENT_QUEUE_ATTR_MAX) {
+		RTE_EDEV_LOG_ERR("Invalid attribute ID %" PRIu8, attr_id);
+		return -EINVAL;
+	}
+
+	if (!(dev->data->event_dev_cap &
+	      RTE_EVENT_DEV_CAP_RUNTIME_QUEUE_ATTR)) {
+		RTE_EDEV_LOG_ERR(
+			"Device %" PRIu8 "does not support changing queue attributes at runtime",
+			dev_id);
+		return -ENOTSUP;
+	}
+
+	RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->queue_attr_set, -ENOTSUP);
+	return (*dev->dev_ops->queue_attr_set)(dev, queue_id, attr_id,
+					       attr_value);
+}
+
 int
 rte_event_port_link(uint8_t dev_id, uint8_t port_id,
 		    const uint8_t queues[], const uint8_t priorities[],
diff --git a/lib/eventdev/rte_eventdev.h b/lib/eventdev/rte_eventdev.h
index 42a5660169..19710cd0c5 100644
--- a/lib/eventdev/rte_eventdev.h
+++ b/lib/eventdev/rte_eventdev.h
@@ -225,7 +225,7 @@  struct rte_event;
 /**< Event scheduling prioritization is based on the priority associated with
  *  each event queue.
  *
- *  @see rte_event_queue_setup()
+ *  @see rte_event_queue_setup(), rte_event_queue_attr_set()
  */
 #define RTE_EVENT_DEV_CAP_EVENT_QOS           (1ULL << 1)
 /**< Event scheduling prioritization is based on the priority associated with
@@ -307,6 +307,13 @@  struct rte_event;
  * global pool, or process signaling related to load balancing.
  */
 
+#define RTE_EVENT_DEV_CAP_RUNTIME_QUEUE_ATTR (1ULL << 11)
+/**< Event device is capable of changing the queue attributes at runtime i.e after
+ * rte_event_queue_setup() or rte_event_start() call sequence. If this flag is
+ * not set, eventdev queue attributes can only be configured during
+ * rte_event_queue_setup().
+ */
+
 /* Event device priority levels */
 #define RTE_EVENT_DEV_PRIORITY_HIGHEST   0
 /**< Highest priority expressed across eventdev subsystem
@@ -678,6 +685,11 @@  rte_event_queue_setup(uint8_t dev_id, uint8_t queue_id,
  */
 #define RTE_EVENT_QUEUE_ATTR_SCHEDULE_TYPE 4
 
+/**
+ * Maximum supported attribute ID.
+ */
+#define RTE_EVENT_QUEUE_ATTR_MAX RTE_EVENT_QUEUE_ATTR_SCHEDULE_TYPE
+
 /**
  * Get an attribute from a queue.
  *
@@ -702,6 +714,30 @@  int
 rte_event_queue_attr_get(uint8_t dev_id, uint8_t queue_id, uint32_t attr_id,
 			uint32_t *attr_value);
 
+/**
+ * Set an event queue attribute.
+ *
+ * @param dev_id
+ *   Eventdev id
+ * @param queue_id
+ *   Eventdev queue id
+ * @param attr_id
+ *   The attribute ID to set
+ * @param attr_value
+ *   The attribute value to set
+ *
+ * @return
+ *   - 0: Successfully set attribute.
+ *   - -EINVAL: invalid device, queue or attr_id.
+ *   - -ENOTSUP: device does not support setting event attribute.
+ *   - -EBUSY: device is in running state
+ *   - <0: failed to set event queue attribute
+ */
+__rte_experimental
+int
+rte_event_queue_attr_set(uint8_t dev_id, uint8_t queue_id, uint32_t attr_id,
+			 uint32_t attr_value);
+
 /* Event port specific APIs */
 
 /* Event port configuration bitmap flags */
diff --git a/lib/eventdev/version.map b/lib/eventdev/version.map
index cd5dada07f..c581b75c18 100644
--- a/lib/eventdev/version.map
+++ b/lib/eventdev/version.map
@@ -108,6 +108,9 @@  EXPERIMENTAL {
 
 	# added in 22.03
 	rte_event_eth_rx_adapter_event_port_get;
+
+	# added in 22.07
+	rte_event_queue_attr_set;
 };
 
 INTERNAL {