xpages = 1UL << order;
        npages = (newsize + PAGE_SIZE - 1) >> PAGE_SHIFT;
 
-       for (loop = 0; loop < npages; loop++)
-               set_page_count(pages + loop, 1);
+       split_page(pages, order);
 
        /* trim off any pages we don't actually require */
        for (loop = npages; loop < xpages; loop++)
 
 
 void put_page(struct page *page);
 
-#ifdef CONFIG_MMU
 void split_page(struct page *page, unsigned int order);
-#else
-static inline void split_page(struct page *page, unsigned int order) {}
-#endif
 
 /*
  * Multiple processes may "see" the same page. E.g. for untouched
 
 
 static inline void set_page_refs(struct page *page, int order)
 {
-#ifdef CONFIG_MMU
        set_page_count(page, 1);
-#else
-       int i;
-
-       /*
-        * We need to reference all the pages for this order, otherwise if
-        * anyone accesses one of the pages with (get/put) it will be freed.
-        * - eg: access_process_vm()
-        */
-       for (i = 0; i < (1 << order); i++)
-               set_page_count(page + i, 1);
-#endif /* CONFIG_MMU */
 }
 
 static inline void __put_page(struct page *page)
 
        /*
         * kmalloc doesn't like __GFP_HIGHMEM for some reason
         */
-       return kmalloc(size, gfp_mask & ~__GFP_HIGHMEM);
+       return kmalloc(size, (gfp_mask | __GFP_COMP) & ~__GFP_HIGHMEM);
 }
 
 struct page * vmalloc_to_page(void *addr)
         * - note that this may not return a page-aligned address if the object
         *   we're allocating is smaller than a page
         */
-       base = kmalloc(len, GFP_KERNEL);
+       base = kmalloc(len, GFP_KERNEL|__GFP_COMP);
        if (!base)
                goto enomem;
 
 
                mutex_debug_check_no_locks_freed(page_address(page),
                                                 PAGE_SIZE<<order);
 
-#ifndef CONFIG_MMU
-       for (i = 1 ; i < (1 << order) ; ++i)
-               __put_page(page + i);
-#endif
-
        for (i = 0 ; i < (1 << order) ; ++i)
                reserved += free_pages_check(page + i);
        if (reserved)
                clear_highpage(page + i);
 }
 
-#ifdef CONFIG_MMU
 /*
  * split_page takes a non-compound higher-order page, and splits it into
  * n (1<<order) sub-pages: page[0..n]
                set_page_count(page + i, 1);
        }
 }
-#endif
 
 /*
  * Really, prep_compound_page() should be called from __rmqueue_bulk().  But
 
 
 static inline struct kmem_cache *page_get_cache(struct page *page)
 {
+       if (unlikely(PageCompound(page)))
+               page = (struct page *)page_private(page);
        return (struct kmem_cache *)page->lru.next;
 }
 
 
 static inline struct slab *page_get_slab(struct page *page)
 {
+       if (unlikely(PageCompound(page)))
+               page = (struct page *)page_private(page);
        return (struct slab *)page->lru.prev;
 }
 
        struct page *page;
 
        /* Nasty!!!!!! I hope this is OK. */
-       i = 1 << cachep->gfporder;
        page = virt_to_page(objp);
+
+       i = 1;
+       if (likely(!PageCompound(page)))
+               i <<= cachep->gfporder;
        do {
                page_set_cache(page, cachep);
                page_set_slab(page, slabp);