From patchwork Wed Apr 25 15:40:50 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adrien Mazarguil X-Patchwork-Id: 38941 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id BB30A8D89; Wed, 25 Apr 2018 17:41:06 +0200 (CEST) Received: from mail-wr0-f196.google.com (mail-wr0-f196.google.com [209.85.128.196]) by dpdk.org (Postfix) with ESMTP id 4B00723D for ; Wed, 25 Apr 2018 17:41:05 +0200 (CEST) Received: by mail-wr0-f196.google.com with SMTP id c14-v6so13663506wrd.4 for ; Wed, 25 Apr 2018 08:41:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=date:from:to:cc:subject:message-id:mime-version:content-disposition; bh=PLcws+QufInlp2otonEYjCPNvYD0wtnO9yxpGL2IJ+o=; b=YmUHxLR0VnYOUnQNc2DgGkfjislKKBCJuD10bSmv/J0n+f7okzBKfuvkvjs6cCdZgS CIekHKU01GEzvhunWcLuOLwa/OtG31RBlIbr4WmuryO7sKYLdBr+d4NMGs37tZvTlofO TUjx21Z1BAGIN6QkKIWSbN12XxniG7qk7iDYUD1eapQ3LNX+wHjiLAaYnlWEmUMkmp1V hLg3h0HLM7HBSZl9mnbXPEMnitpJ6osj/SqVMp1Cw1O9E0IvN5o0lZa4AEVafF+HiH5c lK1RX+dPuPI6kCTwHSsyxGY0LDTRjWlXD0vzhH4sdg8W7z1l7/zHVZrNePU4HM9PO+no Ji+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:mime-version :content-disposition; bh=PLcws+QufInlp2otonEYjCPNvYD0wtnO9yxpGL2IJ+o=; b=HNZ1Bhil92LTNch8MW29gyeIH+rQdpbIDRdjJP77dkFK/DpNHnyz5phIfYHi/mcu82 qyYVQX+bWm46m7hXLx2rN61XOQXUfj9KD4x1mad3b1xDBakR7arhs5ySCQZeo5BfCH0B KigDPxd7zrKBvOgGW9Z6xEbJbAndN4uTBwLInbqHvfdMCVA0xqsUeDJ/7mepw+1LYj3M okBKEDKbG2CxOWwfqxYmMmcJXVhbIbz58ux3mFutUsQCZ7PCu+lyu2vvkkEVzwchQ6bL oeUWHv8lKohvhiHEYz98oAuMdmNLsmStACpH0NWbAXBB5nqlv9H6jFn69jBKASxx2PaM Nl4Q== X-Gm-Message-State: ALQs6tANlv2UPCMy4YEaTKpAq4adx7GwdKjKn7Jg/1RKgFSGWSZSFw06 oLclD4HAvnFoKvUdS8w4eLusMZKz X-Google-Smtp-Source: AIpwx48zx1bgMy1fU547EbFloqy+6pqroSb5f729vhwMi/6igqwvsbB013DIm8OBNFQoSZLlpfizlw== X-Received: by 2002:adf:b594:: with SMTP id c20-v6mr24254912wre.65.1524670864883; Wed, 25 Apr 2018 08:41:04 -0700 (PDT) Received: from 6wind.com (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id p33-v6sm24514143wrc.14.2018.04.25.08.41.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 25 Apr 2018 08:41:04 -0700 (PDT) Date: Wed, 25 Apr 2018 17:40:50 +0200 From: Adrien Mazarguil To: dev@dpdk.org Cc: Ferruh Yigit , stable@dpdk.org Message-ID: <20180425153739.9157-1-adrien.mazarguil@6wind.com> MIME-Version: 1.0 Content-Disposition: inline X-Mailer: git-send-email 2.11.0 Subject: [dpdk-dev] [PATCH v1] net/mlx4: fix Rx resource leak in case of error 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" When creation of a flow rule fails during dev_start(), the usage count of the common RSS context is not decremented, which triggers an assertion failure in debug mode during dev_close(). This is addressed by tracking the initialization status of the common RSS context in order to add missing cleanup code. A similar issue exists in mlx4_rxq_attach(), where usage count is incremented on a Rx queue but not released in case of error. This may lead to the above issue since RSS contexts created by flow rules attach themselves to Rx queues, incrementing their usage count. Fixes: 5697a4142107 ("net/mlx4: relax Rx queue configuration order") Cc: stable@dpdk.org Signed-off-by: Adrien Mazarguil --- drivers/net/mlx4/mlx4.c | 6 ++++-- drivers/net/mlx4/mlx4.h | 1 + drivers/net/mlx4/mlx4_rxq.c | 7 +++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c index 06f17703b..937074a4f 100644 --- a/drivers/net/mlx4/mlx4.c +++ b/drivers/net/mlx4/mlx4.c @@ -61,6 +61,8 @@ const char *pmd_mlx4_init_params[] = { NULL, }; +static void mlx4_dev_stop(struct rte_eth_dev *dev); + /** * DPDK callback for Ethernet device configuration. * @@ -143,8 +145,7 @@ mlx4_dev_start(struct rte_eth_dev *dev) dev->rx_pkt_burst = mlx4_rx_burst; return 0; err: - /* Rollback. */ - priv->started = 0; + mlx4_dev_stop(dev); return ret; } @@ -194,6 +195,7 @@ mlx4_dev_close(struct rte_eth_dev *dev) dev->tx_pkt_burst = mlx4_tx_burst_removed; rte_wmb(); mlx4_flow_clean(priv); + mlx4_rss_deinit(priv); for (i = 0; i != dev->data->nb_rx_queues; ++i) mlx4_rx_queue_release(dev->data->rx_queues[i]); for (i = 0; i != dev->data->nb_tx_queues; ++i) diff --git a/drivers/net/mlx4/mlx4.h b/drivers/net/mlx4/mlx4.h index 45846554b..415b7d40f 100644 --- a/drivers/net/mlx4/mlx4.h +++ b/drivers/net/mlx4/mlx4.h @@ -103,6 +103,7 @@ struct priv { uint32_t vf:1; /**< This is a VF device. */ uint32_t intr_alarm:1; /**< An interrupt alarm is scheduled. */ uint32_t isolated:1; /**< Toggle isolated mode. */ + uint32_t rss_init:1; /**< Common RSS context is initialized. */ uint32_t hw_csum:1; /**< Checksum offload is supported. */ uint32_t hw_csum_l2tun:1; /**< Checksum support for L2 tunnels. */ uint32_t hw_fcs_strip:1; /**< FCS stripping toggling is supported. */ diff --git a/drivers/net/mlx4/mlx4_rxq.c b/drivers/net/mlx4/mlx4_rxq.c index 6be6a0b9a..a7acc047b 100644 --- a/drivers/net/mlx4/mlx4_rxq.c +++ b/drivers/net/mlx4/mlx4_rxq.c @@ -336,6 +336,8 @@ mlx4_rss_init(struct priv *priv) unsigned int i; int ret; + if (priv->rss_init) + return 0; /* Prepare range for RSS contexts before creating the first WQ. */ ret = mlx4_glue->dv_set_context_attr (priv->ctx, @@ -418,6 +420,7 @@ mlx4_rss_init(struct priv *priv) } wq_num_prev = wq_num; } + priv->rss_init = 1; return 0; error: ERROR("cannot initialize common RSS resources (queue %u): %s: %s", @@ -446,6 +449,8 @@ mlx4_rss_deinit(struct priv *priv) { unsigned int i; + if (!priv->rss_init) + return; for (i = 0; i != priv->dev->data->nb_rx_queues; ++i) { struct rxq *rxq = priv->dev->data->rx_queues[i]; @@ -454,6 +459,7 @@ mlx4_rss_deinit(struct priv *priv) mlx4_rxq_detach(rxq); } } + priv->rss_init = 0; } /** @@ -606,6 +612,7 @@ mlx4_rxq_attach(struct rxq *rxq) claim_zero(mlx4_glue->destroy_wq(wq)); if (cq) claim_zero(mlx4_glue->destroy_cq(cq)); + --rxq->usecnt; rte_errno = ret; ERROR("error while attaching Rx queue %p: %s: %s", (void *)rxq, msg, strerror(ret));