Re: [PATCH] Don't refill pcp lists during SWSUSP.

From: Nigel Cunningham (ncunningham@clear.net.nz)
Date: Tue Mar 18 2003 - 01:40:57 EST


Here's the updated version.

Regards,

Nigel

diff -ruN linux-2.5.65-02/include/linux/suspend.h linux-2.5.65-03/include/linux/suspend.h
--- linux-2.5.65-02/include/linux/suspend.h 2003-03-10 12:36:16.000000000 +1300
+++ linux-2.5.65-03/include/linux/suspend.h 2003-03-18 17:56:37.000000000 +1200
@@ -63,6 +63,8 @@
 extern unsigned int nr_copy_pages __nosavedata;
 extern suspend_pagedir_t *pagedir_nosave __nosavedata;
 
+extern unsigned int suspend_task;
+
 /* Communication between kernel/suspend.c and arch/i386/suspend.c */
 
 extern void do_magic_resume_1(void);
@@ -79,6 +81,7 @@
 static inline void software_suspend(void)
 {
 }
+#define suspend_task 0
 #define software_resume() do { } while(0)
 #define register_suspend_notifier(a) do { } while(0)
 #define unregister_suspend_notifier(a) do { } while(0)
diff -ruN linux-2.5.65-02/kernel/suspend.c linux-2.5.65-03/kernel/suspend.c
--- linux-2.5.65-02/kernel/suspend.c 2003-03-18 17:53:44.000000000 +1200
+++ linux-2.5.65-03/kernel/suspend.c 2003-03-18 17:55:55.000000000 +1200
@@ -68,6 +68,7 @@
 extern int sys_sync(void);
 
 unsigned char software_suspend_enabled = 0;
+unsigned int suspend_task = 0;
 
 #define SUSPEND_CONSOLE (MAX_NR_CONSOLES-1)
 /* With SUSPEND_CONSOLE defined, it suspend looks *really* cool, but
@@ -232,6 +233,8 @@
                 }
         } while(todo);
         
+ suspend_task = current->pid;
+
         printk( "|\n" );
         BUG_ON(in_atomic());
         return 0;
@@ -253,6 +256,7 @@
         } while_each_thread(g, p);
 
         read_unlock(&tasklist_lock);
+ suspend_task = 0;
         printk( " done\n" );
         MDELAY(500);
 }
diff -ruN linux-2.5.65-02/mm/page_alloc.c linux-2.5.65-03/mm/page_alloc.c
--- linux-2.5.65-02/mm/page_alloc.c 2003-03-18 17:53:44.000000000 +1200
+++ linux-2.5.65-03/mm/page_alloc.c 2003-03-18 17:55:55.000000000 +1200
@@ -486,6 +486,10 @@
  * Really, prep_compound_page() should be called from __rmqueue_bulk(). But
  * we cheat by calling it from here, in the order > 0 path. Saves a branch
  * or two.
+ *
+ * While suspending, we don't use the pcp structure. It mucks up our
+ * accounting for all the pages and necessitates calling drain_local_pages
+ * multiple times.
  */
 
 static struct page *buffered_rmqueue(struct zone *zone, int order, int cold)
@@ -493,7 +497,7 @@
         unsigned long flags;
         struct page *page = NULL;
 
- if (order == 0) {
+ if ((order == 0) && (!suspend_task)) {
                 struct per_cpu_pages *pcp;
 
                 pcp = &zone->pageset[get_cpu()].pcp[cold];
@@ -700,7 +704,7 @@
 void __free_pages(struct page *page, unsigned int order)
 {
         if (!PageReserved(page) && put_page_testzero(page)) {
- if (order == 0)
+ if ((order == 0) && (!suspend_task))
                         free_hot_page(page);
                 else
                         __free_pages_ok(page, order);

-- 
Nigel Cunningham
495 St Georges Road South, Hastings 4201, New Zealand

Be diligent to present yourself approved to God as a workman who does not need to be ashamed, handling accurately the word of truth. -- 2 Timothy 2:14, NASB.

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sun Mar 23 2003 - 22:00:22 EST