Cold allocation so that swsusp works
Subsystems (3)
Hi!
This is my try to make swsusp work... Does it look acceptable?
Pavel
include/linux/gfp.h +1 -0
@@ -18,6 +18,7 @@#define __GFP_HIGHIO 0x80/* Can start high mem physical IO? */ #define __GFP_FS 0x100/* Can call down to low-level FS? */ #define __GFP_COLD 0x200/* Cache-cold page required */ +#define __GFP_SWSUSP 0x400/* We want page that used to be free, not some page from list */ #define GFP_NOHIGHIO ( __GFP_WAIT | __GFP_IO)#define GFP_NOIO ( __GFP_WAIT)
kernel/suspend.c +2 -2
@@ -547,7 +547,7 @@ pagedir_order =get_bitmask_order (SUSPEND_PD_PAGES (nr_copy_pages)); - p = pagedir = (suspend_pagedir_t *)__get_free_pages (GFP_ATOMIC | __GFP_COLD, pagedir_order); + p = pagedir = (suspend_pagedir_t *)__get_free_pages (GFP_ATOMIC | __GFP_SWSUSP, pagedir_order);if (!pagedir)return NULL ;
@@ -556,7 +556,7 @@SetPageNosave (page++);while (nr_copy_pages--) { - p->address =get_zeroed_page (GFP_ATOMIC | __GFP_COLD); + p->address =get_zeroed_page (GFP_ATOMIC | __GFP_SWSUSP);if (!p->address) {free_suspend_pagedir ((unsigned long ) pagedir);return NULL ;
mm/page_alloc.c +6 -11
@@ -389,10 +389,10 @@unsigned long flags;struct page *page =NULL ; -if (order ==0 ) { +if ((order ==0 ) && !(cold & __GFP_SWSUSP)) {struct per_cpu_pages *pcp; - pcp = &zone->pageset[get_cpu ()].pcp[cold]; + pcp = &zone->pageset[get_cpu ()].pcp[!!cold];local_irq_save (flags);if (pcp->count <= pcp->low) pcp->count += rmqueue_bulk(zone, 0,
@@ -444,15 +444,10 @@struct zone **zones, *classzone;struct page *page;int i; -int cold;if (wait)might_sleep (); - cold =0 ; -if (gfp_mask & __GFP_COLD) - cold =1 ; - zones = zonelist->zones;/* the list of zones suitable for gfp_mask */ classzone = zones[0 ];if (classzone ==NULL )/* no zones in the zonelist */
@@ -466,7 +461,7 @@ min += z->pages_low;if (z->free_pages >= min || (!wait && z->free_pages >= z->pages_high)) { - page =buffered_rmqueue (z, order, cold); + page =buffered_rmqueue (z, order, gfp_mask & (__GFP_COLD | __GFP_SWSUSP));if (page)return page; }
@@ -489,7 +484,7 @@ min += local_min;if (z->free_pages >= min || (!wait && z->free_pages >= z->pages_high)) { - page =buffered_rmqueue (z, order, cold); + page =buffered_rmqueue (z, order, gfp_mask & (__GFP_COLD | __GFP_SWSUSP));if (page)return page; }
@@ -504,7 +499,7 @@for (i =0 ; zones[i] !=NULL ; i++) {struct zone *z = zones[i]; - page =buffered_rmqueue (z, order, cold); + page =buffered_rmqueue (z, order, gfp_mask & (__GFP_COLD | __GFP_SWSUSP));if (page)return page; }
@@ -527,7 +522,7 @@ min += z->pages_min;if (z->free_pages >= min || (!wait && z->free_pages >= z->pages_high)) { - page =buffered_rmqueue (z, order, cold); + page =buffered_rmqueue (z, order, gfp_mask & (__GFP_COLD | __GFP_SWSUSP));if (page)return page; }
Signature · 2 lines
Worst form of spam? Adding advertisment signatures ala sourceforge.net. What goes next? Inserting advertisment *into* email?