Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp473490pxu; Fri, 11 Dec 2020 06:49:04 -0800 (PST) X-Google-Smtp-Source: ABdhPJyMPRwsC2RzGQCBhHl8m3zUWRwPjEhSuWKhr0HU6MyS2ndSyle50kmA0adi0A7rmhvLMD6d X-Received: by 2002:a17:906:128d:: with SMTP id k13mr11110715ejb.309.1607698144692; Fri, 11 Dec 2020 06:49:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1607698144; cv=none; d=google.com; s=arc-20160816; b=NeputqA9aaFWZobctTbGbIbpg9UFMOvX62OA0aHMrK2eNw/l93mpmpoyi1tsPtkzfo SCSn7tUV2qzWNrK+C1v8vJsjTD5ykMRIJOdMCQ9zSO9b5wy9HCm6mxpRfyLheClkv3qB BX1L5RHwGeTFHzdF1xjuZHBpTTk60JJNm44415x6FqifePGQILEIbtriVOZwqqcSniDj fNLWpIVh1kl7xV3XlcCMm8a9pvdhWi5D8xSf9GXswrzq8LYryogaDuuKelQj4ZvsYD2V GCiW/YDJAFjx6ptcN58pPhG3hEJLCP+/JJpVEqrp8sA2IeiCYZcuNZlJdcCJNLxcXtGI L3tg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:message-id:date:subject:cc:to:from :dkim-signature; bh=pty5GK5U+KCQW5qWF1bqAji+naz9G7gouMnlOutEGqc=; b=UwYgmp3+VIlFSsM/j5fXenQBOrSyMKLJLCwXL6/4L7I950AaiBwOUKR6oSKgk9dsks QQhssQwmVYkHdTItlb6mhA0Hyo38698LtN+7VUU5Sz59NmV6UkpCqcWRM21qKo9SMX89 YPEptIjCLt5cEwOWRXaEEbQ7LzRPVAmnKmMXWKuv6xl4VRfoc3YkKMFuheCNUWS6TsU3 LuIp8UTyEEp11OCOPNcXYZIAqhGXLowDVXT8ahSdaKJVOIszdmv1EUHbxn0N1c19ZtQN 5UsB7W2OXPHYb+VphJ2Z8n7OVJoIHWPAB8wJxayCtTH7rPqQ0aKscdpTAKaXQl9Z3Iwl bxsQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b="sDOJFvA/"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id bd3si4751423edb.589.2020.12.11.06.48.41; Fri, 11 Dec 2020 06:49:04 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b="sDOJFvA/"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2406204AbgLKOjF (ORCPT + 99 others); Fri, 11 Dec 2020 09:39:05 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46036 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2406306AbgLKOin (ORCPT ); Fri, 11 Dec 2020 09:38:43 -0500 Received: from mail-qk1-x744.google.com (mail-qk1-x744.google.com [IPv6:2607:f8b0:4864:20::744]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 28EC2C0613CF; Fri, 11 Dec 2020 06:38:03 -0800 (PST) Received: by mail-qk1-x744.google.com with SMTP id q22so8551380qkq.6; Fri, 11 Dec 2020 06:38:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=pty5GK5U+KCQW5qWF1bqAji+naz9G7gouMnlOutEGqc=; b=sDOJFvA/WmK+MbnkzzP0XS8DJkI9Mvl034fGf9AGW6WnqDA/HJG1/Up4MqoMbK2EtL wcAQwA0/SzwHtPrtiidl7UEqiH8+DAfnAFlkeWMYFdT4abn54iBsjEg1/JXlwkPT15Bj VWVRfPM/FxUlR6cZ0kjYjLaGtZGICCQNPkpt0i/YxnWIRAdzXG0erAg3FzAAjDqrXMqg 4bGQN5DwOh8vmlcJ4xdtDtVIYjBhYj4xvHCvmUntlKpLorUlwkjxfWNgXua+i4yz8Z5B AX2girf2RL8CtSzIsn+bdmpCeZ/zrMc+UhlhHlEGRMUdC5BG8n8kfDMppS8CTHaoqcZh eE+Q== 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; bh=pty5GK5U+KCQW5qWF1bqAji+naz9G7gouMnlOutEGqc=; b=FEnj/7P1s60vBlpUAzOUMmZqYL+EIglS3zRgmrT3CVEzSnFZVO+j5DclRheNKKhXf7 GMExiMhmVswEhn6qNb1a03S7DSJmy1xXZR8jJo9okj5G11CrQWZTxBkvWXZyxDHr3hPT cknSGpbUWZ4KezjyKX9u4Mf4zR03ACay+p1dqBnheWj7uHzorKmCe7ul5LBXidTnYnWk i6WmPSRuEBzecpnm9spyOHWfuLd7SODKJTPfGjaXXtrvJgxXmjOD3B5GvOhcjMYbwqsQ EFqSGB8ShxsB6siya+ZVO22AS+q+kP0NnKFuqBaMjOopMfjl9f9foQji9Yx9yJgvoDSu YOXQ== X-Gm-Message-State: AOAM531TLfO3V7TukClrVxDd8R4EWOrhF1NuG1ktjUlvGaHMDK9FfKSZ RP5sn2yr6U00CHdePgR014U= X-Received: by 2002:a37:b82:: with SMTP id 124mr1600660qkl.294.1607697481942; Fri, 11 Dec 2020 06:38:01 -0800 (PST) Received: from localhost.localdomain ([198.52.185.246]) by smtp.gmail.com with ESMTPSA id 8sm7372007qkr.28.2020.12.11.06.38.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Dec 2020 06:38:01 -0800 (PST) From: Sven Van Asbroeck X-Google-Original-From: Sven Van Asbroeck To: Bryan Whitehead , Microchip Linux Driver Support , David S Miller , Jakub Kicinski Cc: Sven Van Asbroeck , Andrew Lunn , Eric Dumazet , Heiner Kallweit , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH net v3] lan743x: fix rx_napi_poll/interrupt ping-pong Date: Fri, 11 Dec 2020 09:37:58 -0500 Message-Id: <20201211143758.28528-1-TheSven73@gmail.com> X-Mailer: git-send-email 2.17.1 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Sven Van Asbroeck Even if there is more rx data waiting on the chip, the rx napi poll fn will never run more than once - it will always read a few buffers, then bail out and re-arm interrupts. Which results in ping-pong between napi and interrupt. This defeats the purpose of napi, and is bad for performance. Fix by making the rx napi poll behave identically to other ethernet drivers: 1. initialize rx napi polling with an arbitrary budget (64). 2. in the polling fn, return full weight if rx queue is not depleted, this tells the napi core to "keep polling". 3. update the rx tail ("ring the doorbell") once for every 8 processed rx ring buffers. Thanks to Jakub Kicinski, Eric Dumazet and Andrew Lunn for their expert opinions and suggestions. Tested with 20 seconds of full bandwidth receive (iperf3): rx irqs softirqs(NET_RX) ----------------------------- before 23827 33620 after 129 4081 Tested-by: Sven Van Asbroeck # lan7430 Fixes: 23f0703c125be ("lan743x: Add main source files for new lan743x driver") Signed-off-by: Sven Van Asbroeck --- v2 -> v3: - use NAPI_POLL_WEIGHT (Heiner Kallweit) v1 -> v2: - make napi rx polling behave identically to existing ethernet drivers (Jacub Kicinski, Eric Dumazet, Andrew Lunn) Tree: git://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git # b7e4ba9a91df To: Bryan Whitehead To: Microchip Linux Driver Support To: "David S. Miller" To: Jakub Kicinski Cc: Andrew Lunn Cc: Eric Dumazet Cc: Heiner Kallweit Cc: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org drivers/net/ethernet/microchip/lan743x_main.c | 44 ++++++++++--------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c index 87b6c59a1e03..30ec308b9a4c 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.c +++ b/drivers/net/ethernet/microchip/lan743x_main.c @@ -1964,6 +1964,14 @@ static struct sk_buff *lan743x_rx_allocate_skb(struct lan743x_rx *rx) length, GFP_ATOMIC | GFP_DMA); } +static void lan743x_rx_update_tail(struct lan743x_rx *rx, int index) +{ + /* update the tail once per 8 descriptors */ + if ((index & 7) == 7) + lan743x_csr_write(rx->adapter, RX_TAIL(rx->channel_number), + index); +} + static int lan743x_rx_init_ring_element(struct lan743x_rx *rx, int index, struct sk_buff *skb) { @@ -1994,6 +2002,7 @@ static int lan743x_rx_init_ring_element(struct lan743x_rx *rx, int index, descriptor->data0 = (RX_DESC_DATA0_OWN_ | (length & RX_DESC_DATA0_BUF_LENGTH_MASK_)); skb_reserve(buffer_info->skb, RX_HEAD_PADDING); + lan743x_rx_update_tail(rx, index); return 0; } @@ -2012,6 +2021,7 @@ static void lan743x_rx_reuse_ring_element(struct lan743x_rx *rx, int index) descriptor->data0 = (RX_DESC_DATA0_OWN_ | ((buffer_info->buffer_length) & RX_DESC_DATA0_BUF_LENGTH_MASK_)); + lan743x_rx_update_tail(rx, index); } static void lan743x_rx_release_ring_element(struct lan743x_rx *rx, int index) @@ -2223,34 +2233,26 @@ static int lan743x_rx_napi_poll(struct napi_struct *napi, int weight) struct lan743x_rx *rx = container_of(napi, struct lan743x_rx, napi); struct lan743x_adapter *adapter = rx->adapter; u32 rx_tail_flags = 0; - int count; + int count, result; if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_W2C) { /* clear int status bit before reading packet */ lan743x_csr_write(adapter, DMAC_INT_STS, DMAC_INT_BIT_RXFRM_(rx->channel_number)); } - count = 0; - while (count < weight) { - int rx_process_result = lan743x_rx_process_packet(rx); - - if (rx_process_result == RX_PROCESS_RESULT_PACKET_RECEIVED) { - count++; - } else if (rx_process_result == - RX_PROCESS_RESULT_NOTHING_TO_DO) { + for (count = 0; count < weight; count++) { + result = lan743x_rx_process_packet(rx); + if (result == RX_PROCESS_RESULT_NOTHING_TO_DO) break; - } else if (rx_process_result == - RX_PROCESS_RESULT_PACKET_DROPPED) { - continue; - } } rx->frame_count += count; - if (count == weight) - goto done; + if (count == weight || result == RX_PROCESS_RESULT_PACKET_RECEIVED) + return weight; if (!napi_complete_done(napi, count)) - goto done; + return count; + /* re-arm interrupts, must write to rx tail on some chip variants */ if (rx->vector_flags & LAN743X_VECTOR_FLAG_VECTOR_ENABLE_AUTO_SET) rx_tail_flags |= RX_TAIL_SET_TOP_INT_VEC_EN_; if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_SET) { @@ -2260,10 +2262,10 @@ static int lan743x_rx_napi_poll(struct napi_struct *napi, int weight) INT_BIT_DMA_RX_(rx->channel_number)); } - /* update RX_TAIL */ - lan743x_csr_write(adapter, RX_TAIL(rx->channel_number), - rx_tail_flags | rx->last_tail); -done: + if (rx_tail_flags) + lan743x_csr_write(adapter, RX_TAIL(rx->channel_number), + rx_tail_flags | rx->last_tail); + return count; } @@ -2407,7 +2409,7 @@ static int lan743x_rx_open(struct lan743x_rx *rx) netif_napi_add(adapter->netdev, &rx->napi, lan743x_rx_napi_poll, - rx->ring_size - 1); + NAPI_POLL_WEIGHT); lan743x_csr_write(adapter, DMAC_CMD, DMAC_CMD_RX_SWR_(rx->channel_number)); -- 2.17.1