From patchwork Fri Jan 22 16:05:01 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michal Krawczyk X-Patchwork-Id: 87099 X-Patchwork-Delegate: ferruh.yigit@amd.com 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 C7AFCA0A0A; Fri, 22 Jan 2021 17:05:46 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id D7AD9141025; Fri, 22 Jan 2021 17:05:18 +0100 (CET) Received: from mail-lj1-f180.google.com (mail-lj1-f180.google.com [209.85.208.180]) by mails.dpdk.org (Postfix) with ESMTP id CA21B14101C for ; Fri, 22 Jan 2021 17:05:15 +0100 (CET) Received: by mail-lj1-f180.google.com with SMTP id f11so7070565ljm.8 for ; Fri, 22 Jan 2021 08:05:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=1qN6fNNWj09UtYtiff0PLCi5B5S6zrA6/F/OsStTVgg=; b=B2njhR0daxwmihIctmRHzKtOrmUUosdz2L5c64CCx/oPzq4q/vBHif+6ukqJFsMgpV FSqfcwKmfn1s9HhR4UFF5kiGdFKb+Itgqvduv2OAf4vj5gjaoILy5vMPnQ6mVO2xk74k FF/QzNjhQcvDi2bADzGzCZM4/FAiBlUm7gZrUycVfKqRjCof8SUY7fciIJVOZyDNW31r Buh6v6s3Ohr8DpYyC+QfvIlNI0PUaRFJYqPpXApPOOP+S9OU0TLlI3bTksfOgoGU4Zri pWbqp4unkftuAu9mpYZ9PM6EaOa1tf6h65dk494/fWwyn/3hPlzoJqijWJ3Q2GTi8SYp IMUw== 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:mime-version:content-transfer-encoding; bh=1qN6fNNWj09UtYtiff0PLCi5B5S6zrA6/F/OsStTVgg=; b=V2mEiPwEHZ/w3dRqSIhEHe/eRDqsO4lLyJy7Gdgbbi8vYLn1S04ML/eHofjpu0vIFJ O5paeFvnxu43uDbrWnW2pPulcTrilwovNhk0iIIS+6aDST18Djd0jRQmo0rx9e5DrvaL n9JYgGeN5BTl6v146NrZer5xZTVWbE9RfDX+R3t3VAE+eKuxTgK5riovalf0rWOAJGrQ KejprHddKH73metgQgx88/w1K0QDT48JzI2vKUPXDX8k0QA+a+jLhUU6h+PimQP+LKze TOtmbBc2s46dD1IwjlZmvgSjaxX1kaViXGYoVVG6OuiIGWHP6FQJhQy9aM5YNS5ervmQ BjjA== X-Gm-Message-State: AOAM530qpVQqlJjp2FpWn5ePRu/oGBIVoUhQ6BhlLvtS+F3qO/hrqfrE CaJdxAXe4CxbE8p5dt/4wyLL9M1x6apFkoIf X-Google-Smtp-Source: ABdhPJyZOty6DGOP7jz+xa+kpZESXaoySfuypx3Gf/eC68z9xXVu4Qdx8Wc1oDeHVZ5dVmX65d5EKw== X-Received: by 2002:a2e:b819:: with SMTP id u25mr2648145ljo.458.1611331515206; Fri, 22 Jan 2021 08:05:15 -0800 (PST) Received: from mkPC.int.semihalf.com (193-106-246-138.noc.fibertech.net.pl. [193.106.246.138]) by smtp.gmail.com with ESMTPSA id s2sm934063lfs.2.2021.01.22.08.05.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 Jan 2021 08:05:14 -0800 (PST) From: Michal Krawczyk To: dev@dpdk.org Cc: gtzalik@amazon.com, igorch@amazon.com, mw@semihalf.com, Michal Krawczyk Date: Fri, 22 Jan 2021 17:05:01 +0100 Message-Id: <20210122160501.2273782-5-mk@semihalf.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210122160501.2273782-1-mk@semihalf.com> References: <20210122160501.2273782-1-mk@semihalf.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH 4/4] net/ena: fix Tx sq free space assessment 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 Sender: "dev" From: Igor Chauskin Before starting transmission of Tx burst, the driver checked the available space in the sq and limited the number of packets for transmission accordingly. The calculation was incorrect for fragmented packets and potentially had significantly limited the length of Tx bursts. This patch removes the assessment and pushes packets to the sq as long as the burst is not exhausted and space is available in the sq. Correct evaluation of the required space isn't possible before the burst because it depends on the number of segments of each packet. This patch adds per-packet space evaluation for each packet before attempting to process it. In case there is not enough queue space, the burst will just stop without error. Signed-off-by: Igor Chauskin Reviewed-by: Michal Krawczyk --- drivers/net/ena/ena_ethdev.c | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c index 9ee9de6eb9..4083568d5d 100644 --- a/drivers/net/ena/ena_ethdev.c +++ b/drivers/net/ena/ena_ethdev.c @@ -2359,8 +2359,8 @@ static void ena_update_hints(struct ena_adapter *adapter, } } -static int ena_check_and_linearize_mbuf(struct ena_ring *tx_ring, - struct rte_mbuf *mbuf) +static int ena_check_space_and_linearize_mbuf(struct ena_ring *tx_ring, + struct rte_mbuf *mbuf) { struct ena_com_dev *ena_dev; int num_segments, header_len, rc; @@ -2370,13 +2370,21 @@ static int ena_check_and_linearize_mbuf(struct ena_ring *tx_ring, header_len = mbuf->data_len; if (likely(num_segments < tx_ring->sgl_size)) - return 0; + goto checkspace; if (ena_dev->tx_mem_queue_type == ENA_ADMIN_PLACEMENT_POLICY_DEV && (num_segments == tx_ring->sgl_size) && (header_len < tx_ring->tx_max_header_size)) - return 0; + goto checkspace; + /* Checking for space for 2 additional metadata descriptors due to + * possible header split and metadata descriptor. Linearization will + * be needed so we reduce the segments number from num_segments to 1 + */ + if (!ena_com_sq_have_enough_space(tx_ring->ena_com_io_sq, 3)) { + PMD_DRV_LOG(DEBUG, "Not enough space in the tx queue\n"); + return ENA_COM_NO_MEM; + } ++tx_ring->tx_stats.linearize; rc = rte_pktmbuf_linearize(mbuf); if (unlikely(rc)) { @@ -2386,7 +2394,19 @@ static int ena_check_and_linearize_mbuf(struct ena_ring *tx_ring, return rc; } - return rc; + return 0; + +checkspace: + /* Checking for space for 2 additional metadata descriptors due to + * possible header split and metadata descriptor + */ + if (!ena_com_sq_have_enough_space(tx_ring->ena_com_io_sq, + num_segments + 2)) { + PMD_DRV_LOG(DEBUG, "Not enough space in the tx queue\n"); + return ENA_COM_NO_MEM; + } + + return 0; } static void ena_tx_map_mbuf(struct ena_ring *tx_ring, @@ -2473,7 +2493,7 @@ static int ena_xmit_mbuf(struct ena_ring *tx_ring, struct rte_mbuf *mbuf) int nb_hw_desc; int rc; - rc = ena_check_and_linearize_mbuf(tx_ring, mbuf); + rc = ena_check_space_and_linearize_mbuf(tx_ring, mbuf); if (unlikely(rc)) return rc; @@ -2580,9 +2600,6 @@ static uint16_t eth_ena_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, return 0; } - nb_pkts = RTE_MIN(ena_com_free_q_entries(tx_ring->ena_com_io_sq), - nb_pkts); - for (sent_idx = 0; sent_idx < nb_pkts; sent_idx++) { if (ena_xmit_mbuf(tx_ring, tx_pkts[sent_idx])) break;