Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1685365

Re: [RFC PATCH 1/1] mm/mremap: add MREMAP_MIRROR flag for existing mirroring functionality

From Mike Kravetz <mike.kravetz@oracle.com>
Newsgroups linux.kernel
Subject Re: [RFC PATCH 1/1] mm/mremap: add MREMAP_MIRROR flag for existing mirroring functionality
Date 2017-07-12 00:00 +0200
Message-ID <u2bmh-7Ir-1@gated-at.bofh.it> (permalink)
References <u0hFv-7Q8-11@gated-at.bofh.it> <u0hFv-7Q8-9@gated-at.bofh.it> <u22Cm-2fW-15@gated-at.bofh.it> <u2853-5KF-7@gated-at.bofh.it> <u2azU-7pB-9@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


On 07/11/2017 02:02 PM, Andrea Arcangeli wrote:
> On Tue, Jul 11, 2017 at 11:23:19AM -0700, Mike Kravetz wrote:
>> I was surprised as well when a JVM developer pointed this out.
>>
>> From the old e-mail thread, here is original use case:
>> shmget(IPC_PRIVATE, 31498240, 0x1c0|0600) = 11337732
>> shmat(11337732, 0, 0)                   = 0x40299000
>> shmctl(11337732, IPC_RMID, 0)           = 0
>> mremap(0x402a9000, 0, 65536, MREMAP_MAYMOVE|MREMAP_FIXED, 0) = 0
>> mremap(0x402a9000, 0, 65536, MREMAP_MAYMOVE|MREMAP_FIXED, 0x100000) = 0x100000
>>
>> The JVM team wants to do something similar.  They are using
>> mmap(MAP_ANONYMOUS|MAP_SHARED) to create the initial mapping instead
>> of shmget/shmat.  As Vlastimil mentioned previously, one would not
>> expect a shared mapping for parts of the JVM heap.  I am working
>> to get clarification from the JVM team.
> 
> Why don't they use memfd_create instead? That's made so that the fd is
> born anon unlinked so when the last reference is dropped all memory
> associated with it is automatically freed. No need of IC_RMID and then
> they can use mmap instead of mremap(len=0) to get a double map of it.

Wow!  I did not even know about memfd_create until you mentioned it.
That would certainly work for 'normal' pages.

> If they use mmap(MAP_ANONYMOUS|MAP_SHARED) it's not hugetlbfs, that
> would have been the only issue.
> 
> Using hugetlbfs for JVM wouldn't be really flexible, better they try
> to leverage THP on SHM or the hugetlbfs reservation gets in the way of
> efficient use of the unused memory for memory allocations that don't
> have a definitive size (i.e. JVM forks or more JVM are run in
> parallel).

Well, the JVM has had a config option for the use of hugetlbfs for quite
some time.  I assume they have already had to deal with these issues.

What prompted this discussion is that they want the mremap mirroring/
duplication functionality extended to support hugetlbfs.  This is pretty
straight forward.  But, I wanted to have a discussion about whether the
mremap(old_size == 0) functionality should be formally documented first.

Do note that if you actually create/mount a hugetlbfs filesystem and
use a fd in that filesystem you can get the desired functionality.  However,
they want to avoid this extra step if possible and use mmap(anon, hugetlb).

I'm guessing that if memfd_create supported hugetlbfs, that would also
meet their needs.  Any thoughts about extending memfd_create support to
hugetlbfs?  I can't think of any big issues.  In fact, 'under the covers'
there actually is a hugetlbfs file created for anon mappings.  However,
that is not exposed to the user.

>> Yes.  I think this should be a separate patch.  As mentioned earlier,
>> mremap today creates a new/additional private mapping if called in this
>> way with old_size == 0.  To me, this is a bug.
> 
> Kernel by sheer luck should stay stable, but the result is weird and
> it's unlikely intentional.

Yes, that is why I think it is a bug.  Not that kernel is unstable, but
rather the unintentional/unexpected result.

> memfd_create doesn't have such issue, the new mmap MAP_PRIVATE will
> get the file pages correctly after a new mmap (even if there were cows
> in the old MAP_PRIVATE mmap).
> 
>> One reason for the RFC was to determine if people thought we should:
>> 1) Just document the existing old_size == 0 functionality
>> 2) Create a more explicit interface such as a new mremap flag for this
>>    functionality
>>
>> I am waiting to see what direction people prefer before making any
>> man page updates.
> 
> I guess old_size == 0 would better be dropped if possible, if
> memfd_create fits perfectly your needs as I supposed above. If it's
> not dropped then it's not very far from allowing mmap of /proc/self/mm
> again (removed around so far as 2.3.x?).

Yes, in my google'ing it appears the first users of mremap(old_size == 0)
previously used mmap of /proc/self/mm.

If memfd_create can be extended to support hugetlbfs, then I might suggest
dropping the memfd_create(old_size == 0) support.  Just a thought.

