U-Boot Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Tom Rini <trini@konsulko.com>
To: Jerome Forissier <jerome.forissier@linaro.org>
Cc: u-boot@lists.denx.de,
	Ilias Apalodimas <ilias.apalodimas@linaro.org>,
	Javier Tia <javier.tia@linaro.org>,
	Raymond Mao <raymond.mao@linaro.org>,
	Maxim Uvarov <muvarov@gmail.com>,
	Tim Harvey <tharvey@gateworks.com>
Subject: Re: [PATCH v8 00/23] Introduce the lwIP network stack
Date: Mon, 19 Aug 2024 16:08:44 -0600	[thread overview]
Message-ID: <20240819220844.GI1626301@bill-the-cat> (raw)
In-Reply-To: <7bf0ed1a-96f8-4970-a06d-7a572774b263@linaro.org>

[-- Attachment #1: Type: text/plain, Size: 6173 bytes --]

On Mon, Aug 19, 2024 at 04:53:51PM +0200, Jerome Forissier wrote:
> 
> 
> On 8/16/24 20:40, Tom Rini wrote:
> > On Fri, Aug 16, 2024 at 06:21:24PM +0200, Jerome Forissier wrote:
> >>
> >>
> >> On 8/7/24 22:44, Tom Rini wrote:
> >>> On Wed, Aug 07, 2024 at 07:11:44PM +0200, Jerome Forissier wrote:
> >>>
> >>>> This is a rework of a patch series by Maxim Uvarov: "net/lwip: add lwip
> >>>> library for the network stack" [1]. The goal is to introduce the lwIP TCP/IP
> >>>> stack [2] [3] as an alternative to the current implementation in net/,
> >>>> selectable with Kconfig, and ultimately keep only lwIP if possible. Some
> >>>> reasons for doing so are:
> >>>> - Make the support of HTTPS in the wget command easier. Javier T. and
> >>>> Raymond M. (CC'd) have some additional lwIP and Mbed TLS patches to do
> >>>> so. With that it becomes possible to fetch and launch a distro installer
> >>>> such as Debian etc. using a secure, authenticated connection directly
> >>>> from the U-Boot shell. Several use cases:
> >>>>   * Authentication: prevent MITM attack (third party replacing the
> >>>> binary with a different one)
> >>>>   * Confidentiality: prevent third parties from grabbing a copy of the
> >>>> image as it is being downloaded
> >>>>   * Allow connection to servers that do not support plain HTTP anymore
> >>>> (this is becoming more and more common on the Internet these days)
> >>>> - Possibly benefit from additional features implemented in lwIP
> >>>> - Less code to maintain in U-Boot
> >>>>
> >>>> Prior to applying this series, the lwIP stack needs to be added as a
> >>>> Git subtree with the following command:
> >>>>
> >>>>  $  git subtree add --squash --prefix lib/lwip/lwip https://git.savannah.gnu.org/git/lwip.git STABLE-2_2_0_RELEASE
> >>>
> >>> For v9, I think it would be good to do a CI run with NET_LWIP default
> >>> and seeing what fails from that too. There's a few problems still
> >>> leading to a lot of failures, in that case. Thanks.
> >>>
> >>
> >> See here: https://github.com/u-boot/u-boot/pull/635
> >>
> >> I fixed a number of issues, see the commit descriptions. As for the
> >> remaining ones:
> >> - There is no http server in the CI so the wget test I added fails
> > 
> > Ah yes. So the test needs some enable-me type flag, like other tests
> > that require external configuration.
> 
> Can you please suggest how to do that?

Well test/py/tests/test_net_boot.py for example.

> >> - tftp is super slow in QEMU (~145 KiB/s) which causes timeouts. This is
> >> for two reasons: (1) the tftp windowsize option is not supported in lwIP
> >> (while the legacy NET does support it) so the sender waits for an ACK
> >> before sending a new packet; and (2) the latency is very high due to
> >> memcpy() being incredibly slow in QEMU (I am mainly referring to the
> >> memcpy() call in tftp_write() in net/lwip/tftp.c). I measured ~20-60 ms
> >> to copy a few hundred bytes (!) and if CONFIG_USE_ARCH_MEMCPY is enabled
> >> it is slightly better but not much (~15 ms). Also it seems the QEMU
> >> networking emulation is fragmenting the UDP packets because with
> >> CONFIG_TFTP_BLOCKSIZE=1468 the tftp_write() function never receives
> >> 1468 bytes but only a few hundreds at a time (max 544 bytes).
> > 
> > I thought you fixed that? Or was that only for on real hardware?
> 
> It works OK on real hardware...

It should be fast enough here too.

> > But also, some of those numbers sound unusually terrible to me. We can
> > get some bad luck with the free instances, but, still.  Are you sure
> > there's nothing else going on?
> 
> ...and yes that's absolutely terrible. In fact I found something curious.
> With the following patch applied to provide a memcpy() speed test:
> 
> diff --git a/cmd/test.c b/cmd/test.c
> index b4c3eabf9f6..35b8d62af61 100644
> --- a/cmd/test.c
> +++ b/cmd/test.c
> @@ -7,6 +7,8 @@
>  #include <command.h>
>  #include <fs.h>
>  #include <log.h>
> +#include <stdlib.h>
> +#include <time.h>
>  #include <vsprintf.h>
>  
>  #define OP_INVALID	0
> @@ -215,3 +217,49 @@ U_BOOT_CMD(
>  	"do nothing, successfully",
>  	NULL
>  );
> +
> +static int do_mtest(struct cmd_tbl *cmdtp, int flag, int argc,
> +		    char *const argv[])
> +{
> +	ulong t0, delta;
> +	void *src, *dst;
> +	long sz;
> +
> +	if (argc < 2) {
> +		printf("Usage: %s <size_in_bytes> [dst [src]]\n", argv[0]);
> +		return 1;
> +	}
> +	sz = simple_strtol(argv[1], NULL, 10);
> +	if (sz < 0) {
> +		printf("%s: %s: invalid argument\n", argv[0], argv[1]);
> +		return 1;
> +	}
> +	if (argc > 2) {
> +		dst = (void *)hextoul(argv[2], NULL);
> +		if (argc > 3) {
> +			src = (void *)hextoul(argv[3], NULL);
> +		} else {
> +			src = malloc(sz);
> +		}
> +	} else {
> +		dst = malloc(sz);
> +		src = malloc(sz);
> +	}
> +	if (!src || !dst) {
> +		printf("%s: out of memory or NULL address\n", argv[0]);
> +		return 1;
> +	}
> +	printf("%ld bytes from 0x%p to 0x%p: ", sz, src, dst);
> +	t0 = get_timer(0);
> +	memcpy(dst, src, sz);
> +	delta = get_timer(t0);
> +	printf("%ld ms\n", delta);
> +
> +	return 0;
> +}
> +
> +U_BOOT_CMD(
> +	mtest,	CONFIG_SYS_MAXARGS,	0,	do_mtest,
> +	"memcpy() speed test",
> +	NULL
> +);
> 
> I can see that there are ranges of memory that are very slow to *write*
> to (and the loadaddr used by the tftp test happens to fall in that
> range):
> 
> $ make qemu_arm64_defconfig
> $ make -j$(nproc) CROSS_COMPILE="ccache aarch64-linux-gnu-"
> $ qemu-system-aarch64 -M virt -nographic -cpu cortex-a57 -bios u-boot.bin
> 
> U-Boot 2024.10-rc1-00195-g35ce7016c9cb-dirty (Aug 19 2024 - 16:42:15 +0200)
> [...]
> => mtest
> Usage: mtest <size_in_bytes> [dst [src]]
> => mtest 1000
> 1000 bytes from 0x00000000466baed0 to 0x00000000466baae0: 0 ms
> => mtest 1000 0x2000000 0x00000000466baed0
> 1000 bytes from 0x00000000466baed0 to 0x0000000002000000: 22 ms
> => mtest 1000 0x00000000466baed0 0x2000000
> 1000 bytes from 0x0000000002000000 to 0x00000000466baed0: 0 ms
> => 

This is all very strange. Can you investigate a bit please?

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

  reply	other threads:[~2024-08-19 22:08 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-08-07 17:11 [PATCH v8 00/23] Introduce the lwIP network stack Jerome Forissier
2024-08-07 17:11 ` [PATCH v8 01/23] flash: prefix error codes with FL_ Jerome Forissier
2024-08-07 17:11 ` [PATCH v8 02/23] net: wget: removed unused function wget_success() Jerome Forissier
2024-08-09 10:50   ` Ilias Apalodimas
2024-08-07 17:11 ` [PATCH v8 03/23] net: wget: allow EFI boot Jerome Forissier
2024-08-09 10:53   ` Ilias Apalodimas
2024-08-09 12:38     ` Jerome Forissier
2024-08-07 17:11 ` [PATCH v8 04/23] net: introduce alternative implementation as net-lwip/ Jerome Forissier
2024-08-07 17:11 ` [PATCH v8 05/23] configs: replace '# CONFIG_NET is not set' with CONFIG_NO_NET=y Jerome Forissier
2024-08-07 17:11 ` [PATCH v8 06/23] net: fec_mxc_init(): do not ignore return status of fec_open() Jerome Forissier
2024-08-07 18:05   ` Fabio Estevam
2024-08-08 13:01     ` Jerome Forissier
2024-08-07 17:11 ` [PATCH v8 07/23] net: split include/net.h into net{, -common, -legacy, -lwip}.h Jerome Forissier
2024-08-07 17:11 ` [PATCH v8 08/23] net: eth-uclass: add function eth_start_udev() Jerome Forissier
2024-08-07 17:11 ` [PATCH v8 09/23] net-lwip: build lwIP Jerome Forissier
2024-08-07 17:11 ` [PATCH v8 10/23] net-lwip: add DHCP support and dhcp commmand Jerome Forissier
2024-08-07 17:11 ` [PATCH v8 11/23] net-lwip: add TFTP support and tftpboot command Jerome Forissier
2024-08-07 17:11 ` [PATCH v8 12/23] net-lwip: add ping command Jerome Forissier
2024-08-07 17:11 ` [PATCH v8 13/23] net-lwip: add dns command Jerome Forissier
2024-08-07 17:11 ` [PATCH v8 14/23] net: split cmd/net.c into cmd/net.c and cmd/net-common.c Jerome Forissier
2024-08-07 17:11 ` [PATCH v8 15/23] net-lwip: add wget command Jerome Forissier
2024-08-07 17:12 ` [PATCH v8 16/23] net-lwip: lwIP wget supports user defined port in the uri, so allow it Jerome Forissier
2024-08-07 17:12 ` [PATCH v8 17/23] cmd: bdinfo: enable -e when CONFIG_CMD_NET_LWIP=y Jerome Forissier
2024-08-07 17:12 ` [PATCH v8 18/23] configs: add qemu_arm64_lwip_defconfig Jerome Forissier
2024-08-07 17:12 ` [PATCH v8 19/23] lwip: tftp: add support of blksize option to client Jerome Forissier
2024-08-07 17:12 ` [PATCH v8 20/23] net-lwip: add TFTP_BLOCKSIZE Jerome Forissier
2024-08-07 17:12 ` [PATCH v8 21/23] CI: add qemu_arm64_lwip to the test matrix Jerome Forissier
2024-08-07 17:12 ` [PATCH v8 22/23] test/py: add HTTP (wget) test for the EFI loader Jerome Forissier
2024-08-07 17:52   ` Tom Rini
2024-08-08 13:15     ` Jerome Forissier
2024-08-07 17:57   ` Tom Rini
2024-08-08 13:06     ` Jerome Forissier
2024-08-08 15:52       ` Tom Rini
2024-08-08 16:10         ` Jerome Forissier
2024-08-08 16:20       ` Tom Rini
2024-08-08 16:30         ` Jerome Forissier
2024-08-07 17:12 ` [PATCH v8 23/23] MAINTAINERS: net-lwip: add myself as a maintainer Jerome Forissier
2024-08-07 20:44 ` [PATCH v8 00/23] Introduce the lwIP network stack Tom Rini
2024-08-08 16:41   ` Jerome Forissier
2024-08-08 17:24     ` Tom Rini
2024-08-09 13:19       ` Jerome Forissier
2024-08-09 19:46         ` Tom Rini
2024-08-16 16:21   ` Jerome Forissier
2024-08-16 18:40     ` Tom Rini
2024-08-19 14:53       ` Jerome Forissier
2024-08-19 22:08         ` Tom Rini [this message]
2024-08-21  9:04           ` Jerome Forissier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240819220844.GI1626301@bill-the-cat \
    --to=trini@konsulko.com \
    --cc=ilias.apalodimas@linaro.org \
    --cc=javier.tia@linaro.org \
    --cc=jerome.forissier@linaro.org \
    --cc=muvarov@gmail.com \
    --cc=raymond.mao@linaro.org \
    --cc=tharvey@gateworks.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox