Hi Tom,

On Wed, 9 Feb 2005 20:49:36 -0600, Tom Zanussi <[EMAIL PROTECTED]> wrote:
> +static inline struct page **alloc_page_array(int size, int *page_count)
> +{
> +       int n_pages;
> +       struct page **page_array;
> +
> +       size = PAGE_ALIGN(size);
> +       n_pages = size >> PAGE_SHIFT;
> +
> +       page_array = kcalloc(n_pages, sizeof(struct page *), GFP_KERNEL);
> +       if (!page_array)
> +               return NULL;
> +       *page_count = n_pages;
> +
> +       return page_array;
> +}

[snip]

> +static int populate_page_array(struct page **page_array, int page_count)
> +{
> +       int i;
> +
> +       for (i = 0; i < page_count; i++) {
> +               page_array[i] = alloc_page(GFP_KERNEL);
> +               if (unlikely(!page_array[i])) {
> +                       depopulate_page_array(page_array, i);
> +                       return -ENOMEM;
> +               }
> +       }
> +       return 0;
> +}
> +
> +/**
> + *     relay_alloc_rchan_buf - allocate a channel buffer
> + *     @size: total size of the buffer
> + *     @page_array: receives a pointer to the buffer's page array
> + *     @page_count: receives the number of pages allocated
> + *
> + *     Returns a pointer to the resulting buffer, NULL if unsuccessful
> + */
> +void *relay_alloc_rchan_buf(unsigned long size, struct page ***page_array,
> +                           int *page_count)
> +{
> +       void *mem;
> +
> +       *page_array = alloc_page_array(size, page_count);
> +       if (!*page_array)
> +               return NULL;
> +
> +       if (populate_page_array(*page_array, *page_count)) {
> +               kfree(*page_array);
> +               *page_array = NULL;
> +               return NULL;
> +       }

[snip]

Please consider inlining alloc_page_array() and populate_page_array()
into relay_alloc_rchan_buf() as they're only used once. You'd get rid
of passing page_count as a pointer this way. If inlining is
unacceptable, please at least move the n_pages calculation to
relay_alloc_rchan_buf() to make the API more sane.

I think relay_alloc_rchan_buf also would benefit from goto-styled
error handling.

                                  Pekka
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to