On 6/2/22 02:21, Andrew Rybchenko
wrote:
Again,
summary must not be a statement.
I'l re-phrase it.
On
6/1/22 10:39, Xiaoyu Min wrote:
When application use queue-based flow rule
management and operate the
same flow rule on the same queue, e.g create/destroy/query, API
of
querying aged flow rules should also have queue id parameter
just like
other queue-based flow APIs.
By this way, PMD can work in more optimized way since resources
are
isolated by queue and needn't synchronize.
If application do use queue-based flow management but configure
port
without RTE_FLOW_PORT_FLAG_STRICT_QUEUE, which means application
operate
a given flow rule on different queues, the queue id parameter
will
be ignored.
In addition to the above change, another new API is added which
help the
application get information about which queues have aged out
flows after
RTE_ETH_EVENT_FLOW_AGED event received. The queried queue id can
be
used in the above queue based query aged flows API.
Signed-off-by: Xiaoyu Min <jackmin@nvidia.com>
---
lib/ethdev/rte_flow.h | 82
++++++++++++++++++++++++++++++++++++
lib/ethdev/rte_flow_driver.h | 13 ++++++
2 files changed, 95 insertions(+)
diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h
index 38439fcd1d..a12becfe3b 100644
--- a/lib/ethdev/rte_flow.h
+++ b/lib/ethdev/rte_flow.h
@@ -2810,6 +2810,7 @@ enum rte_flow_action_type {
* See function rte_flow_get_aged_flows
* see enum RTE_ETH_EVENT_FLOW_AGED
* See struct rte_flow_query_age
+ * See function rte_flow_get_q_aged_flows
*/
RTE_FLOW_ACTION_TYPE_AGE,
@@ -5624,6 +5625,87 @@
rte_flow_async_action_handle_update(uint16_t port_id,
const void *update,
void *user_data,
struct rte_flow_error *error);
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Get flow queues which have aged out flows on a given port.
+ *
+ * The application can use this function to query which queues
have aged out flows after
+ * a RTE_ETH_EVENT_FLOW_AGED event is received so the returned
queue id can be used to
+ * get aged out flows on this given queue by call
rte_flow_get_q_aged_flows.
+ *
+ * This function can be called from the event callback or
synchronously regardless of the event.
+ *
+ * @param port_id
+ * Port identifier of Ethernet device.
+ * @param[in, out] queue_id
+ * Array of queue id that will be set.
+ * @param[in] nb_queue_id
+ * Maximum number of the queue id that can be returned.
+ * This value should be equal to the size of the queue_id
array.
+ * @param[out] error
+ * Perform verbose error reporting if not NULL. Initialized
in case of
+ * error only.
+ *
+ * @return
+ * if nb_queue_id is 0, return the amount of all queues which
have aged out flows.
+ * if nb_queue_id is not 0 , return the amount of queues
which have aged out flows
+ * reported in the queue_id array, otherwise negative errno
value.
I'm sorry, but it is unclear for me what happens if provided array
is insufficient to return all queues. IMHO, we still should
provide as
much as we can. The question is how to report that we have more
queues.
It looks like the only sensible way is to return value greater
than
nb_queue_id.
+ *
+ * @see rte_flow_action_age
+ * @see RTE_ETH_EVENT_FLOW_AGED
+ */
+
+__rte_experimental
+int
+rte_flow_get_aged_queues(uint16_t port_id, uint32_t queue_id[],
uint32_t nb_queue_id,
+ struct rte_flow_error *error);
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Get aged-out flows of a given port on the given flow queue.
+ *
+ * RTE_ETH_EVENT_FLOW_AGED event will be triggered at least one
new aged out flow was
+ * detected on any flow queue after the last call to
rte_flow_get_q_aged_flows.
+ *
+ * The application can use rte_flow_get_aged_queues to query
which queues have aged
+ * out flows after RTE_ETH_EVEN_FLOW_AGED event.
+ *
+ * If application configure port attribute without
RTE_FLOW_PORT_FLAG_STRICT_QUEUE
+ * the @p queue_id will be ignored.
+ * This function can be called to get the aged flows
asynchronously from the
+ * event callback or synchronously regardless the event.
+ *
+ * @param port_id
+ * Port identifier of Ethernet device.
+ * @param queue_id
+ * Flow queue to query. Ignored when
RTE_FLOW_PORT_FLAG_STRICT_QUEUE not set.
+ * @param[in, out] contexts
+ * The address of an array of pointers to the aged-out flows
contexts.
+ * @param[in] nb_contexts
+ * The length of context array pointers.
+ * @param[out] error
+ * Perform verbose error reporting if not NULL. Initialized
in case of
+ * error only.
+ *
+ * @return
+ * if nb_contexts is 0, return the amount of all aged
contexts.
+ * if nb_contexts is not 0 , return the amount of aged flows
reported
+ * in the context array, otherwise negative errno value.
+ *
+ * @see rte_flow_action_age
+ * @see RTE_ETH_EVENT_FLOW_AGED
+ * @see rte_flow_port_flag
+ */
+
+__rte_experimental
+int
+rte_flow_get_q_aged_flows(uint16_t port_id, uint32_t queue_id,
void **contexts,
+ uint32_t nb_contexts, struct rte_flow_error
*error);
#ifdef __cplusplus
}
#endif
diff --git a/lib/ethdev/rte_flow_driver.h
b/lib/ethdev/rte_flow_driver.h
index 2bff732d6a..b665170bf4 100644
--- a/lib/ethdev/rte_flow_driver.h
+++ b/lib/ethdev/rte_flow_driver.h
@@ -260,6 +260,19 @@ struct rte_flow_ops {
const void *update,
void *user_data,
struct rte_flow_error *error);
+ /** See rte_flow_get_aged_queues() */
+ int (*get_aged_queues)
+ (uint16_t port_id,
+ uint32_t queue_id[],
+ uint32_t nb_queue_id,
+ struct rte_flow_error *error);
+ /** See rte_flow_get_q_aged_flows() */
+ int (*get_q_aged_flows)
+ (uint16_t port_id,
+ uint32_t queue_id,
+ void **contexts,
+ uint32_t nb_contexts,
+ struct rte_flow_error *error);
};
/**