From: Anthony Yznaga <anthony.yznaga@oracle.com>
To: David Hildenbrand <david@redhat.com>,
akpm@linux-foundation.org, willy@infradead.org,
markhemm@googlemail.com, viro@zeniv.linux.org.uk,
khalid@kernel.org
Cc: jthoughton@google.com, corbet@lwn.net, dave.hansen@intel.com,
kirill@shutemov.name, luto@kernel.org, brauner@kernel.org,
arnd@arndb.de, ebiederm@xmission.com, catalin.marinas@arm.com,
mingo@redhat.com, peterz@infradead.org, liam.howlett@oracle.com,
lorenzo.stoakes@oracle.com, vbabka@suse.cz, jannh@google.com,
hannes@cmpxchg.org, mhocko@kernel.org, roman.gushchin@linux.dev,
shakeel.butt@linux.dev, muchun.song@linux.dev,
tglx@linutronix.de, cgroups@vger.kernel.org, x86@kernel.org,
linux-doc@vger.kernel.org, linux-arch@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-mm@kvack.org,
mhiramat@kernel.org, rostedt@goodmis.org,
vasily.averin@linux.dev, xhao@linux.alibaba.com, pcc@google.com,
neilb@suse.de, maz@kernel.org
Subject: Re: [PATCH 00/20] Add support for shared PTEs across processes
Date: Tue, 28 Jan 2025 11:40:34 -0800 [thread overview]
Message-ID: <a6f26afa-e4df-4519-8287-39ec3eab181d@oracle.com> (raw)
In-Reply-To: <404b500a-4a28-4a8a-a0f5-3c96c397be0b@redhat.com>
On 1/28/25 1:36 AM, David Hildenbrand wrote:
>> API
>> ===
>>
>> mshare does not introduce a new API. It instead uses existing APIs
>> to implement page table sharing. The steps to use this feature are:
>>
>> 1. Mount msharefs on /sys/fs/mshare -
>> mount -t msharefs msharefs /sys/fs/mshare
>>
>> 2. mshare regions have alignment and size requirements. Start
>> address for the region must be aligned to an address boundary and
>> be a multiple of fixed size. This alignment and size requirement
>> can be obtained by reading the file /sys/fs/mshare/mshare_info
>> which returns a number in text format. mshare regions must be
>> aligned to this boundary and be a multiple of this size.
>>
>> 3. For the process creating an mshare region:
>> a. Create a file on /sys/fs/mshare, for example -
>> fd = open("/sys/fs/mshare/shareme",
>> O_RDWR|O_CREAT|O_EXCL, 0600);
>>
>> b. Establish the starting address and size of the region
>> struct mshare_info minfo;
>>
>> minfo.start = TB(2);
>> minfo.size = BUFFER_SIZE;
>> ioctl(fd, MSHAREFS_SET_SIZE, &minfo)
>
> We could set the size using ftruncate, just like for any other file.
> It would have to be the first thing after creating the file, and
> before we allow any other modifications.
I'll look into this.
>
> Idealy, we'd be able to get rid of the "start", use something
> resaonable (e.g., TB(2)) internally, and allow processes to mmap() it
> at different (suitably-aligned) addresses.
>
> I recall we discussed that in the past. Did you stumble over real
> blockers such that we really must mmap() the file at the same address
> in all processes? I recall some things around TLB flushing, but not
> sure. So we might have to stick to an mmap address for now.
It's not hard to implement this. It does have the affect that rmap walks
will find the internal VA rather than the actual VA for a given process.
For TLB flushing this isn't a problem for the current implementation
because all TLBs are flushed entirely. I don't know if there might be
other complications. It does mean that an offset rather than address
should be used when creating a mapping as you point out below.
>
> When using fallocate/stat to set/query the file size, we could end up
> with:
>
> /*
> * Set the address where this file can be mapped into processes. Other
> * addresses are not supported for now, and mmap will fail. Changing the
> * mmap address after mappings were already created is not supported.
> */
> MSHAREFS_SET_MMAP_ADDRESS
> MSHAREFS_GET_MMAP_ADDRESS
I'll look into this, too.
>
>
>>
>> c. Map some memory in the region
>> struct mshare_create mcreate;
>>
>> mcreate.addr = TB(2);
>
> Can we use the offset into the virtual file instead? We should be able
> to perform that translation internally fairly easily I assume.
Yes, an offset would be preferable. Especially if mapping the same file
at different VAs is implemented.
>
>> mcreate.size = BUFFER_SIZE;
>> mcreate.offset = 0;
>> mcreate.prot = PROT_READ | PROT_WRITE;
>> mcreate.flags = MAP_ANONYMOUS | MAP_SHARED | MAP_FIXED;
>> mcreate.fd = -1;
>>
>> ioctl(fd, MSHAREFS_CREATE_MAPPING, &mcreate)
>
> Would examples with multiple mappings work already in this version?
>
> Did you experiment with other mappings (e.g., ordinary shared file
> mappings), and what are the blockers to make that fly?
Yes, multiple mappings works. And it's straightforward to make shared
file mappings work. I have a patch where I basically just copied code
from ksys_mmap_pgoff() into msharefs_create_mapping(). Needs some
refactoring and finessing to make it a real patch.
>
>>
>> d. Map the mshare region into the process
>> mmap((void *)TB(2), BUF_SIZE, PROT_READ | PROT_WRITE,
>> MAP_SHARED, fd, 0);
>>
>> e. Write and read to mshared region normally.
>>
>> 4. For processes attaching an mshare region:
>> a. Open the file on msharefs, for example -
>> fd = open("/sys/fs/mshare/shareme", O_RDWR);
>>
>> b. Get information about mshare'd region from the file:
>> struct mshare_info minfo;
>>
>> ioctl(fd, MSHAREFS_GET_SIZE, &minfo);
>>
>> c. Map the mshare'd region into the process
>> mmap(minfo.start, minfo.size,
>> PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
>>
>> 5. To delete the mshare region -
>> unlink("/sys/fs/mshare/shareme");
>>
>
> I recall discussions around cgroup accounting, OOM handling etc. I
> thought the conclusion was that we need an "mshare process" where the
> memory is accounted to, and once that process is killed (e.g., OOM),
> it must tear down all mappings/pages etc.
>
> How does your design currently look like in that regard? E.g., how can
> OOM handling make progress, how is cgroup accounting handled?
There was some discussion on this at last year's LSF/MM, but it seemed
more like ideas rather than a conclusion on an approach. In any case,
tearing down everything if an owning process is killed does not work for
our internal use cases, and I think that was mentioned somewhere in
discussions. Plus it seems to me that yanking the mappings away from the
unsuspecting non-owner processes could be quite catastrophic. Shouldn't
an mshare virtual file be treated like any other in-memory file? Or do
such files get zapped somehow by OOM? Not saying we shouldn't do
anything for OOM, but I'm not sure what the answer is.
Cgroups are tricky. At the mm alignment meeting last year a use case was
brought up where it would be desirable to have all pagetable pages
charged to one memcg rather than have them charged on a first touch
basis. It was proposed that perhaps an mshare file could associated with
a cgroup at the time it is created. I have figured out a way to do this
but I'm not versed enough in cgroups to know if the approach is viable.
The last three patches provided this functionality as well as
functionality that ensures a newly faulted in page is charged to the
current process. If everything, pagetable and faulted pages, should be
charged to the same cgroup then more work is definitely required.
Hopefully this provides enough context to move towards a complete solution.
Anthony
next prev parent reply other threads:[~2025-01-28 19:41 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-24 23:54 Anthony Yznaga
2025-01-24 23:54 ` [PATCH 01/20] mm: Add msharefs filesystem Anthony Yznaga
2025-01-25 3:13 ` Randy Dunlap
2025-01-25 20:05 ` Anthony Yznaga
2025-01-25 21:10 ` Matthew Wilcox
2025-01-27 17:01 ` Anthony Yznaga
2025-02-04 1:52 ` Bagas Sanjaya
2025-02-04 16:41 ` Anthony Yznaga
2025-01-24 23:54 ` [PATCH 02/20] mm/mshare: pre-populate msharefs with information file Anthony Yznaga
2025-01-24 23:54 ` [PATCH 03/20] mm/mshare: make msharefs writable and support directories Anthony Yznaga
2025-01-24 23:54 ` [PATCH 04/20] mm/mshare: allocate an mm_struct for msharefs files Anthony Yznaga
2025-01-24 23:54 ` [PATCH 05/20] mm/mshare: Add ioctl support Anthony Yznaga
2025-01-24 23:54 ` [PATCH 06/20] mm/mshare: Add a vma flag to indicate an mshare region Anthony Yznaga
2025-01-24 23:54 ` [PATCH 07/20] mm/mshare: Add mmap support Anthony Yznaga
2025-01-24 23:54 ` [PATCH 08/20] mm/mshare: flush all TLBs when updating PTEs in an mshare range Anthony Yznaga
2025-01-24 23:54 ` [PATCH 09/20] sched/numa: do not scan msharefs vmas Anthony Yznaga
2025-01-24 23:54 ` [PATCH 10/20] mm: add mmap_read_lock_killable_nested() Anthony Yznaga
2025-01-24 23:54 ` [PATCH 11/20] mm: add and use unmap_page_range vm_ops hook Anthony Yznaga
2025-01-24 23:54 ` [PATCH 12/20] mm/mshare: prepare for page table sharing support Anthony Yznaga
2025-01-24 23:54 ` [PATCH 13/20] x86/mm: enable page table sharing Anthony Yznaga
2025-01-24 23:54 ` [PATCH 14/20] mm: create __do_mmap() to take an mm_struct * arg Anthony Yznaga
2025-01-24 23:54 ` [PATCH 15/20] mm: pass the mm in vma_munmap_struct Anthony Yznaga
2025-01-24 23:54 ` [PATCH 16/20] mshare: add MSHAREFS_CREATE_MAPPING Anthony Yznaga
2025-01-24 23:54 ` [PATCH 17/20] mshare: add MSHAREFS_UNMAP Anthony Yznaga
2025-01-24 23:54 ` [PATCH 18/20] mm/mshare: provide a way to identify an mm as an mshare host mm Anthony Yznaga
2025-01-24 23:54 ` [PATCH 19/20] mm/mshare: get memcg from current->mm instead of mshare mm Anthony Yznaga
2025-01-24 23:54 ` [PATCH 20/20] mm/mshare: associate a mem cgroup with an mshare file Anthony Yznaga
2025-01-27 22:33 ` [PATCH 00/20] Add support for shared PTEs across processes Andrew Morton
2025-01-27 23:59 ` Anthony Yznaga
2025-01-28 9:21 ` David Hildenbrand
2025-01-28 7:11 ` Bagas Sanjaya
2025-01-28 19:53 ` Anthony Yznaga
2025-01-28 9:36 ` David Hildenbrand
2025-01-28 19:40 ` Anthony Yznaga [this message]
2025-01-29 0:11 ` Andrew Morton
2025-01-29 0:25 ` Anthony Yznaga
2025-01-29 0:59 ` Matthew Wilcox
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=a6f26afa-e4df-4519-8287-39ec3eab181d@oracle.com \
--to=anthony.yznaga@oracle.com \
--cc=akpm@linux-foundation.org \
--cc=arnd@arndb.de \
--cc=brauner@kernel.org \
--cc=catalin.marinas@arm.com \
--cc=cgroups@vger.kernel.org \
--cc=corbet@lwn.net \
--cc=dave.hansen@intel.com \
--cc=david@redhat.com \
--cc=ebiederm@xmission.com \
--cc=hannes@cmpxchg.org \
--cc=jannh@google.com \
--cc=jthoughton@google.com \
--cc=khalid@kernel.org \
--cc=kirill@shutemov.name \
--cc=liam.howlett@oracle.com \
--cc=linux-arch@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=lorenzo.stoakes@oracle.com \
--cc=luto@kernel.org \
--cc=markhemm@googlemail.com \
--cc=maz@kernel.org \
--cc=mhiramat@kernel.org \
--cc=mhocko@kernel.org \
--cc=mingo@redhat.com \
--cc=muchun.song@linux.dev \
--cc=neilb@suse.de \
--cc=pcc@google.com \
--cc=peterz@infradead.org \
--cc=roman.gushchin@linux.dev \
--cc=rostedt@goodmis.org \
--cc=shakeel.butt@linux.dev \
--cc=tglx@linutronix.de \
--cc=vasily.averin@linux.dev \
--cc=vbabka@suse.cz \
--cc=viro@zeniv.linux.org.uk \
--cc=willy@infradead.org \
--cc=x86@kernel.org \
--cc=xhao@linux.alibaba.com \
/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