From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 9E45AA0564; Sun, 15 Mar 2020 08:36:57 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 1111625D9; Sun, 15 Mar 2020 08:36:56 +0100 (CET) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by dpdk.org (Postfix) with ESMTP id CEAEB3B5 for ; Sun, 15 Mar 2020 08:36:54 +0100 (CET) IronPort-SDR: 51CJwfy/gynMkKytnS0ltbXNgtDe4qxZMuDNNN/704xDsPBqrz0/54MiBNVaxs7pOJj5rWoAOS zYuP71VM+MoA== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Mar 2020 00:36:53 -0700 IronPort-SDR: JfF52rhsuluF62TgNM9zgRfiA05vtgTl8sJZ/PtgXyASpuzWkAMrrfd3tP3zVR87ZwlJmSWfhF X7HyryTWuLyw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.70,555,1574150400"; d="scan'208";a="267216242" Received: from dpdk51.sh.intel.com ([10.67.110.245]) by fmsmga004.fm.intel.com with ESMTP; 15 Mar 2020 00:36:51 -0700 From: Qi Zhang To: beilei.xing@intel.com, yahui.cao@intel.com Cc: xiaolong.ye@intel.com, dev@dpdk.org, Qi Zhang Date: Sun, 15 Mar 2020 15:40:20 +0800 Message-Id: <20200315074020.15040-1-qi.z.zhang@intel.com> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20200315032227.44523-1-qi.z.zhang@intel.com> References: <20200315032227.44523-1-qi.z.zhang@intel.com> Subject: [dpdk-dev] [PATCH v2] net/ice: code clean for queue interrupt config X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" The patch decouple the intr_handle from ice_vsi_queue_bind_intr which is shared by data Rx queue and fdir Rx queue's interrupt binding. Though there is no issue in current implemenation of ice_vsi_queue_bind_intr, but this rely on the assumption that the fdir setup (when bind interrrupt for fdir queue) must be called before dev_start (when bind interrupt for data queue), which is not a good practise. More detail: if we deferred fdir setup to after dev_start, it is possible when configure a fdir queue, a recorded vector for Rx queue 0 be overwritten by the fdir queue's vector number, this may cause interrupt Rx mode does not work on the Rx queue 0, since the vector number be used by rte_eth_dev_rx_intr_ctl is corrupted. The patch also apply the same code decoupling on ice_vsi_enable|disable_queue_intr to make all queue interrupt API more consistent. Signed-off-by: Qi Zhang --- v2: - rewrite the commit, actually this is not a fix, but code clean. drivers/net/ice/ice_ethdev.c | 52 ++++++++++++++++----------------------- drivers/net/ice/ice_ethdev.h | 9 ++++--- drivers/net/ice/ice_fdir_filter.c | 6 ++--- 3 files changed, 30 insertions(+), 37 deletions(-) diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c index 85ef83e92..48ce258ca 100644 --- a/drivers/net/ice/ice_ethdev.c +++ b/drivers/net/ice/ice_ethdev.c @@ -2318,11 +2318,8 @@ ice_release_vsi(struct ice_vsi *vsi) } void -ice_vsi_disable_queues_intr(struct ice_vsi *vsi) +ice_vsi_disable_queues_intr(struct ice_vsi *vsi, bool use_misc) { - struct rte_eth_dev *dev = vsi->adapter->eth_dev; - struct rte_pci_device *pci_dev = ICE_DEV_TO_PCI(dev); - struct rte_intr_handle *intr_handle = &pci_dev->intr_handle; struct ice_hw *hw = ICE_VSI_TO_HW(vsi); uint16_t msix_intr, i; @@ -2333,7 +2330,7 @@ ice_vsi_disable_queues_intr(struct ice_vsi *vsi) rte_wmb(); } - if (rte_intr_allow_others(intr_handle)) + if (use_misc) /* vfio-pci */ for (i = 0; i < vsi->nb_msix; i++) { msix_intr = vsi->msix_intr + i; @@ -2368,7 +2365,8 @@ ice_dev_stop(struct rte_eth_dev *dev) ice_tx_queue_stop(dev, i); /* disable all queue interrupts */ - ice_vsi_disable_queues_intr(main_vsi); + ice_vsi_disable_queues_intr(main_vsi, + !rte_intr_allow_others(intr_handle)); /* Clear all queues and release mbufs */ ice_clear_queues(dev); @@ -2619,16 +2617,15 @@ __vsi_queues_bind_intr(struct ice_vsi *vsi, uint16_t msix_vect, } void -ice_vsi_queues_bind_intr(struct ice_vsi *vsi) +ice_vsi_queues_bind_intr(struct ice_vsi *vsi, + bool use_misc, + int intr_num_max, + int *intr_vec) { - struct rte_eth_dev *dev = vsi->adapter->eth_dev; - struct rte_pci_device *pci_dev = ICE_DEV_TO_PCI(dev); - struct rte_intr_handle *intr_handle = &pci_dev->intr_handle; struct ice_hw *hw = ICE_VSI_TO_HW(vsi); uint16_t msix_vect = vsi->msix_intr; - uint16_t nb_msix = RTE_MIN(vsi->nb_msix, intr_handle->nb_efd); + uint16_t nb_msix = RTE_MIN(vsi->nb_msix, intr_num_max); uint16_t queue_idx = 0; - int record = 0; int i; /* clear Rx/Tx queue interrupt */ @@ -2637,15 +2634,9 @@ ice_vsi_queues_bind_intr(struct ice_vsi *vsi) ICE_WRITE_REG(hw, QINT_RQCTL(vsi->base_queue + i), 0); } - /* PF bind interrupt */ - if (rte_intr_dp_is_en(intr_handle)) { - queue_idx = 0; - record = 1; - } - for (i = 0; i < vsi->nb_used_qps; i++) { if (nb_msix <= 1) { - if (!rte_intr_allow_others(intr_handle)) + if (use_misc) msix_vect = ICE_MISC_VEC_ID; /* uio mapping all queue to one msix_vect */ @@ -2653,9 +2644,8 @@ ice_vsi_queues_bind_intr(struct ice_vsi *vsi) vsi->base_queue + i, vsi->nb_used_qps - i); - for (; !!record && i < vsi->nb_used_qps; i++) - intr_handle->intr_vec[queue_idx + i] = - msix_vect; + for (; intr_vec && i < vsi->nb_used_qps; i++) + intr_vec[queue_idx + i] = msix_vect; break; } @@ -2663,8 +2653,8 @@ ice_vsi_queues_bind_intr(struct ice_vsi *vsi) __vsi_queues_bind_intr(vsi, msix_vect, vsi->base_queue + i, 1); - if (!!record) - intr_handle->intr_vec[queue_idx + i] = msix_vect; + if (intr_vec) + intr_vec[queue_idx + i] = msix_vect; msix_vect++; nb_msix--; @@ -2672,15 +2662,12 @@ ice_vsi_queues_bind_intr(struct ice_vsi *vsi) } void -ice_vsi_enable_queues_intr(struct ice_vsi *vsi) +ice_vsi_enable_queues_intr(struct ice_vsi *vsi, bool use_misc) { - struct rte_eth_dev *dev = vsi->adapter->eth_dev; - struct rte_pci_device *pci_dev = ICE_DEV_TO_PCI(dev); - struct rte_intr_handle *intr_handle = &pci_dev->intr_handle; struct ice_hw *hw = ICE_VSI_TO_HW(vsi); uint16_t msix_intr, i; - if (rte_intr_allow_others(intr_handle)) + if (use_misc) for (i = 0; i < vsi->nb_used_qps; i++) { msix_intr = vsi->msix_intr + i; ICE_WRITE_REG(hw, GLINT_DYN_CTL(msix_intr), @@ -2736,10 +2723,13 @@ ice_rxq_intr_setup(struct rte_eth_dev *dev) /* Map queues with MSIX interrupt */ vsi->nb_used_qps = dev->data->nb_rx_queues; - ice_vsi_queues_bind_intr(vsi); + ice_vsi_queues_bind_intr(vsi, + !rte_intr_allow_others(intr_handle), + intr_handle->nb_efd, + intr_handle->intr_vec); /* Enable interrupts for all the queues */ - ice_vsi_enable_queues_intr(vsi); + ice_vsi_enable_queues_intr(vsi, !rte_intr_allow_others(intr_handle)); rte_intr_enable(intr_handle); diff --git a/drivers/net/ice/ice_ethdev.h b/drivers/net/ice/ice_ethdev.h index da557a254..392b937a9 100644 --- a/drivers/net/ice/ice_ethdev.h +++ b/drivers/net/ice/ice_ethdev.h @@ -461,9 +461,12 @@ struct ice_vsi * ice_setup_vsi(struct ice_pf *pf, enum ice_vsi_type type); int ice_release_vsi(struct ice_vsi *vsi); -void ice_vsi_enable_queues_intr(struct ice_vsi *vsi); -void ice_vsi_disable_queues_intr(struct ice_vsi *vsi); -void ice_vsi_queues_bind_intr(struct ice_vsi *vsi); +void ice_vsi_enable_queues_intr(struct ice_vsi *vsi, bool use_misc); +void ice_vsi_disable_queues_intr(struct ice_vsi *vsi, bool use_misc); +void ice_vsi_queues_bind_intr(struct ice_vsi *vsi, + bool use_misc, + int intr_num_max, + int *intr_vec); static inline int ice_align_floor(int n) diff --git a/drivers/net/ice/ice_fdir_filter.c b/drivers/net/ice/ice_fdir_filter.c index 5a791610f..533b4de5a 100644 --- a/drivers/net/ice/ice_fdir_filter.c +++ b/drivers/net/ice/ice_fdir_filter.c @@ -501,8 +501,8 @@ ice_fdir_setup(struct ice_pf *pf) /* Enable FDIR MSIX interrupt */ vsi->nb_used_qps = 1; - ice_vsi_queues_bind_intr(vsi); - ice_vsi_enable_queues_intr(vsi); + ice_vsi_queues_bind_intr(vsi, false, 1, NULL); + ice_vsi_enable_queues_intr(vsi, true); /* reserve memory for the fdir programming packet */ snprintf(z_name, sizeof(z_name), "ICE_%s_%d", @@ -628,7 +628,7 @@ ice_fdir_teardown(struct ice_pf *pf) if (!vsi) return; - ice_vsi_disable_queues_intr(vsi); + ice_vsi_disable_queues_intr(vsi, true); err = ice_fdir_tx_queue_stop(eth_dev, pf->fdir.txq->queue_id); if (err) -- 2.13.6