From patchwork Tue Jul 11 23:26:28 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 26849 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id D99D57D3F; Wed, 12 Jul 2017 01:27:04 +0200 (CEST) Received: from mail-wr0-f181.google.com (mail-wr0-f181.google.com [209.85.128.181]) by dpdk.org (Postfix) with ESMTP id BB3C73257 for ; Wed, 12 Jul 2017 01:26:57 +0200 (CEST) Received: by mail-wr0-f181.google.com with SMTP id 77so9951162wrb.1 for ; Tue, 11 Jul 2017 16:26:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=6LBdcL26zSOaB50EDr3+qIIOjhCebMGtZTysB1sgsJg=; b=FMmUI8aLYf+B7WgLehLsZwuTbUM0mMaD9Ptv2h+gOXTkWR5X2ig9f80La46LZ1bjY8 oDWXoXHrQI7sfEZmOiKFG7jakCQB0M0CwYAQLausjUBcuUeFqrE3QdAXzkDmZC6SAp+g 5QHCMdst6jP8cC2UEJMuYwbK1Bjvn0UfTZz8NSZElqrHIIE10RWUPdt1niTl8Ii3Lw/P qLT43xEgJ3tIvBz6BCr9mc/V0ncdrjLIuNi1jNdd9P0577VqpXYrfD+FCM5NiMynHEnO zwPPUqX4zPgv42xzBGw7eP4m5yO4A7fiyEYetIv7cne20jRqr0U/edCzcQryVaupRDKW IvVQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=6LBdcL26zSOaB50EDr3+qIIOjhCebMGtZTysB1sgsJg=; b=s2ZbludCXv/ISNc0GoGi/r3Uojl+yjSp27nynVDrVoUmYnx5i4WYnN/C3cEXQ/lFgm orw6b1qRr9VxYrnBa97+NmVXZFNMFMj9D4ZyjrMuPqWXZ8F9OAoyBpHHbqx20ueMJ2Dj W4NCAjIAXRYdhpiAsPvZKPkahwU4ZePaCDDo58zqGSKYlv3lp1+KjNyEu2m/di3Igdt1 K/GP7Dy0QVfgkIm6/F97bI+ni+3aRb11uMYfralSjudyFer+yxznJYGiXdkjlnfaVU6w zaqNE923sc7or2/lXjNaxoKkIWZKMupLUZFS0W6QM+LAfI6cdqY0ENhhLYIs9cDeORPW 10RQ== X-Gm-Message-State: AIVw113PWtbO+54y7ymwUcmgFz8XFrPs7JQEzEqSbNw14h7NBf6A/ubk ATfnj+5uVPfjZ0Q41UY= X-Received: by 10.28.18.16 with SMTP id 16mr439922wms.93.1499815616918; Tue, 11 Jul 2017 16:26:56 -0700 (PDT) Received: from bidouze.dev.6wind.com (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id w30sm740855wrb.49.2017.07.11.16.26.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 11 Jul 2017 16:26:56 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Gaetan Rivet Date: Wed, 12 Jul 2017 01:26:28 +0200 Message-Id: <9fe18d5587f063e4cd47ad9d2a31521c121f12f7.1499815140.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v9 08/11] net/failsafe: add fast burst functions 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" Signed-off-by: Gaetan Rivet Acked-by: Olga Shern --- drivers/net/failsafe/failsafe_private.h | 8 +++ drivers/net/failsafe/failsafe_rxtx.c | 124 ++++++++++++++++++++++++++------ 2 files changed, 112 insertions(+), 20 deletions(-) diff --git a/drivers/net/failsafe/failsafe_private.h b/drivers/net/failsafe/failsafe_private.h index f40ea2f..25a4dac 100644 --- a/drivers/net/failsafe/failsafe_private.h +++ b/drivers/net/failsafe/failsafe_private.h @@ -141,11 +141,18 @@ int failsafe_hotplug_alarm_cancel(struct rte_eth_dev *dev); /* RX / TX */ +void 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); @@ -299,6 +306,7 @@ fs_switch_dev(struct rte_eth_dev *dev) } else { return; } + set_burst_fn(dev, 0); rte_wmb(); } diff --git a/drivers/net/failsafe/failsafe_rxtx.c b/drivers/net/failsafe/failsafe_rxtx.c index a45b4e5..c15025f 100644 --- a/drivers/net/failsafe/failsafe_rxtx.c +++ b/drivers/net/failsafe/failsafe_rxtx.c @@ -31,16 +31,63 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include + #include #include #include "failsafe_private.h" -/* - * TODO: write fast version, - * without additional checks, to be activated once - * everything has been verified to comply. - */ +static inline int +fs_rx_unsafe(struct sub_device *sdev) +{ + return (ETH(sdev) == NULL) || + (ETH(sdev)->rx_pkt_burst == NULL) || + (sdev->state != DEV_STARTED); +} + +static inline int +fs_tx_unsafe(struct sub_device *sdev) +{ + return (sdev == NULL) || + (ETH(sdev) == NULL) || + (ETH(sdev)->tx_pkt_burst == NULL) || + (sdev->state != DEV_STARTED); +} + +void +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(); +} + uint16_t failsafe_rx_burst(void *queue, struct rte_mbuf **rx_pkts, @@ -63,11 +110,7 @@ failsafe_rx_burst(void *queue, if (i == priv->subs_tail) i = priv->subs_head; sdev = &priv->subs[i]; - if (unlikely(ETH(sdev) == NULL)) - continue; - if (unlikely(ETH(sdev)->rx_pkt_burst == NULL)) - continue; - if (unlikely(sdev->state != DEV_STARTED)) + if (unlikely(fs_rx_unsafe(sdev))) continue; sub_rxq = ETH(sdev)->data->rx_queues[rxq->qid]; nb_rx = ETH(sdev)-> @@ -80,11 +123,40 @@ failsafe_rx_burst(void *queue, return 0; } -/* - * TODO: write fast version, - * without additional checks, to be activated once - * everything has been verified to comply. - */ +uint16_t +failsafe_rx_burst_fast(void *queue, + struct rte_mbuf **rx_pkts, + uint16_t nb_pkts) +{ + struct fs_priv *priv; + struct sub_device *sdev; + struct rxq *rxq; + void *sub_rxq; + uint16_t nb_rx; + uint8_t nb_polled, nb_subs; + uint8_t i; + + rxq = queue; + priv = rxq->priv; + nb_subs = priv->subs_tail - priv->subs_head; + nb_polled = 0; + for (i = rxq->last_polled; nb_polled < nb_subs; nb_polled++) { + i++; + if (i == priv->subs_tail) + i = priv->subs_head; + sdev = &priv->subs[i]; + assert(!fs_rx_unsafe(sdev)); + sub_rxq = ETH(sdev)->data->rx_queues[rxq->qid]; + nb_rx = ETH(sdev)-> + rx_pkt_burst(sub_rxq, rx_pkts, nb_pkts); + if (nb_rx) { + rxq->last_polled = i; + return nb_rx; + } + } + return 0; +} + uint16_t failsafe_tx_burst(void *queue, struct rte_mbuf **tx_pkts, @@ -96,12 +168,24 @@ failsafe_tx_burst(void *queue, txq = queue; sdev = TX_SUBDEV(txq->priv->dev); - if (unlikely(sdev == NULL)) - return 0; - if (unlikely(ETH(sdev) == NULL)) - return 0; - if (unlikely(ETH(sdev)->tx_pkt_burst == NULL)) + if (unlikely(fs_tx_unsafe(sdev))) return 0; sub_txq = ETH(sdev)->data->tx_queues[txq->qid]; return ETH(sdev)->tx_pkt_burst(sub_txq, tx_pkts, nb_pkts); } + +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; + + txq = queue; + sdev = TX_SUBDEV(txq->priv->dev); + assert(!fs_tx_unsafe(sdev)); + sub_txq = ETH(sdev)->data->tx_queues[txq->qid]; + return ETH(sdev)->tx_pkt_burst(sub_txq, tx_pkts, nb_pkts); +}