missing proper initialization Index: linux-2.6.21-rc5-mm4/include/linux/quicklist.h =================================================================== --- linux-2.6.21-rc5-mm4.orig/include/linux/quicklist.h 2007-04-07 21:38:52.000000000 -0700 +++ linux-2.6.21-rc5-mm4/include/linux/quicklist.h 2007-04-07 21:51:13.000000000 -0700 @@ -14,7 +14,7 @@ #ifdef CONFIG_QUICKLIST struct quicklist { - void *page; + struct list_head list; int nr_pages; }; @@ -33,13 +33,14 @@ 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); @@ -66,8 +67,9 @@ } q = &get_cpu_var(quicklist)[nr]; - *(void **)p = q->page; - q->page = p; + if (!q->nr_pages) + INIT_LIST_HEAD(&q->list); + list_add((struct list_head *)q, &q->list); q->nr_pages++; put_cpu_var(quicklist); } Index: linux-2.6.21-rc5-mm4/mm/quicklist.c =================================================================== --- linux-2.6.21-rc5-mm4.orig/mm/quicklist.c 2007-04-07 21:38:52.000000000 -0700 +++ linux-2.6.21-rc5-mm4/mm/quicklist.c 2007-04-07 21:46:32.000000000 -0700 @@ -51,17 +51,15 @@ { 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);