From: Colin Plumb <colin@nyx.net>
To: sct@redhat.com
Cc: linux-mm@kvack.org
Subject: Re: Why don't shared anonymous mappings work?
Date: Wed, 13 Jan 1999 14:31:41 -0700 (MST) [thread overview]
Message-ID: <199901132131.OAA09149@nyx10.nyx.net> (raw)
Um, I just thought of another problem with shared anonymous pages.
It's similar to the zero-page issue you raised, but it's no longer
a single special case.
Copy-on-write and shared mappings. Let's say that process 1 has a COW
copy of page X. Then the page is shared (via mmap /proc/1/mem or some
such) with process 2. Now process A writes to the page.
While copying the page, we have to update B's pte to point to the new copy.
But we have no data structure to keep track of the sharing structure.
It's a fairly simple structure, really, since a given physical page maps
(via COW) to one or more separate logical pages, which are in turn each
mapped into one or more memory maps. Becasue of the "one or more", you
can hope to integrate it into another structure, but ugh. For n copies,
you need n-1 non-null pointers. That's a lot of null pointers when n
has its usual value of 1.
One possible fix is to consider multiple mappings of a logical page to
be a write for the purposes of COW copying. That way, each physical
page is *either* COW-mapped to multiple logical pages, each present in
*one* mmap, or corresponds to one logical page which is present in one
or more maps. This reduces the tree down to one level, and a type bit
in the page structure will do.
It *is* possible to link PTE entries together in a singly-linked list
where a pointer to another PTE is distinguishable from a pointer to
a disk block or a valid PTE. I have thought of using this to update
more PTEs when a page is swapped in, as the swapper-in would traverse
the list to find the page at the end, swap it in if necessary, and
copy the mapping to all the entries it traversed.
Come to think of it, this *could* be used for zero-mapped pages.
Make it a circularly linked list. (You could even distinguish
circular and non-circular lists if you need both.) Then when
the page is accessed, allocate it and copy the pointer to all the
other PTEs on the list.
Do you have any other ideas?
--
-Colin
--
This is a majordomo managed list. To unsubscribe, send a message with
the body 'unsubscribe linux-mm me@address' to: majordomo@kvack.org
next reply other threads:[~1999-01-13 21:32 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
1999-01-13 21:31 Colin Plumb [this message]
1999-01-19 14:32 ` Stephen C. Tweedie
1999-01-19 15:23 ` Eric W. Biederman
-- strict thread matches above, loose matches on Subject: below --
1999-01-15 6:43 Colin Plumb
1999-01-14 3:07 Colin Plumb
1999-01-15 6:07 ` Benjamin C.R. LaHaise
[not found] <199901061523.IAA14788@nyx10.nyx.net>
1999-01-06 19:51 ` Eric W. Biederman
1999-01-07 5:55 ` Eric W. Biederman
1999-01-13 20:21 ` Stephen C. Tweedie
1999-01-05 12:51 Colin Plumb
1999-01-06 4:05 ` Eric W. Biederman
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=199901132131.OAA09149@nyx10.nyx.net \
--to=colin@nyx.net \
--cc=linux-mm@kvack.org \
--cc=sct@redhat.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