public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
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
> 
> 
> 

  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).