From patchwork Thu Dec 4 15:40:23 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jingjing Wu X-Patchwork-Id: 1762 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id AB08A803A; Thu, 4 Dec 2014 16:41:25 +0100 (CET) Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id A9CA77EB0 for ; Thu, 4 Dec 2014 16:41:23 +0100 (CET) Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga102.fm.intel.com with ESMTP; 04 Dec 2014 07:40:30 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.07,516,1413270000"; d="scan'208";a="642399260" Received: from shvmail01.sh.intel.com ([10.239.29.42]) by fmsmga002.fm.intel.com with ESMTP; 04 Dec 2014 07:40:29 -0800 Received: from shecgisg004.sh.intel.com (shecgisg004.sh.intel.com [10.239.29.89]) by shvmail01.sh.intel.com with ESMTP id sB4FeRHQ002555; Thu, 4 Dec 2014 23:40:27 +0800 Received: from shecgisg004.sh.intel.com (localhost [127.0.0.1]) by shecgisg004.sh.intel.com (8.13.6/8.13.6/SuSE Linux 0.8) with ESMTP id sB4FeP3B025811; Thu, 4 Dec 2014 23:40:27 +0800 Received: (from wujingji@localhost) by shecgisg004.sh.intel.com (8.13.6/8.13.6/Submit) id sB4FePtw025807; Thu, 4 Dec 2014 23:40:25 +0800 From: Jingjing Wu To: dev@dpdk.org Date: Thu, 4 Dec 2014 23:40:23 +0800 Message-Id: <1417707623-25777-1-git-send-email-jingjing.wu@intel.com> X-Mailer: git-send-email 1.7.4.1 Subject: [dpdk-dev] [PATCH]i40e: move the fdir_setup from dev_init to dev_configure X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" In order not to affect the FVL's performance by default setting, this patch moves the flow director initialization from i40e_pf_setup to i40e_dev_configure according to the mode in fdir configure info. Then the resources used for flow director will be only setup if it is enabled. Signed-off-by: jingjing.wu Acked-by: Konstantin Ananyev Acked-by: Helin Zhang Tested-by: Min Cao --- app/test-pmd/cmdline.c | 4 +- lib/librte_pmd_i40e/i40e_ethdev.c | 49 ++++++++++++----------- lib/librte_pmd_i40e/i40e_fdir.c | 83 ++++++++++++++++++++------------------- 3 files changed, 72 insertions(+), 64 deletions(-) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index c61c3a0..f79ea3e 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -8546,7 +8546,7 @@ cmd_flow_director_flex_mask_parsed(void *parsed_result, } flex_mask.flow_type = str2flowtype(res->flow_type); fdir_set_flex_mask(res->port_id, &flex_mask); - cmd_reconfig_device_queue(res->port_id, 1, 0); + cmd_reconfig_device_queue(res->port_id, 1, 1); } cmdline_parse_token_string_t cmd_flow_director_flexmask = @@ -8667,7 +8667,7 @@ cmd_flow_director_flxpld_parsed(void *parsed_result, } fdir_set_flex_payload(res->port_id, &flex_cfg); - cmd_reconfig_device_queue(res->port_id, 1, 0); + cmd_reconfig_device_queue(res->port_id, 1, 1); } cmdline_parse_token_string_t cmd_flow_director_flexpayload = diff --git a/lib/librte_pmd_i40e/i40e_ethdev.c b/lib/librte_pmd_i40e/i40e_ethdev.c index 87e750a..002d4a9 100644 --- a/lib/librte_pmd_i40e/i40e_ethdev.c +++ b/lib/librte_pmd_i40e/i40e_ethdev.c @@ -546,7 +546,6 @@ eth_i40e_dev_init(__rte_unused struct eth_driver *eth_drv, err_mac_alloc: i40e_vsi_release(pf->main_vsi); err_setup_pf_switch: - i40e_fdir_teardown(pf); err_get_mac_addr: err_configure_lan_hmc: (void)i40e_shutdown_lan_hmc(hw); @@ -565,8 +564,27 @@ err_get_capabilities: static int i40e_dev_configure(struct rte_eth_dev *dev) { - int ret; + struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private); enum rte_eth_rx_mq_mode mq_mode = dev->data->dev_conf.rxmode.mq_mode; + int ret; + + if (dev->data->dev_conf.fdir_conf.mode == RTE_FDIR_MODE_PERFECT) { + ret = i40e_fdir_setup(pf); + if (ret != I40E_SUCCESS) { + PMD_DRV_LOG(ERR, "Failed to setup flow director."); + return -ENOTSUP; + } + ret = i40e_fdir_configure(dev); + if (ret < 0) { + PMD_DRV_LOG(ERR, "failed to configure fdir."); + goto err; + } + } else + i40e_fdir_teardown(pf); + + ret = i40e_dev_init_vlan(dev); + if (ret < 0) + goto err; /* VMDQ setup. * Needs to move VMDQ setting out of i40e_pf_config_mq_rx() as VMDQ and @@ -583,10 +601,12 @@ i40e_dev_configure(struct rte_eth_dev *dev) if (mq_mode & ETH_MQ_RX_VMDQ_FLAG) { ret = i40e_vmdq_setup(dev); if (ret) - return ret; + goto err; } - - return i40e_dev_init_vlan(dev); + return 0; +err: + i40e_fdir_teardown(pf); + return ret; } void @@ -837,14 +857,8 @@ i40e_dev_start(struct rte_eth_dev *dev) i40e_vsi_enable_queues_intr(pf->vmdq[i].vsi); } - ret = i40e_fdir_configure(dev); - if (ret < 0) { - PMD_DRV_LOG(ERR, "failed to configure fdir."); - goto err_up; - } - /* enable FDIR MSIX interrupt */ - if (pf->flags & I40E_FLAG_FDIR) { + if (pf->fdir.fdir_vsi) { i40e_vsi_queues_bind_intr(pf->fdir.fdir_vsi); i40e_vsi_enable_queues_intr(pf->fdir.fdir_vsi); } @@ -903,7 +917,7 @@ i40e_dev_stop(struct rte_eth_dev *dev) i40e_vsi_queues_unbind_intr(pf->vmdq[i].vsi); } - if (pf->flags & I40E_FLAG_FDIR) { + if (pf->fdir.fdir_vsi) { i40e_vsi_queues_bind_intr(pf->fdir.fdir_vsi); i40e_vsi_enable_queues_intr(pf->fdir.fdir_vsi); } @@ -3302,15 +3316,6 @@ i40e_pf_setup(struct i40e_pf *pf) } pf->main_vsi = vsi; - /* setup FDIR after main vsi created.*/ - if (pf->flags & I40E_FLAG_FDIR) { - ret = i40e_fdir_setup(pf); - if (ret != I40E_SUCCESS) { - PMD_DRV_LOG(ERR, "Failed to setup flow director."); - pf->flags &= ~I40E_FLAG_FDIR; - } - } - /* Configure filter control */ memset(&settings, 0, sizeof(settings)); if (hw->func_caps.rss_table_size == ETH_RSS_RETA_SIZE_128) diff --git a/lib/librte_pmd_i40e/i40e_fdir.c b/lib/librte_pmd_i40e/i40e_fdir.c index d75b96e..ad38803 100644 --- a/lib/librte_pmd_i40e/i40e_fdir.c +++ b/lib/librte_pmd_i40e/i40e_fdir.c @@ -196,6 +196,11 @@ i40e_fdir_setup(struct i40e_pf *pf) const struct rte_memzone *mz = NULL; struct rte_eth_dev *eth_dev = pf->adapter->eth_dev; + if ((pf->flags & I40E_FLAG_FDIR) == 0) { + PMD_INIT_LOG(ERR, "HW doesn't support FDIR"); + return I40E_NOT_SUPPORTED; + } + PMD_DRV_LOG(INFO, "FDIR HW Capabilities: num_filters_guaranteed = %u," " num_filters_best_effort = %u.", hw->func_caps.fd_filters_guaranteed, @@ -203,9 +208,8 @@ i40e_fdir_setup(struct i40e_pf *pf) vsi = pf->fdir.fdir_vsi; if (vsi) { - PMD_DRV_LOG(ERR, "FDIR vsi pointer needs " - "to be null before creation."); - return I40E_ERR_BAD_PTR; + PMD_DRV_LOG(INFO, "FDIR initialization has been done."); + return I40E_SUCCESS; } /* make new FDIR VSI */ vsi = i40e_vsi_setup(pf, I40E_VSI_FDIR, pf->main_vsi, 0); @@ -302,6 +306,8 @@ i40e_fdir_teardown(struct i40e_pf *pf) struct i40e_vsi *vsi; vsi = pf->fdir.fdir_vsi; + if (!vsi) + return; i40e_switch_tx_queue(hw, vsi->base_queue, FALSE); i40e_switch_rx_queue(hw, vsi->base_queue, FALSE); i40e_dev_rx_queue_release(pf->fdir.rxq); @@ -653,37 +659,29 @@ i40e_fdir_configure(struct rte_eth_dev *dev) } } + /* enable FDIR filter */ val = I40E_READ_REG(hw, I40E_PFQF_CTL_0); - if ((pf->flags & I40E_FLAG_FDIR) && - dev->data->dev_conf.fdir_conf.mode == RTE_FDIR_MODE_PERFECT) { - /* enable FDIR filter */ - val |= I40E_PFQF_CTL_0_FD_ENA_MASK; - I40E_WRITE_REG(hw, I40E_PFQF_CTL_0, val); + val |= I40E_PFQF_CTL_0_FD_ENA_MASK; + I40E_WRITE_REG(hw, I40E_PFQF_CTL_0, val); - i40e_init_flx_pld(pf); /* set flex config to default value */ + i40e_init_flx_pld(pf); /* set flex config to default value */ - conf = &dev->data->dev_conf.fdir_conf.flex_conf; - ret = i40e_check_fdir_flex_conf(conf); - if (ret < 0) { - PMD_DRV_LOG(ERR, " invalid configuration arguments."); - return -EINVAL; - } - /* configure flex payload */ - for (i = 0; i < conf->nb_payloads; i++) - i40e_set_flx_pld_cfg(pf, &conf->flex_set[i]); - /* configure flex mask*/ - for (i = 0; i < conf->nb_flexmasks; i++) { - pctype = i40e_flowtype_to_pctype( - conf->flex_mask[i].flow_type); - i40e_set_flex_mask_on_pctype(pf, - pctype, - &conf->flex_mask[i]); - } - } else { - /* disable FDIR filter */ - val &= ~I40E_PFQF_CTL_0_FD_ENA_MASK; - I40E_WRITE_REG(hw, I40E_PFQF_CTL_0, val); - pf->flags &= ~I40E_FLAG_FDIR; + conf = &dev->data->dev_conf.fdir_conf.flex_conf; + ret = i40e_check_fdir_flex_conf(conf); + if (ret < 0) { + PMD_DRV_LOG(ERR, " invalid configuration arguments."); + return -EINVAL; + } + /* configure flex payload */ + for (i = 0; i < conf->nb_payloads; i++) + i40e_set_flx_pld_cfg(pf, &conf->flex_set[i]); + /* configure flex mask*/ + for (i = 0; i < conf->nb_flexmasks; i++) { + pctype = i40e_flowtype_to_pctype( + conf->flex_mask[i].flow_type); + i40e_set_flex_mask_on_pctype(pf, + pctype, + &conf->flex_mask[i]); } return ret; @@ -982,10 +980,12 @@ i40e_add_del_fdir_filter(struct rte_eth_dev *dev, enum i40e_filter_pctype pctype; int ret = 0; - if (!(pf->flags & I40E_FLAG_FDIR)) { - PMD_DRV_LOG(ERR, "FDIR is not enabled."); + if (dev->data->dev_conf.fdir_conf.mode != RTE_FDIR_MODE_PERFECT) { + PMD_DRV_LOG(ERR, "FDIR is not enabled, please" + " check the mode in fdir_conf."); return -ENOTSUP; } + if (!I40E_VALID_FLOW_TYPE(filter->input.flow_type)) { PMD_DRV_LOG(ERR, "invalid flow_type input."); return -EINVAL; @@ -1263,8 +1263,11 @@ i40e_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir) uint16_t num_flex_set = 0; uint16_t num_flex_mask = 0; - fdir->mode = (pf->flags & I40E_FLAG_FDIR) ? - RTE_FDIR_MODE_PERFECT : RTE_FDIR_MODE_NONE; + if (dev->data->dev_conf.fdir_conf.mode == RTE_FDIR_MODE_PERFECT) + fdir->mode = RTE_FDIR_MODE_PERFECT; + else + fdir->mode = RTE_FDIR_MODE_NONE; + fdir->guarant_spc = (uint32_t)hw->func_caps.fd_filters_guaranteed; fdir->best_spc = @@ -1324,11 +1327,11 @@ i40e_fdir_ctrl_func(struct rte_eth_dev *dev, struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private); int ret = 0; - if (filter_op == RTE_ETH_FILTER_NOP) { - if (!(pf->flags & I40E_FLAG_FDIR)) - ret = -ENOTSUP; - return ret; - } + if ((pf->flags & I40E_FLAG_FDIR) == 0) + return -ENOTSUP; + + if (filter_op == RTE_ETH_FILTER_NOP) + return 0; if (arg == NULL && filter_op != RTE_ETH_FILTER_FLUSH) return -EINVAL;