enable protocol agnostic flow offloading in RSS
cover enable protocol agnostic flow offloading in RSS
Enable protocol agnostic flow offloading to support raw pattern input for RSS hash flow rule creation. It is based on Parser Libary feature. Current rte_flow raw API is utilized.
Ting Xu (2):
net/ice: enable protocol agnostic flow offloading in RSS
doc: add protocol agnostic flow offloading for RSS hash
doc/guides/rel_notes/release_21_11.rst | 1 + drivers/net/ice/ice_hash.c | 182 ++++++++++++++++++++++--- 2 files changed, 161 insertions(+), 22 deletions(-)
Signature · 1 line
2.17.1
PATCH 1/2 net/ice: enable protocol agnostic flow offloading in RSS
Enable protocol agnostic flow offloading to support raw pattern input for RSS hash flow rule creation. It is based on Parser Libary feature. Current rte_flow raw API is utilized.
--- drivers/net/ice/ice_hash.c | 182 ++++++++++++++++++++++++++++++++----- 1 file changed, 160 insertions(+), 22 deletions(-)
drivers/net/ice/ice_hash.c +160 -22
@@ -32,6 +32,7 @@#define ICE_PHINT_GTPU_EH BIT_ULL(3)#define ICE_PHINT_GTPU_EH_DWN BIT_ULL(4)#define ICE_PHINT_GTPU_EH_UP BIT_ULL(5) +#define ICE_PHINT_RAW BIT_ULL(6)#define ICE_GTPU_EH_DWNLINK 0#define ICE_GTPU_EH_UPLINK 1
@@ -71,6 +72,7 @@struct ice_rss_meta {uint8_t hash_function;struct ice_rss_hash_cfg cfg; +struct ice_rss_raw_cfg raw; };struct ice_hash_flow_cfg {
@@ -492,6 +494,7 @@ struct ice_rss_hash_cfg eth_tmplt = {*/ static struct ice_pattern_match_item ice_hash_pattern_list[] = {/* IPV4 */ + {pattern_raw,ICE_INSET_NONE ,ICE_INSET_NONE ,NULL }, {pattern_eth_ipv4,ICE_RSS_TYPE_ETH_IPV4 ,ICE_INSET_NONE , &ipv4_tmplt}, {pattern_eth_ipv4_udp,ICE_RSS_TYPE_ETH_IPV4_UDP ,ICE_INSET_NONE , &ipv4_udp_tmplt}, {pattern_eth_ipv4_tcp,ICE_RSS_TYPE_ETH_IPV4_TCP ,ICE_INSET_NONE , &ipv4_tcp_tmplt},
@@ -612,6 +615,9 @@ ice_hash_parse_pattern(const struct rte_flow_item pattern[], uint64_t *phint, }switch (item->type) { +case RTE_FLOW_ITEM_TYPE_RAW : + *phint |=ICE_PHINT_RAW ; +break ;case RTE_FLOW_ITEM_TYPE_VLAN : *phint |=ICE_PHINT_VLAN ;break ;
@@ -639,6 +645,91 @@ ice_hash_parse_pattern(const struct rte_flow_item pattern[], uint64_t *phint,return 0 ; } +static int +ice_hash_parse_raw_pattern (struct ice_adapter *ad, +const struct rte_flow_item *item, +struct ice_rss_meta *meta) +{ +const struct rte_flow_item_raw *raw_spec, *raw_mask; +struct ice_parser_profile prof; +struct ice_parser_result rslt; +struct ice_parser *psr; +uint8_t *pkt_buf, *msk_buf; +uint8_t spec_len, pkt_len; +uint8_t tmp_val =0 ; +uint8_t tmp_c =0 ; +int i, j; + + raw_spec = item->spec; + raw_mask = item->mask; + + spec_len =strlen ((char *)(uintptr_t )raw_spec->pattern); +if (strlen ((char *)(uintptr_t )raw_mask->pattern) != + spec_len) +return -rte_errno; + + pkt_len = spec_len /2 ; + + pkt_buf =rte_zmalloc (NULL , pkt_len,0 ); +if (!pkt_buf) +return -ENOMEM ; + + msk_buf =rte_zmalloc (NULL , pkt_len,0 ); +if (!msk_buf) +return -ENOMEM ; + +/* convert string to int array */ +for (i =0 , j =0 ; i < spec_len; i +=2 , j++) { + tmp_c = raw_spec->pattern[i]; +if (tmp_c >='a' && tmp_c <='f' ) + tmp_val = tmp_c -'a' +10 ; +if (tmp_c >='A' && tmp_c <='F' ) + tmp_val = tmp_c -'A' +10 ; +if (tmp_c >='0' && tmp_c <='9' ) + tmp_val = tmp_c -'0' ; + + tmp_c = raw_spec->pattern[i +1 ]; +if (tmp_c >='a' && tmp_c <='f' ) + pkt_buf[j] = tmp_val *16 + tmp_c -'a' +10 ; +if (tmp_c >='A' && tmp_c <='F' ) + pkt_buf[j] = tmp_val *16 + tmp_c -'A' +10 ; +if (tmp_c >='0' && tmp_c <='9' ) + pkt_buf[j] = tmp_val *16 + tmp_c -'0' ; + + tmp_c = raw_mask->pattern[i]; +if (tmp_c >='a' && tmp_c <='f' ) + tmp_val = tmp_c -0x57 ; +if (tmp_c >='A' && tmp_c <='F' ) + tmp_val = tmp_c -0x37 ; +if (tmp_c >='0' && tmp_c <='9' ) + tmp_val = tmp_c -'0' ; + + tmp_c = raw_mask->pattern[i +1 ]; +if (tmp_c >='a' && tmp_c <='f' ) + msk_buf[j] = tmp_val *16 + tmp_c -'a' +10 ; +if (tmp_c >='A' && tmp_c <='F' ) + msk_buf[j] = tmp_val *16 + tmp_c -'A' +10 ; +if (tmp_c >='0' && tmp_c <='9' ) + msk_buf[j] = tmp_val *16 + tmp_c -'0' ; + } + +if (ice_parser_create (&ad->hw, &psr)) +return -rte_errno; +if (ice_parser_run (psr, pkt_buf, pkt_len, &rslt)) +return -rte_errno; +ice_parser_destroy (psr); + +if (ice_parser_profile_init (&rslt, pkt_buf, msk_buf, + pkt_len,ICE_BLK_RSS , true, &prof)) +return -rte_errno; + +rte_memcpy (&meta->raw.prof, &prof,sizeof (prof)); + +rte_free (pkt_buf); +rte_free (msk_buf); +return 0 ; +} +static void ice_refine_hash_cfg_l234 (struct ice_rss_hash_cfg *hash_cfg,uint64_t rss_type)
@@ -999,7 +1090,10 @@ ice_hash_parse_action(struct ice_pattern_match_item *pattern_match_item, RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ) { rss_meta->hash_function =RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ ; - cfg->symm = true; +if (pattern_hint ==ICE_PHINT_RAW ) + rss_meta->raw.symm = true; +else + cfg->symm = true; }if (rss->level)
@@ -1017,6 +1111,10 @@ ice_hash_parse_action(struct ice_pattern_match_item *pattern_match_item,RTE_FLOW_ERROR_TYPE_ACTION , action, "a non-NULL RSS queue is not supported"); +/* If pattern type is raw, no need to refine rss type */ +if (pattern_hint ==ICE_PHINT_RAW ) +break ; +/** * Check simultaneous use of SRC_ONLY and DST_ONLY * of the same level.
@@ -1085,6 +1183,17 @@ ice_hash_parse_pattern_action(__rte_unused struct ice_adapter *ad,if (ret) goto error; +if (phint ==ICE_PHINT_RAW ) { + rss_meta_ptr->raw.raw_ena = true; + ret =ice_hash_parse_raw_pattern (ad, pattern, rss_meta_ptr); +if (ret) { +rte_flow_error_set (error,EINVAL , +RTE_FLOW_ERROR_TYPE_ITEM ,NULL , +"Parse raw pattern failed" ); + goto error; + } + } +/* Check rss action. */ ret =ice_hash_parse_action (pattern_match_item, actions, phint, (void **)&rss_meta_ptr, error);
@@ -1134,15 +1243,30 @@ ice_hash_create(struct ice_adapter *ad, goto out; }else { -memcpy (&filter_ptr->rss_cfg.hash, &rss_meta->cfg, -sizeof (struct ice_rss_hash_cfg )); - ret =ice_add_rss_cfg_wrap (pf, vsi->idx, - &filter_ptr->rss_cfg.hash); -if (ret) { -rte_flow_error_set (error,EINVAL , -RTE_FLOW_ERROR_TYPE_HANDLE ,NULL , -"rss flow create fail" ); - goto error; +if (rss_meta->raw.raw_ena) { +memcpy (&filter_ptr->rss_cfg.raw, &rss_meta->raw, +sizeof (struct ice_rss_raw_cfg )); + ret =ice_add_rss_raw_cfg (hw, &rss_meta->raw, + pf->main_vsi->idx); +if (ret) { +rte_flow_error_set (error,EINVAL , +RTE_FLOW_ERROR_TYPE_HANDLE , +NULL , +"rss flow create fail" ); + goto error; + } + }else { +memcpy (&filter_ptr->rss_cfg.hash, &rss_meta->cfg, +sizeof (struct ice_rss_hash_cfg )); + ret =ice_add_rss_cfg_wrap (pf, vsi->idx, + &filter_ptr->rss_cfg.hash); +if (ret) { +rte_flow_error_set (error,EINVAL , +RTE_FLOW_ERROR_TYPE_HANDLE , +NULL , +"rss flow create fail" ); + goto error; + } } }
@@ -1178,18 +1302,32 @@ ice_hash_destroy(struct ice_adapter *ad, (1 <<VSIQF_HASH_CTL_HASH_SCHEME_S );ICE_WRITE_REG (hw,VSIQF_HASH_CTL (vsi->vsi_id), reg); }else { - ret =ice_rem_rss_cfg_wrap (pf, vsi->idx, - &filter_ptr->rss_cfg.hash); -/* Fixme: Ignore the error if a rule does not exist. -* Currently a rule for inputset change or symm turn on/off -* will overwrite an exist rule, while application still -* have 2 rte_flow handles. -**/ -if (ret && ret !=ICE_ERR_DOES_NOT_EXIST ) { -rte_flow_error_set (error,EINVAL , -RTE_FLOW_ERROR_TYPE_HANDLE ,NULL , -"rss flow destroy fail" ); - goto error; +if (filter_ptr->rss_cfg.raw.raw_ena) { + ret = +ice_rem_rss_raw_cfg (hw, &filter_ptr->rss_cfg.raw.prof, + pf->main_vsi->idx); +if (ret) { +rte_flow_error_set (error,EINVAL , +RTE_FLOW_ERROR_TYPE_HANDLE , +NULL , +"rss flow destroy fail" ); + goto error; + } + }else { + ret =ice_rem_rss_cfg_wrap (pf, vsi->idx, + &filter_ptr->rss_cfg.hash); +/* Fixme: Ignore the error if a rule does not exist. +* Currently a rule for inputset change or symm turn +* on/off will overwrite an exist rule, while +* application still have 2 rte_flow handles. +**/ +if (ret && ret !=ICE_ERR_DOES_NOT_EXIST ) { +rte_flow_error_set (error,EINVAL , +RTE_FLOW_ERROR_TYPE_HANDLE , +NULL , +"rss flow destroy fail" ); + goto error; + } } }
Signature · 1 line
2.17.1
PATCH 2/2 doc: add protocol agnostic flow offloading for RSS hash
In reply to Ting XuProtocol agnostic flow offloading for RSS hash is supported. Raw pattern input can be used to create RSS hash flow rules, using current rte_flow raw API.
--- doc/guides/rel_notes/release_21_11.rst | 1 + 1 file changed, 1 insertion(+)
doc/guides/rel_notes/release_21_11.rst +1 -0
@@ -86,6 +86,7 @@ New Features * Added 1PPS out support by a devargs. * Added IPv4 and L4(TCP/UDP/SCTP) checksum hash support in RSS flow. + * Added protocol agnostic flow offloading for RSS hash. * **Updated Marvell cnxk ethdev driver.**
Signature · 1 line
2.17.1
v2 cover enable protocol agnostic flow offloading in RSS
In reply to Ting XuEnable protocol agnostic flow offloading to support raw pattern input for RSS hash flow rule creation. It is based on Parser Libary feature. Current rte_flow raw API is utilized.
Ting Xu (3):
net/ice/base: support add HW profile for RSS raw flow net/ice: enable protocol agnostic flow offloading in RSS
doc: add protocol agnostic flow offloading for RSS
doc/guides/rel_notes/release_21_11.rst | 1 + drivers/net/ice/base/ice_flow.c | 109 ++++++++++ drivers/net/ice/base/ice_flow.h | 16 ++ drivers/net/ice/ice_ethdev.h | 9 + drivers/net/ice/ice_hash.c | 286 +++++++++++++++++++++++-- 5 files changed, 399 insertions(+), 22 deletions(-)
Signature · 1 line
2.17.1
PATCH v2 1/3 net/ice: enable protocol agnostic flow offloading in RSS
Enable protocol agnostic flow offloading to support raw pattern input for RSS hash flow rule creation. It is based on Parser Libary feature. Current rte_flow raw API is utilized.
--- drivers/net/ice/ice_hash.c | 182 ++++++++++++++++++++++++++++++++----- 1 file changed, 160 insertions(+), 22 deletions(-)
drivers/net/ice/ice_hash.c +160 -22
@@ -32,6 +32,7 @@#define ICE_PHINT_GTPU_EH BIT_ULL(3)#define ICE_PHINT_GTPU_EH_DWN BIT_ULL(4)#define ICE_PHINT_GTPU_EH_UP BIT_ULL(5) +#define ICE_PHINT_RAW BIT_ULL(6)#define ICE_GTPU_EH_DWNLINK 0#define ICE_GTPU_EH_UPLINK 1
@@ -71,6 +72,7 @@struct ice_rss_meta {uint8_t hash_function;struct ice_rss_hash_cfg cfg; +struct ice_rss_raw_cfg raw; };struct ice_hash_flow_cfg {
@@ -492,6 +494,7 @@ struct ice_rss_hash_cfg eth_tmplt = {*/ static struct ice_pattern_match_item ice_hash_pattern_list[] = {/* IPV4 */ + {pattern_raw,ICE_INSET_NONE ,ICE_INSET_NONE ,NULL }, {pattern_eth_ipv4,ICE_RSS_TYPE_ETH_IPV4 ,ICE_INSET_NONE , &ipv4_tmplt}, {pattern_eth_ipv4_udp,ICE_RSS_TYPE_ETH_IPV4_UDP ,ICE_INSET_NONE , &ipv4_udp_tmplt}, {pattern_eth_ipv4_tcp,ICE_RSS_TYPE_ETH_IPV4_TCP ,ICE_INSET_NONE , &ipv4_tcp_tmplt},
@@ -612,6 +615,9 @@ ice_hash_parse_pattern(const struct rte_flow_item pattern[], uint64_t *phint, }switch (item->type) { +case RTE_FLOW_ITEM_TYPE_RAW : + *phint |=ICE_PHINT_RAW ; +break ;case RTE_FLOW_ITEM_TYPE_VLAN : *phint |=ICE_PHINT_VLAN ;break ;
@@ -639,6 +645,91 @@ ice_hash_parse_pattern(const struct rte_flow_item pattern[], uint64_t *phint,return 0 ; } +static int +ice_hash_parse_raw_pattern (struct ice_adapter *ad, +const struct rte_flow_item *item, +struct ice_rss_meta *meta) +{ +const struct rte_flow_item_raw *raw_spec, *raw_mask; +struct ice_parser_profile prof; +struct ice_parser_result rslt; +struct ice_parser *psr; +uint8_t *pkt_buf, *msk_buf; +uint8_t spec_len, pkt_len; +uint8_t tmp_val =0 ; +uint8_t tmp_c =0 ; +int i, j; + + raw_spec = item->spec; + raw_mask = item->mask; + + spec_len =strlen ((char *)(uintptr_t )raw_spec->pattern); +if (strlen ((char *)(uintptr_t )raw_mask->pattern) != + spec_len) +return -rte_errno; + + pkt_len = spec_len /2 ; + + pkt_buf =rte_zmalloc (NULL , pkt_len,0 ); +if (!pkt_buf) +return -ENOMEM ; + + msk_buf =rte_zmalloc (NULL , pkt_len,0 ); +if (!msk_buf) +return -ENOMEM ; + +/* convert string to int array */ +for (i =0 , j =0 ; i < spec_len; i +=2 , j++) { + tmp_c = raw_spec->pattern[i]; +if (tmp_c >='a' && tmp_c <='f' ) + tmp_val = tmp_c -'a' +10 ; +if (tmp_c >='A' && tmp_c <='F' ) + tmp_val = tmp_c -'A' +10 ; +if (tmp_c >='0' && tmp_c <='9' ) + tmp_val = tmp_c -'0' ; + + tmp_c = raw_spec->pattern[i +1 ]; +if (tmp_c >='a' && tmp_c <='f' ) + pkt_buf[j] = tmp_val *16 + tmp_c -'a' +10 ; +if (tmp_c >='A' && tmp_c <='F' ) + pkt_buf[j] = tmp_val *16 + tmp_c -'A' +10 ; +if (tmp_c >='0' && tmp_c <='9' ) + pkt_buf[j] = tmp_val *16 + tmp_c -'0' ; + + tmp_c = raw_mask->pattern[i]; +if (tmp_c >='a' && tmp_c <='f' ) + tmp_val = tmp_c -0x57 ; +if (tmp_c >='A' && tmp_c <='F' ) + tmp_val = tmp_c -0x37 ; +if (tmp_c >='0' && tmp_c <='9' ) + tmp_val = tmp_c -'0' ; + + tmp_c = raw_mask->pattern[i +1 ]; +if (tmp_c >='a' && tmp_c <='f' ) + msk_buf[j] = tmp_val *16 + tmp_c -'a' +10 ; +if (tmp_c >='A' && tmp_c <='F' ) + msk_buf[j] = tmp_val *16 + tmp_c -'A' +10 ; +if (tmp_c >='0' && tmp_c <='9' ) + msk_buf[j] = tmp_val *16 + tmp_c -'0' ; + } + +if (ice_parser_create (&ad->hw, &psr)) +return -rte_errno; +if (ice_parser_run (psr, pkt_buf, pkt_len, &rslt)) +return -rte_errno; +ice_parser_destroy (psr); + +if (ice_parser_profile_init (&rslt, pkt_buf, msk_buf, + pkt_len,ICE_BLK_RSS , true, &prof)) +return -rte_errno; + +rte_memcpy (&meta->raw.prof, &prof,sizeof (prof)); + +rte_free (pkt_buf); +rte_free (msk_buf); +return 0 ; +} +static void ice_refine_hash_cfg_l234 (struct ice_rss_hash_cfg *hash_cfg,uint64_t rss_type)
@@ -999,7 +1090,10 @@ ice_hash_parse_action(struct ice_pattern_match_item *pattern_match_item, RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ) { rss_meta->hash_function =RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ ; - cfg->symm = true; +if (pattern_hint ==ICE_PHINT_RAW ) + rss_meta->raw.symm = true; +else + cfg->symm = true; }if (rss->level)
@@ -1017,6 +1111,10 @@ ice_hash_parse_action(struct ice_pattern_match_item *pattern_match_item,RTE_FLOW_ERROR_TYPE_ACTION , action, "a non-NULL RSS queue is not supported"); +/* If pattern type is raw, no need to refine rss type */ +if (pattern_hint ==ICE_PHINT_RAW ) +break ; +/** * Check simultaneous use of SRC_ONLY and DST_ONLY * of the same level.
@@ -1085,6 +1183,17 @@ ice_hash_parse_pattern_action(__rte_unused struct ice_adapter *ad,if (ret) goto error; +if (phint ==ICE_PHINT_RAW ) { + rss_meta_ptr->raw.raw_ena = true; + ret =ice_hash_parse_raw_pattern (ad, pattern, rss_meta_ptr); +if (ret) { +rte_flow_error_set (error,EINVAL , +RTE_FLOW_ERROR_TYPE_ITEM ,NULL , +"Parse raw pattern failed" ); + goto error; + } + } +/* Check rss action. */ ret =ice_hash_parse_action (pattern_match_item, actions, phint, (void **)&rss_meta_ptr, error);
@@ -1134,15 +1243,30 @@ ice_hash_create(struct ice_adapter *ad, goto out; }else { -memcpy (&filter_ptr->rss_cfg.hash, &rss_meta->cfg, -sizeof (struct ice_rss_hash_cfg )); - ret =ice_add_rss_cfg_wrap (pf, vsi->idx, - &filter_ptr->rss_cfg.hash); -if (ret) { -rte_flow_error_set (error,EINVAL , -RTE_FLOW_ERROR_TYPE_HANDLE ,NULL , -"rss flow create fail" ); - goto error; +if (rss_meta->raw.raw_ena) { +memcpy (&filter_ptr->rss_cfg.raw, &rss_meta->raw, +sizeof (struct ice_rss_raw_cfg )); + ret =ice_add_rss_raw_cfg (hw, &rss_meta->raw, + pf->main_vsi->idx); +if (ret) { +rte_flow_error_set (error,EINVAL , +RTE_FLOW_ERROR_TYPE_HANDLE , +NULL , +"rss flow create fail" ); + goto error; + } + }else { +memcpy (&filter_ptr->rss_cfg.hash, &rss_meta->cfg, +sizeof (struct ice_rss_hash_cfg )); + ret =ice_add_rss_cfg_wrap (pf, vsi->idx, + &filter_ptr->rss_cfg.hash); +if (ret) { +rte_flow_error_set (error,EINVAL , +RTE_FLOW_ERROR_TYPE_HANDLE , +NULL , +"rss flow create fail" ); + goto error; + } } }
@@ -1178,18 +1302,32 @@ ice_hash_destroy(struct ice_adapter *ad, (1 <<VSIQF_HASH_CTL_HASH_SCHEME_S );ICE_WRITE_REG (hw,VSIQF_HASH_CTL (vsi->vsi_id), reg); }else { - ret =ice_rem_rss_cfg_wrap (pf, vsi->idx, - &filter_ptr->rss_cfg.hash); -/* Fixme: Ignore the error if a rule does not exist. -* Currently a rule for inputset change or symm turn on/off -* will overwrite an exist rule, while application still -* have 2 rte_flow handles. -**/ -if (ret && ret !=ICE_ERR_DOES_NOT_EXIST ) { -rte_flow_error_set (error,EINVAL , -RTE_FLOW_ERROR_TYPE_HANDLE ,NULL , -"rss flow destroy fail" ); - goto error; +if (filter_ptr->rss_cfg.raw.raw_ena) { + ret = +ice_rem_rss_raw_cfg (hw, &filter_ptr->rss_cfg.raw.prof, + pf->main_vsi->idx); +if (ret) { +rte_flow_error_set (error,EINVAL , +RTE_FLOW_ERROR_TYPE_HANDLE , +NULL , +"rss flow destroy fail" ); + goto error; + } + }else { + ret =ice_rem_rss_cfg_wrap (pf, vsi->idx, + &filter_ptr->rss_cfg.hash); +/* Fixme: Ignore the error if a rule does not exist. +* Currently a rule for inputset change or symm turn +* on/off will overwrite an exist rule, while +* application still have 2 rte_flow handles. +**/ +if (ret && ret !=ICE_ERR_DOES_NOT_EXIST ) { +rte_flow_error_set (error,EINVAL , +RTE_FLOW_ERROR_TYPE_HANDLE , +NULL , +"rss flow destroy fail" ); + goto error; + } } }
Signature · 1 line
2.17.1
PATCH v2 2/3 net/ice: enable protocol agnostic flow offloading in RSS
In reply to Ting XuEnable protocol agnostic flow offloading to support raw pattern input for RSS hash flow rule creation. It is based on Parser Libary feature. Current rte_flow raw API is utilized.
--- drivers/net/ice/ice_ethdev.h | 9 ++ drivers/net/ice/ice_hash.c | 286 ++++++++++++++++++++++++++++++++--- 2 files changed, 273 insertions(+), 22 deletions(-)
drivers/net/ice/ice_ethdev.h +9 -0
@@ -500,6 +500,14 @@ struct ice_fdir_prof_info {u64 fdir_actived_cnt; }; +/** +* Structure to store rss fv entry. +*/ +struct ice_rss_prof_info { +struct ice_parser_profile prof; +bool symm; +}; +/** * Structure to store private data for each PF/VF instance. */
@@ -524,6 +532,7 @@ struct ice_adapter {bool ptp_ena;uint64_t time_hw;struct ice_fdir_prof_info fdir_prof_info[ICE_MAX_PTGS ]; +struct ice_rss_prof_info rss_prof_info[ICE_MAX_PTGS ];#ifdef RTE_ARCH_X86 bool rx_use_avx2;bool rx_use_avx512;
drivers/net/ice/ice_hash.c +264 -22
358 lines not on this page · raw message
Signature · 1 line
2.17.1
PATCH v2 3/3 doc: add protocol agnostic flow offloading for RSS
In reply to Ting XuProtocol agnostic flow offloading for RSS hash is supported. Raw pattern input can be used to create RSS hash flow rules, using current rte_flow raw API.
--- doc/guides/rel_notes/release_21_11.rst | 1 + 1 file changed, 1 insertion(+)
doc/guides/rel_notes/release_21_11.rst +1 -0
@@ -168,6 +168,7 @@ New Features * **Updated Intel ice driver.** * Added protocol agnostic flow offloading support in Flow Director. + * Added protocol agnostic flow offloading support in RSS hash. * Added 1PPS out support by a devargs. * Added IPv4 and L4 (TCP/UDP/SCTP) checksum hash support in RSS flow. * Added DEV_RX_OFFLOAD_TIMESTAMP support.
Signature · 1 line
2.17.1
v2 cover enable protocol agnostic flow offloading in RSS
In reply to Ting XuEnable protocol agnostic flow offloading to support raw pattern input for RSS hash flow rule creation. It is based on Parser Libary feature. Current rte_flow raw API is utilized.
Ting Xu (3):
net/ice/base: support add HW profile for RSS raw flow net/ice: enable protocol agnostic flow offloading in RSS
doc: add protocol agnostic flow offloading for RSS
doc/guides/rel_notes/release_21_11.rst | 1 + drivers/net/ice/base/ice_flow.c | 109 ++++++++++ drivers/net/ice/base/ice_flow.h | 16 ++ drivers/net/ice/ice_ethdev.h | 9 + drivers/net/ice/ice_hash.c | 286 +++++++++++++++++++++++-- 5 files changed, 399 insertions(+), 22 deletions(-)
Signature · 1 line
2.17.1
PATCH v2 1/3 net/ice/base: support add HW profile for RSS raw flow
Based on the parser library, we can directly set HW profile and associate VSI for RSS raw flows. Add symmetric hash configuration for raw flow.
--- drivers/net/ice/base/ice_flow.c | 109 ++++++++++++++++++++++++++++++++ drivers/net/ice/base/ice_flow.h | 16 +++++ 2 files changed, 125 insertions(+)
drivers/net/ice/base/ice_flow.c +109 -0
@@ -4071,6 +4071,115 @@ ice_rss_update_symm(struct ice_hw *hw, } } +/** +* ice_rss_cfg_raw_symm - configure symmetric hash parameters +* for raw pattern +* @hw: pointer to the hardware structure +* @prof: pointer to parser profile +* @prof_id: profile ID +* +* Calculate symmetric hash parameters based on input protocol type. +*/ +static void +ice_rss_cfg_raw_symm (struct ice_hw *hw, +struct ice_parser_profile *prof,u64 prof_id) +{ +u8 src_idx, dst_idx, proto_id; +int len, i =0 ; + +while (i < prof->fv_num) { + proto_id = prof->fv[i].proto_id; + +switch (proto_id) { +case ICE_PROT_IPV4_OF_OR_S : + len =ICE_FLOW_FLD_SZ_IPV4_ADDR / +ICE_FLOW_FV_EXTRACT_SZ ; +if (prof->fv[i].offset == +ICE_FLOW_FIELD_IPV4_SRC_OFFSET && + prof->fv[i + len].proto_id == proto_id && + prof->fv[i + len].offset == +ICE_FLOW_FIELD_IPV4_DST_OFFSET ) { + src_idx = i; + dst_idx = i + len; + i +=2 * len; +break ; + } + i++; +continue ; +case ICE_PROT_IPV6_OF_OR_S : + len =ICE_FLOW_FLD_SZ_IPV6_ADDR / +ICE_FLOW_FV_EXTRACT_SZ ; +if (prof->fv[i].offset == +ICE_FLOW_FIELD_IPV6_SRC_OFFSET && + prof->fv[i + len].proto_id == proto_id && + prof->fv[i + len].offset == +ICE_FLOW_FIELD_IPV6_DST_OFFSET ) { + src_idx = i; + dst_idx = i + len; + i +=2 * len; +break ; + } + i++; +continue ; +case ICE_PROT_TCP_IL : +case ICE_PROT_UDP_IL_OR_S : +case ICE_PROT_SCTP_IL : + len =ICE_FLOW_FLD_SZ_PORT / +ICE_FLOW_FV_EXTRACT_SZ ; +if (prof->fv[i].offset == +ICE_FLOW_FIELD_SRC_PORT_OFFSET && + prof->fv[i + len].proto_id == proto_id && + prof->fv[i + len].offset == +ICE_FLOW_FIELD_DST_PORT_OFFSET ) { + src_idx = i; + dst_idx = i + len; + i +=2 * len; +break ; + } + i++; +continue ; +default : + i++; +continue ; + } +ice_rss_config_xor (hw, prof_id, src_idx, dst_idx, len); + } +} + +/* Max registers index per packet profile */ +#define ICE_SYMM_REG_INDEX_MAX 6 + +/** +* ice_rss_update_raw_symm - update symmetric hash configuration +* for raw pattern +* @hw: pointer to the hardware structure +* @cfg: configure parameters for raw pattern +* @id: profile tracking ID +* +* Update symmetric hash configuration for raw pattern if required. +* Otherwise only clear to default. +*/ +void +ice_rss_update_raw_symm (struct ice_hw *hw, +struct ice_rss_raw_cfg *cfg,u64 id) +{ +struct ice_prof_map *map; +u8 prof_id, m; + +ice_acquire_lock (&hw->blk[ICE_BLK_RSS ].es.prof_map_lock); + map =ice_search_prof_id (hw,ICE_BLK_RSS , id); +if (map) + prof_id = map->prof_id; +ice_release_lock (&hw->blk[ICE_BLK_RSS ].es.prof_map_lock); +if (!map) +return ; +/* clear to default */ +for (m =0 ; m <ICE_SYMM_REG_INDEX_MAX ; m++) +wr32 (hw,GLQF_HSYMM (prof_id, m),0 ); +if (cfg->symm) +ice_rss_cfg_raw_symm (hw, &cfg->prof, prof_id); +} +/** * ice_add_rss_cfg_sync - add an RSS configuration * @hw: pointer to the hardware structure
drivers/net/ice/base/ice_flow.h +16 -0
@@ -149,6 +149,13 @@#define ICE_FLOW_HASH_NAT_T_ESP_IPV6_SPI \ (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_NAT_T_ESP_SPI) +#define ICE_FLOW_FIELD_IPV4_SRC_OFFSET 12 +#define ICE_FLOW_FIELD_IPV4_DST_OFFSET 16 +#define ICE_FLOW_FIELD_IPV6_SRC_OFFSET 8 +#define ICE_FLOW_FIELD_IPV6_DST_OFFSET 24 +#define ICE_FLOW_FIELD_SRC_PORT_OFFSET 0 +#define ICE_FLOW_FIELD_DST_PORT_OFFSET 2 +/* Protocol header fields within a packet segment. A segment consists of one or * more protocol headers that make up a logical group of protocol headers. Each * logical group of protocol headers encapsulates or is encapsulated using/by
@@ -493,11 +500,18 @@ struct ice_flow_prof {struct ice_flow_action *acts; }; +struct ice_rss_raw_cfg { +struct ice_parser_profile prof; +bool raw_ena; +bool symm; +}; +struct ice_rss_cfg {struct LIST_ENTRY_TYPE l_entry;/* bitmap of VSIs added to the RSS entry */ ice_declare_bitmap(vsis, ICE_MAX_VSI);struct ice_rss_hash_cfg hash; +struct ice_rss_raw_cfg raw; };enum ice_flow_action_type {
@@ -585,5 +599,7 @@ ice_add_rss_cfg(struct ice_hw *hw, u16 vsi_handle,enum ice_status ice_rem_rss_cfg (struct ice_hw *hw,u16 vsi_handle,const struct ice_rss_hash_cfg *cfg); +void ice_rss_update_raw_symm (struct ice_hw *hw, +struct ice_rss_raw_cfg *cfg,u64 id);u64 ice_get_rss_cfg (struct ice_hw *hw,u16 vsi_handle,u32 hdrs);#endif /* _ICE_FLOW_H_ */
Signature · 1 line
2.17.1
PATCH v2 2/3 net/ice: enable protocol agnostic flow offloading in RSS
In reply to Ting XuEnable protocol agnostic flow offloading to support raw pattern input for RSS hash flow rule creation. It is based on Parser Libary feature. Current rte_flow raw API is utilized.
--- drivers/net/ice/ice_ethdev.h | 9 ++ drivers/net/ice/ice_hash.c | 286 ++++++++++++++++++++++++++++++++--- 2 files changed, 273 insertions(+), 22 deletions(-)
drivers/net/ice/ice_ethdev.h +9 -0
@@ -500,6 +500,14 @@ struct ice_fdir_prof_info {u64 fdir_actived_cnt; }; +/** +* Structure to store rss fv entry. +*/ +struct ice_rss_prof_info { +struct ice_parser_profile prof; +bool symm; +}; +/** * Structure to store private data for each PF/VF instance. */
@@ -524,6 +532,7 @@ struct ice_adapter {bool ptp_ena;uint64_t time_hw;struct ice_fdir_prof_info fdir_prof_info[ICE_MAX_PTGS ]; +struct ice_rss_prof_info rss_prof_info[ICE_MAX_PTGS ];#ifdef RTE_ARCH_X86 bool rx_use_avx2;bool rx_use_avx512;
drivers/net/ice/ice_hash.c +264 -22
358 lines not on this page · raw message
Signature · 1 line
2.17.1
PATCH v2 3/3 doc: add protocol agnostic flow offloading for RSS
In reply to Ting XuProtocol agnostic flow offloading for RSS hash is supported. Raw pattern input can be used to create RSS hash flow rules, using current rte_flow raw API.
--- doc/guides/rel_notes/release_21_11.rst | 1 + 1 file changed, 1 insertion(+)
doc/guides/rel_notes/release_21_11.rst +1 -0
@@ -168,6 +168,7 @@ New Features * **Updated Intel ice driver.** * Added protocol agnostic flow offloading support in Flow Director. + * Added protocol agnostic flow offloading support in RSS hash. * Added 1PPS out support by a devargs. * Added IPv4 and L4 (TCP/UDP/SCTP) checksum hash support in RSS flow. * Added DEV_RX_OFFLOAD_TIMESTAMP support.
Signature · 1 line
2.17.1
v3 cover enable protocol agnostic flow offloading in RSS
In reply to Ting XuEnable protocol agnostic flow offloading to support raw pattern input for RSS hash flow rule creation. It is based on Parser Library feature. Current rte_flow raw API is utilized.
Ting Xu (3):
net/ice/base: support add HW profile for RSS raw flow net/ice: enable protocol agnostic flow offloading in RSS
doc: add protocol agnostic flow offloading for RSS
doc/guides/rel_notes/release_21_11.rst | 1 + drivers/net/ice/base/ice_flow.c | 109 ++++++++++ drivers/net/ice/base/ice_flow.h | 16 ++ drivers/net/ice/ice_ethdev.h | 9 + drivers/net/ice/ice_hash.c | 286 +++++++++++++++++++++++-- 5 files changed, 399 insertions(+), 22 deletions(-)
Signature · 1 line
2.17.1
PATCH v3 1/3 net/ice/base: support add HW profile for RSS raw flow
Based on the parser library, we can directly set HW profile and associate VSI for RSS raw flows. Add symmetric hash configuration for raw flow.
--- drivers/net/ice/base/ice_flow.c | 109 ++++++++++++++++++++++++++++++++ drivers/net/ice/base/ice_flow.h | 16 +++++ 2 files changed, 125 insertions(+)
drivers/net/ice/base/ice_flow.c +109 -0
@@ -4071,6 +4071,115 @@ ice_rss_update_symm(struct ice_hw *hw, } } +/** +* ice_rss_cfg_raw_symm - configure symmetric hash parameters +* for raw pattern +* @hw: pointer to the hardware structure +* @prof: pointer to parser profile +* @prof_id: profile ID +* +* Calculate symmetric hash parameters based on input protocol type. +*/ +static void +ice_rss_cfg_raw_symm (struct ice_hw *hw, +struct ice_parser_profile *prof,u64 prof_id) +{ +u8 src_idx, dst_idx, proto_id; +int len, i =0 ; + +while (i < prof->fv_num) { + proto_id = prof->fv[i].proto_id; + +switch (proto_id) { +case ICE_PROT_IPV4_OF_OR_S : + len =ICE_FLOW_FLD_SZ_IPV4_ADDR / +ICE_FLOW_FV_EXTRACT_SZ ; +if (prof->fv[i].offset == +ICE_FLOW_FIELD_IPV4_SRC_OFFSET && + prof->fv[i + len].proto_id == proto_id && + prof->fv[i + len].offset == +ICE_FLOW_FIELD_IPV4_DST_OFFSET ) { + src_idx = i; + dst_idx = i + len; + i +=2 * len; +break ; + } + i++; +continue ; +case ICE_PROT_IPV6_OF_OR_S : + len =ICE_FLOW_FLD_SZ_IPV6_ADDR / +ICE_FLOW_FV_EXTRACT_SZ ; +if (prof->fv[i].offset == +ICE_FLOW_FIELD_IPV6_SRC_OFFSET && + prof->fv[i + len].proto_id == proto_id && + prof->fv[i + len].offset == +ICE_FLOW_FIELD_IPV6_DST_OFFSET ) { + src_idx = i; + dst_idx = i + len; + i +=2 * len; +break ; + } + i++; +continue ; +case ICE_PROT_TCP_IL : +case ICE_PROT_UDP_IL_OR_S : +case ICE_PROT_SCTP_IL : + len =ICE_FLOW_FLD_SZ_PORT / +ICE_FLOW_FV_EXTRACT_SZ ; +if (prof->fv[i].offset == +ICE_FLOW_FIELD_SRC_PORT_OFFSET && + prof->fv[i + len].proto_id == proto_id && + prof->fv[i + len].offset == +ICE_FLOW_FIELD_DST_PORT_OFFSET ) { + src_idx = i; + dst_idx = i + len; + i +=2 * len; +break ; + } + i++; +continue ; +default : + i++; +continue ; + } +ice_rss_config_xor (hw, prof_id, src_idx, dst_idx, len); + } +} + +/* Max registers index per packet profile */ +#define ICE_SYMM_REG_INDEX_MAX 6 + +/** +* ice_rss_update_raw_symm - update symmetric hash configuration +* for raw pattern +* @hw: pointer to the hardware structure +* @cfg: configure parameters for raw pattern +* @id: profile tracking ID +* +* Update symmetric hash configuration for raw pattern if required. +* Otherwise only clear to default. +*/ +void +ice_rss_update_raw_symm (struct ice_hw *hw, +struct ice_rss_raw_cfg *cfg,u64 id) +{ +struct ice_prof_map *map; +u8 prof_id, m; + +ice_acquire_lock (&hw->blk[ICE_BLK_RSS ].es.prof_map_lock); + map =ice_search_prof_id (hw,ICE_BLK_RSS , id); +if (map) + prof_id = map->prof_id; +ice_release_lock (&hw->blk[ICE_BLK_RSS ].es.prof_map_lock); +if (!map) +return ; +/* clear to default */ +for (m =0 ; m <ICE_SYMM_REG_INDEX_MAX ; m++) +wr32 (hw,GLQF_HSYMM (prof_id, m),0 ); +if (cfg->symm) +ice_rss_cfg_raw_symm (hw, &cfg->prof, prof_id); +} +/** * ice_add_rss_cfg_sync - add an RSS configuration * @hw: pointer to the hardware structure
drivers/net/ice/base/ice_flow.h +16 -0
@@ -149,6 +149,13 @@#define ICE_FLOW_HASH_NAT_T_ESP_IPV6_SPI \ (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_NAT_T_ESP_SPI) +#define ICE_FLOW_FIELD_IPV4_SRC_OFFSET 12 +#define ICE_FLOW_FIELD_IPV4_DST_OFFSET 16 +#define ICE_FLOW_FIELD_IPV6_SRC_OFFSET 8 +#define ICE_FLOW_FIELD_IPV6_DST_OFFSET 24 +#define ICE_FLOW_FIELD_SRC_PORT_OFFSET 0 +#define ICE_FLOW_FIELD_DST_PORT_OFFSET 2 +/* Protocol header fields within a packet segment. A segment consists of one or * more protocol headers that make up a logical group of protocol headers. Each * logical group of protocol headers encapsulates or is encapsulated using/by
@@ -493,11 +500,18 @@ struct ice_flow_prof {struct ice_flow_action *acts; }; +struct ice_rss_raw_cfg { +struct ice_parser_profile prof; +bool raw_ena; +bool symm; +}; +struct ice_rss_cfg {struct LIST_ENTRY_TYPE l_entry;/* bitmap of VSIs added to the RSS entry */ ice_declare_bitmap(vsis, ICE_MAX_VSI);struct ice_rss_hash_cfg hash; +struct ice_rss_raw_cfg raw; };enum ice_flow_action_type {
@@ -585,5 +599,7 @@ ice_add_rss_cfg(struct ice_hw *hw, u16 vsi_handle,enum ice_status ice_rem_rss_cfg (struct ice_hw *hw,u16 vsi_handle,const struct ice_rss_hash_cfg *cfg); +void ice_rss_update_raw_symm (struct ice_hw *hw, +struct ice_rss_raw_cfg *cfg,u64 id);u64 ice_get_rss_cfg (struct ice_hw *hw,u16 vsi_handle,u32 hdrs);#endif /* _ICE_FLOW_H_ */
Signature · 1 line
2.17.1
PATCH v3 2/3 net/ice: enable protocol agnostic flow offloading in RSS
In reply to Ting XuEnable protocol agnostic flow offloading to support raw pattern input for RSS hash flow rule creation. It is based on Parser Library feature. Current rte_flow raw API is utilized.
--- drivers/net/ice/ice_ethdev.h | 9 ++ drivers/net/ice/ice_hash.c | 286 ++++++++++++++++++++++++++++++++--- 2 files changed, 273 insertions(+), 22 deletions(-)
drivers/net/ice/ice_ethdev.h +9 -0
@@ -500,6 +500,14 @@ struct ice_fdir_prof_info {u64 fdir_actived_cnt; }; +/** +* Structure to store rss fv entry. +*/ +struct ice_rss_prof_info { +struct ice_parser_profile prof; +bool symm; +}; +/** * Structure to store private data for each PF/VF instance. */
@@ -524,6 +532,7 @@ struct ice_adapter {bool ptp_ena;uint64_t time_hw;struct ice_fdir_prof_info fdir_prof_info[ICE_MAX_PTGS ]; +struct ice_rss_prof_info rss_prof_info[ICE_MAX_PTGS ];#ifdef RTE_ARCH_X86 bool rx_use_avx2;bool rx_use_avx512;
drivers/net/ice/ice_hash.c +264 -22
358 lines not on this page · raw message
Signature · 1 line
2.17.1
Re: [dpdk-dev] [PATCH v3 2/3] net/ice: enable protocol agnostic flow offloading in RSS
Quoted 13 lines · Ting Xu
drivers/net/ice/ice_hash.c +13
-0+static int +ice_hash_rem_raw_cfg (struct ice_adapter *ad, +struct ice_parser_profile *prof, +u16 vsi_handle) +{ +struct ice_hw *hw = &ad->hw; +int ptg, ret; +u16 vsig; +u64 id; + + id = (u64 )ice_find_first_bit (prof->ptypes,0xFFFF ); + + ptg = hw->blk[ICE_BLK_RSS ].xlt1.t[id];
drivers/net/ice/ice_hash.c ice_hash_create(struct ice_adapter *ad, · line 1371
Quoted 10 lines
drivers/net/ice/ice_hash.c +10
-0+ +memset (&ad->rss_prof_info[ptg],0 , +sizeof (struct ice_rss_prof_info )); + +/* check if vsig is already removed */ + ret =ice_vsig_find_vsi (hw,ICE_BLK_RSS , +ice_get_hw_vsi_num (hw, vsi_handle), &vsig); +if (!ret && vsig) { + ret = ice_rem_prof_id_flow(hw, ICE_BLK_RSS, + ice_get_hw_vsi_num(hw, vsi__handle),
The set doesn't compile, 'vsi__handle' is not defined.
Most probably it is a typo for 'vsi_handle', but I was reluctant to fix it in next-net. If the code sent without compiling, there may be other issues missed, can you please check the set again, build it, test it and send a new version?
Thanks,
ferruh
Re: [dpdk-dev] [PATCH v3 2/3] net/ice: enable protocol agnostic flow offloading in RSS
Quoted 35 lines
-----Original Message-----
From: Yigit, Ferruh <[email protected]>
Sent: Wednesday, November 3, 2021 10:13 PM
To: Xu, Ting <[email protected]>; [email protected]
Cc: Zhang, Qi Z <[email protected]>; Yang, Qiming <[email protected]>; Guo, Junfeng <[email protected]>
Subject: Re: [dpdk-dev] [PATCH v3 2/3] net/ice: enable protocol agnostic flow offloading in RSSQuoted 13 lines · Ting Xu
drivers/net/ice/ice_hash.c +13
-0+static int +ice_hash_rem_raw_cfg (struct ice_adapter *ad, +struct ice_parser_profile *prof, +u16 vsi_handle) +{ +struct ice_hw *hw = &ad->hw; +int ptg, ret; +u16 vsig; +u64 id; + + id = (u64 )ice_find_first_bit (prof->ptypes,0xFFFF ); + + ptg = hw->blk[ICE_BLK_RSS ].xlt1.t[id];drivers/net/ice/ice_hash.c ice_hash_create(struct ice_adapter *ad,
Quoted 10 lines
drivers/net/ice/ice_hash.c +10
-0+ +memset (&ad->rss_prof_info[ptg],0 , +sizeof (struct ice_rss_prof_info )); + +/* check if vsig is already removed */ + ret =ice_vsig_find_vsi (hw,ICE_BLK_RSS , +ice_get_hw_vsi_num (hw, vsi_handle), &vsig); +if (!ret && vsig) { + ret = ice_rem_prof_id_flow(hw, ICE_BLK_RSS, + ice_get_hw_vsi_num(hw,
vsi__handle),
Quoted 8 lines
The set doesn't compile, '
vsi__handle' is not defined.Most probably it is a typo for '
vsi_handle', but I was reluctant to fix it in next- net. If the code sent without compiling, there may be other issues missed, can you please check the set again, build it, test it and send a new version?Thanks,
Ferruh
Hi, Ferruh, Sorry for the missing check since I was hurried when submitted this patchset after update. A new version is sent now with build and test passed. Thanks!
PATCH v3 3/3 doc: add protocol agnostic flow offloading for RSS
In reply to Ting XuProtocol agnostic flow offloading for RSS hash is supported. Raw pattern input can be used to create RSS hash flow rules, using current rte_flow raw API.
--- doc/guides/rel_notes/release_21_11.rst | 1 + 1 file changed, 1 insertion(+)
doc/guides/rel_notes/release_21_11.rst +1 -0
@@ -168,6 +168,7 @@ New Features * **Updated Intel ice driver.** * Added protocol agnostic flow offloading support in Flow Director. + * Added protocol agnostic flow offloading support in RSS hash. * Added 1PPS out support by a devargs. * Added IPv4 and L4 (TCP/UDP/SCTP) checksum hash support in RSS flow. * Added DEV_RX_OFFLOAD_TIMESTAMP support.
Signature · 1 line
2.17.1
Quoted 11 lines
-----Original Message-----
From: Xu, Ting <[email protected]>
Sent: Tuesday, November 2, 2021 9:50 AM
To: [email protected]
Cc: Zhang, Qi Z <[email protected]>; Yang, Qiming <[email protected]>; Guo, Junfeng <[email protected]>; Xu, Ting <[email protected]>
Subject: [PATCH v3 0/3] enable protocol agnostic flow offloading in RSS
Quoted 8 lines
Enable protocol agnostic flow offloading to support raw pattern input for RSS hash flow rule creation. It is based on Parser Library feature. Current
rte_flowraw API is utilized.Ting Xu (3):
net/ice/base: support add HW profile for RSS raw flow net/ice: enable protocol agnostic flow offloading in RSS
doc: add protocol agnostic flow offloading for RSS
Release note update should be squash to the patch that implemented the feature.
Quoted 10 lines
doc/guides/rel_notes/release_21_11.rst | 1 + drivers/net/ice/base/ice_flow.c | 109 ++++++++++ drivers/net/ice/base/ice_flow.h | 16 ++ drivers/net/ice/ice_ethdev.h | 9 + drivers/net/ice/ice_hash.c | 286 +++++++++++++++++++++++-- 5 files changed, 399 insertions(+), 22 deletions(-)--
2.17.1
Applied to dpdk-next-net-intel.
Thanks
Qi
Quoted 15 lines · Qi Z
Quoted 15 lines
-----Original Message-----
From: Xu, Ting <[email protected]>
Sent: Tuesday, November 2, 2021 9:50 AM
To: [email protected]
Cc: Zhang, Qi Z <[email protected]>; Yang, Qiming <[email protected]>; Guo, Junfeng <[email protected]>; Xu, Ting <[email protected]>
Subject: [PATCH v3 0/3] enable protocol agnostic flow offloading in RSSEnable protocol agnostic flow offloading to support raw pattern input for RSS hash flow rule creation. It is based on Parser Library feature. Current
rte_flowraw API is utilized.
Quoted 7 lines
Quoted 4 lines
Ting Xu (3):
net/ice/base: support add HW profile for RSS raw flow net/ice: enable protocol agnostic flow offloading in RSS
doc: add protocol agnostic flow offloading for RSSRelease note update should be squash to the patch that implemented the feature.
+1
Ting, can you send new version including this change please.
v4 cover enable protocol agnostic flow offloading in RSS
In reply to Ting XuEnable protocol agnostic flow offloading to support raw pattern input for RSS hash flow rule creation. It is based on Parser Library feature. Current rte_flow raw API is utilized.
Ting Xu (2):
net/ice/base: support add HW profile for RSS raw flow net/ice: enable protocol agnostic flow offloading in RSS
doc/guides/rel_notes/release_21_11.rst | 1 + drivers/net/ice/base/ice_flow.c | 109 ++++++++++ drivers/net/ice/base/ice_flow.h | 16 ++ drivers/net/ice/ice_ethdev.h | 9 + drivers/net/ice/ice_hash.c | 286 +++++++++++++++++++++++-- 5 files changed, 399 insertions(+), 22 deletions(-)
Signature · 1 line
2.17.1
PATCH v4 1/2 net/ice/base: support add HW profile for RSS raw flow
Based on the parser library, we can directly set HW profile and associate VSI for RSS raw flows. Add symmetric hash configuration for raw flow.
--- drivers/net/ice/base/ice_flow.c | 109 ++++++++++++++++++++++++++++++++ drivers/net/ice/base/ice_flow.h | 16 +++++ 2 files changed, 125 insertions(+)
drivers/net/ice/base/ice_flow.c +109 -0
@@ -4071,6 +4071,115 @@ ice_rss_update_symm(struct ice_hw *hw, } } +/** +* ice_rss_cfg_raw_symm - configure symmetric hash parameters +* for raw pattern +* @hw: pointer to the hardware structure +* @prof: pointer to parser profile +* @prof_id: profile ID +* +* Calculate symmetric hash parameters based on input protocol type. +*/ +static void +ice_rss_cfg_raw_symm (struct ice_hw *hw, +struct ice_parser_profile *prof,u64 prof_id) +{ +u8 src_idx, dst_idx, proto_id; +int len, i =0 ; + +while (i < prof->fv_num) { + proto_id = prof->fv[i].proto_id; + +switch (proto_id) { +case ICE_PROT_IPV4_OF_OR_S : + len =ICE_FLOW_FLD_SZ_IPV4_ADDR / +ICE_FLOW_FV_EXTRACT_SZ ; +if (prof->fv[i].offset == +ICE_FLOW_FIELD_IPV4_SRC_OFFSET && + prof->fv[i + len].proto_id == proto_id && + prof->fv[i + len].offset == +ICE_FLOW_FIELD_IPV4_DST_OFFSET ) { + src_idx = i; + dst_idx = i + len; + i +=2 * len; +break ; + } + i++; +continue ; +case ICE_PROT_IPV6_OF_OR_S : + len =ICE_FLOW_FLD_SZ_IPV6_ADDR / +ICE_FLOW_FV_EXTRACT_SZ ; +if (prof->fv[i].offset == +ICE_FLOW_FIELD_IPV6_SRC_OFFSET && + prof->fv[i + len].proto_id == proto_id && + prof->fv[i + len].offset == +ICE_FLOW_FIELD_IPV6_DST_OFFSET ) { + src_idx = i; + dst_idx = i + len; + i +=2 * len; +break ; + } + i++; +continue ; +case ICE_PROT_TCP_IL : +case ICE_PROT_UDP_IL_OR_S : +case ICE_PROT_SCTP_IL : + len =ICE_FLOW_FLD_SZ_PORT / +ICE_FLOW_FV_EXTRACT_SZ ; +if (prof->fv[i].offset == +ICE_FLOW_FIELD_SRC_PORT_OFFSET && + prof->fv[i + len].proto_id == proto_id && + prof->fv[i + len].offset == +ICE_FLOW_FIELD_DST_PORT_OFFSET ) { + src_idx = i; + dst_idx = i + len; + i +=2 * len; +break ; + } + i++; +continue ; +default : + i++; +continue ; + } +ice_rss_config_xor (hw, prof_id, src_idx, dst_idx, len); + } +} + +/* Max registers index per packet profile */ +#define ICE_SYMM_REG_INDEX_MAX 6 + +/** +* ice_rss_update_raw_symm - update symmetric hash configuration +* for raw pattern +* @hw: pointer to the hardware structure +* @cfg: configure parameters for raw pattern +* @id: profile tracking ID +* +* Update symmetric hash configuration for raw pattern if required. +* Otherwise only clear to default. +*/ +void +ice_rss_update_raw_symm (struct ice_hw *hw, +struct ice_rss_raw_cfg *cfg,u64 id) +{ +struct ice_prof_map *map; +u8 prof_id, m; + +ice_acquire_lock (&hw->blk[ICE_BLK_RSS ].es.prof_map_lock); + map =ice_search_prof_id (hw,ICE_BLK_RSS , id); +if (map) + prof_id = map->prof_id; +ice_release_lock (&hw->blk[ICE_BLK_RSS ].es.prof_map_lock); +if (!map) +return ; +/* clear to default */ +for (m =0 ; m <ICE_SYMM_REG_INDEX_MAX ; m++) +wr32 (hw,GLQF_HSYMM (prof_id, m),0 ); +if (cfg->symm) +ice_rss_cfg_raw_symm (hw, &cfg->prof, prof_id); +} +/** * ice_add_rss_cfg_sync - add an RSS configuration * @hw: pointer to the hardware structure
drivers/net/ice/base/ice_flow.h +16 -0
@@ -149,6 +149,13 @@#define ICE_FLOW_HASH_NAT_T_ESP_IPV6_SPI \ (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_NAT_T_ESP_SPI) +#define ICE_FLOW_FIELD_IPV4_SRC_OFFSET 12 +#define ICE_FLOW_FIELD_IPV4_DST_OFFSET 16 +#define ICE_FLOW_FIELD_IPV6_SRC_OFFSET 8 +#define ICE_FLOW_FIELD_IPV6_DST_OFFSET 24 +#define ICE_FLOW_FIELD_SRC_PORT_OFFSET 0 +#define ICE_FLOW_FIELD_DST_PORT_OFFSET 2 +/* Protocol header fields within a packet segment. A segment consists of one or * more protocol headers that make up a logical group of protocol headers. Each * logical group of protocol headers encapsulates or is encapsulated using/by
@@ -493,11 +500,18 @@ struct ice_flow_prof {struct ice_flow_action *acts; }; +struct ice_rss_raw_cfg { +struct ice_parser_profile prof; +bool raw_ena; +bool symm; +}; +struct ice_rss_cfg {struct LIST_ENTRY_TYPE l_entry;/* bitmap of VSIs added to the RSS entry */ ice_declare_bitmap(vsis, ICE_MAX_VSI);struct ice_rss_hash_cfg hash; +struct ice_rss_raw_cfg raw; };enum ice_flow_action_type {
@@ -585,5 +599,7 @@ ice_add_rss_cfg(struct ice_hw *hw, u16 vsi_handle,enum ice_status ice_rem_rss_cfg (struct ice_hw *hw,u16 vsi_handle,const struct ice_rss_hash_cfg *cfg); +void ice_rss_update_raw_symm (struct ice_hw *hw, +struct ice_rss_raw_cfg *cfg,u64 id);u64 ice_get_rss_cfg (struct ice_hw *hw,u16 vsi_handle,u32 hdrs);#endif /* _ICE_FLOW_H_ */
Signature · 1 line
2.17.1
PATCH v4 2/2 net/ice: enable protocol agnostic flow offloading in RSS
In reply to Ting XuEnable protocol agnostic flow offloading to support raw pattern input for RSS hash flow rule creation. It is based on Parser Library feature. Current rte_flow raw API is utilized.
--- doc/guides/rel_notes/release_21_11.rst | 1 + drivers/net/ice/ice_ethdev.h | 9 + drivers/net/ice/ice_hash.c | 286 +++++++++++++++++++++++-- 3 files changed, 274 insertions(+), 22 deletions(-)
doc/guides/rel_notes/release_21_11.rst +1 -0
@@ -168,6 +168,7 @@ New Features * **Updated Intel ice driver.** * Added protocol agnostic flow offloading support in Flow Director. + * Added protocol agnostic flow offloading support in RSS hash. * Added 1PPS out support by a devargs. * Added IPv4 and L4 (TCP/UDP/SCTP) checksum hash support in RSS flow. * Added DEV_RX_OFFLOAD_TIMESTAMP support.
drivers/net/ice/ice_ethdev.h +9 -0
@@ -500,6 +500,14 @@ struct ice_fdir_prof_info {u64 fdir_actived_cnt; }; +/** +* Structure to store rss fv entry. +*/ +struct ice_rss_prof_info { +struct ice_parser_profile prof; +bool symm; +}; +/** * Structure to store private data for each PF/VF instance. */
@@ -524,6 +532,7 @@ struct ice_adapter {bool ptp_ena;uint64_t time_hw;struct ice_fdir_prof_info fdir_prof_info[ICE_MAX_PTGS ]; +struct ice_rss_prof_info rss_prof_info[ICE_MAX_PTGS ];#ifdef RTE_ARCH_X86 bool rx_use_avx2;bool rx_use_avx512;
drivers/net/ice/ice_hash.c +264 -22
358 lines not on this page · raw message
Signature · 1 line
2.17.1
Zhang, Qi Z
AppliedQuoted 26 lines
-----Original Message-----
From: Xu, Ting <[email protected]>
Sent: Thursday, November 4, 2021 10:22 AM
To: [email protected]
Cc: Zhang, Qi Z <[email protected]>; Yang, Qiming <[email protected]>; Guo, Junfeng <[email protected]>; Xu, Ting <[email protected]>
Subject: [PATCH v4 0/2] enable protocol agnostic flow offloading in RSSEnable protocol agnostic flow offloading to support raw pattern input for RSS hash flow rule creation. It is based on Parser Library feature. Current
rte_flowraw API is utilized.Ting Xu (2):
net/ice/base: support add HW profile for RSS raw flow net/ice: enable protocol agnostic flow offloading in RSSdoc/guides/rel_notes/release_21_11.rst | 1 + drivers/net/ice/base/ice_flow.c | 109 ++++++++++ drivers/net/ice/base/ice_flow.h | 16 ++ drivers/net/ice/ice_ethdev.h | 9 + drivers/net/ice/ice_hash.c | 286 +++++++++++++++++++++++-- 5 files changed, 399 insertions(+), 22 deletions(-)
Quoted 2 lines
--
2.17.1
Applied to dpdk-next-net-intel.
Thanks
Qi
04/11/2021 03:22, Ting Xu:
Quoted 3 lines
Enable protocol agnostic flow offloading to support raw pattern input for RSS hash flow rule creation. It is based on Parser Library feature. Current
rte_flowraw API is utilized.
I remember raw item was especially targetting encapsulation action. Which action do you achieve in ice PMD? Only RSS with raw item?
For matching, raw item is quite limited. I think the new flex item is more appropriate for general custom protocol parsing. Did you look into flex item feature?
Quoted 15 lines
-----Original Message-----
From: Thomas Monjalon <[email protected]>
Sent: Friday, November 5, 2021 9:10 PM
To: Zhang, Qi Z <[email protected]>; Xu, Ting <[email protected]>
Cc: [email protected]; Yang, Qiming <[email protected]>; Guo, Junfeng <[email protected]>; [email protected]; [email protected]; Yigit, Ferruh <[email protected]>; [email protected]
Subject: Re: [dpdk-dev] [PATCH v4 0/2] enable protocol agnostic flow offloading in RSS04/11/2021 03:22, Ting Xu:
Quoted 3 lines
Enable protocol agnostic flow offloading to support raw pattern input for RSS hash flow rule creation. It is based on Parser Library feature. Current
rte_flowraw API is utilized.
Quoted 7 lines
I remember raw item was especially targetting encapsulation action. Which action do you achieve in ice PMD? Only RSS with raw item?
For matching, raw item is quite limited. I think the new flex item is more appropriate for general custom protocol parsing.
Did you look into flex item feature?
Hi, Thomas, we make use of the API for rte_raw to achieve our protocol agnostic flow offloading method, including RSS and FDIR. Behind it is the new Parser Library feature based on DDP, rather than the original logic I think. Binary-format pattern spec and mask are passed to Parser Library and the corresponding protocol ID and offset will be provided.
05/11/2021 14:18, Xu, Ting:
Quoted 9 lines
From: Thomas Monjalon <[email protected]>
Quoted 8 lines
04/11/2021 03:22, Ting Xu:
Quoted 3 lines
Enable protocol agnostic flow offloading to support raw pattern input for RSS hash flow rule creation. It is based on Parser Library feature. Current
rte_flowraw API is utilized.I remember raw item was especially targetting encapsulation action. Which action do you achieve in ice PMD? Only RSS with raw item?
Quoted 7 lines
Quoted 4 lines
For matching, raw item is quite limited. I think the new flex item is more appropriate for general custom protocol parsing.
Did you look into flex item feature?Hi, Thomas, we make use of the API for
rte_rawto achieve our protocol agnostic flow offloading method, including RSS and FDIR. Behind it is the new Parser Library feature based on DDP,
Where is this parser library code?
Quoted 4 lines
rather than the original logic I think.
Binary-format pattern spec and mask are passed to Parser Library and the corresponding protocol ID and offset will be provided.
Sorry you didn't reply about the new flex item added in this release. Do you know it was added?
https://git.dpdk.org/dpdk/commit/?id=dc4d860e8a89
Quoted 25 lines
-----Original Message-----
From: Thomas Monjalon <[email protected]>
Sent: Friday, November 5, 2021 9:23 PM
To: Zhang, Qi Z <[email protected]>; Xu, Ting <[email protected]>
Cc: [email protected]; Yang, Qiming <[email protected]>; Guo, Junfeng <[email protected]>; [email protected]; [email protected]; Yigit, Ferruh <[email protected]>; [email protected]
Subject: Re: [dpdk-dev] [PATCH v4 0/2] enable protocol agnostic flow offloading in RSS05/11/2021 14:18, Xu, Ting:
Quoted 4 lines
From: Thomas Monjalon <[email protected]>
Quoted 3 lines
04/11/2021 03:22, Ting Xu:
Quoted 2 lines
Enable protocol agnostic flow offloading to support raw pattern input for RSS hash flow rule creation. It is based on Parser Library
feature.
Quoted 9 lines
Quoted 9 lines
Quoted 1 line
Current
rte_flowraw API is utilized.I remember raw item was especially targetting encapsulation action. Which action do you achieve in ice PMD? Only RSS with raw item?
For matching, raw item is quite limited. I think the new flex item is more appropriate for general custom protocol parsing. Did you look into flex item feature?
Quoted 5 lines
Quoted 3 lines
Hi, Thomas, we make use of the API for
rte_rawto achieve our protocol agnostic flow offloading method, including RSS and FDIR. Behind it is the new Parser Library feature based on DDP,Where is this parser library code?
Parser Library is committed before as ice base code.
Quoted 10 lines
Quoted 5 lines
rather than the original logic I think.
Binary-format pattern spec and mask are passed to Parser Library and the corresponding protocol ID and offset will be provided.
Sorry you didn't reply about the new flex item added in this release. Do you know it was added?
https://git.dpdk.org/dpdk/commit/?id=dc4d860e8a89
Protocol agnostic flow offloading is based on ice DDP feature, although they all want to make flow creation more flexible, I think it is different with flex item. @Zhang, Qi Z Hi, Qi, are you familiar with flex item?
Quoted 58 lines
-----Original Message-----
From: Xu, Ting <[email protected]>
Sent: Friday, November 5, 2021 10:54 PM
To: Thomas Monjalon <[email protected]>; Zhang, Qi Z <[email protected]>
Cc: [email protected]; Yang, Qiming <[email protected]>; Guo, Junfeng <[email protected]>; [email protected]; [email protected]; Yigit, Ferruh <[email protected]>; [email protected]
Subject: RE: [dpdk-dev] [PATCH v4 0/2] enable protocol agnostic flow offloading in RSSQuoted 26 lines
-----Original Message-----
From: Thomas Monjalon <[email protected]>
Sent: Friday, November 5, 2021 9:23 PM
To: Zhang, Qi Z <[email protected]>; Xu, Ting <[email protected]>
Cc: [email protected]; Yang, Qiming <[email protected]>; Guo, Junfeng <[email protected]>; [email protected]; [email protected]; Yigit, Ferruh <[email protected]>; [email protected]
Subject: Re: [dpdk-dev] [PATCH v4 0/2] enable protocol agnostic flow offloading in RSS05/11/2021 14:18, Xu, Ting:
Quoted 5 lines
From: Thomas Monjalon <[email protected]>
Quoted 4 lines
04/11/2021 03:22, Ting Xu:
Quoted 3 lines
Enable protocol agnostic flow offloading to support raw pattern input for RSS hash flow rule creation. It is based on Parser Library
feature.
Quoted 9 lines
Quoted 9 lines
Quoted 1 line
Current
rte_flowraw API is utilized.I remember raw item was especially targetting encapsulation action. Which action do you achieve in ice PMD? Only RSS with raw item?
For matching, raw item is quite limited. I think the new flex item is more appropriate for general custom protocol parsing. Did you look into flex item feature?
Quoted 5 lines
Quoted 3 lines
Hi, Thomas, we make use of the API for
rte_rawto achieve our protocol agnostic flow offloading method, including RSS and FDIR. Behind it is the new Parser Library feature based on DDP,Where is this parser library code?
Parser Library is committed before as ice base code.
Quoted 10 lines
Quoted 5 lines
rather than the original logic I think.
Binary-format pattern spec and mask are passed to Parser Library and the corresponding protocol ID and offset will be provided.
Sorry you didn't reply about the new flex item added in this release. Do you know it was added?
https://git.dpdk.org/dpdk/commit/?id=dc4d860e8a89
Quoted 5 lines
Protocol agnostic flow offloading is based on ice DDP feature, although they all want to make flow creation more flexible, I think it is different with flex item.
@Zhang, Qi Z Hi, Qi, are you familiar with flex item?
Yes, this is a very Intel DDP specific feature, the goal is to make our driver to support any customized parser (DDP) without change code.
Below steps are planned:
1. raw packet interface, this help on quick POC, as its simply the rte_flow parser, but of cause it's not scale for an DPDK application to support different vendor.
2. enable a build-in util to forge a packet from a sequence of rte_flow headers, then the application will be scale, but the missing part is how to describe a customized header, we have similar idea like json, but seems "Flex Item" already help to fix this gap, and we will improve the solution base on it.
Thanks
Qi
08/11/2021 03:44, Zhang, Qi Z:
Quoted 43 lines
From: Xu, Ting <[email protected]>
Quoted 36 lines
From: Thomas Monjalon <[email protected]>
Quoted 16 lines
05/11/2021 14:18, Xu, Ting:
Quoted 5 lines
From: Thomas Monjalon <[email protected]>
Quoted 4 lines
04/11/2021 03:22, Ting Xu:
Quoted 3 lines
Enable protocol agnostic flow offloading to support raw pattern input for RSS hash flow rule creation. It is based on Parser Library
feature.
Quoted 9 lines
Quoted 9 lines
Quoted 1 line
Current
rte_flowraw API is utilized.I remember raw item was especially targetting encapsulation action. Which action do you achieve in ice PMD? Only RSS with raw item?
For matching, raw item is quite limited. I think the new flex item is more appropriate for general custom protocol parsing. Did you look into flex item feature?
Quoted 5 lines
Quoted 3 lines
Hi, Thomas, we make use of the API for
rte_rawto achieve our protocol agnostic flow offloading method, including RSS and FDIR. Behind it is the new Parser Library feature based on DDP,Where is this parser library code?
Parser Library is committed before as ice base code.
Quoted 10 lines
Quoted 5 lines
rather than the original logic I think.
Binary-format pattern spec and mask are passed to Parser Library and the corresponding protocol ID and offset will be provided.
Sorry you didn't reply about the new flex item added in this release. Do you know it was added?
https://git.dpdk.org/dpdk/commit/?id=dc4d860e8a89Quoted 5 lines
Protocol agnostic flow offloading is based on ice DDP feature, although they all want to make flow creation more flexible, I think it is different with flex item.
@Zhang, Qi Z Hi, Qi, are you familiar with flex item?
Quoted 6 lines
Yes, this is a very Intel DDP specific feature, the goal is to make our driver to support any customized parser (DDP) without change code.
Below steps are planned:
1. raw packet interface, this help on quick POC, as its simply the
rte_flowparser, but of cause it's not scale for an DPDK application to support different vendor.
2. enable a build-in util to forge a packet from a sequence ofrte_flowheaders, then the application will be scale, but the missing part is how to describe a customized header, we have similar idea like json, but seems "Flex Item" already help to fix this gap, and we will improve the solution base on it.
Yes please, I hope flex item will fit with your need.