diff mbox series

[07/12] net/ice: enable FDIR queue group

Message ID 20190906120058.108073-8-yahui.cao@intel.com (mailing list archive)
State Superseded, archived
Delegated to: xiaolong ye
Headers show
Series net/ice: add ice Flow Director driver | expand

Checks

Context Check Description
ci/checkpatch warning coding style issues
ci/Intel-compilation fail apply issues

Commit Message

Cao, Yahui Sept. 6, 2019, noon UTC
FDIR can send packet to a group of queues and distruibte it by RSS.

Signed-off-by: Yahui Cao <yahui.cao@intel.com>
---
 drivers/net/ice/ice_fdir_filter.c | 65 +++++++++++++++++++++++++++++++
 1 file changed, 65 insertions(+)

Comments

Xiaolong Ye Sept. 7, 2019, 6:22 p.m. UTC | #1
On 09/06, Yahui Cao wrote:
>FDIR can send packet to a group of queues and distruibte it by RSS.
>
>Signed-off-by: Yahui Cao <yahui.cao@intel.com>
>---
> drivers/net/ice/ice_fdir_filter.c | 65 +++++++++++++++++++++++++++++++
> 1 file changed, 65 insertions(+)
>
>diff --git a/drivers/net/ice/ice_fdir_filter.c b/drivers/net/ice/ice_fdir_filter.c
>index df4d0329c..ebbe1bd6c 100644
>--- a/drivers/net/ice/ice_fdir_filter.c
>+++ b/drivers/net/ice/ice_fdir_filter.c
>@@ -741,6 +741,62 @@ static struct ice_flow_engine ice_fdir_engine = {
> 	.type = ICE_FLOW_ENGINE_FDIR,
> };
> 
>+static int
>+ice_fdir_parse_action_qregion(struct ice_pf *pf,
>+			      struct rte_flow_error *error,
>+			      const struct rte_flow_action *act,
>+			      struct ice_fdir_filter_conf *filter)
>+{
>+	const struct rte_flow_action_rss *rss = act->conf;
>+	uint32_t i;
>+
>+	if (act->type != RTE_FLOW_ACTION_TYPE_RSS) {
>+		rte_flow_error_set(error, EINVAL,
>+				   RTE_FLOW_ERROR_TYPE_ACTION, act,
>+				   "Invalid action.");
>+		return -rte_errno;
>+	}
>+
>+	if (rss->queue_num <= 1) {
>+		rte_flow_error_set(error, EINVAL,
>+				   RTE_FLOW_ERROR_TYPE_ACTION, act,
>+				   "Queue region size can't be 0 or 1.");
>+		return -rte_errno;
>+	}
>+
>+	/* check if queue index for queue region is continuos */

s/continuos/continuous

>+	for (i = 0; i < rss->queue_num - 1; i++) {
>+		if (rss->queue[i + 1] != rss->queue[i] + 1) {
>+			rte_flow_error_set(error, EINVAL,
>+					   RTE_FLOW_ERROR_TYPE_ACTION, act,
>+					   "Invalid queue region indexes.");

Change the error message to "discontinuous queue region." to be more specific?

>+			return -rte_errno;
>+		}
>+	}
>+
>+	if (rss->queue[rss->queue_num - 1] >= pf->dev_data->nb_rx_queues) {
>+		rte_flow_error_set(error, EINVAL,
>+				   RTE_FLOW_ERROR_TYPE_ACTION, act,
>+				   "Invalid queue region indexes.");
>+		return -rte_errno;
>+	}
>+
>+	if (!(rte_is_power_of_2(rss->queue_num) && (rss->queue_num <= 128))) {

Use a macro fro the 128.

>+		rte_flow_error_set(error, EINVAL,
>+				   RTE_FLOW_ERROR_TYPE_ACTION, act,
>+				   "The region sizes should be any of the following values:"

s/sizes/size

>+				   "1, 2, 4, 8, 16, 32, 64, 128 as long as the total number "
>+				   "of queues do not exceed the VSI allocation.");
>+		return -rte_errno;
>+	}
>+
>+	filter->input.q_index = rss->queue[0];
>+	filter->input.q_region = rte_fls_u32(rss->queue_num) - 1;
>+	filter->input.dest_ctl = ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP;
>+
>+	return 0;
>+}
>+
> static int
> ice_fdir_parse_action(struct ice_adapter *ad,
> 		      const struct rte_flow_action actions[],
>@@ -752,6 +808,7 @@ ice_fdir_parse_action(struct ice_adapter *ad,
> 	const struct rte_flow_action_mark *mark_spec = NULL;
> 	uint32_t dest_num = 0;
> 	uint32_t mark_num = 0;
>+	int ret;
> 
> 	for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) {
> 		switch (actions->type) {
>@@ -785,6 +842,14 @@ ice_fdir_parse_action(struct ice_adapter *ad,
> 				ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QINDEX;
> 			filter->input.q_index = 0;
> 			break;
>+		case RTE_FLOW_ACTION_TYPE_RSS:
>+			dest_num++;
>+
>+			ret = ice_fdir_parse_action_qregion(pf,
>+						error, actions, filter);
>+			if (ret)
>+				return ret;
>+			break;
> 		case RTE_FLOW_ACTION_TYPE_MARK:
> 			mark_num++;
> 
>-- 
>2.17.1
>
diff mbox series

Patch

diff --git a/drivers/net/ice/ice_fdir_filter.c b/drivers/net/ice/ice_fdir_filter.c
index df4d0329c..ebbe1bd6c 100644
--- a/drivers/net/ice/ice_fdir_filter.c
+++ b/drivers/net/ice/ice_fdir_filter.c
@@ -741,6 +741,62 @@  static struct ice_flow_engine ice_fdir_engine = {
 	.type = ICE_FLOW_ENGINE_FDIR,
 };
 
+static int
+ice_fdir_parse_action_qregion(struct ice_pf *pf,
+			      struct rte_flow_error *error,
+			      const struct rte_flow_action *act,
+			      struct ice_fdir_filter_conf *filter)
+{
+	const struct rte_flow_action_rss *rss = act->conf;
+	uint32_t i;
+
+	if (act->type != RTE_FLOW_ACTION_TYPE_RSS) {
+		rte_flow_error_set(error, EINVAL,
+				   RTE_FLOW_ERROR_TYPE_ACTION, act,
+				   "Invalid action.");
+		return -rte_errno;
+	}
+
+	if (rss->queue_num <= 1) {
+		rte_flow_error_set(error, EINVAL,
+				   RTE_FLOW_ERROR_TYPE_ACTION, act,
+				   "Queue region size can't be 0 or 1.");
+		return -rte_errno;
+	}
+
+	/* check if queue index for queue region is continuos */
+	for (i = 0; i < rss->queue_num - 1; i++) {
+		if (rss->queue[i + 1] != rss->queue[i] + 1) {
+			rte_flow_error_set(error, EINVAL,
+					   RTE_FLOW_ERROR_TYPE_ACTION, act,
+					   "Invalid queue region indexes.");
+			return -rte_errno;
+		}
+	}
+
+	if (rss->queue[rss->queue_num - 1] >= pf->dev_data->nb_rx_queues) {
+		rte_flow_error_set(error, EINVAL,
+				   RTE_FLOW_ERROR_TYPE_ACTION, act,
+				   "Invalid queue region indexes.");
+		return -rte_errno;
+	}
+
+	if (!(rte_is_power_of_2(rss->queue_num) && (rss->queue_num <= 128))) {
+		rte_flow_error_set(error, EINVAL,
+				   RTE_FLOW_ERROR_TYPE_ACTION, act,
+				   "The region sizes should be any of the following values:"
+				   "1, 2, 4, 8, 16, 32, 64, 128 as long as the total number "
+				   "of queues do not exceed the VSI allocation.");
+		return -rte_errno;
+	}
+
+	filter->input.q_index = rss->queue[0];
+	filter->input.q_region = rte_fls_u32(rss->queue_num) - 1;
+	filter->input.dest_ctl = ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP;
+
+	return 0;
+}
+
 static int
 ice_fdir_parse_action(struct ice_adapter *ad,
 		      const struct rte_flow_action actions[],
@@ -752,6 +808,7 @@  ice_fdir_parse_action(struct ice_adapter *ad,
 	const struct rte_flow_action_mark *mark_spec = NULL;
 	uint32_t dest_num = 0;
 	uint32_t mark_num = 0;
+	int ret;
 
 	for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) {
 		switch (actions->type) {
@@ -785,6 +842,14 @@  ice_fdir_parse_action(struct ice_adapter *ad,
 				ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QINDEX;
 			filter->input.q_index = 0;
 			break;
+		case RTE_FLOW_ACTION_TYPE_RSS:
+			dest_num++;
+
+			ret = ice_fdir_parse_action_qregion(pf,
+						error, actions, filter);
+			if (ret)
+				return ret;
+			break;
 		case RTE_FLOW_ACTION_TYPE_MARK:
 			mark_num++;