From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
To: libc-alpha@sourceware.org
Subject: Re: [libc/string] State of PAGE_COPY_FWD / PAGE_COPY_THRESHOLD
Date: Tue, 01 Nov 2016 13:59:00 -0000 [thread overview]
Message-ID: <c05f0be4-6e4b-80cd-ad74-edc16a443b14@linaro.org> (raw)
In-Reply-To: <E122D105-776D-4B9B-A15C-0A7C24BC0910@linaro.org>
On 01/11/2016 07:28, Maxim Kuvyrkov wrote:
> I wanted to check performance impact of using linux zero page sharing in calls to memset (PTR, 0, SIZE). I remembered seeing PAGE_COPY_FWD_MAYBE and PAGE_COPY_THRESHOLD in string/memcpy.c, and my plan was to copy this logic to an experimental memset() implementation.
>
> Closer inspection of the current code showed that only Mach port attempted to use full-page copying in memcpy.c, but now even the Mach port disables it. The net result is that code in string/memcpy.c, as well as parts of headers sysdeps/generic/pagecopy.h and sysdeps/generic/memcopy.h are dead code.
>
> From the above we have 2 questions:
> 1. Is it possible to use full-page copy (with COW) in the Linux glibc port for memcpy() and/or memset(0)?
It is still possible to use the algorithms string/mem{cpy,set}, you just need to
make some change on the architecture you are aiming for.
On x86_64, for instance, you will need to remove any possible assembly
implementation so sysdeps won't use it instead. While configuring
with --disable-multi-arch (to remove the ifunc usage and keep it
simpler), I removed:
deleted: sysdeps/x86_64/memcpy.S
deleted: sysdeps/x86_64/memcpy_chk.S
deleted: sysdeps/x86_64/memmove.S
deleted: sysdeps/x86_64/mempcpy.S
deleted: sysdeps/x86_64/wordcopy.c
The 'memcpy.S' is the default optimized implementation and 'memcpy_chk.S'
is an empty one (since it is implemented on memcpy.S for x86_64 and we
will need the symbols provided). Same logic applies for the other removed
one (memmove.S and mempcpy.S).
I also removed sysdeps/x86_64/wordcopy.c because the idea is to use the
default one on string/wordcopy.c.
Next it will require to define OP_T_THRES so I created the file
'sysdeps/x86_64/memcopy.h' with the contents:
$ cat sysdeps/x86_64/memcopy.h
#include <sysdeps/generic/memcopy.h>
#undef OP_T_THRES
#define OP_T_THRES 8
(I think we should just define it to WORDSIZE/8 somewhere).
This should enable the build and use of generic memcpy implementation.
To actually use the PAGE_COPY_* macro you will need to add a arch
specific pagecopy.h header. Using the x86_64 example:
$ cat sysdeps/x86/pagecopy.h
#define PAGE_SIZE 4096
#define PAGE_COPY_THRESHOLD PAGE_SIZE
#define PAGE_COPY_FWD(dstp, srcp, nbytes_left, nbytes) /* Implement it */
It should work on any other architecture as well. Now the question
is whether this actually does make sense for Linux. Hurd/mach provided
a syscall (?) to actually copy the pages (vm_copy) which seems to apply
some tricks to avoid full copy pages. By 'linux zero page sharing' are
you referring to KSM (Kernel Samepage Merging)?
If so, on a system without a provided kernel interface to work directed
with underlying memory mapping (such as for mach), mem{cpy,set} will
actually need to touch the pages and it will be up to kernel page fault
mechanism to actually handle it (by identifying common pages and adjusting
vma mapping accordingly). And AFAIK this are only enabled on KSM if you
actually madavise the page explicit. So I am not grasping the need to
actually implement page copying on Linux.
>
> 2. If not, then is there any reason to keep the dead code around or should we clean it up?
In fact I think hurd/mach intent is indeed to actually use it and
it is not using due a missing adjustment in commit
99f8dc922033821edcc13f9f8360e9fda40dfcff (Fix -Wundef warning on
PAGE_COPY_THRESHOLD). It should have changed 'sysdeps/mach/pagecopy.h"
PAGE_THRESHOLD definition to PAGE_COPY_THRESHOLD.
>
> --
> Maxim Kuvyrkov
> www.linaro.org
>
>
>
next prev parent reply other threads:[~2016-11-01 13:59 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-11-01 9:28 Maxim Kuvyrkov
2016-11-01 13:59 ` Adhemerval Zanella [this message]
2016-11-10 7:39 ` Maxim Kuvyrkov
2016-11-10 7:48 ` Andrew Pinski
2016-11-10 7:52 ` Maxim Kuvyrkov
2016-11-10 8:01 ` Andrew Pinski
2016-11-10 8:05 ` Andrew Pinski
2016-11-10 8:25 ` Florian Weimer
2016-11-10 8:34 ` Andrew Pinski
2016-11-10 8:55 ` Andrew Pinski
2016-11-10 9:25 ` Siddhesh Poyarekar
2016-11-10 9:29 ` Florian Weimer
2016-11-10 9:34 ` Siddhesh Poyarekar
2016-11-30 11:18 ` Siddhesh Poyarekar
2016-11-10 8:26 ` Florian Weimer
2016-11-10 8:27 ` Florian Weimer
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=c05f0be4-6e4b-80cd-ad74-edc16a443b14@linaro.org \
--to=adhemerval.zanella@linaro.org \
--cc=libc-alpha@sourceware.org \
/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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).