From mboxrd@z Thu Jan 1 00:00:00 1970 From: Xiaoyu Min Subject: [PATCH] net/mlx5: handle expected errno properly Date: Thu, 23 Aug 2018 14:38:51 +0800 Message-ID: <20180823063851.32559-1-jackmin@mellanox.com> Mime-Version: 1.0 Content-Type: text/plain Cc: dev@dpdk.org, xuemingl@mellanox.com To: Shahaf Shuler , Yongseok Koh Return-path: Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-eopbgr80050.outbound.protection.outlook.com [40.107.8.50]) by dpdk.org (Postfix) with ESMTP id 17CC82C38 for ; Thu, 23 Aug 2018 08:39:36 +0200 (CEST) List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" rte_errno is a per thread variable and is widely used as an error indicator, which means a function could affect other functions' results by setting rte_errno carelessly During rxq setup, an EINVAL rte_errno is expected since the queues are not created yet So rte_errno is cleared when it is EINVAL as expected Signed-off-by: Xiaoyu Min --- drivers/net/mlx5/mlx5_rxq.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c index 1f7bfd4..e7056e8 100644 --- a/drivers/net/mlx5/mlx5_rxq.c +++ b/drivers/net/mlx5/mlx5_rxq.c @@ -443,6 +443,7 @@ struct mlx5_rxq_data *rxq = (*priv->rxqs)[idx]; struct mlx5_rxq_ctrl *rxq_ctrl = container_of(rxq, struct mlx5_rxq_ctrl, rxq); + int ret = 0; if (!rte_is_power_of_2(desc)) { desc = 1 << log2above(desc); @@ -459,13 +460,21 @@ rte_errno = EOVERFLOW; return -rte_errno; } - if (!mlx5_rxq_releasable(dev, idx)) { + ret = mlx5_rxq_releasable(dev, idx); + if (!ret) { DRV_LOG(ERR, "port %u unable to release queue index %u", dev->data->port_id, idx); rte_errno = EBUSY; return -rte_errno; + } else if (ret == -EINVAL) { + /** + * on the first time, rx queue doesn't exist, + * so just ignore this error and reset rte_errno. + */ + rte_errno = 0; + } else { + mlx5_rxq_release(dev, idx); } - mlx5_rxq_release(dev, idx); rxq_ctrl = mlx5_rxq_new(dev, idx, desc, socket, conf, mp); if (!rxq_ctrl) { DRV_LOG(ERR, "port %u unable to allocate queue index %u", @@ -1543,11 +1552,12 @@ struct mlx5_rxq_ctrl * * @param dev * Pointer to Ethernet device. * @param idx - * TX queue index. + * RX queue index. * * @return - * 1 if the queue can be released, negative errno otherwise and rte_errno is - * set. + * 1 if the queue can be released + * 0 if the queue can not be released + * -EINVAL if the queue doesn't exist */ int mlx5_rxq_releasable(struct rte_eth_dev *dev, uint16_t idx) -- 1.8.3.1