>> 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. >> + * - -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. >> + * - <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 {