From nobody Thu Jan 13 09:49:06 2022 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 2BB4A12D229F; Thu, 13 Jan 2022 09:49:08 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4JZKQC1CcXz4jJF; Thu, 13 Jan 2022 09:49:07 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1642067347; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=xMK1warhiEX5WdTMqiHS9OEzKUzPpLqObbzzAw5eIrw=; b=uwYPGK9F2/0JTYpuz81JE1O/klBKBuVE436ffaLlUDtcbN3JFrecHbsWQI25bcex0QvLc4 AbQ1FJnXTjkP0Qw66iObOP3E5a9shV5fw0Kznq0W+jiFR+K0Z2KqDE/WD8Jsfu/xrVOuzI KTDigRcFiinVKcRyyRXLRKUscj0LDiTvoE4NeMKPbM1Xl+QngrccSqgI0xOcMBzaxnAtxy DvJFEBU7kUz2M/BWcKkNPw9BOKQ3SS45d27wWbDfzqwYzEnuwDBOxTNcT3aAUr0We86vRp XVpwMxmcHhYe7g/tFouMrZNBtRR817BFN7C7qvAHq0JDEu+GNHCLFYkWEnr9iQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id D2F6C1E623; Thu, 13 Jan 2022 09:49:06 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 20D9n6xc095954; Thu, 13 Jan 2022 09:49:06 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 20D9n6Mn095953; Thu, 13 Jan 2022 09:49:06 GMT (envelope-from git) Date: Thu, 13 Jan 2022 09:49:06 GMT Message-Id: <202201130949.20D9n6Mn095953@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Emmanuel Vadot Subject: git: d85252555503 - stable/13 - loader: tftp: Add preload method List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: manu X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: d852525555032ed5e41e4d19316ded8ab6a04803 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1642067347; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=xMK1warhiEX5WdTMqiHS9OEzKUzPpLqObbzzAw5eIrw=; b=AZ3bxcBziyJdfJjTUAN7/MWh8QkepFHO0vtOB4Gv/nll/18g6GlePiBNHbE/3JvmMP8LQP lj1pBoiJSeDoSFAp/T3uELRMq3jDfsE/50Iy8Ziy/NlfJJSe7s3qnRmbh6HLOQTDPgSNaP kKZ5M4MXZSl3eS5zGUZBeukxI11YhAVz6XuKtoPXgDNM/3UhMg1cx/5bVLeow09XBKm+FH Tq9e+drz1oZJD23OkXU33Bgm/d4bFlCZP3e/EtfMZbtiligvMxv/0Bhwfanb4hSdrBVMfI gKIrrJ9q+5ChWZbKq4s8+n6NoCBU3UmFGD8rGmqswi8BQefHfcJfdvEhw/rp/Q== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1642067347; a=rsa-sha256; cv=none; b=OPQOsGhKoAkAE3ZqksUwXsASx/XpaL9vPBUCDRuTZDsJjMlu6z6gM+7c7RY5Z25nV51d44 zLn1WL0XklNv1yixt+m8YkCkBo+1FcFA4oYSSppeewR1wINeyNAO1gDhhriw/SMaohjg8F HG/k1KEejUbDdVVnQtGKkF+/wxC5Nw0rKN5Y7d8+iLiw8kQCZxtuHU60FcLC62YUq+pc4W E95+xUyGx0CGkUT5jf7zzpJlNgmd4N8MGSJ0LLaunu5hFUhMfxCyYdtupH+iBE/4/PUG8p 0tfPFEPBf5zDBWF7iymGQspIMwVL4XYZXwnCOfWiaBsQMw7q2AcxQXVXcOmGEw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by manu: URL: https://cgit.FreeBSD.org/src/commit/?id=d852525555032ed5e41e4d19316ded8ab6a04803 commit d852525555032ed5e41e4d19316ded8ab6a04803 Author: Emmanuel Vadot AuthorDate: 2021-12-10 09:37:01 +0000 Commit: Emmanuel Vadot CommitDate: 2022-01-13 07:58:39 +0000 loader: tftp: Add preload method The preload method will transfer the whole file in a buffer and cache it so read/lseek operations are faster. Reviewed by: imp, tsoome MFC after: 2 weeks Sponsored by: Beckhoff Automation GmbH & Co. KG Differential Revision: https://reviews.freebsd.org/D33410 (cherry picked from commit 3eb019000c9eba6dafad6741a88f627b4d4fcd8a) --- stand/libsa/tftp.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/stand/libsa/tftp.c b/stand/libsa/tftp.c index a63ca8d16d4d..f91974fbff5d 100644 --- a/stand/libsa/tftp.c +++ b/stand/libsa/tftp.c @@ -72,6 +72,7 @@ static int tftp_read(struct open_file *, void *, size_t, size_t *); static off_t tftp_seek(struct open_file *, off_t, int); static int tftp_set_blksize(struct tftp_handle *, const char *); static int tftp_stat(struct open_file *, struct stat *); +static int tftp_preload(struct open_file *); struct fs_ops tftp_fsops = { .fs_name = "tftp", @@ -81,6 +82,7 @@ struct fs_ops tftp_fsops = { .fo_write = null_write, .fo_seek = tftp_seek, .fo_stat = tftp_stat, + .fo_preload = tftp_preload, .fo_readdir = null_readdir }; @@ -518,6 +520,16 @@ tftp_read(struct open_file *f, void *addr, size_t size, size = tftpfile->tftp_tsize - tftpfile->off; } + if (tftpfile->tftp_cache != NULL) { + bcopy(tftpfile->tftp_cache + tftpfile->off, + addr, size); + + addr = (char *)addr + size; + tftpfile->off += size; + res -= size; + goto out; + } + while (size > 0) { int needblock, count; @@ -583,6 +595,7 @@ tftp_read(struct open_file *f, void *addr, size_t size, } +out: if (resid != NULL) *resid = res; return (rc); @@ -600,6 +613,7 @@ tftp_close(struct open_file *f) if (tftpfile) { free(tftpfile->path); free(tftpfile->pkt); + free(tftpfile->tftp_cache); free(tftpfile); } is_open = 0; @@ -640,6 +654,52 @@ tftp_seek(struct open_file *f, off_t offset, int where) return (tftpfile->off); } +static int +tftp_preload(struct open_file *f) +{ + struct tftp_handle *tftpfile; + char *cache; + int rc; +#ifdef TFTP_DEBUG + time_t start, end; +#endif + + tftpfile = f->f_fsdata; + cache = malloc(sizeof(char) * tftpfile->tftp_tsize); + if (cache == NULL) { + printf("Couldn't allocate %ju bytes for preload caching" + ", disabling caching\n", + (uintmax_t)sizeof(char) * tftpfile->tftp_tsize); + return (-1); + } + +#ifdef TFTP_DEBUG + start = getsecs(); + printf("Preloading %s ", tftpfile->path); +#endif + while (tftpfile->islastblock == 0) { + twiddle(32); + rc = tftp_getnextblock(tftpfile); + if (rc) { + free(cache); + printf("Got TFTP error %d, disabling caching\n", rc); + return (rc); + } + bcopy(tftpfile->tftp_hdr->th_data, + cache + (tftpfile->tftp_blksize * (tftpfile->currblock - 1)), + tftpfile->validsize); + } +#ifdef TFTP_DEBUG + end = getsecs(); + printf("\nPreloaded %s (%ju bytes) during %jd seconds\n", + tftpfile->path, (intmax_t)tftpfile->tftp_tsize, + (intmax_t)end - start); +#endif + + tftpfile->tftp_cache = cache; + return (0); +} + static int tftp_set_blksize(struct tftp_handle *h, const char *str) {