On Mon, Mar 23, 2009 at 11:12:47PM -0700, Avantika Mathur wrote:
> Mel Gorman wrote:
>
>> On Fri, Mar 20, 2009 at 05:48:25PM -0700, Avantika Mathur wrote:
>>   
>>> Mel Gorman wrote:
>>>     
>> Fix it up so that --hard can be specified anywhere and I'll be happy.
>>
>>   
> I've made it so --hard can be specified anywhere with your suggestion, and 
> also updated man/hugeadm.8.  Hopefully this is the final version!  thanks for 
> the comments
>
> thanks Avantika
>
>
>

> Growing the hugepage pool with --pool-pages-min can fail due to the
> fragmentation within the system but one failure is not a guarantee of
> future failure, particularly if a very large amount of memory has to be
> reclaimed to satisfy the allocation. This patch adds a --hard flag to
> retry allocations multiple times. It initially tries to resize the pool
> up to 5 times. It continues to try if progress is being made towards 
> the resize.
> 
> Signed-off-by: Avantika Mathur <mat...@us.ibm.com>

Acked-by: Mel Gorman <m...@csn.ul.ie>

> ---
> Index: libhugetlbfs/hugeadm.c
> ===================================================================
> --- libhugetlbfs.orig/hugeadm.c       2009-03-20 17:10:02.000000000 -0700
> +++ libhugetlbfs/hugeadm.c    2009-03-23 22:56:53.000000000 -0700
> @@ -67,6 +67,9 @@
>  
>       OPTION("--list-all-mounts", "List all current hugetlbfs mount points");
>       OPTION("--pool-list", "List all pools");
> +     OPTION("--hard", "specified with --pool-pages-min to make");
> +     CONT("multiple attempts at adjusting the pool size to the");
> +     CONT("specified count on failure");
>       OPTION("--pool-pages-min <size>:[+|-]<count>", "");
>       CONT("Adjust pool 'size' lower bound");
>       OPTION("--pool-pages-max <size>:[+|-]<count>", "");
> @@ -97,6 +100,7 @@
>  }
>  
>  int opt_dry_run = 0;
> +int opt_hard = 0;
>  
>  /*
>   * getopts return values for options which are long only.
> @@ -106,6 +110,8 @@
>  #define LONG_POOL_MIN_ADJ    (LONG_POOL|'m')
>  #define LONG_POOL_MAX_ADJ    (LONG_POOL|'M')
>  
> +#define LONG_HARD            ('h' << 8)
> +
>  #define LONG_PAGE    ('P' << 8)
>  #define LONG_PAGE_SIZES      (LONG_PAGE|'s')
>  #define LONG_PAGE_AVAIL      (LONG_PAGE|'a')
> @@ -465,6 +471,7 @@
>  
>       unsigned long min;
>       unsigned long max;
> +     unsigned long last_pool_value;
>  
>       /* Extract the pagesize and adjustment. */
>       page_size_str = strtok_r(cmd, ":", &iter);
> @@ -518,16 +525,38 @@
>               INFO("setting HUGEPAGES_OC to %ld\n", (max - min));
>               set_huge_page_counter(page_size, HUGEPAGES_OC, (max - min));
>       }
> -     if (pools[pos].minimum != min) {
> -             INFO("setting HUGEPAGES_TOTAL to %ld\n", min);
> +
> +     if (opt_hard)
> +             cnt = 5;
> +     else
> +             cnt = -1;
> +
> +     INFO("setting HUGEPAGES_TOTAL to %ld\n", min);
> +     set_huge_page_counter(page_size, HUGEPAGES_TOTAL, min);
> +     get_pool_size(page_size, &pools[pos]);
> +
> +     /* If we fail to make an allocation, retry if user requests */
> +     last_pool_value = pools[pos].minimum;
> +     while ((pools[pos].minimum != min) && (cnt > 0)) {
> +             /* Make note if progress is being made and sleep for IO */
> +             if (last_pool_value == pools[pos].minimum)
> +                     cnt--;
> +             else
> +                     cnt = 5;
> +             sleep(6);
> +
> +             last_pool_value = pools[pos].minimum;
> +             INFO("Retrying allocation HUGEPAGES_TOTAL to %ld current %ld\n",
> +                                                     min, 
> pools[pos].minimum);
>               set_huge_page_counter(page_size, HUGEPAGES_TOTAL, min);
> +             get_pool_size(page_size, &pools[pos]);
>       }
> +
>       /*
>        * HUGEPAGES_TOTAL is not guarenteed to check to exactly the figure
>        * requested should there be insufficient pages.  Check the new
>        * value and adjust HUGEPAGES_OC accordingly.
>        */
> -     get_pool_size(page_size, &pools[pos]);
>       if (pools[pos].minimum != min) {
>               WARNING("failed to set pool minimum to %ld became %ld\n",
>                       min, pools[pos].minimum);
> @@ -566,6 +595,7 @@
>  
>       char opts[] = "+hd";
>       char base[PATH_MAX];
> +     char * opt_min_adj = NULL;
>       int ret = 0, index = 0;
>       struct option long_opts[] = {
>               {"help",       no_argument, NULL, 'h'},
> @@ -574,6 +604,7 @@
>               {"pool-list", no_argument, NULL, LONG_POOL_LIST},
>               {"pool-pages-min", required_argument, NULL, LONG_POOL_MIN_ADJ},
>               {"pool-pages-max", required_argument, NULL, LONG_POOL_MAX_ADJ},
> +             {"hard", no_argument, NULL, LONG_HARD},
>               {"create-mounts", no_argument, NULL, LONG_CREATE_MOUNTS},
>               {"create-user-mounts", required_argument, NULL, 
> LONG_CREATE_USER_MOUNTS},
>               {"create-group-mounts", required_argument, NULL, 
> LONG_CREATE_GROUP_MOUNTS},
> @@ -619,6 +650,10 @@
>               case -1:
>                       break;
>  
> +             case LONG_HARD:
> +                     opt_hard = 1;
> +                     continue;
> +
>               case LONG_LIST_ALL_MOUNTS:
>                       mounts_list_all();
>                       break;
> @@ -628,10 +663,7 @@
>                       break;
>  
>               case LONG_POOL_MIN_ADJ:
> -                     if (! kernel_has_overcommit())
> -                             pool_adjust(optarg, POOL_BOTH);
> -                     else
> -                             pool_adjust(optarg, POOL_MIN);
> +                     opt_min_adj = optarg;
>                       break;
>  
>               case LONG_POOL_MAX_ADJ:
> @@ -679,6 +711,14 @@
>               if (ret != -1)
>                       ops++;
>       }
> +
> +     if (opt_min_adj != NULL) {
> +             if (! kernel_has_overcommit())
> +                     pool_adjust(opt_min_adj, POOL_BOTH);
> +             else
> +                     pool_adjust(opt_min_adj, POOL_MIN);
> +     }
> +
>       index = optind;
>  
>       if ((argc - index) != 0 || ops == 0) {
> Index: libhugetlbfs/man/hugeadm.8
> ===================================================================
> --- libhugetlbfs.orig/man/hugeadm.8   2009-03-23 22:41:06.000000000 -0700
> +++ libhugetlbfs/man/hugeadm.8        2009-03-23 22:57:15.000000000 -0700
> @@ -117,6 +117,15 @@
>  the number of huge pages requested by applications is between the Minimum and
>  Maximum pool sizes.
>  
> +.TP
> +.B --hard
> +
> +
> +This option is specified with --pool-pages-min to retry allocations multiple
> +times on failure to allocate the desired count of pages. It initially tries
> +to resize the pool up to 5 times and continues to try if progress is being
> +made towards the resize.
> +
>  .SH SEE ALSO
>  .I oprofile(1),
>  .I pagesize(1),


-- 
Mel Gorman
Part-time Phd Student                          Linux Technology Center
University of Limerick                         IBM Dublin Software Lab

------------------------------------------------------------------------------
Apps built with the Adobe(R) Flex(R) framework and Flex Builder(TM) are
powering Web 2.0 with engaging, cross-platform capabilities. Quickly and
easily build your RIAs with Flex Builder, the Eclipse(TM)based development
software that enables intelligent coding and step-through debugging.
Download the free 60 day trial. http://p.sf.net/sfu/www-adobe-com
_______________________________________________
Libhugetlbfs-devel mailing list
Libhugetlbfs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libhugetlbfs-devel

Reply via email to