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.
You mention "both VMAs (a and b) will fault on subsequent writes", so would you actually be allowing PROT_WRITE access to b ("snapshot")?
-- Thanks, David / dhildenb