static long cmm_alloc_pages(long pages, long *counter, struct cmm_page_array **list) { struct cmm_page_array *pa; unsigned long page; pa = *list; while (pages) { page = __get_free_page(GFP_NOIO); if (!page) break; if (!pa || pa->index >= CMM_NR_PAGES) { /* Need a new page for the page list. */ pa = (struct cmm_page_array *) __get_free_page(GFP_NOIO); if (!pa) { free_page(page); break; } pa->next = *list; pa->index = 0; *list = pa; } diag10(page); pa->pages[pa->index++] = page; (*counter)++; pages--; } return pages; }
static long cmm_alloc_pages(long nr, long *counter, struct cmm_page_array **list) { struct cmm_page_array *pa, *npa; unsigned long addr; while (nr) { addr = __get_free_page(GFP_NOIO); if (!addr) break; spin_lock(&cmm_lock); pa = *list; if (!pa || pa->index >= CMM_NR_PAGES) { /* Need a new page for the page list. */ spin_unlock(&cmm_lock); npa = (struct cmm_page_array *) __get_free_page(GFP_NOIO); if (!npa) { free_page(addr); break; } spin_lock(&cmm_lock); pa = *list; if (!pa || pa->index >= CMM_NR_PAGES) { npa->next = pa; npa->index = 0; pa = npa; *list = pa; } else free_page((unsigned long) npa); } diag10(addr); pa->pages[pa->index++] = addr; (*counter)++; spin_unlock(&cmm_lock); nr--; } return nr; }