From patchwork Tue Nov 29 14:48:29 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luc Pelletier X-Patchwork-Id: 120276 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 22EE4A00C3; Tue, 29 Nov 2022 15:50:32 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id CDD2242BD9; Tue, 29 Nov 2022 15:50:31 +0100 (CET) Received: from mail-qt1-f173.google.com (mail-qt1-f173.google.com [209.85.160.173]) by mails.dpdk.org (Postfix) with ESMTP id 2E65642B8C; Tue, 29 Nov 2022 15:50:30 +0100 (CET) Received: by mail-qt1-f173.google.com with SMTP id l15so9051453qtv.4; Tue, 29 Nov 2022 06:50:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=x65RBFLYFeugknTlnHkP1QebxJ/q7Kwtp/HyVMorJTQ=; b=XbqX1SuQmVK1FDdPD3zPuDPNlfI4uldOawRLdGB1+zkvUxWv3gbt7ZMup9wTI+9pbx Kx5CsNBxjdvPYYADGNURIFqTvawa/7Pux5vEDlMYKJiXfXqacq/P6PtYACtVTxJm4jvb Y4aEBkOntV9xQhizfrSjMqRUaLAIzAr8WjTSwGwP0N0japZOm1Fr97XRjxkN+89hMrX/ OtgI/B/KNWQsO3Gc1GmWFkEzSMr6z6VaKB6r9ktHSylXILw2FLRlx5g0T7nybankCPt/ WT7VGvG7B+SRXOp5Jho+aWMlYkmGFg41FIqyYzQzxG0za1ivd4QpsmN2wyP2oAgHMj2F QSkA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=x65RBFLYFeugknTlnHkP1QebxJ/q7Kwtp/HyVMorJTQ=; b=QsgM+DlwLcGdo/Y23g4q9EGrIDrPnFVVf9CRxObR73koUb0P5szqjgHMaMNJOBKu3Q cOM45z4CXvT1fWUrOMg4r8Q+oojbGD9wtSuK8e9q5OV1e6lzwZEluKO/XM6VhShkuDGh +hoA0P+PW+ZoHgEs4a+857fXs6kbNj6qLZzQmsxoh9t283mswqe/UulunLNDy6m3rpiw v83CXI5HTOqtFDsEHBXT6juQR3y9jyZP2Z3KlhIiTrnns3YXWCryel1+vqd8bJRTd4vH cRJrKuWUOKF7QogcEiFLGFCCWNzKGlB9cSuWVd3gAl3c+tCcBNfv2yrCfviG8PxAsD3G kJmw== X-Gm-Message-State: ANoB5pnDoMMgnDWjHaHOGRHRKg3U5lHZgKkQAsaDoOrWGF/AzgPZBsyt CgzQNkZB/mBVXdXHr0AqIUg= X-Google-Smtp-Source: AA0mqf6cTlt/QLARgpIwZHqYU4yDHdzdZiOg5+7mlnyIm3W20GyAwwioGjMZq7fdiDXwxhsYvkOZVw== X-Received: by 2002:ac8:4d46:0:b0:3a5:278d:d95e with SMTP id x6-20020ac84d46000000b003a5278dd95emr52268972qtv.125.1669733429542; Tue, 29 Nov 2022 06:50:29 -0800 (PST) Received: from ubuntu.home (bras-base-hullpq2034w-grc-26-74-12-221-152.dsl.bell.ca. [74.12.221.152]) by smtp.gmail.com with ESMTPSA id y14-20020a05620a44ce00b006fb7c42e73asm11068836qkp.21.2022.11.29.06.50.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 29 Nov 2022 06:50:28 -0800 (PST) From: Luc Pelletier To: grive@u256.net Cc: dev@dpdk.org, stephen@networkplumber.org, konstantin.ananyev@huawei.com, Luc Pelletier , stable@dpdk.org Subject: [PATCH v3 1/5] failsafe: fix segfault on hotplug event Date: Tue, 29 Nov 2022 09:48:29 -0500 Message-Id: <20221129144832.2750-2-lucp.at.work@gmail.com> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221110163410.12734-1-lucp.at.work@gmail.com> References: <20221110163410.12734-1-lucp.at.work@gmail.com> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org When the failsafe PMD encounters a hotplug event, it switches its rx/tx functions to "safe" ones that validate the sub-device's rx/tx functions before calling them. It switches the rx/tx functions by changing the function pointers in the rte_eth_dev structure. Following commit 7a0935239b9e, the rx/tx functions of PMDs are no longer called through the function pointers in the rte_eth_dev structure. They are rather called through a flat array named rte_eth_fp_ops. The function pointers in that array are initialized when the devices start and are initialized. When a hotplug event occurs, the function pointers in rte_eth_fp_ops still point to the "unsafe" rx/tx functions in the failsafe PMD since they haven't been updated. This results in a segmentation fault because it ends up using the "unsafe" functions, when the "safe" functions should have been used. To fix the problem, the "unsafe" rx/tx functions were completely removed. The "safe" functions are now always used. Modifying the rx/tx functions on-the-fly is not supported by DPDK, so this is the correct approach and should have very minimal impact on performance. Fixes: 7a0935239b9e ("ethdev: make fast-path functions to use new flat array") Cc: Konstantin Ananyev Cc: stable@dpdk.org Signed-off-by: Luc Pelletier --- drivers/net/failsafe/failsafe_ether.c | 2 - drivers/net/failsafe/failsafe_private.h | 8 --- drivers/net/failsafe/failsafe_rxtx.c | 83 +------------------------ 3 files changed, 1 insertion(+), 92 deletions(-) diff --git a/drivers/net/failsafe/failsafe_ether.c b/drivers/net/failsafe/failsafe_ether.c index 10b90fd837..517126565f 100644 --- a/drivers/net/failsafe/failsafe_ether.c +++ b/drivers/net/failsafe/failsafe_ether.c @@ -595,8 +595,6 @@ failsafe_eth_rmv_event_callback(uint16_t port_id __rte_unused, fs_lock(fs_dev(sdev), 0); /* Switch as soon as possible tx_dev. */ fs_switch_dev(fs_dev(sdev), sdev); - /* Use safe bursts in any case. */ - failsafe_set_burst_fn(fs_dev(sdev), 1); /* * Async removal, the sub-PMD will try to unregister * the callback at the source of the current thread context. diff --git a/drivers/net/failsafe/failsafe_private.h b/drivers/net/failsafe/failsafe_private.h index 53a451c1b1..3865f2fc34 100644 --- a/drivers/net/failsafe/failsafe_private.h +++ b/drivers/net/failsafe/failsafe_private.h @@ -208,18 +208,11 @@ int failsafe_hotplug_alarm_cancel(struct rte_eth_dev *dev); /* RX / TX */ -void failsafe_set_burst_fn(struct rte_eth_dev *dev, int force_safe); - uint16_t failsafe_rx_burst(void *rxq, struct rte_mbuf **rx_pkts, uint16_t nb_pkts); uint16_t failsafe_tx_burst(void *txq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts); -uint16_t failsafe_rx_burst_fast(void *rxq, - struct rte_mbuf **rx_pkts, uint16_t nb_pkts); -uint16_t failsafe_tx_burst_fast(void *txq, - struct rte_mbuf **tx_pkts, uint16_t nb_pkts); - /* ARGS */ int failsafe_args_parse(struct rte_eth_dev *dev, const char *params); @@ -487,7 +480,6 @@ fs_switch_dev(struct rte_eth_dev *dev, } else { return; } - failsafe_set_burst_fn(dev, 0); rte_wmb(); } diff --git a/drivers/net/failsafe/failsafe_rxtx.c b/drivers/net/failsafe/failsafe_rxtx.c index fe67293299..707fe60a36 100644 --- a/drivers/net/failsafe/failsafe_rxtx.c +++ b/drivers/net/failsafe/failsafe_rxtx.c @@ -28,39 +28,6 @@ fs_tx_unsafe(struct sub_device *sdev) (sdev->state != DEV_STARTED); } -void -failsafe_set_burst_fn(struct rte_eth_dev *dev, int force_safe) -{ - struct sub_device *sdev; - uint8_t i; - int need_safe; - int safe_set; - - need_safe = force_safe; - FOREACH_SUBDEV(sdev, i, dev) - need_safe |= fs_rx_unsafe(sdev); - safe_set = (dev->rx_pkt_burst == &failsafe_rx_burst); - if (need_safe && !safe_set) { - DEBUG("Using safe RX bursts%s", - (force_safe ? " (forced)" : "")); - dev->rx_pkt_burst = &failsafe_rx_burst; - } else if (!need_safe && safe_set) { - DEBUG("Using fast RX bursts"); - dev->rx_pkt_burst = &failsafe_rx_burst_fast; - } - need_safe = force_safe || fs_tx_unsafe(TX_SUBDEV(dev)); - safe_set = (dev->tx_pkt_burst == &failsafe_tx_burst); - if (need_safe && !safe_set) { - DEBUG("Using safe TX bursts%s", - (force_safe ? " (forced)" : "")); - dev->tx_pkt_burst = &failsafe_tx_burst; - } else if (!need_safe && safe_set) { - DEBUG("Using fast TX bursts"); - dev->tx_pkt_burst = &failsafe_tx_burst_fast; - } - rte_wmb(); -} - /* * Override source port in Rx packets. * @@ -89,7 +56,7 @@ failsafe_rx_burst(void *queue, rxq = queue; sdev = rxq->sdev; do { - if (fs_rx_unsafe(sdev)) { + if (unlikely(fs_rx_unsafe(sdev))) { nb_rx = 0; sdev = sdev->next; continue; @@ -108,34 +75,6 @@ failsafe_rx_burst(void *queue, return nb_rx; } -uint16_t -failsafe_rx_burst_fast(void *queue, - struct rte_mbuf **rx_pkts, - uint16_t nb_pkts) -{ - struct sub_device *sdev; - struct rxq *rxq; - void *sub_rxq; - uint16_t nb_rx; - - rxq = queue; - sdev = rxq->sdev; - do { - RTE_ASSERT(!fs_rx_unsafe(sdev)); - sub_rxq = ETH(sdev)->data->rx_queues[rxq->qid]; - FS_ATOMIC_P(rxq->refcnt[sdev->sid]); - nb_rx = ETH(sdev)-> - rx_pkt_burst(sub_rxq, rx_pkts, nb_pkts); - FS_ATOMIC_V(rxq->refcnt[sdev->sid]); - sdev = sdev->next; - } while (nb_rx == 0 && sdev != rxq->sdev); - rxq->sdev = sdev; - if (nb_rx) - failsafe_rx_set_port(rx_pkts, nb_rx, - rxq->priv->data->port_id); - return nb_rx; -} - uint16_t failsafe_tx_burst(void *queue, struct rte_mbuf **tx_pkts, @@ -156,23 +95,3 @@ failsafe_tx_burst(void *queue, FS_ATOMIC_V(txq->refcnt[sdev->sid]); return nb_tx; } - -uint16_t -failsafe_tx_burst_fast(void *queue, - struct rte_mbuf **tx_pkts, - uint16_t nb_pkts) -{ - struct sub_device *sdev; - struct txq *txq; - void *sub_txq; - uint16_t nb_tx; - - txq = queue; - sdev = TX_SUBDEV(&rte_eth_devices[txq->priv->data->port_id]); - RTE_ASSERT(!fs_tx_unsafe(sdev)); - sub_txq = ETH(sdev)->data->tx_queues[txq->qid]; - FS_ATOMIC_P(txq->refcnt[sdev->sid]); - nb_tx = ETH(sdev)->tx_pkt_burst(sub_txq, tx_pkts, nb_pkts); - FS_ATOMIC_V(txq->refcnt[sdev->sid]); - return nb_tx; -}