Index: linux-2.6.21-rc4/include/linux/quicklist.h =================================================================== --- linux-2.6.21-rc4.orig/include/linux/quicklist.h 2007-03-28 10:35:25.000000000 -0700 +++ linux-2.6.21-rc4/include/linux/quicklist.h 2007-03-28 10:46:53.000000000 -0700 @@ -14,7 +14,7 @@ #ifdef CONFIG_QUICKLIST struct quicklist { - void *page; + struct list_head list; int nr_pages; }; @@ -33,13 +33,14 @@ DECLARE_PER_CPU(struct quicklist, quickl static inline void *quicklist_alloc(int nr, gfp_t flags, void (*ctor)(void *)) { struct quicklist *q; - void **p = NULL; + struct list_head *p = NULL; q =&get_cpu_var(quicklist)[nr]; - p = q->page; - if (likely(p)) { - q->page = p[0]; - p[0] = NULL; + if (likely(!list_empty(&q->list))) { + p = q->list.next; + list_del(p); + p->next = NULL; + p->prev = NULL; q->nr_pages--; } put_cpu_var(quicklist); @@ -55,7 +56,7 @@ static inline void *quicklist_alloc(int static inline void quicklist_free(int nr, void (*dtor)(void *), void *pp) { struct quicklist *q; - void **p = pp; + struct list_head *p = pp; struct page *page = virt_to_page(p); int nid = page_to_nid(page); @@ -67,8 +68,7 @@ static inline void quicklist_free(int nr } q = &get_cpu_var(quicklist)[nr]; - p[0] = q->page; - q->page = p; + list_add(p, &q->list); q->nr_pages++; put_cpu_var(quicklist); } Index: linux-2.6.21-rc4/mm/quicklist.c =================================================================== --- linux-2.6.21-rc4.orig/mm/quicklist.c 2007-03-28 10:38:36.000000000 -0700 +++ linux-2.6.21-rc4/mm/quicklist.c 2007-03-28 10:40:25.000000000 -0700 @@ -51,17 +51,15 @@ void quicklist_trim(int nr, void (*dtor) { long pages_to_free; struct quicklist *q; + struct list_head *p; q = &get_cpu_var(quicklist)[nr]; if (q->nr_pages > min_pages) { pages_to_free = min_pages_to_free(q, min_pages, max_free); - while (pages_to_free > 0) { - /* - * We pass a gfp_t of 0 to quicklist_alloc here - * because we will never call into the page allocator. - */ - void *p = quicklist_alloc(nr, 0, NULL); + while (pages_to_free > 0 && !list_empty(&q->list)) { + p = q->list.prev; + list_del(p); if (dtor) dtor(p);