From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 117F2A04B6; Thu, 17 Sep 2020 07:31:26 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 87B571D547; Thu, 17 Sep 2020 07:30:58 +0200 (CEST) Received: from mail-lj1-f182.google.com (mail-lj1-f182.google.com [209.85.208.182]) by dpdk.org (Postfix) with ESMTP id BB1D81D53C for ; Thu, 17 Sep 2020 07:30:54 +0200 (CEST) Received: by mail-lj1-f182.google.com with SMTP id u4so868599ljd.10 for ; Wed, 16 Sep 2020 22:30:54 -0700 (PDT) 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=jF21iGMl/L8zE5QFjjIM+typr5EYFILT5YadTokO7Hg=; b=QGTkkFVycIFB6FAkdfZ/Y2kyjT7RtdvmdjtFIMDLl7B20m4+7aBkGBFiSfgp1QO1ZY KyJ9/BGNkZrBbH9QUNOKMUKoIQ4Uhfyz1jUAX4EB+ol3fLom2fR+T9ICLrqvHhD38yIX E8whsnk81t+ksPmV+M7Uy2AxvzjfE0GplE/sSAF4pAeKy1FETTtqKgb+32giT6NSdbs/ 8Hde6CKHrYJYtSgrqANJSmutH/tY1z6rTs/j1KJDgwDks6r5YEtbs8mt84OSAXvfi9eD B9W1gNZPX3ZWOqsfJbln7zijgPVIsY8BxDeXby2jhvHZwCppJiZh8BTabnlKZZ78VK6P DJfg== 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=jF21iGMl/L8zE5QFjjIM+typr5EYFILT5YadTokO7Hg=; b=n162pbW6hMLfA4R+I/TyUx37d73XEr0Aq0Pv3aqhn5f7uBhOFqQXqhSq6k+/eGihcw 592nSujqR0eSk8HVnCNlSwSPNylktI37RqQZkOIcNqFbi4y2vvXjaFNlhdND8kCVfE4E 9/t5rLu3TgZotoM3fovQf7cbC/ZGSVqyHGN2X8pi6ZSUWOh05R7uiHm7P3XwsBeU1FC7 VvK8qjxOTVDpbNXqlP8JHqPzmC9yrf+xdvXvEEkkCASH9K0merj6qvvR6yZ5O38IwwS0 4ocmV1kCheAtUtBso5m73ThDK8WCpeC8Z75vejEcVFpBlhaTvL8ZVSYiIemuw9DZ0SPK ZcFQ== X-Gm-Message-State: AOAM533/zOM3OQjRHZgYstTzZo3WgFrUcisE6gmzzc9xKeCTCRXP5J8Q 3pchz3pxe8jjlBpWCa21xG264fyuqKEgUtZ0 X-Google-Smtp-Source: ABdhPJxDd+KOnaMSMzTw9LbyUTVAF81UFPCl5HBZUZitl762//GhQdo+ZvNrwihSTEEejLG+LnKOgg== X-Received: by 2002:a2e:9cd7:: with SMTP id g23mr8951233ljj.183.1600320654047; Wed, 16 Sep 2020 22:30:54 -0700 (PDT) Received: from mkPC.semihalf.local (193-106-246-138.noc.fibertech.net.pl. [193.106.246.138]) by smtp.gmail.com with ESMTPSA id j3sm5033686lfb.185.2020.09.16.22.30.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2020 22:30:52 -0700 (PDT) From: Michal Krawczyk To: dev@dpdk.org Cc: gtzalik@amazon.com, igorch@amazon.com, Michal Krawczyk , Marcin Wojtas , Evgeny Schemeilin Date: Thu, 17 Sep 2020 07:30:19 +0200 Message-Id: <20200917053035.1889989-5-mk@semihalf.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200917053035.1889989-1-mk@semihalf.com> References: <20200917053035.1889989-1-mk@semihalf.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH 04/20] net/ena/base: exponential delay in polling 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" Instead of the fixes, 5 ms delay in the polling functions, use values into given range (by default from 100 us 5000 us) and increase them exponentially each time, the operation isn't finished. This change can improve responsiveness of the driver for the fast operations. Signed-off-by: Michal Krawczyk Reviewed-by: Igor Chauskin Reviewed-by: Guy Tzalik --- drivers/net/ena/base/ena_com.c | 35 ++++++++++++++++++++-------- drivers/net/ena/base/ena_com.h | 3 +++ drivers/net/ena/base/ena_plat_dpdk.h | 1 + 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/drivers/net/ena/base/ena_com.c b/drivers/net/ena/base/ena_com.c index 0a6a92ebea..b4e54318c6 100644 --- a/drivers/net/ena/base/ena_com.c +++ b/drivers/net/ena/base/ena_com.c @@ -34,7 +34,9 @@ #define ENA_REGS_ADMIN_INTR_MASK 1 -#define ENA_POLL_MS 5 +#define ENA_MIN_ADMIN_POLL_US 100 + +#define ENA_MAX_ADMIN_POLL_US 5000 /*****************************************************************************/ /*****************************************************************************/ @@ -524,12 +526,20 @@ static int ena_com_comp_status_to_errno(u8 comp_status) return ENA_COM_INVAL; } +static void ena_delay_exponential_backoff_us(u32 exp, u32 delay_us) +{ + delay_us = ENA_MAX32(ENA_MIN_ADMIN_POLL_US, delay_us); + delay_us = ENA_MIN32(delay_us * (1U << exp), ENA_MAX_ADMIN_POLL_US); + ENA_USLEEP(delay_us); +} + static int ena_com_wait_and_process_admin_cq_polling(struct ena_comp_ctx *comp_ctx, struct ena_com_admin_queue *admin_queue) { unsigned long flags = 0; ena_time_t timeout; int ret; + u32 exp = 0; timeout = ENA_GET_SYSTEM_TIMEOUT(admin_queue->completion_timeout); @@ -553,7 +563,8 @@ static int ena_com_wait_and_process_admin_cq_polling(struct ena_comp_ctx *comp_c goto err; } - ENA_MSLEEP(ENA_POLL_MS); + ena_delay_exponential_backoff_us(exp++, + admin_queue->ena_dev->ena_min_poll_delay_us); } if (unlikely(comp_ctx->status == ENA_CMD_ABORTED)) { @@ -947,12 +958,13 @@ static void ena_com_io_queue_free(struct ena_com_dev *ena_dev, static int wait_for_reset_state(struct ena_com_dev *ena_dev, u32 timeout, u16 exp_state) { - u32 val, i; + u32 val, exp = 0; + ena_time_t timeout_stamp; - /* Convert timeout from resolution of 100ms to ENA_POLL_MS */ - timeout = (timeout * 100) / ENA_POLL_MS; + /* Convert timeout from resolution of 100ms to us resolution. */ + timeout_stamp = ENA_GET_SYSTEM_TIMEOUT(100 * 1000 * timeout); - for (i = 0; i < timeout; i++) { + while (1) { val = ena_com_reg_bar_read32(ena_dev, ENA_REGS_DEV_STS_OFF); if (unlikely(val == ENA_MMIO_READ_TIMEOUT)) { @@ -964,10 +976,11 @@ static int wait_for_reset_state(struct ena_com_dev *ena_dev, u32 timeout, exp_state) return 0; - ENA_MSLEEP(ENA_POLL_MS); - } + if (ENA_TIME_EXPIRE(timeout_stamp)) + return ENA_COM_TIMER_EXPIRED; - return ENA_COM_TIMER_EXPIRED; + ena_delay_exponential_backoff_us(exp++, ena_dev->ena_min_poll_delay_us); + } } static bool ena_com_check_supported_feature_id(struct ena_com_dev *ena_dev, @@ -1458,11 +1471,12 @@ void ena_com_wait_for_abort_completion(struct ena_com_dev *ena_dev) { struct ena_com_admin_queue *admin_queue = &ena_dev->admin_queue; unsigned long flags = 0; + u32 exp = 0; ENA_SPINLOCK_LOCK(admin_queue->q_lock, flags); while (ATOMIC32_READ(&admin_queue->outstanding_cmds) != 0) { ENA_SPINLOCK_UNLOCK(admin_queue->q_lock, flags); - ENA_MSLEEP(ENA_POLL_MS); + ena_delay_exponential_backoff_us(exp++, ena_dev->ena_min_poll_delay_us); ENA_SPINLOCK_LOCK(admin_queue->q_lock, flags); } ENA_SPINLOCK_UNLOCK(admin_queue->q_lock, flags); @@ -1827,6 +1841,7 @@ int ena_com_admin_init(struct ena_com_dev *ena_dev, if (ret) goto error; + admin_queue->ena_dev = ena_dev; admin_queue->running_state = true; return 0; diff --git a/drivers/net/ena/base/ena_com.h b/drivers/net/ena/base/ena_com.h index 61074eaf63..2acf6d8ae5 100644 --- a/drivers/net/ena/base/ena_com.h +++ b/drivers/net/ena/base/ena_com.h @@ -202,6 +202,7 @@ struct ena_com_stats_admin { struct ena_com_admin_queue { void *q_dmadev; void *bus; + struct ena_com_dev *ena_dev; ena_spinlock_t q_lock; /* spinlock for the admin queue */ struct ena_comp_ctx *comp_ctx; @@ -322,6 +323,8 @@ struct ena_com_dev { struct ena_intr_moder_entry *intr_moder_tbl; struct ena_com_llq_info llq_info; + + u32 ena_min_poll_delay_us; }; struct ena_com_dev_get_features_ctx { diff --git a/drivers/net/ena/base/ena_plat_dpdk.h b/drivers/net/ena/base/ena_plat_dpdk.h index d9b728c4d6..ae4fd8f868 100644 --- a/drivers/net/ena/base/ena_plat_dpdk.h +++ b/drivers/net/ena/base/ena_plat_dpdk.h @@ -57,6 +57,7 @@ typedef uint64_t dma_addr_t; #define ENA_ABORT() abort() #define ENA_MSLEEP(x) rte_delay_us_sleep(x * 1000) +#define ENA_USLEEP(x) rte_delay_us_sleep(x) #define ENA_UDELAY(x) rte_delay_us_block(x) #define ENA_TOUCH(x) ((void)(x)) -- 2.25.1