>>>> 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 <sthot...@marvell.com> >>>> Acked-by: Jerin Jacob <jer...@marvell.com> >>>> --- >>>> doc/guides/eventdevs/features/default.ini | 1 + >>>> doc/guides/rel_notes/release_22_07.rst | 5 ++++ >>>> lib/eventdev/eventdev_pmd.h | 22 +++++++++++++++ >>>> lib/eventdev/rte_eventdev.c | 26 ++++++++++++++++++ >>>> lib/eventdev/rte_eventdev.h | 33 ++++++++++++++++++++++- >>>> lib/eventdev/version.map | 3 +++ >>>> 6 files changed, 89 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/doc/guides/rel_notes/release_22_07.rst >>> b/doc/guides/rel_notes/release_22_07.rst >>>> index 88d6e96cc1..a7a912d665 100644 >>>> --- a/doc/guides/rel_notes/release_22_07.rst >>>> +++ b/doc/guides/rel_notes/release_22_07.rst >>>> @@ -65,6 +65,11 @@ New Features >>>> * Added support for promiscuous mode on Windows. >>>> * Added support for MTU on Windows. >>>> >>>> +* **Added support for setting queue attributes at runtime in eventdev.** >>>> + >>>> + Added new API ``rte_event_queue_attr_set()``, to set event queue >>> attributes >>>> + at runtime. >>>> + >>>> >>>> Removed Items >>>> ------------- >>>> diff --git a/lib/eventdev/eventdev_pmd.h b/lib/eventdev/eventdev_pmd.h >>>> index ce469d47a6..3b85d9f7a5 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, >>>> + uint64_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..a31e99be02 100644 >>>> --- a/lib/eventdev/rte_eventdev.c >>>> +++ b/lib/eventdev/rte_eventdev.c >>>> @@ -844,6 +844,32 @@ 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, >>>> + uint64_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 (!(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..c1163ee8ec 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 >>>> @@ -702,6 +709,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. > >Can "invalid" here be something else than "non-existent"? >
No. >>>> + * - -ENOTSUP: device does not support setting event attribute. >>>> + * - -EBUSY: device is in running state >>> >>> I thought the point of this new interface was to allow setting queue >>> attributes when the event device was running? >>> >>> It would be useful for the caller to be able to distinguish between >>> "busy, but please try again later", and "busy, forever". Maybe the >>> latter is what's meant here? In that case, what is the difference with >>> EBUSY and ENOTSUP? >>> >> >> As there are multiple queue attributes, not all attributes could be >> supported by >> all PMDs. ENOTSUP can be returned for unsupported attributes. >> > >So ENOTSUP means this particular attribute exists, but can't be change >in runtime? Yes. If the attribute doesn’t exist, EINVAL is returned. > Is ENOTSUP returned also if no attributes can be modified >(i.e., the event device does not have the appropriate capability)? > Yes. Application should also be checking the eventdev capability RTE_EVENT_DEV_CAP_RUNTIME_QUEUE_ATTR before calling this API. >How is the application supposed to behaved in case -EBUSY is returned? >What does -EBUSY mean? The event device being in a running state doesn't >sound like an error to me. > EBUSY was added to indicate the device was busy and was unable to set the attribute at that time. I think, it can be removed as it is causing confusion. Please let me know if it make sense, I will send v4. > >>>> + * - <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, >>>> + uint64_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 { >>