Fdir allocating msix resource is not strictly necessary, if no resource left, print a warning message. Signed-off-by: Jiang Mao <maox.jiang@intel.com> Fixes: 4861cde461 (i40e: new poll mode driver) --- drivers/net/i40e/i40e_ethdev.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 33ed556c8..acc43077d 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -5744,6 +5744,17 @@ i40e_vsi_setup(struct i40e_pf *pf, vsi->nb_msix = RTE_MIN(vsi->nb_qps, RTE_MAX_RXTX_INTR_VEC_ID); } + } else if (type == I40E_VSI_FDIR) { + ret = i40e_res_pool_alloc(&pf->msix_pool, 1); + if (ret < 0) { + PMD_DRV_LOG(WARNING, "MSIX vectors used up, FDIR can`t bind interrupt"); + vsi->msix_intr = 0; + vsi->nb_msix = 0; + } else { + vsi->msix_intr = ret; + vsi->nb_msix = 1; + } + } else if (type != I40E_VSI_SRIOV) { ret = i40e_res_pool_alloc(&pf->msix_pool, 1); if (ret < 0) { -- 2.17.1
The value of vsi->nb_msix shouldn`t be zero, otherwise, all of interrupts will be bind to vector 0. Fixes: 4861cde461 (i40e: new poll mode driver) Cc: stable@dpdk.org Signed-off-by: Jiang Mao <maox.jiang@intel.com> --- drivers/net/i40e/i40e_ethdev.c | 41 +++++++++++++++++++++++----------- drivers/net/i40e/i40e_ethdev.h | 2 +- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 970a31cb2..33ed556c8 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -2013,7 +2013,7 @@ __vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t msix_vect, I40E_WRITE_FLUSH(hw); } -void +int i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx) { struct rte_eth_dev *dev = vsi->adapter->eth_dev; @@ -2033,10 +2033,14 @@ i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx) /* VF bind interrupt */ if (vsi->type == I40E_VSI_SRIOV) { + if (vsi->nb_msix == 0) { + PMD_DRV_LOG(ERR, "No msix resource"); + return -EINVAL; + } __vsi_queues_bind_intr(vsi, msix_vect, - vsi->base_queue, vsi->nb_qps, - itr_idx); - return; + vsi->base_queue, vsi->nb_qps, + itr_idx); + return 0; } /* PF & VMDq bind interrupt */ @@ -2053,16 +2057,19 @@ i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx) } for (i = 0; i < vsi->nb_used_qps; i++) { - if (nb_msix <= 1) { + if (vsi->nb_msix == 0) { + PMD_DRV_LOG(ERR, "No msix resource"); + return -EINVAL; + } else if (nb_msix <= 1) { if (!rte_intr_allow_others(intr_handle)) /* allow to share MISC_VEC_ID */ msix_vect = I40E_MISC_VEC_ID; /* no enough msix_vect, map all to one */ __vsi_queues_bind_intr(vsi, msix_vect, - vsi->base_queue + i, - vsi->nb_used_qps - i, - itr_idx); + vsi->base_queue + i, + vsi->nb_used_qps - i, + itr_idx); for (; !!record && i < vsi->nb_used_qps; i++) intr_handle->intr_vec[queue_idx + i] = msix_vect; @@ -2078,6 +2085,8 @@ i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx) msix_vect++; nb_msix--; } + + return 0; } static void @@ -2318,21 +2327,27 @@ i40e_dev_start(struct rte_eth_dev *dev) /* Map queues with MSIX interrupt */ main_vsi->nb_used_qps = dev->data->nb_rx_queues - pf->nb_cfg_vmdq_vsi * RTE_LIBRTE_I40E_QUEUE_NUM_PER_VM; - i40e_vsi_queues_bind_intr(main_vsi, I40E_ITR_INDEX_DEFAULT); + ret = i40e_vsi_queues_bind_intr(main_vsi, I40E_ITR_INDEX_DEFAULT); + if (ret < 0) + return ret; i40e_vsi_enable_queues_intr(main_vsi); /* Map VMDQ VSI queues with MSIX interrupt */ for (i = 0; i < pf->nb_cfg_vmdq_vsi; i++) { pf->vmdq[i].vsi->nb_used_qps = RTE_LIBRTE_I40E_QUEUE_NUM_PER_VM; - i40e_vsi_queues_bind_intr(pf->vmdq[i].vsi, - I40E_ITR_INDEX_DEFAULT); + ret = i40e_vsi_queues_bind_intr(pf->vmdq[i].vsi, + I40E_ITR_INDEX_DEFAULT); + if (ret < 0) + return ret; i40e_vsi_enable_queues_intr(pf->vmdq[i].vsi); } /* enable FDIR MSIX interrupt */ if (pf->fdir.fdir_vsi) { - i40e_vsi_queues_bind_intr(pf->fdir.fdir_vsi, - I40E_ITR_INDEX_NONE); + ret = i40e_vsi_queues_bind_intr(pf->fdir.fdir_vsi, + I40E_ITR_INDEX_NONE); + if (ret < 0) + return ret; i40e_vsi_enable_queues_intr(pf->fdir.fdir_vsi); } diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h index e5d0ce53f..33fbe776b 100644 --- a/drivers/net/i40e/i40e_ethdev.h +++ b/drivers/net/i40e/i40e_ethdev.h @@ -1248,7 +1248,7 @@ void i40e_update_vsi_stats(struct i40e_vsi *vsi); void i40e_pf_disable_irq0(struct i40e_hw *hw); void i40e_pf_enable_irq0(struct i40e_hw *hw); int i40e_dev_link_update(struct rte_eth_dev *dev, int wait_to_complete); -void i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx); +int i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx); void i40e_vsi_queues_unbind_intr(struct i40e_vsi *vsi); int i40e_vsi_vlan_pvid_set(struct i40e_vsi *vsi, struct i40e_vsi_vlan_pvid_info *info); -- 2.17.1
Fdir allocating msix resource is not strictly necessary, if no resource left, print a warning message. Fixes: 4861cde461 (i40e: new poll mode driver) Cc: stable@dpdk.org Signed-off-by: Jiang Mao <maox.jiang@intel.com> --- drivers/net/i40e/i40e_ethdev.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 33ed556c8..acc43077d 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -5744,6 +5744,17 @@ i40e_vsi_setup(struct i40e_pf *pf, vsi->nb_msix = RTE_MIN(vsi->nb_qps, RTE_MAX_RXTX_INTR_VEC_ID); } + } else if (type == I40E_VSI_FDIR) { + ret = i40e_res_pool_alloc(&pf->msix_pool, 1); + if (ret < 0) { + PMD_DRV_LOG(WARNING, "MSIX vectors used up, FDIR can`t bind interrupt"); + vsi->msix_intr = 0; + vsi->nb_msix = 0; + } else { + vsi->msix_intr = ret; + vsi->nb_msix = 1; + } + } else if (type != I40E_VSI_SRIOV) { ret = i40e_res_pool_alloc(&pf->msix_pool, 1); if (ret < 0) { -- 2.17.1
Tested-by: zhiminx.huang@intel.com Regards, HuangZhiMin -----Original Message----- From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Jiang Mao Sent: Tuesday, June 9, 2020 10:26 AM To: Ye, Xiaolong <xiaolong.ye@intel.com> Cc: dev@dpdk.org; stable@dpdk.org; Jiang, MaoX <maox.jiang@intel.com> Subject: [dpdk-dev] [PATCH 1/2] net/i40e: fix binding interrupt without msix vectors The value of vsi->nb_msix shouldn`t be zero, otherwise, all of interrupts will be bind to vector 0. Fixes: 4861cde461 (i40e: new poll mode driver) Cc: stable@dpdk.org Signed-off-by: Jiang Mao <maox.jiang@intel.com> --- drivers/net/i40e/i40e_ethdev.c | 41 +++++++++++++++++++++++----------- drivers/net/i40e/i40e_ethdev.h | 2 +- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 970a31cb2..33ed556c8 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -2013,7 +2013,7 @@ __vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t msix_vect, I40E_WRITE_FLUSH(hw); } -void +int i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx) { struct rte_eth_dev *dev = vsi->adapter->eth_dev; @@ -2033,10 +2033,14 @@ i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx) /* VF bind interrupt */ if (vsi->type == I40E_VSI_SRIOV) { + if (vsi->nb_msix == 0) { + PMD_DRV_LOG(ERR, "No msix resource"); + return -EINVAL; + } __vsi_queues_bind_intr(vsi, msix_vect, - vsi->base_queue, vsi->nb_qps, - itr_idx); - return; + vsi->base_queue, vsi->nb_qps, + itr_idx); + return 0; } /* PF & VMDq bind interrupt */ @@ -2053,16 +2057,19 @@ i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx) } for (i = 0; i < vsi->nb_used_qps; i++) { - if (nb_msix <= 1) { + if (vsi->nb_msix == 0) { + PMD_DRV_LOG(ERR, "No msix resource"); + return -EINVAL; + } else if (nb_msix <= 1) { if (!rte_intr_allow_others(intr_handle)) /* allow to share MISC_VEC_ID */ msix_vect = I40E_MISC_VEC_ID; /* no enough msix_vect, map all to one */ __vsi_queues_bind_intr(vsi, msix_vect, - vsi->base_queue + i, - vsi->nb_used_qps - i, - itr_idx); + vsi->base_queue + i, + vsi->nb_used_qps - i, + itr_idx); for (; !!record && i < vsi->nb_used_qps; i++) intr_handle->intr_vec[queue_idx + i] = msix_vect; @@ -2078,6 +2085,8 @@ i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx) msix_vect++; nb_msix--; } + + return 0; } static void @@ -2318,21 +2327,27 @@ i40e_dev_start(struct rte_eth_dev *dev) /* Map queues with MSIX interrupt */ main_vsi->nb_used_qps = dev->data->nb_rx_queues - pf->nb_cfg_vmdq_vsi * RTE_LIBRTE_I40E_QUEUE_NUM_PER_VM; - i40e_vsi_queues_bind_intr(main_vsi, I40E_ITR_INDEX_DEFAULT); + ret = i40e_vsi_queues_bind_intr(main_vsi, I40E_ITR_INDEX_DEFAULT); + if (ret < 0) + return ret; i40e_vsi_enable_queues_intr(main_vsi); /* Map VMDQ VSI queues with MSIX interrupt */ for (i = 0; i < pf->nb_cfg_vmdq_vsi; i++) { pf->vmdq[i].vsi->nb_used_qps = RTE_LIBRTE_I40E_QUEUE_NUM_PER_VM; - i40e_vsi_queues_bind_intr(pf->vmdq[i].vsi, - I40E_ITR_INDEX_DEFAULT); + ret = i40e_vsi_queues_bind_intr(pf->vmdq[i].vsi, + I40E_ITR_INDEX_DEFAULT); + if (ret < 0) + return ret; i40e_vsi_enable_queues_intr(pf->vmdq[i].vsi); } /* enable FDIR MSIX interrupt */ if (pf->fdir.fdir_vsi) { - i40e_vsi_queues_bind_intr(pf->fdir.fdir_vsi, - I40E_ITR_INDEX_NONE); + ret = i40e_vsi_queues_bind_intr(pf->fdir.fdir_vsi, + I40E_ITR_INDEX_NONE); + if (ret < 0) + return ret; i40e_vsi_enable_queues_intr(pf->fdir.fdir_vsi); } diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h index e5d0ce53f..33fbe776b 100644 --- a/drivers/net/i40e/i40e_ethdev.h +++ b/drivers/net/i40e/i40e_ethdev.h @@ -1248,7 +1248,7 @@ void i40e_update_vsi_stats(struct i40e_vsi *vsi); void i40e_pf_disable_irq0(struct i40e_hw *hw); void i40e_pf_enable_irq0(struct i40e_hw *hw); int i40e_dev_link_update(struct rte_eth_dev *dev, int wait_to_complete); -void i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx); +int i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx); void i40e_vsi_queues_unbind_intr(struct i40e_vsi *vsi); int i40e_vsi_vlan_pvid_set(struct i40e_vsi *vsi, struct i40e_vsi_vlan_pvid_info *info); -- 2.17.1
Tested-by: zhiminx.huang@intel.com Regards, HuangZhiMin -----Original Message----- From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Jiang Mao Sent: Tuesday, June 9, 2020 10:26 AM To: Ye, Xiaolong <xiaolong.ye@intel.com> Cc: dev@dpdk.org; stable@dpdk.org; Jiang, MaoX <maox.jiang@intel.com> Subject: [dpdk-dev] [PATCH 2/2] net/i40e: fix fdir allocating msix resource error Fdir allocating msix resource is not strictly necessary, if no resource left, print a warning message. Fixes: 4861cde461 (i40e: new poll mode driver) Cc: stable@dpdk.org Signed-off-by: Jiang Mao <maox.jiang@intel.com> --- drivers/net/i40e/i40e_ethdev.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 33ed556c8..acc43077d 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -5744,6 +5744,17 @@ i40e_vsi_setup(struct i40e_pf *pf, vsi->nb_msix = RTE_MIN(vsi->nb_qps, RTE_MAX_RXTX_INTR_VEC_ID); } + } else if (type == I40E_VSI_FDIR) { + ret = i40e_res_pool_alloc(&pf->msix_pool, 1); + if (ret < 0) { + PMD_DRV_LOG(WARNING, "MSIX vectors used up, FDIR can`t bind interrupt"); + vsi->msix_intr = 0; + vsi->nb_msix = 0; + } else { + vsi->msix_intr = ret; + vsi->nb_msix = 1; + } + } else if (type != I40E_VSI_SRIOV) { ret = i40e_res_pool_alloc(&pf->msix_pool, 1); if (ret < 0) { -- 2.17.1
The value of vsi->nb_msix shouldn`t be zero, otherwise, all of interrupts will be bind to vector 0. Fixes: 4861cde461 (i40e: new poll mode driver) Cc: stable@dpdk.org Signed-off-by: Jiang Mao <maox.jiang@intel.com> --- drivers/net/i40e/i40e_ethdev.c | 31 +++++++++++++++++++++++-------- drivers/net/i40e/i40e_ethdev.h | 2 +- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 777e149..16fcb8d 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -2001,7 +2001,7 @@ void i40e_flex_payload_reg_set_default(struct i40e_hw *hw) I40E_WRITE_FLUSH(hw); } -void +int i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx) { struct rte_eth_dev *dev = vsi->adapter->eth_dev; @@ -2021,10 +2021,14 @@ void i40e_flex_payload_reg_set_default(struct i40e_hw *hw) /* VF bind interrupt */ if (vsi->type == I40E_VSI_SRIOV) { + if (vsi->nb_msix == 0) { + PMD_DRV_LOG(ERR, "No msix resource"); + return -EINVAL; + } __vsi_queues_bind_intr(vsi, msix_vect, vsi->base_queue, vsi->nb_qps, itr_idx); - return; + return 0; } /* PF & VMDq bind interrupt */ @@ -2041,7 +2045,10 @@ void i40e_flex_payload_reg_set_default(struct i40e_hw *hw) } for (i = 0; i < vsi->nb_used_qps; i++) { - if (nb_msix <= 1) { + if (vsi->nb_msix == 0) { + PMD_DRV_LOG(ERR, "No msix resource"); + return -EINVAL; + } else if (nb_msix <= 1) { if (!rte_intr_allow_others(intr_handle)) /* allow to share MISC_VEC_ID */ msix_vect = I40E_MISC_VEC_ID; @@ -2066,6 +2073,8 @@ void i40e_flex_payload_reg_set_default(struct i40e_hw *hw) msix_vect++; nb_msix--; } + + return 0; } static void @@ -2306,21 +2315,27 @@ void i40e_flex_payload_reg_set_default(struct i40e_hw *hw) /* Map queues with MSIX interrupt */ main_vsi->nb_used_qps = dev->data->nb_rx_queues - pf->nb_cfg_vmdq_vsi * RTE_LIBRTE_I40E_QUEUE_NUM_PER_VM; - i40e_vsi_queues_bind_intr(main_vsi, I40E_ITR_INDEX_DEFAULT); + ret = i40e_vsi_queues_bind_intr(main_vsi, I40E_ITR_INDEX_DEFAULT); + if (ret < 0) + return ret; i40e_vsi_enable_queues_intr(main_vsi); /* Map VMDQ VSI queues with MSIX interrupt */ for (i = 0; i < pf->nb_cfg_vmdq_vsi; i++) { pf->vmdq[i].vsi->nb_used_qps = RTE_LIBRTE_I40E_QUEUE_NUM_PER_VM; - i40e_vsi_queues_bind_intr(pf->vmdq[i].vsi, - I40E_ITR_INDEX_DEFAULT); + ret = i40e_vsi_queues_bind_intr(pf->vmdq[i].vsi, + I40E_ITR_INDEX_DEFAULT); + if (ret < 0) + return ret; i40e_vsi_enable_queues_intr(pf->vmdq[i].vsi); } /* enable FDIR MSIX interrupt */ if (pf->fdir.fdir_vsi) { - i40e_vsi_queues_bind_intr(pf->fdir.fdir_vsi, - I40E_ITR_INDEX_NONE); + ret = i40e_vsi_queues_bind_intr(pf->fdir.fdir_vsi, + I40E_ITR_INDEX_NONE); + if (ret < 0) + return ret; i40e_vsi_enable_queues_intr(pf->fdir.fdir_vsi); } diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h index e5d0ce5..33fbe77 100644 --- a/drivers/net/i40e/i40e_ethdev.h +++ b/drivers/net/i40e/i40e_ethdev.h @@ -1248,7 +1248,7 @@ struct i40e_vsi *i40e_vsi_setup(struct i40e_pf *pf, void i40e_pf_disable_irq0(struct i40e_hw *hw); void i40e_pf_enable_irq0(struct i40e_hw *hw); int i40e_dev_link_update(struct rte_eth_dev *dev, int wait_to_complete); -void i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx); +int i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx); void i40e_vsi_queues_unbind_intr(struct i40e_vsi *vsi); int i40e_vsi_vlan_pvid_set(struct i40e_vsi *vsi, struct i40e_vsi_vlan_pvid_info *info); -- 1.8.3.1
Fdir allocating msix resource is not strictly necessary, if no resource left, print a warning message. Fixes: 4861cde461 (i40e: new poll mode driver) Cc: stable@dpdk.org Signed-off-by: Jiang Mao <maox.jiang@intel.com> --- drivers/net/i40e/i40e_ethdev.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 16fcb8d..885b637 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -5732,6 +5732,17 @@ struct i40e_vsi * vsi->nb_msix = RTE_MIN(vsi->nb_qps, RTE_MAX_RXTX_INTR_VEC_ID); } + } else if (type == I40E_VSI_FDIR) { + ret = i40e_res_pool_alloc(&pf->msix_pool, 1); + if (ret < 0) { + PMD_DRV_LOG(WARNING, "MSIX vectors used up, FDIR can`t bind interrupt"); + vsi->msix_intr = 0; + vsi->nb_msix = 0; + } else { + vsi->msix_intr = ret; + vsi->nb_msix = 1; + } + } else if (type != I40E_VSI_SRIOV) { ret = i40e_res_pool_alloc(&pf->msix_pool, 1); if (ret < 0) { -- 1.8.3.1
> -----Original Message----- > From: dev <dev-bounces@dpdk.org> On Behalf Of Jiang Mao > Sent: Thursday, July 9, 2020 3:53 AM > To: Ye, Xiaolong <xiaolong.ye@intel.com> > Cc: dev@dpdk.org; stable@dpdk.org; Jiang, MaoX <maox.jiang@intel.com> > Subject: [dpdk-dev] [PATCH 2/2] net/i40e: fix fdir allocating msix resource error > > Fdir allocating msix resource is not strictly necessary, if no resource left, print a > warning message. > > Fixes: 4861cde461 (i40e: new poll mode driver) > Cc: stable@dpdk.org > Signed-off-by: Jiang Mao <maox.jiang@intel.com> > --- > drivers/net/i40e/i40e_ethdev.c | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c > index 16fcb8d..885b637 100644 > --- a/drivers/net/i40e/i40e_ethdev.c > +++ b/drivers/net/i40e/i40e_ethdev.c > @@ -5732,6 +5732,17 @@ struct i40e_vsi * > vsi->nb_msix = RTE_MIN(vsi->nb_qps, > RTE_MAX_RXTX_INTR_VEC_ID); > } > + } else if (type == I40E_VSI_FDIR) { > + ret = i40e_res_pool_alloc(&pf->msix_pool, 1); > + if (ret < 0) { > + PMD_DRV_LOG(WARNING, "MSIX vectors used up, FDIR can`t > bind interrupt"); > + vsi->msix_intr = 0; > + vsi->nb_msix = 0; > + } else { > + vsi->msix_intr = ret; > + vsi->nb_msix = 1; > + } > + Better to merge above branch into below branch and remove the "else" branch > } else if (type != I40E_VSI_SRIOV) { > ret = i40e_res_pool_alloc(&pf->msix_pool, 1); > if (ret < 0) { > -- > 1.8.3.1
hi, jiang mao On 7/9/2020 3:50 AM, Jiang Mao wrote: > The value of vsi->nb_msix shouldn`t be zero, otherwise, all of > interrupts will be bind to vector 0. > > Fixes: 4861cde461 (i40e: new poll mode driver) > Cc: stable@dpdk.org Blank line is need before Signed-off. And please remember --reply-to when you send new version patch to trace the comments. > Signed-off-by: Jiang Mao <maox.jiang@intel.com> > --- > drivers/net/i40e/i40e_ethdev.c | 31 +++++++++++++++++++++++-------- > drivers/net/i40e/i40e_ethdev.h | 2 +- > 2 files changed, 24 insertions(+), 9 deletions(-) > > diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c > index 777e149..16fcb8d 100644 > --- a/drivers/net/i40e/i40e_ethdev.c > +++ b/drivers/net/i40e/i40e_ethdev.c > @@ -2001,7 +2001,7 @@ void i40e_flex_payload_reg_set_default(struct i40e_hw *hw) > I40E_WRITE_FLUSH(hw); > } > > -void > +int > i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx) > { > struct rte_eth_dev *dev = vsi->adapter->eth_dev; > @@ -2021,10 +2021,14 @@ void i40e_flex_payload_reg_set_default(struct i40e_hw *hw) > > /* VF bind interrupt */ > if (vsi->type == I40E_VSI_SRIOV) { > + if (vsi->nb_msix == 0) { > + PMD_DRV_LOG(ERR, "No msix resource"); > + return -EINVAL; > + } > __vsi_queues_bind_intr(vsi, msix_vect, > vsi->base_queue, vsi->nb_qps, > itr_idx); > - return; > + return 0; > } > > /* PF & VMDq bind interrupt */ > @@ -2041,7 +2045,10 @@ void i40e_flex_payload_reg_set_default(struct i40e_hw *hw) > } > > for (i = 0; i < vsi->nb_used_qps; i++) { > - if (nb_msix <= 1) { > + if (vsi->nb_msix == 0) { > + PMD_DRV_LOG(ERR, "No msix resource"); > + return -EINVAL; > + } else if (nb_msix <= 1) { > if (!rte_intr_allow_others(intr_handle)) > /* allow to share MISC_VEC_ID */ > msix_vect = I40E_MISC_VEC_ID; > @@ -2066,6 +2073,8 @@ void i40e_flex_payload_reg_set_default(struct i40e_hw *hw) > msix_vect++; > nb_msix--; > } > + > + return 0; > } > > static void > @@ -2306,21 +2315,27 @@ void i40e_flex_payload_reg_set_default(struct i40e_hw *hw) > /* Map queues with MSIX interrupt */ > main_vsi->nb_used_qps = dev->data->nb_rx_queues - > pf->nb_cfg_vmdq_vsi * RTE_LIBRTE_I40E_QUEUE_NUM_PER_VM; > - i40e_vsi_queues_bind_intr(main_vsi, I40E_ITR_INDEX_DEFAULT); > + ret = i40e_vsi_queues_bind_intr(main_vsi, I40E_ITR_INDEX_DEFAULT); > + if (ret < 0) Better to add some print log out of the calling if it is need. Below is the same. > + return ret; > i40e_vsi_enable_queues_intr(main_vsi); > > /* Map VMDQ VSI queues with MSIX interrupt */ > for (i = 0; i < pf->nb_cfg_vmdq_vsi; i++) { > pf->vmdq[i].vsi->nb_used_qps = RTE_LIBRTE_I40E_QUEUE_NUM_PER_VM; > - i40e_vsi_queues_bind_intr(pf->vmdq[i].vsi, > - I40E_ITR_INDEX_DEFAULT); > + ret = i40e_vsi_queues_bind_intr(pf->vmdq[i].vsi, > + I40E_ITR_INDEX_DEFAULT); > + if (ret < 0) > + return ret; > i40e_vsi_enable_queues_intr(pf->vmdq[i].vsi); > } > > /* enable FDIR MSIX interrupt */ > if (pf->fdir.fdir_vsi) { > - i40e_vsi_queues_bind_intr(pf->fdir.fdir_vsi, > - I40E_ITR_INDEX_NONE); > + ret = i40e_vsi_queues_bind_intr(pf->fdir.fdir_vsi, > + I40E_ITR_INDEX_NONE); > + if (ret < 0) > + return ret; > i40e_vsi_enable_queues_intr(pf->fdir.fdir_vsi); > } > > diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h > index e5d0ce5..33fbe77 100644 > --- a/drivers/net/i40e/i40e_ethdev.h > +++ b/drivers/net/i40e/i40e_ethdev.h > @@ -1248,7 +1248,7 @@ struct i40e_vsi *i40e_vsi_setup(struct i40e_pf *pf, > void i40e_pf_disable_irq0(struct i40e_hw *hw); > void i40e_pf_enable_irq0(struct i40e_hw *hw); > int i40e_dev_link_update(struct rte_eth_dev *dev, int wait_to_complete); > -void i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx); > +int i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx); > void i40e_vsi_queues_unbind_intr(struct i40e_vsi *vsi); > int i40e_vsi_vlan_pvid_set(struct i40e_vsi *vsi, > struct i40e_vsi_vlan_pvid_info *info);
Thanks Jia. Comments as below. > -----Original Message----- > From: Guo, Jia > Sent: Tuesday, July 21, 2020 11:58 AM > To: Jiang, MaoX <maox.jiang@intel.com>; Ye, Xiaolong > <xiaolong.ye@intel.com> > Cc: dev@dpdk.org; stable@dpdk.org > Subject: Re: [dpdk-dev] [PATCH 1/2] net/i40e: fix binding interrupt without > msix vectors > > hi, jiang mao > > On 7/9/2020 3:50 AM, Jiang Mao wrote: > > The value of vsi->nb_msix shouldn`t be zero, otherwise, all of > > interrupts will be bind to vector 0. > > > > Fixes: 4861cde461 (i40e: new poll mode driver) > > Cc: stable@dpdk.org > > > Blank line is need before Signed-off. And please remember --reply-to when > you send new version patch to trace the comments. > > > > Signed-off-by: Jiang Mao <maox.jiang@intel.com> > > --- > > drivers/net/i40e/i40e_ethdev.c | 31 +++++++++++++++++++++++-------- > > drivers/net/i40e/i40e_ethdev.h | 2 +- > > 2 files changed, 24 insertions(+), 9 deletions(-) > > > > diff --git a/drivers/net/i40e/i40e_ethdev.c > b/drivers/net/i40e/i40e_ethdev.c > > index 777e149..16fcb8d 100644 > > --- a/drivers/net/i40e/i40e_ethdev.c > > +++ b/drivers/net/i40e/i40e_ethdev.c > > @@ -2001,7 +2001,7 @@ void i40e_flex_payload_reg_set_default(struct > i40e_hw *hw) > > I40E_WRITE_FLUSH(hw); > > } > > > > -void > > +int > > i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx) > > { > > struct rte_eth_dev *dev = vsi->adapter->eth_dev; > > @@ -2021,10 +2021,14 @@ void i40e_flex_payload_reg_set_default(struct > i40e_hw *hw) > > > > /* VF bind interrupt */ > > if (vsi->type == I40E_VSI_SRIOV) { > > + if (vsi->nb_msix == 0) { > > + PMD_DRV_LOG(ERR, "No msix resource"); > > + return -EINVAL; > > + } > > __vsi_queues_bind_intr(vsi, msix_vect, > > vsi->base_queue, vsi->nb_qps, > > itr_idx); > > - return; > > + return 0; > > } > > > > /* PF & VMDq bind interrupt */ > > @@ -2041,7 +2045,10 @@ void i40e_flex_payload_reg_set_default(struct > i40e_hw *hw) > > } > > > > for (i = 0; i < vsi->nb_used_qps; i++) { > > - if (nb_msix <= 1) { > > + if (vsi->nb_msix == 0) { > > + PMD_DRV_LOG(ERR, "No msix resource"); > > + return -EINVAL; > > + } else if (nb_msix <= 1) { > > if (!rte_intr_allow_others(intr_handle)) > > /* allow to share MISC_VEC_ID */ > > msix_vect = I40E_MISC_VEC_ID; > > @@ -2066,6 +2073,8 @@ void i40e_flex_payload_reg_set_default(struct > i40e_hw *hw) > > msix_vect++; > > nb_msix--; > > } > > + > > + return 0; > > } > > > > static void > > @@ -2306,21 +2315,27 @@ void i40e_flex_payload_reg_set_default(struct > i40e_hw *hw) > > /* Map queues with MSIX interrupt */ > > main_vsi->nb_used_qps = dev->data->nb_rx_queues - > > pf->nb_cfg_vmdq_vsi * > RTE_LIBRTE_I40E_QUEUE_NUM_PER_VM; > > - i40e_vsi_queues_bind_intr(main_vsi, I40E_ITR_INDEX_DEFAULT); > > + ret = i40e_vsi_queues_bind_intr(main_vsi, > I40E_ITR_INDEX_DEFAULT); > > + if (ret < 0) > > > Better to add some print log out of the calling if it is need. Below is > the same. At i40e_vsi_queues_bind_intr(), I have add a print log, I think it`s enough, otherwise it will add too many print log in code. > > > > + return ret; > > i40e_vsi_enable_queues_intr(main_vsi); > > > > /* Map VMDQ VSI queues with MSIX interrupt */ > > for (i = 0; i < pf->nb_cfg_vmdq_vsi; i++) { > > pf->vmdq[i].vsi->nb_used_qps = > RTE_LIBRTE_I40E_QUEUE_NUM_PER_VM; > > - i40e_vsi_queues_bind_intr(pf->vmdq[i].vsi, > > - I40E_ITR_INDEX_DEFAULT); > > + ret = i40e_vsi_queues_bind_intr(pf->vmdq[i].vsi, > > + I40E_ITR_INDEX_DEFAULT); > > + if (ret < 0) > > + return ret; > > i40e_vsi_enable_queues_intr(pf->vmdq[i].vsi); > > } > > > > /* enable FDIR MSIX interrupt */ > > if (pf->fdir.fdir_vsi) { > > - i40e_vsi_queues_bind_intr(pf->fdir.fdir_vsi, > > - I40E_ITR_INDEX_NONE); > > + ret = i40e_vsi_queues_bind_intr(pf->fdir.fdir_vsi, > > + I40E_ITR_INDEX_NONE); > > + if (ret < 0) > > + return ret; > > i40e_vsi_enable_queues_intr(pf->fdir.fdir_vsi); > > } > > > > diff --git a/drivers/net/i40e/i40e_ethdev.h > b/drivers/net/i40e/i40e_ethdev.h > > index e5d0ce5..33fbe77 100644 > > --- a/drivers/net/i40e/i40e_ethdev.h > > +++ b/drivers/net/i40e/i40e_ethdev.h > > @@ -1248,7 +1248,7 @@ struct i40e_vsi *i40e_vsi_setup(struct i40e_pf *pf, > > void i40e_pf_disable_irq0(struct i40e_hw *hw); > > void i40e_pf_enable_irq0(struct i40e_hw *hw); > > int i40e_dev_link_update(struct rte_eth_dev *dev, int > wait_to_complete); > > -void i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx); > > +int i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx); > > void i40e_vsi_queues_unbind_intr(struct i40e_vsi *vsi); > > int i40e_vsi_vlan_pvid_set(struct i40e_vsi *vsi, > > struct i40e_vsi_vlan_pvid_info *info);
Fdir allocating msix resource is not strictly necessary, if no resource left, jump the error. Fixes: 4861cde461 (i40e: new poll mode driver) Cc: stable@dpdk.org Signed-off-by: Jiang Mao <maox.jiang@intel.com> --- drivers/net/i40e/i40e_ethdev.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) --- V2: Move type I40E_VSI_FDIR branch into !I40E_VSI_SRIOV branch. diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 777e14926f..a606409172 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -5721,10 +5721,14 @@ i40e_vsi_setup(struct i40e_pf *pf, ret = i40e_res_pool_alloc(&pf->msix_pool, 1); if (ret < 0) { PMD_DRV_LOG(ERR, "VSI %d get heap failed %d", vsi->seid, ret); - goto fail_queue_alloc; + if (type != I40E_VSI_FDIR) + goto fail_queue_alloc; + vsi->msix_intr = 0; + vsi->nb_msix = 0; + } else { + vsi->msix_intr = ret; + vsi->nb_msix = 1; } - vsi->msix_intr = ret; - vsi->nb_msix = 1; } else { vsi->msix_intr = 0; vsi->nb_msix = 0; -- 2.17.1
The value of vsi->nb_msix shouldn`t be zero, otherwise, all of interrupts will be bind to vector 0. Fixes: 4861cde461 (i40e: new poll mode driver) Cc: stable@dpdk.org Signed-off-by: Jiang Mao <maox.jiang@intel.com> --- V3: fix format issue. --- drivers/net/i40e/i40e_ethdev.c | 31 +++++++++++++++++++++++-------- drivers/net/i40e/i40e_ethdev.h | 2 +- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 777e14926f..16fcb8d24e 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -2001,7 +2001,7 @@ __vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t msix_vect, I40E_WRITE_FLUSH(hw); } -void +int i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx) { struct rte_eth_dev *dev = vsi->adapter->eth_dev; @@ -2021,10 +2021,14 @@ i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx) /* VF bind interrupt */ if (vsi->type == I40E_VSI_SRIOV) { + if (vsi->nb_msix == 0) { + PMD_DRV_LOG(ERR, "No msix resource"); + return -EINVAL; + } __vsi_queues_bind_intr(vsi, msix_vect, vsi->base_queue, vsi->nb_qps, itr_idx); - return; + return 0; } /* PF & VMDq bind interrupt */ @@ -2041,7 +2045,10 @@ i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx) } for (i = 0; i < vsi->nb_used_qps; i++) { - if (nb_msix <= 1) { + if (vsi->nb_msix == 0) { + PMD_DRV_LOG(ERR, "No msix resource"); + return -EINVAL; + } else if (nb_msix <= 1) { if (!rte_intr_allow_others(intr_handle)) /* allow to share MISC_VEC_ID */ msix_vect = I40E_MISC_VEC_ID; @@ -2066,6 +2073,8 @@ i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx) msix_vect++; nb_msix--; } + + return 0; } static void @@ -2306,21 +2315,27 @@ i40e_dev_start(struct rte_eth_dev *dev) /* Map queues with MSIX interrupt */ main_vsi->nb_used_qps = dev->data->nb_rx_queues - pf->nb_cfg_vmdq_vsi * RTE_LIBRTE_I40E_QUEUE_NUM_PER_VM; - i40e_vsi_queues_bind_intr(main_vsi, I40E_ITR_INDEX_DEFAULT); + ret = i40e_vsi_queues_bind_intr(main_vsi, I40E_ITR_INDEX_DEFAULT); + if (ret < 0) + return ret; i40e_vsi_enable_queues_intr(main_vsi); /* Map VMDQ VSI queues with MSIX interrupt */ for (i = 0; i < pf->nb_cfg_vmdq_vsi; i++) { pf->vmdq[i].vsi->nb_used_qps = RTE_LIBRTE_I40E_QUEUE_NUM_PER_VM; - i40e_vsi_queues_bind_intr(pf->vmdq[i].vsi, - I40E_ITR_INDEX_DEFAULT); + ret = i40e_vsi_queues_bind_intr(pf->vmdq[i].vsi, + I40E_ITR_INDEX_DEFAULT); + if (ret < 0) + return ret; i40e_vsi_enable_queues_intr(pf->vmdq[i].vsi); } /* enable FDIR MSIX interrupt */ if (pf->fdir.fdir_vsi) { - i40e_vsi_queues_bind_intr(pf->fdir.fdir_vsi, - I40E_ITR_INDEX_NONE); + ret = i40e_vsi_queues_bind_intr(pf->fdir.fdir_vsi, + I40E_ITR_INDEX_NONE); + if (ret < 0) + return ret; i40e_vsi_enable_queues_intr(pf->fdir.fdir_vsi); } diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h index e5d0ce53f5..33fbe776bb 100644 --- a/drivers/net/i40e/i40e_ethdev.h +++ b/drivers/net/i40e/i40e_ethdev.h @@ -1248,7 +1248,7 @@ void i40e_update_vsi_stats(struct i40e_vsi *vsi); void i40e_pf_disable_irq0(struct i40e_hw *hw); void i40e_pf_enable_irq0(struct i40e_hw *hw); int i40e_dev_link_update(struct rte_eth_dev *dev, int wait_to_complete); -void i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx); +int i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx); void i40e_vsi_queues_unbind_intr(struct i40e_vsi *vsi); int i40e_vsi_vlan_pvid_set(struct i40e_vsi *vsi, struct i40e_vsi_vlan_pvid_info *info); -- 2.17.1
Fdir allocating msix resource is not strictly necessary, if no resource left, jump the error. Fixes: 4861cde461 (i40e: new poll mode driver) Cc: stable@dpdk.org Signed-off-by: Jiang Mao <maox.jiang@intel.com> --- V3: Move type I40E_VSI_FDIR branch into !I40E_VSI_SRIOV branch. --- drivers/net/i40e/i40e_ethdev.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 16fcb8d24e..c19bf868ea 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -5736,10 +5736,14 @@ i40e_vsi_setup(struct i40e_pf *pf, ret = i40e_res_pool_alloc(&pf->msix_pool, 1); if (ret < 0) { PMD_DRV_LOG(ERR, "VSI %d get heap failed %d", vsi->seid, ret); - goto fail_queue_alloc; + if (type != I40E_VSI_FDIR) + goto fail_queue_alloc; + vsi->msix_intr = 0; + vsi->nb_msix = 0; + } else { + vsi->msix_intr = ret; + vsi->nb_msix = 1; } - vsi->msix_intr = ret; - vsi->nb_msix = 1; } else { vsi->msix_intr = 0; vsi->nb_msix = 0; -- 2.17.1
> -----Original Message-----
> From: Jiang, MaoX <maox.jiang@intel.com>
> Sent: Thursday, July 23, 2020 11:27 PM
> To: Zhang, Qi Z <qi.z.zhang@intel.com>
> Cc: dev@dpdk.org; stable@dpdk.org; Jiang, MaoX <maox.jiang@intel.com>
> Subject: [PATCH v4 1/2] net/i40e: fix binding interrupt without msix vectors
>
> The value of vsi->nb_msix shouldn`t be zero, otherwise, all of interrupts will be
> bind to vector 0.
>
> Fixes: 4861cde461 (i40e: new poll mode driver)
> Cc: stable@dpdk.org
>
> Signed-off-by: Jiang Mao <maox.jiang@intel.com>
Acked-by: Qi Zhang <qi.z.zhang@intel.com>
Applied to dpdk-next-net-intel.
Thanks
Qi
> -----Original Message-----
> From: Jiang, MaoX <maox.jiang@intel.com>
> Sent: Friday, July 24, 2020 12:12 AM
> To: Zhang, Qi Z <qi.z.zhang@intel.com>
> Cc: dev@dpdk.org; stable@dpdk.org; Jiang, MaoX <maox.jiang@intel.com>
> Subject: [PATCH v4 2/2] net/i40e: fix fdir allocating msix resource error
>
> Fdir allocating msix resource is not strictly necessary, if no resource left, jump
> the error.
>
> Fixes: 4861cde461 (i40e: new poll mode driver)
> Cc: stable@dpdk.org
>
> Signed-off-by: Jiang Mao <maox.jiang@intel.com>
Acked-by: Qi Zhang <qi.z.zhang@intel.com>
Applied to dpdk-next-net-intel.
Thanks
Qi
The value of vsi->nb_msix shouldn`t be zero, otherwise, all of interrupts will be bind to vector 0. Fixes: 4861cde461 (i40e: new poll mode driver) Cc: stable@dpdk.org Signed-off-by: Jiang Mao <maox.jiang@intel.com> --- V3: Fix format issue. V4: Rebase this patch. --- drivers/net/i40e/i40e_ethdev.c | 25 +++++++++++++++++++------ drivers/net/i40e/i40e_ethdev.h | 2 +- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 05d5f28615..0c32e451c5 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -2117,7 +2117,7 @@ __vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t msix_vect, I40E_WRITE_FLUSH(hw); } -void +int i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx) { struct rte_eth_dev *dev = vsi->adapter->eth_dev; @@ -2137,10 +2137,14 @@ i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx) /* VF bind interrupt */ if (vsi->type == I40E_VSI_SRIOV) { + if (vsi->nb_msix == 0) { + PMD_DRV_LOG(ERR, "No msix resource"); + return -EINVAL; + } __vsi_queues_bind_intr(vsi, msix_vect, vsi->base_queue, vsi->nb_qps, itr_idx); - return; + return 0; } /* PF & VMDq bind interrupt */ @@ -2157,7 +2161,10 @@ i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx) } for (i = 0; i < vsi->nb_used_qps; i++) { - if (nb_msix <= 1) { + if (vsi->nb_msix == 0) { + PMD_DRV_LOG(ERR, "No msix resource"); + return -EINVAL; + } else if (nb_msix <= 1) { if (!rte_intr_allow_others(intr_handle)) /* allow to share MISC_VEC_ID */ msix_vect = I40E_MISC_VEC_ID; @@ -2182,6 +2189,8 @@ i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx) msix_vect++; nb_msix--; } + + return 0; } void @@ -2422,14 +2431,18 @@ i40e_dev_start(struct rte_eth_dev *dev) /* Map queues with MSIX interrupt */ main_vsi->nb_used_qps = dev->data->nb_rx_queues - pf->nb_cfg_vmdq_vsi * RTE_LIBRTE_I40E_QUEUE_NUM_PER_VM; - i40e_vsi_queues_bind_intr(main_vsi, I40E_ITR_INDEX_DEFAULT); + ret = i40e_vsi_queues_bind_intr(main_vsi, I40E_ITR_INDEX_DEFAULT); + if (ret < 0) + return ret; i40e_vsi_enable_queues_intr(main_vsi); /* Map VMDQ VSI queues with MSIX interrupt */ for (i = 0; i < pf->nb_cfg_vmdq_vsi; i++) { pf->vmdq[i].vsi->nb_used_qps = RTE_LIBRTE_I40E_QUEUE_NUM_PER_VM; - i40e_vsi_queues_bind_intr(pf->vmdq[i].vsi, - I40E_ITR_INDEX_DEFAULT); + ret = i40e_vsi_queues_bind_intr(pf->vmdq[i].vsi, + I40E_ITR_INDEX_DEFAULT); + if (ret < 0) + return ret; i40e_vsi_enable_queues_intr(pf->vmdq[i].vsi); } diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h index aef88abed0..19f821829a 100644 --- a/drivers/net/i40e/i40e_ethdev.h +++ b/drivers/net/i40e/i40e_ethdev.h @@ -1319,7 +1319,7 @@ void i40e_update_vsi_stats(struct i40e_vsi *vsi); void i40e_pf_disable_irq0(struct i40e_hw *hw); void i40e_pf_enable_irq0(struct i40e_hw *hw); int i40e_dev_link_update(struct rte_eth_dev *dev, int wait_to_complete); -void i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx); +int i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx); void i40e_vsi_queues_unbind_intr(struct i40e_vsi *vsi); void i40e_vsi_disable_queues_intr(struct i40e_vsi *vsi); int i40e_vsi_vlan_pvid_set(struct i40e_vsi *vsi, -- 2.17.1
Fdir allocating msix resource is not strictly necessary, if no resource left, jump the error. Fixes: 4861cde461 (i40e: new poll mode driver) Cc: stable@dpdk.org Signed-off-by: Jiang Mao <maox.jiang@intel.com> --- V3: Move type I40E_VSI_FDIR branch into !I40E_VSI_SRIOV branch. V4: Rebase this patch. --- drivers/net/i40e/i40e_ethdev.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 0c32e451c5..f9a8e7132f 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -5839,10 +5839,14 @@ i40e_vsi_setup(struct i40e_pf *pf, ret = i40e_res_pool_alloc(&pf->msix_pool, 1); if (ret < 0) { PMD_DRV_LOG(ERR, "VSI %d get heap failed %d", vsi->seid, ret); - goto fail_queue_alloc; + if (type != I40E_VSI_FDIR) + goto fail_queue_alloc; + vsi->msix_intr = 0; + vsi->nb_msix = 0; + } else { + vsi->msix_intr = ret; + vsi->nb_msix = 1; } - vsi->msix_intr = ret; - vsi->nb_msix = 1; } else { vsi->msix_intr = 0; vsi->nb_msix = 0; -- 2.17.1