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