On Fri, Oct 24, 2008 at 03:28:49PM +0100, Andy Whitcroft wrote: > On Fri, Oct 24, 2008 at 02:01:58PM +0100, Mel Gorman wrote: > > On Thu, Oct 23, 2008 at 03:54:59PM +0100, Andy Whitcroft wrote: > > > gethugepagesizes has two modes: a counting mode which tells us exactly > > > how many entries we would need; and a lookup mode which fills in a > > > supplied buffer. > > > > > > The counting mode is defined as triggering when we pass in both a zero > > > element count and a NULL buffer pointer. Currently we enter this mode > > > when > > > the element count is zero which causes it to trigger at the edge case > > > where > > > the caller (pointlessly) passes in a buffer with an element count of zero. > > > Fix behaviour to match the documentation. > > > > > > Signed-off-by: Andy Whitcroft <[EMAIL PROTECTED]> > > > --- > > > hugeutils.c | 19 ++++++++++--------- > > > 1 files changed, 10 insertions(+), 9 deletions(-) > > > > > > diff --git a/hugeutils.c b/hugeutils.c > > > index ae60f39..eb0b7b2 100644 > > > --- a/hugeutils.c > > > +++ b/hugeutils.c > > > @@ -581,11 +581,11 @@ int gethugepagesizes(long pagesizes[], int n_elem) > > > if (default_size < 0) > > > return 0; > > > > > > - if (n_elem && pagesizes) > > > + if (pagesizes && (nr_sizes == n_elem)) > > > + return nr_sizes; > > > > Ok, this is a little confusing because nr_sizes == 0 - can't we just go > > pagesizes && n_elem == 0 ? > > well its consistent with the other version of this check in this > function which must use nr_sizes. >
Ok, fair enough. When applied it was obvious. It was looking at it in patch form that I was scratching my head. > > Otherwise, the behaviour appears to match the documentation. If you > > supply a buffer with zero elements, then 0 pagesizes are put in the > > buffer. > > > > > + if (pagesizes) > > > pagesizes[nr_sizes] = default_size; > > > > I'm not seeing why you have to check pagesizes here. Earlier in the > > function, we already check it for EINVAL and the check above would exit > > if n_elem was 0 so we know the array is valid at this point, right? > > If we are in counting mode, pagesizes is null and we cannot write to it, > but we must continue to accumulate nr_sizes. > D'OH, I wasn't taking the counting use of the function into account. *sleps forehead*. > > > nr_sizes++; > > > - if (n_elem && (nr_sizes == n_elem)) > > > - return nr_sizes; > > > > > > /* > > > * Scan sysfs to look for other sizes. > > > @@ -599,8 +599,7 @@ int gethugepagesizes(long pagesizes[], int n_elem) > > > } else > > > return -1; > > > } > > > - while ((ent = readdir(sysfs)) && > > > - ((n_elem == 0) || (nr_sizes < n_elem))) { > > > + while ((ent = readdir(sysfs))) { > > > long size; > > > > > > if (strncmp(ent->d_name, "hugepages-", 10)) > > > @@ -613,7 +612,9 @@ int gethugepagesizes(long pagesizes[], int n_elem) > > > > > > if (size < 0 || size == default_size) > > > continue; > > > - if (n_elem && pagesizes) > > > + if (pagesizes && (nr_sizes == n_elem)) > > > + return nr_sizes; > > > + if (pagesizes) > > > pagesizes[nr_sizes] = size; > > > > Can we really reach here with pagesizes == NULL? > > Yes, when we call this n_elem 0, pagesizes = NULL we are in counting > mode and iterate over all entries just counting nr_sizes. > > > > nr_sizes++; > > > } > > > @@ -636,10 +637,10 @@ int getpagesizes(long pagesizes[], int n_elem) > > > ret = gethugepagesizes(pagesizes, n_elem); > > > } else { > > > /* Install the base page size. */ > > > - if (n_elem && pagesizes) > > > + if (pagesizes && n_elem == 0) > > > + return 0; > > > > Here the test is easier to follow. > > And I am trying to be consistant with here for that clarity. > > > > + if (pagesizes) > > > pagesizes[0] = sysconf(_SC_PAGESIZE); > > > - if (n_elem == 1) > > > - return 1; > > > > > > ret = gethugepagesizes(pagesizes + 1, n_elem - 1); > > > } > Acked-by: Mel Gorman <[EMAIL PROTECTED]> -- 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