From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id B339BA04FD; Mon, 4 Apr 2022 03:21:36 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 3BD7340698; Mon, 4 Apr 2022 03:21:36 +0200 (CEST) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by mails.dpdk.org (Postfix) with ESMTP id B091A4068C; Mon, 4 Apr 2022 03:21:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649035295; x=1680571295; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=DxXqbzpU1EAVAdclmX0ep2TS1fiau3J82WxZ08r5Z/M=; b=Wl56x8PivKikIPE2xVP3VBEl0d6xpGaFUL+mM0OmQcp4T24NHEaUqe54 yp0npD1u3MbaHCJvGRp6Sh6ZbK/REqrKR92mnXXYGrXPSEZzco58+581l I79CtLGz9vHrDh7U5X5+WSHLrowObOWXPj7joBpuKcQwpw0lzUcz6wQfp OMTQzLGXEALiUC+I+Qmmrvjc1uL8i7JEeAFHVWKiUWuoUV1yzqpt5Cinl 3h8X34nZx+AVMpsNVUAYOfOG2QrYfwoRZ9lBQBq2aPpDTEbECCJJExguu /VBacFBTSgcwBfHWxO7bwSlBgydpmqSuauhp5MDg+URC8rfS/QRaRKDgt w==; X-IronPort-AV: E=McAfee;i="6200,9189,10306"; a="285367324" X-IronPort-AV: E=Sophos;i="5.90,233,1643702400"; d="scan'208";a="285367324" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Apr 2022 18:21:30 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.90,233,1643702400"; d="scan'208";a="721475938" Received: from qzhan15-icelake-dpdk.sh.intel.com ([10.67.114.175]) by orsmga005.jf.intel.com with ESMTP; 03 Apr 2022 18:21:28 -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] net/ice: refact parser API usage Date: Mon, 4 Apr 2022 05:27:30 -0400 Message-Id: <20220404092730.129489-1-qi.z.zhang@intel.com> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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 --- drivers/net/ice/ice_ethdev.c | 10 ++++++++++ drivers/net/ice/ice_ethdev.h | 1 + drivers/net/ice/ice_fdir_filter.c | 19 ++++++------------- drivers/net/ice/ice_generic_flow.c | 8 ++++++++ 4 files changed, 25 insertions(+), 13 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..0b63390d58 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++) { @@ -1860,7 +1859,11 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad, &input_set_i : &input_set_o; switch (item_type) { - case RTE_FLOW_ITEM_TYPE_RAW: { + case RTE_FLOW_ITEM_TYPE_RAW: + + if (ad->psr == NULL) + return -rte_errno; + raw_spec = item->spec; raw_mask = item->mask; @@ -1872,7 +1875,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 +1923,8 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad, pkt_len /= 2; - if (ice_parser_create(&ad->hw, &psr)) + if (ice_parser_run(ad->psr, tmp_spec, pkt_len, &rslt)) 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)) - return -rte_errno; - ice_parser_destroy(psr); if (!tmp_mask) return -rte_errno; @@ -1954,8 +1949,6 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad, filter->parser_ena = true; break; - } - case RTE_FLOW_ITEM_TYPE_ETH: flow_type = ICE_FLTR_PTYPE_NON_IP_L2; eth_spec = item->spec; diff --git a/drivers/net/ice/ice_generic_flow.c b/drivers/net/ice/ice_generic_flow.c index 53b1c0b69a..6ce3cc0bd0 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, "Faied 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 * -- 2.31.1