On Fri, Oct 10, 2008 at 02:23:14PM +0100, Mel Gorman wrote:
> On (09/10/08 20:20), Andy Whitcroft didst pronounce:
> > Utilise the new gethugepagesizes call to implement getpagesizes() call
> > returning all page sizes on the system, both base page sizes and all
> > hugepage sizes.
> > 
> > Signed-off-by: Andy Whitcroft <[EMAIL PROTECTED]>
> > ---
> >  hugetlbfs.h              |    1 +
> >  hugeutils.c              |   27 ++++++++++++++
> >  tests/gethugepagesizes.c |   87 
> > +++++++++++++++++++++++++++++++++++++---------
> >  3 files changed, 98 insertions(+), 17 deletions(-)
> > 
> > diff --git a/hugetlbfs.h b/hugetlbfs.h
> > index 985e138..3f2eb30 100644
> > --- a/hugetlbfs.h
> > +++ b/hugetlbfs.h
> > @@ -23,6 +23,7 @@
> >  
> >  long gethugepagesize(void);
> >  int gethugepagesizes(long pagesizes[], int n_elem);
> > +int getpagesizes(long pagesizes[], int n_elem);
> >  int hugetlbfs_test_path(const char *mount);
> >  long hugetlbfs_test_pagesize(const char *mount);
> >  const char *hugetlbfs_find_path(void);
> > diff --git a/hugeutils.c b/hugeutils.c
> > index a48fa36..75b71b1 100644
> > --- a/hugeutils.c
> > +++ b/hugeutils.c
> > @@ -617,6 +617,33 @@ int gethugepagesizes(long pagesizes[], int n_elem)
> >     return nr_sizes;
> >  }
> >  
> > +int getpagesizes(long pagesizes[], int n_elem)
> > +{
> > +   int ret;
> > +
> > +   if (n_elem < 0 || (n_elem > 0 && pagesizes == NULL)) {
> > +           errno = EINVAL;
> > +           return -1;
> > +   }
> > +
> > +   /* Requests for sizing, we need one more slot than gethugepagesizes. */
> > +   if (pagesizes == NULL && n_elem == 0) {
> > +           ret = gethugepagesizes(pagesizes, n_elem);
> > +
> 
> Should it be
> 
> ret = gethugepagesizes(pagesizes, n_elem) + 1;
> 
> for the  base page size?

No as the incantation in all cases must be:

        ret = gethugepagesizes(pagesizes, n_elem);
        if (ret < 0)
                return ret;
        return ret + 1;

> > +   } else {
> > +           /* Install the base page size. */
> > +           if (n_elem && pagesizes)
> > +                   pagesizes[0] = sysconf(_SC_PAGESIZE);
> > +                if (n_elem == 1)
> > +                        return 1;
> > +
> > +           ret = gethugepagesizes(pagesizes + 1, n_elem - 1);
> > +   }
> > +   if (ret < 0)
> > +           return ret;
> > +   return ret + 1;
> > +} 
> > +
> >  int hugetlbfs_test_path(const char *mount)
> >  {
> >     struct statfs64 sb;
> > diff --git a/tests/gethugepagesizes.c b/tests/gethugepagesizes.c
> > index 34e9957..6118ae7 100644
> > --- a/tests/gethugepagesizes.c
> > +++ b/tests/gethugepagesizes.c
> > @@ -72,6 +72,8 @@ DIR *opendir(const char *name)
> >     }
> >  }
> >  
> > +#define HPAGE_SIZE (16 * 1024)
> > +
> >  /*
> >   * Override read_meminfo to simulate various conditions
> >   */
> > @@ -86,7 +88,7 @@ long read_meminfo(const char *tag)
> >  
> >     switch (meminfo_state) {
> >             case OVERRIDE_OFF:      return real_read_meminfo(tag);
> > -           case OVERRIDE_ON:       return 16 * 1024;
> > +           case OVERRIDE_ON:       return HPAGE_SIZE;
> >             default:                return -1;
> >     }
> >  }
> > @@ -141,12 +143,11 @@ void cleanup(void)
> >             cleanup_fake_sysfs();
> >  }
> >  
> > -#define INIT_SIZES(a, v1, v2, v3) {a[0] = v1; a[1] = v2; a[2] = v3; a[3] = 
> > -1;}
> > -
> > -void expect_sizes(int line, int expected, int actual,
> > -                   long expected_sizes[], long actual_sizes[])
> > +void validate_sizes(int line, long actual_sizes[], int actual, int 
> > max_actual,
> > +                   long expected_sizes[], int expected)
> >  {
> >     int i, j;
> > +
> 
> Spurious whitespace change

Fixed.

> >     if (expected != actual)
> >             FAIL("Line %i: Wrong number of sizes returned -- expected %i "
> >                     "got %i", line, expected, actual);
> > @@ -159,12 +160,37 @@ void expect_sizes(int line, int expected, int actual,
> >                     FAIL("Line %i: Expected size %li not found in actual "
> >                             "results", line, expected_sizes[i]);
> >     }
> > -}  
> > +
> > +   for (i = expected; i < max_actual; i++)
> > +           if (actual_sizes[i] != 42)
> > +                   FAIL("Line %i: Wrote past official limit at %i",
> > +                           line, i);
> > +}
> > +
> > +#define MAX 16
> > +#define EXPECT_SIZES(func, max, count, expected)                   \
> > +({                                                                 \
> > +   long __a[MAX] = { [0 ... MAX-1] = 42 };                         \
> > +   int __na;                                                       \
> > +   int __l = (count < max) ? count : max;                          \
> > +                                                                   \
> > +   __na = func(__a, max);                                          \
> > +                                                                   \
> > +   validate_sizes(__LINE__, __a, __na, MAX, expected, __l);        \
> > +                                                                   \
> > +   __na;                                                           \
> > +})
> > +
> > +#define INIT_LIST(a, values...)                                            
> > \
> > +({                                                                 \
> > +   long __e[] = { values };                                        \
> > +   memcpy(a, __e, sizeof(__e));                                    \
> > +})
> >  
> >  int main(int argc, char *argv[])
> >  {
> > -   long expected_sizes[4], actual_sizes[4], meminfo_size;
> > -   int nr_sizes;
> > +   long expected_sizes[MAX], actual_sizes[MAX], meminfo_size;
> > +   long base_size = sysconf(_SC_PAGESIZE);
> >  
> >     test_init(argc, argv);
> >  
> > @@ -175,11 +201,17 @@ int main(int argc, char *argv[])
> >      */
> >     meminfo_state = OVERRIDE_OFF;
> >     sysfs_state = OVERRIDE_OFF;
> > +
> >     if (gethugepagesizes(actual_sizes, -1) != -1 || errno != EINVAL)
> >             FAIL("Mishandled params (n_elem < 0)");
> >     if (gethugepagesizes(NULL, 1) != -1 || errno != EINVAL)
> >             FAIL("Mishandled params (pagesizes == NULL, n_elem > 0)");
> >  
> > +   if (getpagesizes(actual_sizes, -1) != -1 || errno != EINVAL)
> > +           FAIL("Mishandled params (n_elem < 0)");
> > +   if (getpagesizes(NULL, 1) != -1 || errno != EINVAL)
> > +           FAIL("Mishandled params (pagesizes == NULL, n_elem > 0)");
> > +
> >     /*
> >      * ===
> >      * Test some corner cases using a fake system configuration
> > @@ -190,8 +222,11 @@ int main(int argc, char *argv[])
> >      * Check handling when /proc/meminfo indicates no huge page support
> >      */
> >     meminfo_state = OVERRIDE_MISSING;
> > -   if (gethugepagesizes(actual_sizes, 1) != 0 || errno != 0)
> > -           FAIL("Incorrect handling when huge page support is missing");
> > +
> > +   EXPECT_SIZES(gethugepagesizes, MAX, 0, expected_sizes);
> > +
> > +   INIT_LIST(expected_sizes, base_size);
> > +   EXPECT_SIZES(getpagesizes, MAX, 1, expected_sizes);
> >  
> >     /*
> >      * When the sysfs heirarchy is not present ...
> > @@ -201,26 +236,44 @@ int main(int argc, char *argv[])
> >     /* ... only the meminfo size is returned. */
> >     meminfo_state = OVERRIDE_ON;
> >     meminfo_size = read_meminfo("Hugepagesize:") * 1024;
> > -   INIT_SIZES(expected_sizes, meminfo_size, -1, -1);
> >  
> > -   /* Use 2 to give the function the chance to return too many sizes */
> > -   nr_sizes = gethugepagesizes(actual_sizes, 2);
> > -   expect_sizes(__LINE__, 1, nr_sizes, expected_sizes, actual_sizes);
> > +   INIT_LIST(expected_sizes, meminfo_size);
> > +   EXPECT_SIZES(gethugepagesizes, MAX, 1, expected_sizes);
> >     
> > +   INIT_LIST(expected_sizes, base_size, meminfo_size);
> > +   EXPECT_SIZES(getpagesizes, MAX, 2, expected_sizes);
> > +
> >     /*
> >      * When sysfs defines additional sizes ...
> >      */
> > -   INIT_SIZES(expected_sizes, meminfo_size, 1024, 2048);
> > +   INIT_LIST(expected_sizes, meminfo_size, 1024 * 1024, 2048 * 1024);
> > +
> >     setup_fake_sysfs(expected_sizes, 3);
> >     sysfs_state = OVERRIDE_ON;
> >  
> >     /* ... make sure all sizes are returned without duplicates */
> > -   nr_sizes = gethugepagesizes(actual_sizes, 4);
> > -   expect_sizes(__LINE__, 3, nr_sizes, expected_sizes, actual_sizes);
> > +   /* ... while making sure we do not overstep our limit */
> > +   EXPECT_SIZES(gethugepagesizes, MAX, 3, expected_sizes);
> > +   EXPECT_SIZES(gethugepagesizes, 1, 3, expected_sizes);
> > +   EXPECT_SIZES(gethugepagesizes, 2, 3, expected_sizes);
> > +   EXPECT_SIZES(gethugepagesizes, 3, 3, expected_sizes);
> > +   EXPECT_SIZES(gethugepagesizes, 4, 3, expected_sizes);
> > +
> > +   INIT_LIST(expected_sizes,
> > +                   base_size, meminfo_size, 1024 * 1024, 2048 * 1024);
> > +   EXPECT_SIZES(getpagesizes, MAX, 4, expected_sizes);
> > +   EXPECT_SIZES(getpagesizes, 1, 4, expected_sizes);
> > +   EXPECT_SIZES(getpagesizes, 2, 4, expected_sizes);
> > +   EXPECT_SIZES(getpagesizes, 3, 4, expected_sizes);
> > +   EXPECT_SIZES(getpagesizes, 4, 4, expected_sizes);
> > +   EXPECT_SIZES(getpagesizes, 5, 4, expected_sizes);
> >  
> >     /* ... we can check how many sizes are supported. */
> >     if (gethugepagesizes(NULL, 0) != 3)
> >             FAIL("Unable to check the number of supported sizes");
> >  
> > +   if (getpagesizes(NULL, 0) != 4)
> > +           FAIL("Unable to check the number of supported sizes");
> > +
> >     PASS();
> >  }

-apw

-------------------------------------------------------------------------
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