From patchwork Thu Apr 5 13:51:45 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Doherty, Declan" X-Patchwork-Id: 37299 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 8D9F61CBD6; Thu, 5 Apr 2018 16:00:15 +0200 (CEST) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by dpdk.org (Postfix) with ESMTP id 20ECE1CBAD for ; Thu, 5 Apr 2018 16:00:11 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga005.jf.intel.com ([10.7.209.41]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Apr 2018 07:00:11 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.48,411,1517904000"; d="scan'208";a="214177504" Received: from dwdohert-ws.ir.intel.com ([163.33.210.60]) by orsmga005.jf.intel.com with ESMTP; 05 Apr 2018 07:00:08 -0700 From: Declan Doherty To: dev@dpdk.org Cc: Alex Rosenbaum , Ferruh Yigit , Thomas Monjalon , Shahaf Shuler , Qi Zhang , Alejandro Lucero , Andrew Rybchenko , Mohammad Abdul Awal , Remy Horton , John McNamara , Rony Efraim , Jingjing Wu , Wenzhuo Lu , Yuanhan Liu , Bruce Richardson , Declan Doherty Date: Thu, 5 Apr 2018 14:51:45 +0100 Message-Id: <20180405135148.16388-2-declan.doherty@intel.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180405135148.16388-1-declan.doherty@intel.com> References: <20180405135148.16388-1-declan.doherty@intel.com> Subject: [dpdk-dev] [PATCH v2 1/4] ethdev: add group counter support to rte_flow X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Add new RTE_FLOW_ACTION_TYPE_GROUP_COUNT action type to enable shared counters across multiple flows on a single port or across multiple flows on multiple ports within the same switch domain. Introduce new API rte_flow_query_group_count to allow querying of group counters. Signed-off-by: Declan Doherty --- doc/guides/prog_guide/rte_flow.rst | 33 +++++++++++++++++++ lib/librte_ether/rte_ethdev_version.map | 8 +++++ lib/librte_ether/rte_flow.c | 21 +++++++++++++ lib/librte_ether/rte_flow.h | 56 ++++++++++++++++++++++++++++++++- lib/librte_ether/rte_flow_driver.h | 6 ++++ 5 files changed, 123 insertions(+), 1 deletion(-) diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst index 961943dda..468af51b2 100644 --- a/doc/guides/prog_guide/rte_flow.rst +++ b/doc/guides/prog_guide/rte_flow.rst @@ -1698,6 +1698,39 @@ Return values: - 0 on success, a negative errno value otherwise and ``rte_errno`` is set. + +Group Count Query +~~~~~~~~~~~~~~~~~ + +Query group counter which can be associated with multiple flows on a specified +port. + +This function allows retrieving of group counters. Data +is gathered by special actions which must be present in the flow rule +definition. + +.. code-block:: c + + int + rte_flow_query_group_count(uint16_t port_id, + uint32_t group_counter_id, + struct rte_flow_query_count *count, + struct rte_flow_error *error); + +Arguments: + +- ``port_id``: port identifier of Ethernet device. +- ``group_counter_id``: group counter identifier. +- ``count``: group counter parameters. +- ``error``: perform verbose error reporting if not NULL. PMDs initialize + this structure in case of error only. + +Return values: + +- 0 on success, a negative errno value otherwise and ``rte_errno`` is set. + + + Isolated mode ------------- diff --git a/lib/librte_ether/rte_ethdev_version.map b/lib/librte_ether/rte_ethdev_version.map index 34df6c8b5..cff6807fc 100644 --- a/lib/librte_ether/rte_ethdev_version.map +++ b/lib/librte_ether/rte_ethdev_version.map @@ -229,3 +229,11 @@ EXPERIMENTAL { rte_mtr_stats_update; } DPDK_17.11; + + +EXPERIMENTAL { + global: + + rte_flow_query_group_count + +} DPDK_18.05; diff --git a/lib/librte_ether/rte_flow.c b/lib/librte_ether/rte_flow.c index 38f2d27be..e10b1d082 100644 --- a/lib/librte_ether/rte_flow.c +++ b/lib/librte_ether/rte_flow.c @@ -418,3 +418,24 @@ rte_flow_copy(struct rte_flow_desc *desc, size_t len, } return 0; } + +int __rte_experimental +rte_flow_query_group_count(uint16_t port_id, + uint32_t group_count_id, + struct rte_flow_query_count *count, + struct rte_flow_error *error) +{ + struct rte_eth_dev *dev = &rte_eth_devices[port_id]; + const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error); + + if (!ops) + return -rte_errno; + if (likely(!!ops->query_group_count)) + return flow_err(port_id, + ops->query_group_count(dev, group_count_id, + count, error), + error); + return rte_flow_error_set(error, ENOSYS, + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, + NULL, rte_strerror(ENOSYS)); +} diff --git a/lib/librte_ether/rte_flow.h b/lib/librte_ether/rte_flow.h index 13e420218..7d1f89d9e 100644 --- a/lib/librte_ether/rte_flow.h +++ b/lib/librte_ether/rte_flow.h @@ -1010,7 +1010,19 @@ enum rte_flow_action_type { * * See struct rte_flow_action_security. */ - RTE_FLOW_ACTION_TYPE_SECURITY + RTE_FLOW_ACTION_TYPE_SECURITY, + + /** + * Enable a shared flow group counter for flow. Group counters can be + * associated with multiples flows on the same port or on port within + * the same switch domain if supported by that device. + * + * Group counters can be retrieved and reset through + * rte_flow_query_group_count() + * + * See struct rte_flow_action_group_count. + */ + RTE_FLOW_ACTION_TYPE_GROUP_COUNT }; /** @@ -1148,6 +1160,18 @@ struct rte_flow_action_security { void *security_session; /**< Pointer to security session structure. */ }; +/** + * RTE_FLOW_ACTION_TYPE_GROUP_COUNT + * + * A packet/byte counter which can be shared across a group of flows programmed + * on the same port/switch domain. + * + * Non-terminating by default. + */ +struct rte_flow_action_group_count { + uint32_t id; +}; + /** * Definition of a single action. * @@ -1476,6 +1500,36 @@ rte_flow_copy(struct rte_flow_desc *fd, size_t len, const struct rte_flow_item *items, const struct rte_flow_action *actions); + +/** + * Get hit/bytes count for group counter. + * + * A group counter is a counter which can be shared among multiple flows on a + * single port or among multiple flows on multiple ports within the same + * switch domain. + * + * In the case of ports within the same switch domain a global name space is + * assumed for group_count_id value. + * + * @param[in] port_id + * Port identifier of Ethernet device. + * @param[in] group_count_id + * Group counter identifier to query + * @param[out] count + * Group counter value + * @param[out] error + * Perform verbose error reporting if not NULL. PMDs initialize this + * structure in case of error only. + * + * @return + * Negative error code (errno value) and rte_errno is set. + */ +int __rte_experimental +rte_flow_query_group_count(uint16_t port_id, + uint32_t group_count_id, + struct rte_flow_query_count *count, + struct rte_flow_error *error); + #ifdef __cplusplus } #endif diff --git a/lib/librte_ether/rte_flow_driver.h b/lib/librte_ether/rte_flow_driver.h index 7778c8e0f..ef09465cf 100644 --- a/lib/librte_ether/rte_flow_driver.h +++ b/lib/librte_ether/rte_flow_driver.h @@ -96,6 +96,12 @@ struct rte_flow_ops { (struct rte_eth_dev *, int, struct rte_flow_error *); + /** See rte_flow_query_group_count(). */ + int (*query_group_count) + (struct rte_eth_dev *, + uint32_t, + struct rte_flow_query_count *, + struct rte_flow_error *); }; /**