Received: by 2002:a05:6a10:5bc5:0:0:0:0 with SMTP id os5csp491130pxb; Wed, 3 Nov 2021 07:33:08 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy3mhrNDns1qXg7w252xRWbLQYSbbASaC2SYHbr9QGjJlvm2hvGvda1jAR87GYvYHeOCgqI X-Received: by 2002:a92:c569:: with SMTP id b9mr14640288ilj.39.1635949987875; Wed, 03 Nov 2021 07:33:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1635949987; cv=none; d=google.com; s=arc-20160816; b=c2L5IswFiKX3FxlmwlJz1h4BJ0JCsZESfn2ytMopp5q6abkQX+n/1o5rc24xW3tt1c KQ1Cx1rOBx7uuFn/TuAjX3UpGR1HUgc2Cvlk6WjuVFwHGb5qyF0GfKGuGHfrqIHzcz68 EEBObDnL2yGHj6rVO8Z5jT6kEPAzsEfDVpCKMB9MZrVw7EUr00BetTRRzjT3NuW/luUi EkqgYBl3+4B4aWPIhMNkxGrqAX1/7e2/K8V1CMGb67UNw1dUQhxbpVBheEvTT3Vsc7+V mkHzqyp3R2TtLKqnsEtDSKf19vbLFMIysa5XneEV1AKVPp4A4nbyF/N7au3qayz+zKEd bkxw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :organization:references:in-reply-to:message-id:subject:cc:to:from :date; bh=rs2Scz2aWqKr7ci9qoiVzNoJfOIC49ccd7ojrTBRVFM=; b=oB1vk83TpDX35O2cKCtFV1hmxSTQvPp0pq6Lx1Ejr0/fzGx1Zgsql4R76ivQORWXZ+ BZnAbQPHe/aWAXvNbrknG1YScSGS1zzvJfhRan8vsfUAn9MRkFIfmP3eRPY4EwlgD95u 77EOdeFkcvGKPXQK+rUGpUaFKhnxxU/6kdO4fF6fFQJZ4BvLRHxXf/3NA+LEe1dHmda3 EFHpvxpN0VeNW/uXBM/AZPjWLKbPjt7u+XF975/YT+eW63+co3yk+o4eS+DK6VRNz3/f BsweyLsELDxpK8KM96UgS9YzNglr3bbyNXz3QtJqf4iVzlS6DWxbbAQHxwYzq7TCNi1X tU3A== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id c4si4637103iow.33.2021.11.03.07.32.55; Wed, 03 Nov 2021 07:33:07 -0700 (PDT) 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; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231386AbhKCOc4 convert rfc822-to-8bit (ORCPT + 99 others); Wed, 3 Nov 2021 10:32:56 -0400 Received: from relay8-d.mail.gandi.net ([217.70.183.201]:44921 "EHLO relay8-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232126AbhKCOct (ORCPT ); Wed, 3 Nov 2021 10:32:49 -0400 Received: (Authenticated sender: clement.leger@bootlin.com) by relay8-d.mail.gandi.net (Postfix) with ESMTPSA id 77CEB1BF210; Wed, 3 Nov 2021 14:30:08 +0000 (UTC) Date: Wed, 3 Nov 2021 15:30:07 +0100 From: =?UTF-8?B?Q2zDqW1lbnQgTMOpZ2Vy?= To: Vladimir Oltean Cc: "David S. Miller" , Jakub Kicinski , Rob Herring , Claudiu Manoil , Alexandre Belloni , "UNGLinuxDriver@microchip.com" , Andrew Lunn , "netdev@vger.kernel.org" , "devicetree@vger.kernel.org" , "linux-kernel@vger.kernel.org" , Thomas Petazzoni Subject: Re: [PATCH v2 6/6] net: ocelot: add jumbo frame support for FDMA Message-ID: <20211103153007.405509c0@fixe.home> In-Reply-To: <20211103124319.e7th7khpsybs7zjd@skbuf> References: <20211103091943.3878621-1-clement.leger@bootlin.com> <20211103091943.3878621-7-clement.leger@bootlin.com> <20211103124319.e7th7khpsybs7zjd@skbuf> Organization: Bootlin X-Mailer: Claws Mail 3.18.0 (GTK+ 2.24.33; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Le Wed, 3 Nov 2021 12:43:20 +0000, Vladimir Oltean a écrit : > On Wed, Nov 03, 2021 at 10:19:43AM +0100, Clément Léger wrote: > > When using the FDMA, using jumbo frames can lead to a large performance > > improvement. When changing the MTU, the RX buffer size must be > > increased to be large enough to receive jumbo frame. Since the FDMA is > > shared amongst all interfaces, all the ports must be down before > > changing the MTU. Buffers are sized to accept the maximum MTU supported > > by each port. > > > > Signed-off-by: Clément Léger > > --- > > Instead of draining buffers and refilling with a different size, which > impacts the user experience, can you not just use scatter/gather RX > processing for frames larger than the fixed buffer size, like a normal > driver would? I could do that yes but I'm not sure it will improve the FDMA performance that much then. I will check. > > > drivers/net/ethernet/mscc/ocelot_fdma.c | 61 +++++++++++++++++++++++++ > > drivers/net/ethernet/mscc/ocelot_fdma.h | 1 + > > drivers/net/ethernet/mscc/ocelot_net.c | 7 +++ > > 3 files changed, 69 insertions(+) > > > > diff --git a/drivers/net/ethernet/mscc/ocelot_fdma.c b/drivers/net/ethernet/mscc/ocelot_fdma.c > > index d8cdf022bbee..bee1a310caa6 100644 > > --- a/drivers/net/ethernet/mscc/ocelot_fdma.c > > +++ b/drivers/net/ethernet/mscc/ocelot_fdma.c > > @@ -530,6 +530,67 @@ static void fdma_free_skbs_list(struct ocelot_fdma *fdma, > > } > > } > > > > +int ocelot_fdma_change_mtu(struct net_device *dev, int new_mtu) > > +{ > > + struct ocelot_port_private *priv = netdev_priv(dev); > > + struct ocelot_port *port = &priv->port; > > + struct ocelot *ocelot = port->ocelot; > > + struct ocelot_fdma *fdma = ocelot->fdma; > > + struct ocelot_fdma_dcb *dcb, *dcb_temp; > > + struct list_head tmp = LIST_HEAD_INIT(tmp); > > + size_t old_rx_buf_size = fdma->rx_buf_size; > > + bool all_ports_down = true; > > + u8 port_num; > > + > > + /* The FDMA RX list is shared amongst all the port, get the max MTU from > > + * all of them > > + */ > > + for (port_num = 0; port_num < ocelot->num_phys_ports; port_num++) { > > + port = ocelot->ports[port_num]; > > + if (!port) > > + continue; > > + > > + priv = container_of(port, struct ocelot_port_private, port); > > + > > + if (READ_ONCE(priv->dev->mtu) > new_mtu) > > + new_mtu = READ_ONCE(priv->dev->mtu); > > + > > + /* All ports must be down to change the RX buffer length */ > > + if (netif_running(priv->dev)) > > + all_ports_down = false; > > + } > > + > > + fdma->rx_buf_size = fdma_rx_compute_buffer_size(new_mtu); > > + if (fdma->rx_buf_size == old_rx_buf_size) > > + return 0; > > + > > + if (!all_ports_down) > > + return -EBUSY; > > + > > + priv = netdev_priv(dev); > > + > > + fdma_stop_channel(fdma, MSCC_FDMA_INJ_CHAN); > > + > > + /* Discard all pending RX software and hardware descriptor */ > > + fdma_free_skbs_list(fdma, &fdma->rx_hw, DMA_FROM_DEVICE); > > + fdma_free_skbs_list(fdma, &fdma->rx_sw, DMA_FROM_DEVICE); > > + > > + /* Move all DCBs to a temporary list that will be injected in sw list */ > > + if (!list_empty(&fdma->rx_hw)) > > + list_splice_tail_init(&fdma->rx_hw, &tmp); > > + if (!list_empty(&fdma->rx_sw)) > > + list_splice_tail_init(&fdma->rx_sw, &tmp); > > + > > + list_for_each_entry_safe(dcb, dcb_temp, &tmp, node) { > > + list_del(&dcb->node); > > + ocelot_fdma_rx_add_dcb_sw(fdma, dcb); > > + } > > + > > + ocelot_fdma_rx_refill(fdma); > > + > > + return 0; > > +} > > + > > static int fdma_init_tx(struct ocelot_fdma *fdma) > > { > > int i; > > diff --git a/drivers/net/ethernet/mscc/ocelot_fdma.h b/drivers/net/ethernet/mscc/ocelot_fdma.h > > index 6c5c5872abf5..74514a0b291a 100644 > > --- a/drivers/net/ethernet/mscc/ocelot_fdma.h > > +++ b/drivers/net/ethernet/mscc/ocelot_fdma.h > > @@ -55,5 +55,6 @@ int ocelot_fdma_start(struct ocelot_fdma *fdma); > > int ocelot_fdma_stop(struct ocelot_fdma *fdma); > > int ocelot_fdma_inject_frame(struct ocelot_fdma *fdma, int port, u32 rew_op, > > struct sk_buff *skb, struct net_device *dev); > > +int ocelot_fdma_change_mtu(struct net_device *dev, int new_mtu); > > > > #endif > > diff --git a/drivers/net/ethernet/mscc/ocelot_net.c b/drivers/net/ethernet/mscc/ocelot_net.c > > index 3971b810c5b4..d5e88d7b15c7 100644 > > --- a/drivers/net/ethernet/mscc/ocelot_net.c > > +++ b/drivers/net/ethernet/mscc/ocelot_net.c > > @@ -492,6 +492,13 @@ static int ocelot_change_mtu(struct net_device *dev, int new_mtu) > > struct ocelot_port_private *priv = netdev_priv(dev); > > struct ocelot_port *ocelot_port = &priv->port; > > struct ocelot *ocelot = ocelot_port->ocelot; > > + int ret; > > + > > + if (ocelot->fdma) { > > + ret = ocelot_fdma_change_mtu(dev, new_mtu); > > + if (ret) > > + return ret; > > + } > > > > ocelot_port_set_maxlen(ocelot, priv->chip_port, new_mtu); > > WRITE_ONCE(dev->mtu, new_mtu); > > -- > > 2.33.0 > -- Clément Léger, Embedded Linux and Kernel engineer at Bootlin https://bootlin.com