hugetlbfs_prefault relies on having a file descriptor associated with
the huge page backed region to prefault the huge pages.  This patch
gives an alternative for prefaulting which will be used when the
kernel supports MAP_HUGETLB.

Signed-off-by: Eric B Munson <emun...@mgebm.net>
---
 hugeutils.c |   59 ++++++++++++++++++++++++++++++++++++++---------------------
 1 files changed, 38 insertions(+), 21 deletions(-)

diff --git a/hugeutils.c b/hugeutils.c
index bf9fb85..ecbfc29 100644
--- a/hugeutils.c
+++ b/hugeutils.c
@@ -956,6 +956,15 @@ int hugetlbfs_unlinked_fd(void)
 #define IOV_LEN 64
 int hugetlbfs_prefault(int fd, void *addr, size_t length)
 {
+       size_t offset;
+       struct iovec iov[IOV_LEN];
+       int ret;
+       int i;
+       int close_fd = -1;
+
+       if (!__hugetlbfs_prefault)
+               return 0;
+
        /*
         * The NUMA users of libhugetlbfs' malloc feature are
         * expected to use the numactl program to specify an
@@ -972,30 +981,38 @@ int hugetlbfs_prefault(int fd, void *addr, size_t length)
         * -ENOMEM is returned. The caller is expected to release the entire
         * mapping and optionally it may recover by mapping base pages instead.
         */
-       if (__hugetlbfs_prefault) {
-               int i;
-               size_t offset;
-               struct iovec iov[IOV_LEN];
-               int ret;
-
-               for (offset = 0; offset < length; ) {
-                       for (i = 0; i < IOV_LEN && offset < length; i++) {
-                               iov[i].iov_base = addr + offset;
-                               iov[i].iov_len = 1;
-                               offset += gethugepagesize();
-                       }
-                       ret = readv(fd, iov, i);
-                       if (ret != i) {
-                               DEBUG("Got %d of %d requested; err=%d\n", ret,
-                                               i, ret < 0 ? errno : 0);
-                               WARNING("Failed to reserve %ld huge pages "
-                                               "for new region\n",
-                                               length / gethugepagesize());
-                               return -ENOMEM;
-                       }
+
+       if (fd < 0 && __hugetlb_opts.map_hugetlb) {
+               fd = open("/dev/zero", O_RDONLY);
+               if (fd < 0) {
+                       ERROR("Failed to open /dev/zero for reading\n");
+                       return -ENOMEM;
+               }
+               close_fd = fd;
+       }
+
+       for (offset = 0; offset < length; ) {
+               for (i = 0; i < IOV_LEN && offset < length; i++) {
+                       iov[i].iov_base = addr + offset;
+                       iov[i].iov_len = 1;
+                       offset += gethugepagesize();
+               }
+               ret = readv(fd, iov, i);
+               if (ret != i) {
+                       DEBUG("Got %d of %d requested; err=%d\n", ret,
+                                       i, ret < 0 ? errno : 0);
+                       WARNING("Failed to reserve %ld huge pages "
+                                       "for new region\n",
+                                       length / gethugepagesize());
+                       if (close_fd >= 0)
+                               close(close_fd);
+                       return -ENOMEM;
                }
        }
 
+       if (close_fd >= 0)
+               close(close_fd);
+
        return 0;
 }
 
-- 
1.7.1


------------------------------------------------------------------------------
Beautiful is writing same markup. Internet Explorer 9 supports
standards for HTML5, CSS3, SVG 1.1,  ECMAScript5, and DOM L2 & L3.
Spend less time writing and  rewriting code and more time creating great
experiences on the web. Be a part of the beta today
http://p.sf.net/sfu/msIE9-sfdev2dev
_______________________________________________
Libhugetlbfs-devel mailing list
Libhugetlbfs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libhugetlbfs-devel

Reply via email to