From patchwork Thu Apr 7 16:06:14 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qi Zhang X-Patchwork-Id: 109410 X-Patchwork-Delegate: qi.z.zhang@intel.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id A973AA050B; Thu, 7 Apr 2022 10:00:14 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 505DB40689; Thu, 7 Apr 2022 10:00:14 +0200 (CEST) Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by mails.dpdk.org (Postfix) with ESMTP id 1D5144014F; Thu, 7 Apr 2022 10:00:12 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649318413; x=1680854413; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=B+M6NB5h6cGx3m9Aa23Mz/2Z9jVuTgs56uJGG+Yunsk=; b=KgyCEpD8cw7WVGwSfxY8pMrvDwHpABdzWEwJ16JvfH35p7UJfFqEuMoM 1g1VkZERdDA1YeRvNEhlXuZ+Vrip97xjRjyW/ukDXGroTYp0okDaeJ/lj b0UaGpMUgqziqKV4dCQwTgXeYug9DgQAyeSXAVDXaLS4fkVuHWz1NIJCr qQxFzX7ozSNyFJ3udqBiX4OYKZP0eFnFD3L4rnRJjS+6oxVVPgU0trLxl DZ35MEaccqU6rqnkCV7eMBL63c5xzSPkNcLJL73/zj26KYDMd9Bdj59pb K65LYTZ+rldVM00mI25h74ILtQNpGRjxnfO0yLgHKvRPNxcGaNDMsx41v A==; X-IronPort-AV: E=McAfee;i="6200,9189,10309"; a="248780917" X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="248780917" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 01:00:12 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="524820159" Received: from qzhan15-icelake-dpdk.sh.intel.com ([10.67.114.175]) by orsmga006.jf.intel.com with ESMTP; 07 Apr 2022 01:00:09 -0700 From: Qi Zhang To: junfeng.guo@intel.com, ting.xu@intel.com Cc: dev@dpdk.org, qiming.yang@intel.com, Qi Zhang , stable@dpdk.org Subject: [PATCH v3] net/ice: refact parser API usage Date: Thu, 7 Apr 2022 12:06:14 -0400 Message-Id: <20220407160614.886439-1-qi.z.zhang@intel.com> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Not necessary to create / destroy a parser instance for every raw packet rule. A global parser instance will be created in ice_flow_init and be destroyed in ice_flow_uninit. Also, ice_dev_udp_tunnel_port_add has been hooked to perform corresponding parser configure. This also fix the issue that RSS engine can't support VXLAN inner through raw packet filter. Fixes: 1b9c68120a1c ("net/ice: enable protocol agnostic flow offloading in RSS") Cc: stable@dpdk.org Signed-off-by: Qi Zhang Acked-by: Xu Ting --- v3: - add missing refact in ice_hash.c v2: - typo fix. drivers/net/ice/ice_ethdev.c | 10 ++++++++++ drivers/net/ice/ice_ethdev.h | 1 + drivers/net/ice/ice_fdir_filter.c | 14 ++++---------- drivers/net/ice/ice_generic_flow.c | 8 ++++++++ drivers/net/ice/ice_hash.c | 9 ++++----- 5 files changed, 27 insertions(+), 15 deletions(-) diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c index 73e550f5fb..8bb34b874b 100644 --- a/drivers/net/ice/ice_ethdev.c +++ b/drivers/net/ice/ice_ethdev.c @@ -5621,6 +5621,8 @@ ice_dev_udp_tunnel_port_add(struct rte_eth_dev *dev, { int ret = 0; struct ice_hw *hw = ICE_DEV_PRIVATE_TO_HW(dev->data->dev_private); + struct ice_adapter *ad = + ICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); if (udp_tunnel == NULL) return -EINVAL; @@ -5628,6 +5630,9 @@ ice_dev_udp_tunnel_port_add(struct rte_eth_dev *dev, switch (udp_tunnel->prot_type) { case RTE_ETH_TUNNEL_TYPE_VXLAN: ret = ice_create_tunnel(hw, TNL_VXLAN, udp_tunnel->udp_port); + if (!ret && ad->psr != NULL) + ice_parser_vxlan_tunnel_set(ad->psr, + udp_tunnel->udp_port, true); break; default: PMD_DRV_LOG(ERR, "Invalid tunnel type"); @@ -5645,6 +5650,8 @@ ice_dev_udp_tunnel_port_del(struct rte_eth_dev *dev, { int ret = 0; struct ice_hw *hw = ICE_DEV_PRIVATE_TO_HW(dev->data->dev_private); + struct ice_adapter *ad = + ICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); if (udp_tunnel == NULL) return -EINVAL; @@ -5652,6 +5659,9 @@ ice_dev_udp_tunnel_port_del(struct rte_eth_dev *dev, switch (udp_tunnel->prot_type) { case RTE_ETH_TUNNEL_TYPE_VXLAN: ret = ice_destroy_tunnel(hw, udp_tunnel->udp_port, 0); + if (!ret && ad->psr != NULL) + ice_parser_vxlan_tunnel_set(ad->psr, + udp_tunnel->udp_port, false); break; default: PMD_DRV_LOG(ERR, "Invalid tunnel type"); diff --git a/drivers/net/ice/ice_ethdev.h b/drivers/net/ice/ice_ethdev.h index 3ab310628f..3d8427225f 100644 --- a/drivers/net/ice/ice_ethdev.h +++ b/drivers/net/ice/ice_ethdev.h @@ -561,6 +561,7 @@ struct ice_adapter { struct ice_rss_prof_info rss_prof_info[ICE_MAX_PTGS]; /* True if DCF state of the associated PF is on */ bool dcf_state_on; + struct ice_parser *psr; #ifdef RTE_ARCH_X86 bool rx_use_avx2; bool rx_use_avx512; diff --git a/drivers/net/ice/ice_fdir_filter.c b/drivers/net/ice/ice_fdir_filter.c index 7954c6d8ea..0982478feb 100644 --- a/drivers/net/ice/ice_fdir_filter.c +++ b/drivers/net/ice/ice_fdir_filter.c @@ -1826,7 +1826,6 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad, struct ice_fdir_v4 *p_v4 = NULL; struct ice_fdir_v6 *p_v6 = NULL; struct ice_parser_result rslt; - struct ice_parser *psr; uint8_t item_num = 0; for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) { @@ -1861,6 +1860,9 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad, switch (item_type) { case RTE_FLOW_ITEM_TYPE_RAW: { + if (ad->psr == NULL) + return -rte_errno; + raw_spec = item->spec; raw_mask = item->mask; @@ -1872,7 +1874,6 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad, (uint8_t *)(uintptr_t)raw_spec->pattern; unsigned char *tmp_mask = (uint8_t *)(uintptr_t)raw_mask->pattern; - uint16_t udp_port = 0; uint16_t tmp_val = 0; uint8_t pkt_len = 0; uint8_t tmp = 0; @@ -1921,15 +1922,8 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad, pkt_len /= 2; - if (ice_parser_create(&ad->hw, &psr)) - return -rte_errno; - if (ice_get_open_tunnel_port(&ad->hw, TNL_VXLAN, - &udp_port)) - ice_parser_vxlan_tunnel_set(psr, udp_port, - true); - if (ice_parser_run(psr, tmp_spec, pkt_len, &rslt)) + if (ice_parser_run(ad->psr, tmp_spec, pkt_len, &rslt)) return -rte_errno; - ice_parser_destroy(psr); if (!tmp_mask) return -rte_errno; diff --git a/drivers/net/ice/ice_generic_flow.c b/drivers/net/ice/ice_generic_flow.c index 53b1c0b69a..57eb002bde 100644 --- a/drivers/net/ice/ice_generic_flow.c +++ b/drivers/net/ice/ice_generic_flow.c @@ -1831,6 +1831,9 @@ ice_flow_init(struct ice_adapter *ad) TAILQ_INIT(&pf->dist_parser_list); rte_spinlock_init(&pf->flow_ops_lock); + if (ice_parser_create(&ad->hw, &ad->psr) != ICE_SUCCESS) + PMD_INIT_LOG(WARNING, "Failed to initialize DDP parser, raw packet filter will not be supported"); + RTE_TAILQ_FOREACH_SAFE(engine, &engine_list, node, temp) { if (engine->init == NULL) { PMD_INIT_LOG(ERR, "Invalid engine type (%d)", @@ -1885,6 +1888,11 @@ ice_flow_uninit(struct ice_adapter *ad) TAILQ_REMOVE(&pf->dist_parser_list, p_parser, node); rte_free(p_parser); } + + if (ad->psr != NULL) { + ice_parser_destroy(ad->psr); + ad->psr = NULL; + } } static struct ice_parser_list * diff --git a/drivers/net/ice/ice_hash.c b/drivers/net/ice/ice_hash.c index afbb357fa3..f35727856e 100644 --- a/drivers/net/ice/ice_hash.c +++ b/drivers/net/ice/ice_hash.c @@ -653,13 +653,15 @@ ice_hash_parse_raw_pattern(struct ice_adapter *ad, 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; + if (ad->psr == NULL) + return -rte_errno; + raw_spec = item->spec; raw_mask = item->mask; @@ -713,11 +715,8 @@ ice_hash_parse_raw_pattern(struct ice_adapter *ad, 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)) + if (ice_parser_run(ad->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))