On 23/08/2021 10:02, David Hildenbrand wrote: > On 20.08.21 15:13, Ralf Ramsauer wrote: >> Dear mm folks, >> >> I have an issue, where it would be great to have a COW-backed virtual >> memory area within an userspace process. I know there's the possibility >> to have a file-backed MAP_SHARED vma, which is later duplicated with >> MAP_PRIVATE, but that's not exactly what I'm looking for. >> >> Say I have an anonymous page-aligned VMA a, with MAP_PRIVATE and >> PROT_RW. Userspace happily writes to/reads from it. At some point in >> time, I want to 'snapshot' that single VMA within the context of the >> process and without the need to fork(). Say there's something like >> >> a = mmap(0, len, PROT_RW, MAP_ANON | MAP_POPULATE, -1, 0); >> [... fill a ...] >> >> b = mmdup(a, len, PROT_READ); >> >> b shall be the new base pointer of a new VMA that is backed by COW >> mechanisms. After mmdup, those regular COW mechanisms do the rest: both >> VMAs (a and b) will fault on subsequent writes and duplicate the >> previously shared physical mapping, pretty much what cow_fault or >> shared_fault does. >> >> Afaict, this, or at least something like this is currently not supported >> by the kernel. Is that correct? If so, why? Generally spoken, is it a >> bad idea? > > Not sure if it helps (most probably not), QEMU uses uffd-wp for > background snapshots of VM memory. It's different, though, as you'll > only have a single mapping and will be catching modifications to your > single mapping, such that you can "safe away" relevant snapshot pages > before any modifications. Thanks for the pointer, David. I'll have a look. > > You mention "both VMAs (a and b) will fault on subsequent writes", so > would you actually be allowing PROT_WRITE access to b ("snapshot")? > In general, yes, both should be allowed to be PROT_WRITE. So no matter "which side" causes the fault, simply both will lead to duplication. If it would make things easier, then it would also be absolutely fine to have the snapshot PROT_READ, which would suffice my requirements as well. Thanks Ralf