[PATCH v3] tools: copyfile: use 64k instead of 512 buffer
Dragan Simic
dsimic at manjaro.org
Thu Apr 4 18:43:15 CEST 2024
Hello Ahelenia,
Just checking, have you forgotten about this patch?
On 2024-03-21 21:50, Dragan Simic wrote:
> On 2024-03-21 21:37, Ahelenia Ziemiańska wrote:
>> This is a trivial but significant optimization:
>> mkimage took >200ms (and 49489 writes (of which 49456 512)),
>> now it takes 110ms (and 419 writes (of which 386 64k)).
>>
>> sendfile is much more appropriate for this and is done in one syscall,
>> but doesn't bring any significant speedups over 64k r/w
>> at the 13M size ranges, so there's no need to introduce
>> #if __linux__
>> while((size = sendfile(fd_dst, fd_src, NULL, 128 * 1024 * 1024)) > 0)
>> ;
>> if(size != -1) {
>> ret = 0;
>> goto out;
>> }
>> #endif
>>
>> Also extract the buffer size to a constant.
>>
>> Signed-off-by: Ahelenia Ziemiańska <nabijaczleweli at nabijaczleweli.xyz>
>> Reviewed-by: Dragan Simic <dsimic at manjaro.org>
>
> Please, remove my Reviewed-by tag from this version of the patch,
> because it no longer applies.
>
>> ---
>> On Thu, Mar 21, 2024 at 08:49:52PM +0100, Dragan Simic wrote:
>>> On 2024-03-21 19:29, Ahelenia Ziemiańska wrote:
>>> > This is a trivial but significant optimisation:
>>> s/optimisation/optimization/
>> This seems to run counter to precedent of not doing americans'
>> imperialism for them for free
>> (I see -ise/-ize in free variation even in my 100-deep checkout).
>
> Well, that's politics, which I have no interest about.
>
>>> > +#define copyfile_bufsize (64 * 1024)
>>> This is not the right place for such a preprocessor directive.
>>> Instead, it should be placed at the start of the file.
>>>
>>> Also, it should use all uppercase letters.
>> FTR, neither of these points seem to be universal;
>> I modelled this after tools/mtk_image.c (also cf.
>> scripts/kconfig/expr.c),
>> but there are at least 25 other function-local macros
>> (as in git grep -B1 '^#define' | grep -c -A1 -e '-{' returns 27).
>
> AFAICT, scripts/kconfig/expr.c could use come cleanups.
>
>> Also kinda weird to explicitly request a macro
>> only to review it back to a constant, but whatever.
>
> Well, it isn't weird. See, the instances of a preprocessor #define
> directive are replaced with its definition before the source code
> reaches the compiler, making it, in this case, a bit easier for the
> compiler to do its job.
>
> The way you wrote it below, the compiler will almost surely optimize
> out the constant variable and replace it with the literal number in
> the generated object code, but that puts unnecessary burden on the
> compiler, which can be avoided by feeding it with the literal number,
> using a preprocessor directive.
>
>> tools/fit_common.c | 5 +++--
>> 1 file changed, 3 insertions(+), 2 deletions(-)
>>
>> diff --git a/tools/fit_common.c b/tools/fit_common.c
>> index 2d417d47..37066203 100644
>> --- a/tools/fit_common.c
>> +++ b/tools/fit_common.c
>> @@ -129,6 +129,7 @@ int copyfile(const char *src, const char *dst)
>> {
>> int fd_src = -1, fd_dst = -1;
>> void *buf = NULL;
>> + const size_t bufsize = 64 * 1024;
>> ssize_t size;
>> size_t count;
>> int ret = -1;
>> @@ -145,14 +146,14 @@ int copyfile(const char *src, const char *dst)
>> goto out;
>> }
>>
>> - buf = calloc(1, 512);
>> + buf = calloc(1, bufsize);
>> if (!buf) {
>> printf("Can't allocate buffer to copy file\n");
>> goto out;
>> }
>>
>> while (1) {
>> - size = read(fd_src, buf, 512);
>> + size = read(fd_src, buf, bufsize);
>> if (size < 0) {
>> printf("Can't read file %s\n", src);
>> goto out;
More information about the U-Boot
mailing list