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/