Prefaulting should be disabled when the kernel supports private reservations.
Currently this check is part of the morecore_setup function and is only made
if HUGETLB_MORECORE is 'yes'.  This is a problem for users of
get_hugepage_region because prefaulting will slow allocation down significantly.
This patch moves the check for private reservations into s separate function
that is called during hugetlb_setup.

Signed-off-by: Eric B Munson <[email protected]>
---
 hugeutils.c             |   14 ++++++++++++++
 init.c                  |    1 +
 libhugetlbfs_internal.h |    2 ++
 morecore.c              |   11 -----------
 4 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/hugeutils.c b/hugeutils.c
index 86dd120..d6f8940 100644
--- a/hugeutils.c
+++ b/hugeutils.c
@@ -302,6 +302,20 @@ void hugetlbfs_setup_env()
                __hugetlb_opts.shm_enabled = 1;
 }
 
+void hugetlbfs_check_priv_resv()
+{
+       /*
+        * If the kernel supports MAP_PRIVATE reservations, we can skip
+        * prefaulting the huge pages we allocate since the kernel
+        * guarantees them.  This can help NUMA performance quite a bit.
+        */
+       if (hugetlbfs_test_feature(HUGETLB_FEATURE_PRIVATE_RESV)) {
+               INFO("Kernel has MAP_PRIVATE reservations.  Disabling "
+                       "heap prefaulting.\n");
+               __hugetlbfs_prefault = 0;
+       }
+}
+
 /*
  * Pool counters are typically exposed in sysfs in modern kernels, the
  * counters for the default page size are exposed in procfs in all kernels
diff --git a/init.c b/init.c
index 794e03c..e95cb5c 100644
--- a/init.c
+++ b/init.c
@@ -25,6 +25,7 @@ static void __attribute__ ((constructor)) 
setup_libhugetlbfs(void)
        hugetlbfs_setup_debug();
        setup_mounts();
        setup_features();
+       hugetlbfs_check_priv_resv();
 #ifndef NO_ELFLINK
        hugetlbfs_setup_elflink();
 #endif
diff --git a/libhugetlbfs_internal.h b/libhugetlbfs_internal.h
index b3c3a38..05c22e0 100644
--- a/libhugetlbfs_internal.h
+++ b/libhugetlbfs_internal.h
@@ -98,6 +98,8 @@ extern void hugetlbfs_setup_debug();
 extern void setup_mounts();
 #define setup_features __lh_setup_features
 extern void setup_features();
+#define hugetlbfs_check_priv_resv __lh_hugetlbfs_check_priv_resv
+extern void hugetlbfs_check_priv_resv();
 #define __hugetlbfs_hostname __lh___hugetlbfs_hostname
 extern char __hugetlbfs_hostname[];
 #define hugetlbfs_prefault __lh_hugetlbfs_prefault
diff --git a/morecore.c b/morecore.c
index 56acf44..232e04a 100644
--- a/morecore.c
+++ b/morecore.c
@@ -227,17 +227,6 @@ void hugetlbfs_setup_morecore(void)
                return;
        }
 
-       /*
-        * If the kernel supports MAP_PRIVATE reservations, we can skip
-        * prefaulting the huge pages we allocate for the heap since the
-        * kernel guarantees them.  This can help NUMA performance quite a bit.
-        */
-       if (hugetlbfs_test_feature(HUGETLB_FEATURE_PRIVATE_RESV)) {
-               INFO("Kernel has MAP_PRIVATE reservations.  Disabling "
-                       "heap prefaulting.\n");
-               __hugetlbfs_prefault = 0;
-       }
-
        if (hpage_size <= 0) {
                if (errno == ENOSYS)
                        WARNING("Hugepages unavailable\n");
-- 
1.6.1.2


------------------------------------------------------------------------------
The NEW KODAK i700 Series Scanners deliver under ANY circumstances! Your
production scanning environment may not be a perfect world - but thanks to
Kodak, there's a perfect scanner to get the job done! With the NEW KODAK i700
Series Scanner you'll get full speed at 300 dpi even with all image 
processing features enabled. http://p.sf.net/sfu/kodak-com
_______________________________________________
Libhugetlbfs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libhugetlbfs-devel

Reply via email to