-- 
Mike Kravetz

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[RFC PATCH 1/1] mm/mremap: add MREMAP_MIRROR flag for existing mirroring functionality Mike Kravetz <mike.kravetz@oracle.com> - 2017-07-06 18:20 +0200
  Re: [RFC PATCH 1/1] mm/mremap: add MREMAP_MIRROR flag for existing  mirroring functionality Anshuman Khandual <khandual@linux.vnet.ibm.com> - 2017-07-07 10:50 +0200
    Re: [RFC PATCH 1/1] mm/mremap: add MREMAP_MIRROR flag for existing  mirroring functionality Mike Kravetz <mike.kravetz@oracle.com> - 2017-07-07 19:20 +0200
      Re: [RFC PATCH 1/1] mm/mremap: add MREMAP_MIRROR flag for existing  mirroring functionality Anshuman Khandual <khandual@linux.vnet.ibm.com> - 2017-07-09 09:30 +0200
  Re: [RFC PATCH 1/1] mm/mremap: add MREMAP_MIRROR flag for existing  mirroring functionality "Kirill A. Shutemov" <kirill@shutemov.name> - 2017-07-07 12:30 +0200
    Re: [RFC PATCH 1/1] mm/mremap: add MREMAP_MIRROR flag for existing  mirroring functionality Mike Kravetz <mike.kravetz@oracle.com> - 2017-07-07 19:40 +0200
      Re: [RFC PATCH 1/1] mm/mremap: add MREMAP_MIRROR flag for existing  mirroring functionality "Kirill A. Shutemov" <kirill@shutemov.name> - 2017-07-07 19:50 +0200
        Re: [RFC PATCH 1/1] mm/mremap: add MREMAP_MIRROR flag for existing  mirroring functionality Mike Kravetz <mike.kravetz@oracle.com> - 2017-07-07 20:20 +0200
          Re: [RFC PATCH 1/1] mm/mremap: add MREMAP_MIRROR flag for existing  mirroring functionality Anshuman Khandual <khandual@linux.vnet.ibm.com> - 2017-07-09 09:40 +0200
            Re: [RFC PATCH 1/1] mm/mremap: add MREMAP_MIRROR flag for existing  mirroring functionality Vlastimil Babka <vbabka@suse.cz> - 2017-07-10 18:30 +0200
              Re: [RFC PATCH 1/1] mm/mremap: add MREMAP_MIRROR flag for existing  mirroring functionality Mike Kravetz <mike.kravetz@oracle.com> - 2017-07-10 19:30 +0200
  Re: [RFC PATCH 1/1] mm/mremap: add MREMAP_MIRROR flag for existing  mirroring functionality Michal Hocko <mhocko@kernel.org> - 2017-07-11 14:40 +0200
    Re: [RFC PATCH 1/1] mm/mremap: add MREMAP_MIRROR flag for existing  mirroring functionality Mike Kravetz <mike.kravetz@oracle.com> - 2017-07-11 20:30 +0200
      Re: [RFC PATCH 1/1] mm/mremap: add MREMAP_MIRROR flag for existing  mirroring functionality Andrea Arcangeli <aarcange@redhat.com> - 2017-07-11 23:10 +0200
        Re: [RFC PATCH 1/1] mm/mremap: add MREMAP_MIRROR flag for existing  mirroring functionality Mike Kravetz <mike.kravetz@oracle.com> - 2017-07-12 00:00 +0200
          Re: [RFC PATCH 1/1] mm/mremap: add MREMAP_MIRROR flag for existing  mirroring functionality Andrea Arcangeli <aarcange@redhat.com> - 2017-07-12 01:40 +0200
      Re: [RFC PATCH 1/1] mm/mremap: add MREMAP_MIRROR flag for existing  mirroring functionality Michal Hocko <mhocko@kernel.org> - 2017-07-12 13:50 +0200
        Re: [RFC PATCH 1/1] mm/mremap: add MREMAP_MIRROR flag for existing  mirroring functionality Mike Kravetz <mike.kravetz@oracle.com> - 2017-07-12 19:00 +0200
          Re: [RFC PATCH 1/1] mm/mremap: add MREMAP_MIRROR flag for existing  mirroring functionality Michal Hocko <mhocko@kernel.org> - 2017-07-13 08:20 +0200
            Re: [RFC PATCH 1/1] mm/mremap: add MREMAP_MIRROR flag for existing  mirroring functionality Mike Kravetz <mike.kravetz@oracle.com> - 2017-07-13 18:10 +0200
              Re: [RFC PATCH 1/1] mm/mremap: add MREMAP_MIRROR flag for existing  mirroring functionality Andrea Arcangeli <aarcange@redhat.com> - 2017-07-13 18:40 +0200
                Re: [RFC PATCH 1/1] mm/mremap: add MREMAP_MIRROR flag for existing  mirroring functionality Mike Kravetz <mike.kravetz@oracle.com> - 2017-07-13 20:20 +0200
                Re: [RFC PATCH 1/1] mm/mremap: add MREMAP_MIRROR flag for existing  mirroring functionality Andrea Arcangeli <aarcange@redhat.com> - 2017-07-13 22:40 +0200

csiph-web