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

Reply via email to