From: Luc Pelletier <lucp.at.work@gmail.com>
To: grive@u256.net
Cc: dev@dpdk.org, stephen@networkplumber.org,
konstantin.ananyev@huawei.com,
Luc Pelletier <lucp.at.work@gmail.com>,
stable@dpdk.org
Subject: [PATCH v4 1/5] failsafe: fix segfault on hotplug event
Date: Tue, 29 Nov 2022 10:25:13 -0500 [thread overview]
Message-ID: <20221129152516.4513-2-lucp.at.work@gmail.com> (raw)
In-Reply-To: <20221110163410.12734-1-lucp.at.work@gmail.com>
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 <konstantin.ananyev@huawei.com>
Cc: stable@dpdk.org
Signed-off-by: Luc Pelletier <lucp.at.work@gmail.com>
---
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;
-}
--
2.38.1
next prev parent reply other threads:[~2022-11-29 15:25 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-10 16:34 [PATCH] failsafe: fix segfault on hotplug event Luc Pelletier
2022-11-10 17:42 ` [PATCH v2] " Luc Pelletier
2022-11-10 23:33 ` Stephen Hemminger
2022-11-16 17:35 ` [PATCH] " Konstantin Ananyev
2022-11-16 21:51 ` Luc Pelletier
2022-11-16 22:25 ` Stephen Hemminger
2022-11-18 16:31 ` Konstantin Ananyev
2022-11-29 14:48 ` [PATCH v3 0/5] Failsafe bug fixes and improvements Luc Pelletier
2022-11-29 14:48 ` [PATCH v3 1/5] failsafe: fix segfault on hotplug event Luc Pelletier
2023-10-31 17:35 ` Stephen Hemminger
2022-11-29 14:48 ` [PATCH v3 2/5] failsafe: use public rx/tx burst API Luc Pelletier
2022-11-29 14:48 ` [PATCH v3 3/5] failsafe: fix double release of port Luc Pelletier
2022-11-29 14:48 ` [PATCH v3 4/5] failsafe: use public APIs in fs_link_update Luc Pelletier
2022-11-29 14:48 ` [PATCH v3 5/5] failsafe: make sub-device remove flag thread-safe Luc Pelletier
2022-11-29 15:25 ` [PATCH v4 0/5] Failsafe bug fixes and improvements Luc Pelletier
2022-11-29 15:25 ` Luc Pelletier [this message]
2022-11-29 15:25 ` [PATCH v4 2/5] failsafe: use public rx/tx burst API Luc Pelletier
2022-11-29 15:25 ` [PATCH v4 3/5] failsafe: fix double release of port Luc Pelletier
2022-11-29 15:25 ` [PATCH v4 4/5] failsafe: use public APIs in fs_link_update Luc Pelletier
2022-11-29 15:25 ` [PATCH v4 5/5] failsafe: make sub-device remove flag thread-safe Luc Pelletier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20221129152516.4513-2-lucp.at.work@gmail.com \
--to=lucp.at.work@gmail.com \
--cc=dev@dpdk.org \
--cc=grive@u256.net \
--cc=konstantin.ananyev@huawei.com \
--cc=stable@dpdk.org \
--cc=stephen@networkplumber.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.