On 07.02.2007 [11:34:49 -0800], Nishanth Aravamudan wrote:
> On 07.02.2007 [10:20:44 -0600], Adam Litke wrote:
> > On Tue, 2007-02-06 at 19:31 -0800, Nishanth Aravamudan wrote:
> > > + /*
> > > + * take a COW fault on each hugepage in the
> > > + * segment's file data ...
> > > + */
> > > + for (p = seg[i].vaddr;
> > > + p <= seg[i].vaddr + seg[i].filesz;
> > > + p += hpage_size) {
> > > + memcpy(&c, p, 1);
> > > + memcpy(p, &c, 1);
> > > + }
> > > + /*
> > > + * ... as well as each huge page in the
> > > + * extracopy area
> > > + *
> > > + * Note: if minimal_copy is enabled, we do *not*
> > > + * want to prefault in the remainder of the
> > > + * segment, as the upper boundary is quite high
> > > + * (to avoid collisions with small pages)
> > > + */
> >
> > Hmm. For the MINIMAL_COPY=no case, don't we want to disable the whole
> > fadvise algorithm (not just the COWs)?
>
> All good points, updated patch below:
Sent a little too quick. Fixed-up a bit more of the formatting and
removed the (unnecessary) fsync() call.
Author: Nishanth Aravamudan <[EMAIL PROTECTED]>
Date: Mon Feb 5 14:22:02 2007 -0800
elflink: drop hugepage cached pages for writable segments
We currently use extra hugepages for writable segments because of the
first MAP_SHARED mmap() which stays resident in the page cache. Use a
forced COW for the filesz portion of writable segments and then
fadvise() to drop the page cache pages while keeping our PRIVATE
mapping. This is mutually exclusive to segment sharing, but is also
orthogonal in code because we only allow sharing of read-only segments.
Also, if the minimal_copy algorithm is disabled, we also disable this
optimization.
Signed-off-by: Nishanth Aravamudan <[EMAIL PROTECTED]>
diff --git a/elflink.c b/elflink.c
index 780d87c..09c3a47 100644
--- a/elflink.c
+++ b/elflink.c
@@ -793,6 +793,7 @@ static void remap_segments(struct seg_info *seg, int num)
long hpage_size = gethugepagesize();
int i;
void *p;
+ char c;
/*
* XXX: The bogus call to mmap below forces ld.so to resolve the
@@ -831,6 +832,57 @@ static void remap_segments(struct seg_info *seg, int num)
/* The segments are all back at this point.
* and it should be safe to reference static data
*/
+
+ /*
+ * This pagecache dropping code should not be used for shared
+ * segments. But we currently only share read-only segments, so
+ * the below check for PROT_WRITE is implicitly sufficient.
+ *
+ * Note: if minimal_copy is enabled, it is overkill to try and
+ * save huge pages here, as we will end up using more than
+ * normal anyways. Also, due to limitations on certain
+ * architectures, we would need to avoid prefaulting in the
+ * extracopy area so as to not use an inordinate number of huge
+ * pages.
+ */
+ if (minimal_copy) {
+ for (i = 0; i < num; i++) {
+ if (seg[i].prot & PROT_WRITE) {
+ /*
+ * take a COW fault on each hugepage in
+ * the segment's file data ...
+ */
+ for (p = seg[i].vaddr;
+ p <= seg[i].vaddr + seg[i].filesz;
+ p += hpage_size) {
+ memcpy(&c, p, 1);
+ memcpy(p, &c, 1);
+ }
+ /*
+ * ... as well as each huge page in the
+ * extracopy area
+ *
+ */
+ if (seg[i].extra_vaddr) {
+ for (p = seg[i].extra_vaddr;
+ p <= seg[i].extra_vaddr +
+ seg[i].extrasz;
+ p += hpage_size) {
+ memcpy(&c, p, 1);
+ memcpy(p, &c, 1);
+ }
+ }
+ /*
+ * Note: fadvise() failing is not
+ * actually an error, as we'll just use
+ * an extra set of hugepages (in the
+ * pagecache).
+ */
+ posix_fadvise(seg[i].fd, 0, 0,
+ POSIX_FADV_DONTNEED);
+ }
+ }
+ }
}
static int check_env(void)
--
Nishanth Aravamudan <[EMAIL PROTECTED]>
IBM Linux Technology Center
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier.
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Libhugetlbfs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libhugetlbfs-devel