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 C8A88A0577; Sun, 15 Mar 2020 04:19:05 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 9899F2C2B; Sun, 15 Mar 2020 04:19:04 +0100 (CET) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by dpdk.org (Postfix) with ESMTP id 3A5742BE3; Sun, 15 Mar 2020 04:19:02 +0100 (CET) IronPort-SDR: OChF+UEMlIX3A0phOKikF/eZrgj1aqCk6yBlot0bjbR+eL29nDVYfeh+9UMPZWh9/CVhpNjzNp A1K8GlAR6VvQ== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Mar 2020 20:19:01 -0700 IronPort-SDR: PmiHbqCZJYXn0VPRN9Mxpl/D9Ax7MrRgy4qeNZG1KqMvZjSJkC23V+nkTA3XuvJ9QjisiXD2Qp Yk7iVAY6GHKQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.70,554,1574150400"; d="scan'208";a="390321950" Received: from dpdk51.sh.intel.com ([10.67.110.245]) by orsmga004.jf.intel.com with ESMTP; 14 Mar 2020 20:18:59 -0700 From: Qi Zhang To: beilei.xing@intel.com, yahui.cao@intel.com Cc: xiaolong.ye@intel.com, dev@dpdk.org, Qi Zhang , stable@dpdk.org Date: Sun, 15 Mar 2020 11:22:27 +0800 Message-Id: <20200315032227.44523-1-qi.z.zhang@intel.com> X-Mailer: git-send-email 2.13.6 Subject: [dpdk-dev] [PATCH] net/ice: fix wrong interrupt vector overwritten 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" ice_vsi_queues_bind_intr is shared by data rx queue and fdir rx queue's interrupt binding. while when configure a fdir queue, it is possible that a data path Rx queue 0's vector number be recorded in intr_handle->intr_vec 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 fix this issue by decoupling the intr_handle from ice_vsi_queue_bind_intr, so data queue and fdir queue can be handled differently base on different parameters. Fixes: 84dc7a95a2d3 ("net/ice: enable flow director engine") Cc: stable@dpdk.org Signed-off-by: Qi Zhang --- drivers/net/ice/ice_ethdev.c | 33 ++++++++++++++------------------- drivers/net/ice/ice_ethdev.h | 6 +++++- drivers/net/ice/ice_fdir_filter.c | 5 ++++- 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c index 85ef83e92..a192f44bc 100644 --- a/drivers/net/ice/ice_ethdev.c +++ b/drivers/net/ice/ice_ethdev.c @@ -2619,16 +2619,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 intr_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 +2636,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 (intr_use_misc) msix_vect = ICE_MISC_VEC_ID; /* uio mapping all queue to one msix_vect */ @@ -2653,9 +2646,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 +2655,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--; @@ -2736,7 +2728,10 @@ 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); diff --git a/drivers/net/ice/ice_ethdev.h b/drivers/net/ice/ice_ethdev.h index da557a254..942ada8af 100644 --- a/drivers/net/ice/ice_ethdev.h +++ b/drivers/net/ice/ice_ethdev.h @@ -8,6 +8,7 @@ #include #include +#include #include "base/ice_common.h" #include "base/ice_adminq_cmd.h" @@ -463,7 +464,10 @@ 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_queues_bind_intr(struct ice_vsi *vsi, + bool intr_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..387807819 100644 --- a/drivers/net/ice/ice_fdir_filter.c +++ b/drivers/net/ice/ice_fdir_filter.c @@ -433,6 +433,8 @@ ice_fdir_setup(struct ice_pf *pf) { struct rte_eth_dev *eth_dev = pf->adapter->eth_dev; struct ice_hw *hw = ICE_PF_TO_HW(pf); + struct rte_pci_device *pci_dev = ICE_DEV_TO_PCI(eth_dev); + struct rte_intr_handle *intr_handle = &pci_dev->intr_handle; const struct rte_memzone *mz = NULL; char z_name[RTE_MEMZONE_NAMESIZE]; struct ice_vsi *vsi; @@ -501,7 +503,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_queues_bind_intr(vsi, !rte_intr_allow_others(intr_handle), + 1, NULL); ice_vsi_enable_queues_intr(vsi); /* reserve memory for the fdir programming packet */ -- 2.13.6