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 >> --- >>   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); >>   }; >>     /** >