From: Nick Piggin Allocate a compound page for the user mapping instead of tweaking the page refcounts. Signed-off-by: Nick Piggin Cc: Dave Airlie Signed-off-by: Andrew Morton --- drivers/char/drm/ati_pcigart.c | 11 ++++------- 1 files changed, 4 insertions(+), 7 deletions(-) diff -puN drivers/char/drm/ati_pcigart.c~ati_pcigart-simplify-page_count-manipulations drivers/char/drm/ati_pcigart.c --- devel/drivers/char/drm/ati_pcigart.c~ati_pcigart-simplify-page_count-manipulations 2006-01-18 20:04:04.000000000 -0800 +++ devel-akpm/drivers/char/drm/ati_pcigart.c 2006-01-18 20:05:10.000000000 -0800 @@ -59,17 +59,16 @@ static void *drm_ati_alloc_pcigart_table int i; DRM_DEBUG("%s\n", __FUNCTION__); - address = __get_free_pages(GFP_KERNEL, ATI_PCIGART_TABLE_ORDER); + address = __get_free_pages(GFP_KERNEL | __GFP_COMP, + ATI_PCIGART_TABLE_ORDER); if (address == 0UL) { return NULL; } page = virt_to_page(address); - for (i = 0; i < ATI_PCIGART_TABLE_PAGES; i++, page++) { - get_page(page); + for (i = 0; i < ATI_PCIGART_TABLE_PAGES; i++, page++) SetPageReserved(page); - } DRM_DEBUG("%s: returning 0x%08lx\n", __FUNCTION__, address); return (void *)address; @@ -83,10 +82,8 @@ static void drm_ati_free_pcigart_table(v page = virt_to_page((unsigned long)address); - for (i = 0; i < ATI_PCIGART_TABLE_PAGES; i++, page++) { - __put_page(page); + for (i = 0; i < ATI_PCIGART_TABLE_PAGES; i++, page++) ClearPageReserved(page); - } free_pages((unsigned long)address, ATI_PCIGART_TABLE_ORDER); } _