[PATCH 1/6] eventdev: support to set queue attributes at runtime
Shijith Thotton
sthotton at marvell.com
Tue Mar 29 15:11:00 CEST 2022
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 at 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
+
/**
* 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 {
--
2.25.1
More information about the dev
mailing list