diff --git a/include/linux/suspend.h b/include/linux/suspend.h
index 3aecc96acc76754cd029794f53ebdb4da6bd585f..96868be9c211ce435f258ba363911e5ed777b796 100644
--- a/include/linux/suspend.h
+++ b/include/linux/suspend.h
@@ -52,10 +52,4 @@ struct saved_context;
 void __save_processor_state(struct saved_context *ctxt);
 void __restore_processor_state(struct saved_context *ctxt);
 
-/*
- * XXX: We try to keep some more pages free so that I/O operations succeed
- * without paging. Might this be more?
- */
-#define PAGES_FOR_IO	1024
-
 #endif /* _LINUX_SWSUSP_H */
diff --git a/kernel/power/power.h b/kernel/power/power.h
index a3e47cbdaf31ebc9c3b5b1c2a90c19f2eee4e3bb..34b43542785a3859d8e954858346aeb8d409f367 100644
--- a/kernel/power/power.h
+++ b/kernel/power/power.h
@@ -14,8 +14,18 @@ struct swsusp_info {
 
 
 #ifdef CONFIG_SOFTWARE_SUSPEND
-extern int pm_suspend_disk(void);
+/*
+ * Keep some memory free so that I/O operations can succeed without paging
+ * [Might this be more than 4 MB?]
+ */
+#define PAGES_FOR_IO	((4096 * 1024) >> PAGE_SHIFT)
+/*
+ * Keep 1 MB of memory free so that device drivers can allocate some pages in
+ * their .suspend() routines without breaking the suspend to disk.
+ */
+#define SPARE_PAGES	((1024 * 1024) >> PAGE_SHIFT)
 
+extern int pm_suspend_disk(void);
 #else
 static inline int pm_suspend_disk(void)
 {
diff --git a/kernel/power/swsusp.c b/kernel/power/swsusp.c
index 1109023d8358001cc8497e7de9edb9da42e8ecf3..5da304c8f1f66473233d68d713a66e2a17c59d54 100644
--- a/kernel/power/swsusp.c
+++ b/kernel/power/swsusp.c
@@ -233,7 +233,7 @@ int swsusp_shrink_memory(void)
 		long size, highmem_size;
 
 		highmem_size = count_highmem_pages();
-		size = count_data_pages() + PAGES_FOR_IO;
+		size = count_data_pages() + PAGES_FOR_IO + SPARE_PAGES;
 		tmp = size;
 		size += highmem_size;
 		for_each_zone (zone)