From: Christoph Lameter <clameter@sgi.com>
To: "Rafael J. Wysocki" <rjw@sisk.pl>
Cc: linux-mm@kvack.org
Subject: Remove page flags for software suspend
Date: Fri, 16 Feb 2007 02:13:51 -0800 (PST) [thread overview]
Message-ID: <Pine.LNX.4.64.0702160212150.21862@schroedinger.engr.sgi.com> (raw)
I think we can just move the flags completely into the kernel/power
directory? This centralizes all your handling of pageflags into snapshot.c
so that you need no external definitions anymore.
Index: linux-2.6.20-mm1/include/linux/mmzone.h
===================================================================
--- linux-2.6.20-mm1.orig/include/linux/mmzone.h 2007-02-16 01:11:46.000000000 -0800
+++ linux-2.6.20-mm1/include/linux/mmzone.h 2007-02-16 01:12:23.000000000 -0800
@@ -295,6 +295,7 @@ struct zone {
unsigned long spanned_pages; /* total size, including holes */
unsigned long present_pages; /* amount of memory (excluding holes) */
+ unsigned long *suspend_flags;
/*
* rarely used fields:
*/
Index: linux-2.6.20-mm1/include/linux/page-flags.h
===================================================================
--- linux-2.6.20-mm1.orig/include/linux/page-flags.h 2007-02-16 01:05:26.000000000 -0800
+++ linux-2.6.20-mm1/include/linux/page-flags.h 2007-02-16 01:16:45.000000000 -0800
@@ -82,13 +82,11 @@
#define PG_private 11 /* If pagecache, has fs-private data */
#define PG_writeback 12 /* Page is under writeback */
-#define PG_nosave 13 /* Used for system suspend/resume */
#define PG_compound 14 /* Part of a compound page */
#define PG_swapcache 15 /* Swap page: swp_entry_t in private */
#define PG_mappedtodisk 16 /* Has blocks allocated on-disk */
#define PG_reclaim 17 /* To be reclaimed asap */
-#define PG_nosave_free 18 /* Used for system suspend/resume */
#define PG_buddy 19 /* Page is free, on buddy lists */
#define PG_mlocked 20 /* Page is mlocked */
@@ -192,16 +190,6 @@ static inline void SetPageUptodate(struc
#define TestClearPageWriteback(page) test_and_clear_bit(PG_writeback, \
&(page)->flags)
-#define PageNosave(page) test_bit(PG_nosave, &(page)->flags)
-#define SetPageNosave(page) set_bit(PG_nosave, &(page)->flags)
-#define TestSetPageNosave(page) test_and_set_bit(PG_nosave, &(page)->flags)
-#define ClearPageNosave(page) clear_bit(PG_nosave, &(page)->flags)
-#define TestClearPageNosave(page) test_and_clear_bit(PG_nosave, &(page)->flags)
-
-#define PageNosaveFree(page) test_bit(PG_nosave_free, &(page)->flags)
-#define SetPageNosaveFree(page) set_bit(PG_nosave_free, &(page)->flags)
-#define ClearPageNosaveFree(page) clear_bit(PG_nosave_free, &(page)->flags)
-
#define PageBuddy(page) test_bit(PG_buddy, &(page)->flags)
#define __SetPageBuddy(page) __set_bit(PG_buddy, &(page)->flags)
#define __ClearPageBuddy(page) __clear_bit(PG_buddy, &(page)->flags)
Index: linux-2.6.20-mm1/include/linux/suspend.h
===================================================================
--- linux-2.6.20-mm1.orig/include/linux/suspend.h 2007-02-16 01:15:30.000000000 -0800
+++ linux-2.6.20-mm1/include/linux/suspend.h 2007-02-16 01:57:51.000000000 -0800
@@ -21,7 +22,6 @@ struct pbe {
/* mm/page_alloc.c */
extern void drain_local_pages(void);
-extern void mark_free_pages(struct zone *zone);
#ifdef CONFIG_PM
/* kernel/power/swsusp.c */
@@ -42,6 +42,18 @@ static inline int software_suspend(void)
}
#endif /* CONFIG_PM */
+#ifdef CONFIG_SOFTWARE_SUSPEND
+int suspend_flags_init(struct zone *zone, unsigned long zone_size_pages);
+void mark_free_pages(struct zone *zone);
+#else
+static inline int suspend_flags_init(struct zone *zone, unsigned long zone_size_pages)
+{
+ return 0;
+}
+
+static inline void mark_free_pages(struct zone *zone) {}
+#endif
+
void save_processor_state(void);
void restore_processor_state(void);
struct saved_context;
Index: linux-2.6.20-mm1/mm/page_alloc.c
===================================================================
--- linux-2.6.20-mm1.orig/mm/page_alloc.c 2007-02-16 01:22:09.000000000 -0800
+++ linux-2.6.20-mm1/mm/page_alloc.c 2007-02-16 01:40:39.000000000 -0800
@@ -767,40 +767,6 @@ static void __drain_pages(unsigned int c
}
#ifdef CONFIG_PM
-
-void mark_free_pages(struct zone *zone)
-{
- unsigned long pfn, max_zone_pfn;
- unsigned long flags;
- int order;
- struct list_head *curr;
-
- if (!zone->spanned_pages)
- return;
-
- spin_lock_irqsave(&zone->lock, flags);
-
- max_zone_pfn = zone->zone_start_pfn + zone->spanned_pages;
- for (pfn = zone->zone_start_pfn; pfn < max_zone_pfn; pfn++)
- if (pfn_valid(pfn)) {
- struct page *page = pfn_to_page(pfn);
-
- if (!PageNosave(page))
- ClearPageNosaveFree(page);
- }
-
- for (order = MAX_ORDER - 1; order >= 0; --order)
- list_for_each(curr, &zone->free_area[order].free_list) {
- unsigned long i;
-
- pfn = page_to_pfn(list_entry(curr, struct page, lru));
- for (i = 0; i < (1UL << order); i++)
- SetPageNosaveFree(pfn_to_page(pfn + i));
- }
-
- spin_unlock_irqrestore(&zone->lock, flags);
-}
-
/*
* Spill all of this CPU's per-cpu pages back into the buddy allocator.
*/
@@ -2354,6 +2320,9 @@ __meminit int init_currently_empty_zone(
ret = zone_wait_table_init(zone, size);
if (ret)
return ret;
+ ret = suspend_flags_init(zone, size);
+ if (ret)
+ return ret;
pgdat->nr_zones = zone_idx(zone) + 1;
zone->zone_start_pfn = zone_start_pfn;
Index: linux-2.6.20-mm1/kernel/power/snapshot.c
===================================================================
--- linux-2.6.20-mm1.orig/kernel/power/snapshot.c 2007-02-16 01:46:02.000000000 -0800
+++ linux-2.6.20-mm1/kernel/power/snapshot.c 2007-02-16 01:59:24.000000000 -0800
@@ -34,6 +34,126 @@
#include "power.h"
+static inline int PageNosave(struct page *page)
+{
+ struct zone *zone = page_zone(page);
+ unsigned long offset = page_to_pfn(page) - zone->zone_start_pfn;
+
+ return test_bit(offset * 2, zone->suspend_flags);
+}
+
+static inline void SetPageNosave(struct page *page)
+{
+ struct zone *zone = page_zone(page);
+ unsigned long offset = page_to_pfn(page) - zone->zone_start_pfn;
+
+ set_bit(offset * 2, zone->suspend_flags);
+}
+
+static inline int TestSetPageNosave(struct page *page)
+{
+ struct zone *zone = page_zone(page);
+ unsigned long offset = page_to_pfn(page) - zone->zone_start_pfn;
+
+ return test_and_set_bit(offset * 2, zone->suspend_flags);
+}
+
+static inline void ClearPageNosave(struct page *page)
+{
+ struct zone *zone = page_zone(page);
+ unsigned long offset = page_to_pfn(page) - zone->zone_start_pfn;
+
+ clear_bit(offset * 2, zone->suspend_flags);
+}
+
+static inline int TestClearPageNosave(struct page *page)
+{
+ struct zone *zone = page_zone(page);
+ unsigned long offset = page_to_pfn(page) - zone->zone_start_pfn;
+
+ return test_and_clear_bit(offset * 2, zone->suspend_flags);
+}
+
+
+static inline int PageNosaveFree(struct page *page)
+{
+ struct zone *zone = page_zone(page);
+ unsigned long offset = page_to_pfn(page) - zone->zone_start_pfn;
+
+ return test_bit(offset * 2 + 1, zone->suspend_flags);
+}
+
+static inline void SetPageNosaveFree(struct page *page)
+{
+ struct zone *zone = page_zone(page);
+ unsigned long offset = page_to_pfn(page) - zone->zone_start_pfn;
+
+ set_bit(offset * 2 + 1, zone->suspend_flags);
+}
+
+static inline void ClearPageNosaveFree(struct page *page)
+{
+ struct zone *zone = page_zone(page);
+ unsigned long offset = page_to_pfn(page) - zone->zone_start_pfn;
+
+ clear_bit(offset * 2 + 1, zone->suspend_flags);
+}
+
+int suspend_flags_init(struct zone *zone, unsigned long zone_size_pages)
+{
+ struct pglist_data *pgdat = zone->zone_pgdat;
+ size_t alloc_size;
+
+ /*
+ * We need two bits per page in the zone. One for PageNosave and the other
+ * for PageNosaveFree.
+ */
+ alloc_size = BITS_TO_LONGS(zone_size_pages * 2);
+ if (system_state == SYSTEM_BOOTING) {
+ zone->suspend_flags = (unsigned long *)
+ alloc_bootmem_node(pgdat, alloc_size);
+ } else
+ zone->suspend_flags = (unsigned long *)vmalloc(alloc_size);
+ if (!zone->suspend_flags)
+ return -ENOMEM;
+
+ bitmap_zero(zone->suspend_flags, 2 * zone_size_pages);
+ return 0;
+}
+
+void mark_free_pages(struct zone *zone)
+{
+ unsigned long pfn, max_zone_pfn;
+ unsigned long flags;
+ int order;
+ struct list_head *curr;
+
+ if (!zone->spanned_pages)
+ return;
+
+ spin_lock_irqsave(&zone->lock, flags);
+
+ max_zone_pfn = zone->zone_start_pfn + zone->spanned_pages;
+ for (pfn = zone->zone_start_pfn; pfn < max_zone_pfn; pfn++)
+ if (pfn_valid(pfn)) {
+ struct page *page = pfn_to_page(pfn);
+
+ if (!PageNosave(page))
+ ClearPageNosaveFree(page);
+ }
+
+ for (order = MAX_ORDER - 1; order >= 0; --order)
+ list_for_each(curr, &zone->free_area[order].free_list) {
+ unsigned long i;
+
+ pfn = page_to_pfn(list_entry(curr, struct page, lru));
+ for (i = 0; i < (1UL << order); i++)
+ SetPageNosaveFree(pfn_to_page(pfn + i));
+ }
+
+ spin_unlock_irqrestore(&zone->lock, flags);
+}
+
/* List of PBEs needed for restoring the pages that were allocated before
* the suspend and included in the suspend image, but have also been
* allocated by the "resume" kernel, so their contents cannot be written
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next reply other threads:[~2007-02-16 10:13 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-02-16 10:13 Christoph Lameter [this message]
2007-02-16 10:56 ` Remove page flags for software suspend Rafael J. Wysocki
2007-02-28 10:14 ` Pavel Machek
2007-02-28 15:25 ` Christoph Lameter
2007-02-28 17:13 ` Rafael J. Wysocki
2007-02-28 17:17 ` Christoph Lameter
2007-02-28 17:33 ` Rafael J. Wysocki
2007-02-28 17:35 ` Christoph Lameter
2007-02-28 17:51 ` Rafael J. Wysocki
2007-02-28 17:56 ` Christoph Lameter
2007-02-28 21:11 ` Pavel Machek
2007-03-01 2:35 ` Nick Piggin
2007-03-01 15:18 ` Nick Piggin
2007-03-01 15:33 ` Rafael J. Wysocki
2007-03-01 23:10 ` Rafael J. Wysocki
2007-03-04 13:50 ` [RFC][PATCH 0/3] swsusp: Do not use page flags (was: Re: Remove page flags for software suspend) Rafael J. Wysocki
2007-03-04 14:07 ` [RFC][PATCH 1/3] swsusp: Do not use page flags directly Rafael J. Wysocki
2007-03-13 4:45 ` Nick Piggin
2007-03-04 14:07 ` [RFC][PATCH 2/3] swsusp: Do not use page flags Rafael J. Wysocki
2007-03-13 4:47 ` Nick Piggin
2007-03-13 9:16 ` Rafael J. Wysocki
2007-03-13 9:23 ` Nick Piggin
2007-03-13 10:17 ` Rafael J. Wysocki
2007-03-13 10:31 ` Nick Piggin
2007-03-13 21:20 ` Rafael J. Wysocki
2007-03-14 3:17 ` Nick Piggin
2007-03-14 8:30 ` Rafael J. Wysocki
2007-03-04 14:08 ` [RFC][PATCH 3/3] mm: Remove nosave and nosave_free " Rafael J. Wysocki
2007-03-08 1:00 ` [RFC][PATCH 0/3] swsusp: Do not use page flags (was: Re: Remove page flags for software suspend) Johannes Berg
2007-03-08 22:05 ` Rafael J. Wysocki
2007-03-08 22:10 ` Johannes Berg
2007-03-08 22:33 ` Rafael J. Wysocki
2007-03-08 22:43 ` Johannes Berg
2007-03-08 22:54 ` Rafael J. Wysocki
2007-03-08 22:54 ` Johannes Berg
2007-03-08 23:15 ` Pavel Machek
2007-03-08 23:21 ` Johannes Berg
2007-03-08 23:23 ` Pavel Machek
2007-03-08 23:34 ` Rafael J. Wysocki
2007-03-08 23:36 ` Pavel Machek
2007-03-08 15:09 ` Johannes Berg
2007-03-08 22:10 ` Rafael J. Wysocki
2007-03-08 22:12 ` Johannes Berg
2007-03-08 15:53 ` Peter Zijlstra
2007-03-08 22:11 ` Rafael J. Wysocki
2007-03-01 17:48 ` Remove page flags for software suspend Hugh Dickins
2007-03-13 3:36 ` Nick Piggin
2007-03-01 20:46 ` Rafael J. Wysocki
2007-03-02 10:17 ` Pavel Machek
2007-02-28 21:08 ` Pavel Machek
2007-02-28 21:16 ` Christoph Lameter
2007-02-28 21:22 ` Pavel Machek
2007-02-28 22:23 ` Rafael J. Wysocki
2007-03-01 2:31 ` Nick Piggin
2007-02-28 10:14 ` Pavel Machek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Pine.LNX.4.64.0702160212150.21862@schroedinger.engr.sgi.com \
--to=clameter@sgi.com \
--cc=linux-mm@kvack.org \
--cc=rjw@sisk.pl \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).