On (10/10/08 14:41), Andy Whitcroft didst pronounce: > 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; >
Doh, of course. > > > + } 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 > -- Mel Gorman Part-time Phd Student Linux Technology Center University of Limerick IBM Dublin Software Lab ------------------------------------------------------------------------- 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