From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id E99F41B17F for ; Mon, 10 Dec 2018 16:11:21 +0100 (CET) X-Virus-Scanned: Proofpoint Essentials engine Received: from webmail.solarflare.com (webmail.solarflare.com [12.187.104.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (Proofpoint Essentials ESMTP Server) with ESMTPS id 1094310009E; Mon, 10 Dec 2018 15:11:20 +0000 (UTC) Received: from ocex03.SolarFlarecom.com (10.20.40.36) by ocex03.SolarFlarecom.com (10.20.40.36) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Mon, 10 Dec 2018 07:11:17 -0800 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ocex03.SolarFlarecom.com (10.20.40.36) with Microsoft SMTP Server (TLS) id 15.0.1395.4 via Frontend Transport; Mon, 10 Dec 2018 07:11:16 -0800 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id wBAFBFc9014745; Mon, 10 Dec 2018 15:11:15 GMT Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id ABB7D1616EF; Mon, 10 Dec 2018 15:11:15 +0000 (GMT) From: Andrew Rybchenko To: CC: Igor Romanov Date: Mon, 10 Dec 2018 15:10:51 +0000 Message-ID: <1544454656-5339-1-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 MIME-Version: 1.0 Content-Type: text/plain X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.5.1010-24274.006 X-TM-AS-Result: No-2.396400-4.000000-10 X-TMASE-MatchedRID: aHgTgtU2uHmuhCBFl/b63hcqpH7D1rtQL34I8IpvQcL1gF7PCEF9btKe uoOP1lboQOGSNyQBW1ImAjVreEJWp/VTeZLup9NPA9lly13c/gHGYnoF/CTeZZsoi2XrUn/Jn6K dMrRsL14qtq5d3cxkNUXcrZQR7nPugC8jhclrlC7d0GHJDQDUZ4Ty8TDxMbhBziWMzERPfsoEx0 D9R8GKb+wQ8atoheRxJak0BpItgLCleD/1bDy42taTxr7l5BRrOKBkFAm8GOUPoO5ncI6OuehbQ 2QpmASdbcuA3Id6O6JDDKa3G4nrLQ== X-TM-AS-User-Approved-Sender: No X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--2.396400-4.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.5.1010-24274.006 X-MDID: 1544454680-x2RSjgtNHnDd Subject: [dpdk-stable] [PATCH 17.11 1/6] net/failsafe: fix crash on slave queue release X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 10 Dec 2018 15:11:22 -0000 From: Igor Romanov [ backported from upstream commit 6b35f4d88b40645425b4b8e156423982471eccf5 ] Releasing a queue that is already released by slave may cause a segmentation fault. For example, after a successfull device configuration a queue is set up. Afterwards the device is reconfigured with an invalid argument, forcing slaves to release the queues (e.g. rte_eth_dev.data.tx_queues). Finally the failsafe's queues are released. The queue release functions also try to release slaves' queues using ETH(sdev)->data->tx_queues which is NULL at the time. Add checks for NULL slaves' Tx and Rx queues before releasing them. Fixes: a46f8d584eb8 ("net/failsafe: add fail-safe PMD") Signed-off-by: Igor Romanov Signed-off-by: Andrew Rybchenko --- drivers/net/failsafe/failsafe_ops.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/drivers/net/failsafe/failsafe_ops.c b/drivers/net/failsafe/failsafe_ops.c index 9a5d873..885d63c 100644 --- a/drivers/net/failsafe/failsafe_ops.c +++ b/drivers/net/failsafe/failsafe_ops.c @@ -260,9 +260,13 @@ return; rxq = queue; dev = rxq->priv->dev; - FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) - SUBOPS(sdev, rx_queue_release) - (ETH(sdev)->data->rx_queues[rxq->qid]); + FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) { + if (ETH(sdev)->data->rx_queues != NULL && + ETH(sdev)->data->rx_queues[rxq->qid] != NULL) { + SUBOPS(sdev, rx_queue_release) + (ETH(sdev)->data->rx_queues[rxq->qid]); + } + } dev->data->rx_queues[rxq->qid] = NULL; rte_free(rxq); } @@ -328,9 +332,13 @@ return; txq = queue; dev = txq->priv->dev; - FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) - SUBOPS(sdev, tx_queue_release) - (ETH(sdev)->data->tx_queues[txq->qid]); + FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) { + if (ETH(sdev)->data->tx_queues != NULL && + ETH(sdev)->data->tx_queues[txq->qid] != NULL) { + SUBOPS(sdev, tx_queue_release) + (ETH(sdev)->data->tx_queues[txq->qid]); + } + } dev->data->tx_queues[txq->qid] = NULL; rte_free(txq); } -- 1.8.3.1