On Tue, 2008-10-28 at 13:54 +0000, Andy Whitcroft wrote: > 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]>
Acked-by: Adam Litke <[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", -- Adam Litke - (agl at us.ibm.com) IBM Linux Technology Center ------------------------------------------------------------------------- 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