We use the kernel default page size all over the place. We use it approximatly 6 times when setting the boundaries on a single pool. Currently every place looks this value up in /proc/meminfo which is very costly.
As this value is essentially static per boot we can cache this value. Create a new routine kernel_default_hugepage_size() which looks this up and caches the result. Signed-off-by: Andy Whitcroft <[EMAIL PROTECTED]> Acked-by: Eric B Munson <[EMAIL PROTECTED]> Acked-by: Mel Gorman <[EMAIL PROTECTED]> --- hugeutils.c | 33 +++++++++++++++++++++------------ libhugetlbfs_privutils.h | 3 +++ shm.c | 2 +- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/hugeutils.c b/hugeutils.c index ba8f46d..736d07d 100644 --- a/hugeutils.c +++ b/hugeutils.c @@ -55,10 +55,24 @@ static struct hpage_size hpage_sizes[MAX_HPAGE_SIZES]; static int nr_hpage_sizes; static int hpage_sizes_default_idx = -1; +static int default_size; + /********************************************************************/ /* Internal functions */ /********************************************************************/ +/* + * Lookup the kernel default page size. + */ +long kernel_default_hugepage_size() +{ + if (default_size == 0) { + default_size = file_read_ulong(MEMINFO, "Hugepagesize:"); + default_size = size_to_smaller_unit(default_size); /* kB to B */ + } + return default_size; +} + #define BUF_SZ 256 #define MEMINFO_SIZE 2048 @@ -240,8 +254,7 @@ static int select_pool_counter(unsigned int counter, unsigned long pagesize, * between libhugetlbfs and the test suite. For now we will just * read /proc/meminfo. */ - default_size = file_read_ulong(MEMINFO, "Hugepagesize:"); - default_size = size_to_smaller_unit(default_size); /* kB to B */ + default_size = kernel_default_hugepage_size(); if (default_size < 0) { ERROR("Cannot determine the default page size\n"); return -1; @@ -290,8 +303,7 @@ static void probe_default_hpage_size(void) if (env && strlen(env) > 0) size = parse_page_size(env); else { - size = file_read_ulong(MEMINFO, "Hugepagesize:"); - size *= 1024; /* convert from kB to B */ + size = kernel_default_hugepage_size(); } if (size >= 0) { @@ -506,8 +518,7 @@ int hpool_sizes(struct hpage_pool *pools, int pcnt) DIR *dir; struct dirent *entry; - default_size = size_to_smaller_unit(file_read_ulong(MEMINFO, - "Hugepagesize:")); + default_size = kernel_default_hugepage_size(); if (default_size >= 0 && which < pcnt) if (get_pool_size(default_size, &pools[which])) { pools[which].is_default = 1; @@ -543,8 +554,7 @@ int hpool_sizes(struct hpage_pool *pools, int pcnt) */ int kernel_has_hugepages(void) { - long default_size = file_read_ulong(MEMINFO, "Hugepagesize:"); - default_size = size_to_smaller_unit(default_size); + long default_size = kernel_default_hugepage_size(); if (default_size < 0) return 0; @@ -557,8 +567,7 @@ int kernel_has_hugepages(void) */ int kernel_has_overcommit(void) { - long default_size = file_read_ulong(MEMINFO, "Hugepagesize:"); - default_size = size_to_smaller_unit(default_size); + long default_size = kernel_default_hugepage_size(); if (default_size < 0) return 0; @@ -616,8 +625,8 @@ int gethugepagesizes(long pagesizes[], int n_elem) errno = 0; - /* Get the system default size from /proc/meminfo */ - default_size = read_meminfo("Hugepagesize:") * 1024; + /* Get the system default size. */ + default_size = kernel_default_hugepage_size(); if (default_size < 0) return 0; diff --git a/libhugetlbfs_privutils.h b/libhugetlbfs_privutils.h index 4e01aac..c31d526 100644 --- a/libhugetlbfs_privutils.h +++ b/libhugetlbfs_privutils.h @@ -61,6 +61,9 @@ int kernel_has_overcommit(void); #define read_meminfo __pu_read_meminfo long read_meminfo(const char *tag); +#define kernel_default_hugepage_size __pu_kernel_default_hugepage_size +long kernel_default_hugepage_size(void); + /* Kernel feature testing */ /* This enum defines the bits in a feature bitmask */ enum { diff --git a/shm.c b/shm.c index 8a56725..ac3b52a 100644 --- a/shm.c +++ b/shm.c @@ -60,7 +60,7 @@ int shmget(key_t key, size_t size, int shmflg) * Use /proc/meminfo because shm always uses the system * default huge page size. */ - long hpage_size = read_meminfo("Hugepagesize:") * 1024; + long hpage_size = kernel_default_hugepage_size(); aligned_size = ALIGN(size, hpage_size); if (size != aligned_size) { DEBUG("hugetlb_shmem: size growth align %zd -> %zd\n", -- 1.6.0.2.711.gf1ba4 ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ Libhugetlbfs-devel mailing list Libhugetlbfs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libhugetlbfs-devel