TuxOnIce shares the resume_file and restore_pblists with swsusp, and also uses the saveable_[highmem_]page functions, struct nosave_region, memory bitmap functions and header struct functions. Make all of these non-static and move the memory bitmap definition to kernel/power/power.h for this purpose. Signed-off-by: Nigel Cunningham <nigel@xxxxxxxxxxxx> --- kernel/power/disk.c | 20 +++++----- kernel/power/power.h | 87 +++++++++++++++++++++++++++++++++++++++++++++++ kernel/power/snapshot.c | 69 +++++++------------------------------ 3 files changed, 110 insertions(+), 66 deletions(-) diff --git a/kernel/power/disk.c b/kernel/power/disk.c index e71ca9c..e4b1166 100644 --- a/kernel/power/disk.c +++ b/kernel/power/disk.c @@ -29,7 +29,7 @@ static int noresume = 0; -static char resume_file[256] = CONFIG_PM_STD_PARTITION; +char resume_file[256] = CONFIG_PM_STD_PARTITION; dev_t swsusp_resume_device; sector_t swsusp_resume_block; @@ -115,7 +115,7 @@ static int hibernation_test(int level) { return 0; } * hibernation */ -static int platform_begin(int platform_mode) +int platform_begin(int platform_mode) { return (platform_mode && hibernation_ops) ? hibernation_ops->begin() : 0; @@ -126,7 +126,7 @@ static int platform_begin(int platform_mode) * working state */ -static void platform_end(int platform_mode) +void platform_end(int platform_mode) { if (platform_mode && hibernation_ops) hibernation_ops->end(); @@ -137,7 +137,7 @@ static void platform_end(int platform_mode) * platform driver if so configured and return an error code if it fails */ -static int platform_pre_snapshot(int platform_mode) +int platform_pre_snapshot(int platform_mode) { return (platform_mode && hibernation_ops) ? hibernation_ops->pre_snapshot() : 0; @@ -148,7 +148,7 @@ static int platform_pre_snapshot(int platform_mode) * of operation using the platform driver (called with interrupts disabled) */ -static void platform_leave(int platform_mode) +void platform_leave(int platform_mode) { if (platform_mode && hibernation_ops) hibernation_ops->leave(); @@ -159,7 +159,7 @@ static void platform_leave(int platform_mode) * using the platform driver (must be called after platform_prepare()) */ -static void platform_finish(int platform_mode) +void platform_finish(int platform_mode) { if (platform_mode && hibernation_ops) hibernation_ops->finish(); @@ -171,7 +171,7 @@ static void platform_finish(int platform_mode) * called, platform_restore_cleanup() must be called. */ -static int platform_pre_restore(int platform_mode) +int platform_pre_restore(int platform_mode) { return (platform_mode && hibernation_ops) ? hibernation_ops->pre_restore() : 0; @@ -184,7 +184,7 @@ static int platform_pre_restore(int platform_mode) * regardless of the result of platform_pre_restore(). */ -static void platform_restore_cleanup(int platform_mode) +void platform_restore_cleanup(int platform_mode) { if (platform_mode && hibernation_ops) hibernation_ops->restore_cleanup(); @@ -195,7 +195,7 @@ static void platform_restore_cleanup(int platform_mode) * devices. */ -static void platform_recover(int platform_mode) +void platform_recover(int platform_mode) { if (platform_mode && hibernation_ops && hibernation_ops->recover) hibernation_ops->recover(); @@ -634,7 +634,7 @@ int hibernate(void) * */ -static int software_resume(void) +int software_resume(void) { int error; unsigned int flags; diff --git a/kernel/power/power.h b/kernel/power/power.h index 46b5ec7..ce81df1 100644 --- a/kernel/power/power.h +++ b/kernel/power/power.h @@ -31,8 +31,12 @@ static inline char *check_image_kernel(struct swsusp_info *info) return arch_hibernation_header_restore(info) ? "architecture specific data" : NULL; } +#else +extern char *check_image_kernel(struct swsusp_info *info); #endif /* CONFIG_ARCH_HIBERNATION_HEADER */ +extern int init_header(struct swsusp_info *info); +extern char resume_file[256]; /* * Keep some memory free so that I/O operations can succeed without paging * [Might this be more than 4 MB?] @@ -49,6 +53,7 @@ static inline char *check_image_kernel(struct swsusp_info *info) extern int hibernation_snapshot(int platform_mode); extern int hibernation_restore(int platform_mode); extern int hibernation_platform_enter(void); +extern void platform_recover(int platform_mode); #endif extern int pfn_is_nosave(unsigned long); @@ -63,6 +68,8 @@ static struct kobj_attribute _name##_attr = { \ .store = _name##_store, \ } +extern struct pbe *restore_pblist; + /* Preferred image size in bytes (default 500 MB) */ extern unsigned long image_size; extern int in_suspend; @@ -223,3 +230,83 @@ static inline void suspend_thaw_processes(void) { } #endif + +extern struct page *saveable_page(struct zone *z, unsigned long p); +#ifdef CONFIG_HIGHMEM +extern struct page *saveable_highmem_page(struct zone *z, unsigned long p); +#else +static +inline struct page *saveable_highmem_page(struct zone *z, unsigned long p) +{ + return NULL; +} +#endif + +#define PBES_PER_PAGE (PAGE_SIZE / sizeof(struct pbe)) +extern struct list_head nosave_regions; + +/** + * This structure represents a range of page frames the contents of which + * should not be saved during the suspend. + */ + +struct nosave_region { + struct list_head list; + unsigned long start_pfn; + unsigned long end_pfn; +}; + +#ifndef PHYS_PFN_OFFSET +#define PHYS_PFN_OFFSET 0 +#endif + +#define ZONE_START(thiszone) ((thiszone)->zone_start_pfn - PHYS_PFN_OFFSET) + +#define BM_END_OF_MAP (~0UL) + +#define BM_BITS_PER_BLOCK (PAGE_SIZE << 3) + +struct bm_block { + struct list_head hook; /* hook into a list of bitmap blocks */ + unsigned long start_pfn; /* pfn represented by the first bit */ + unsigned long end_pfn; /* pfn represented by the last bit plus 1 */ + unsigned long *data; /* bitmap representing pages */ +}; + +/* struct bm_position is used for browsing memory bitmaps */ + +struct bm_position { + struct bm_block *block; + int bit; +}; + +struct memory_bitmap { + struct list_head blocks; /* list of bitmap blocks */ + struct linked_page *p_list; /* list of pages used to store zone + * bitmap objects and bitmap block + * objects + */ + struct bm_position cur; /* most recently used bit position */ +}; + +extern int memory_bm_create(struct memory_bitmap *bm, gfp_t gfp_mask, + int safe_needed); +extern void memory_bm_free(struct memory_bitmap *bm, int clear_nosave_free); +extern void memory_bm_set_bit(struct memory_bitmap *bm, unsigned long pfn); +extern void memory_bm_clear_bit(struct memory_bitmap *bm, unsigned long pfn); +extern int memory_bm_test_bit(struct memory_bitmap *bm, unsigned long pfn); +extern unsigned long memory_bm_next_pfn(struct memory_bitmap *bm); +extern void memory_bm_position_reset(struct memory_bitmap *bm); +extern void memory_bm_clear(struct memory_bitmap *bm); +extern void memory_bm_copy(struct memory_bitmap *source, + struct memory_bitmap *dest); +extern void memory_bm_dup(struct memory_bitmap *source, + struct memory_bitmap *dest); + +#ifdef CONFIG_TOI +struct toi_module_ops; +extern int memory_bm_read(struct memory_bitmap *bm, int (*rw_chunk) + (int rw, struct toi_module_ops *owner, char *buffer, int buffer_size)); +extern int memory_bm_write(struct memory_bitmap *bm, int (*rw_chunk) + (int rw, struct toi_module_ops *owner, char *buffer, int buffer_size)); +#endif diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c index 33e2e4a..8020644 100644 --- a/kernel/power/snapshot.c +++ b/kernel/power/snapshot.c @@ -223,48 +223,19 @@ static void *chain_alloc(struct chain_allocator *ca, unsigned int size) * the represented memory area. */ -#define BM_END_OF_MAP (~0UL) - -#define BM_BITS_PER_BLOCK (PAGE_SIZE << 3) - -struct bm_block { - struct list_head hook; /* hook into a list of bitmap blocks */ - unsigned long start_pfn; /* pfn represented by the first bit */ - unsigned long end_pfn; /* pfn represented by the last bit plus 1 */ - unsigned long *data; /* bitmap representing pages */ -}; - static inline unsigned long bm_block_bits(struct bm_block *bb) { return bb->end_pfn - bb->start_pfn; } -/* strcut bm_position is used for browsing memory bitmaps */ - -struct bm_position { - struct bm_block *block; - int bit; -}; - -struct memory_bitmap { - struct list_head blocks; /* list of bitmap blocks */ - struct linked_page *p_list; /* list of pages used to store zone - * bitmap objects and bitmap block - * objects - */ - struct bm_position cur; /* most recently used bit position */ -}; - /* Functions that operate on memory bitmaps */ -static void memory_bm_position_reset(struct memory_bitmap *bm) +void memory_bm_position_reset(struct memory_bitmap *bm) { bm->cur.block = list_entry(bm->blocks.next, struct bm_block, hook); bm->cur.bit = 0; } -static void memory_bm_free(struct memory_bitmap *bm, int clear_nosave_free); - /** * create_bm_block_list - create a list of block bitmap objects * @nr_blocks - number of blocks to allocate @@ -371,7 +342,7 @@ static int create_mem_extents(struct list_head *list, gfp_t gfp_mask) /** * memory_bm_create - allocate memory for a memory bitmap */ -static int +int memory_bm_create(struct memory_bitmap *bm, gfp_t gfp_mask, int safe_needed) { struct chain_allocator ca; @@ -431,7 +402,7 @@ memory_bm_create(struct memory_bitmap *bm, gfp_t gfp_mask, int safe_needed) /** * memory_bm_free - free memory occupied by the memory bitmap @bm */ -static void memory_bm_free(struct memory_bitmap *bm, int clear_nosave_free) +void memory_bm_free(struct memory_bitmap *bm, int clear_nosave_free) { struct bm_block *bb; @@ -481,7 +452,7 @@ static int memory_bm_find_bit(struct memory_bitmap *bm, unsigned long pfn, return 0; } -static void memory_bm_set_bit(struct memory_bitmap *bm, unsigned long pfn) +void memory_bm_set_bit(struct memory_bitmap *bm, unsigned long pfn) { void *addr; unsigned int bit; @@ -504,7 +475,7 @@ static int mem_bm_set_bit_check(struct memory_bitmap *bm, unsigned long pfn) return error; } -static void memory_bm_clear_bit(struct memory_bitmap *bm, unsigned long pfn) +void memory_bm_clear_bit(struct memory_bitmap *bm, unsigned long pfn) { void *addr; unsigned int bit; @@ -515,7 +486,7 @@ static void memory_bm_clear_bit(struct memory_bitmap *bm, unsigned long pfn) clear_bit(bit, addr); } -static int memory_bm_test_bit(struct memory_bitmap *bm, unsigned long pfn) +int memory_bm_test_bit(struct memory_bitmap *bm, unsigned long pfn) { void *addr; unsigned int bit; @@ -543,7 +514,7 @@ static bool memory_bm_pfn_present(struct memory_bitmap *bm, unsigned long pfn) * this function. */ -static unsigned long memory_bm_next_pfn(struct memory_bitmap *bm) +unsigned long memory_bm_next_pfn(struct memory_bitmap *bm) { struct bm_block *bb; int bit; @@ -568,18 +539,9 @@ static unsigned long memory_bm_next_pfn(struct memory_bitmap *bm) return bb->start_pfn + bit; } -/** - * This structure represents a range of page frames the contents of which - * should not be saved during the suspend. - */ -struct nosave_region { - struct list_head list; - unsigned long start_pfn; - unsigned long end_pfn; -}; -static LIST_HEAD(nosave_regions); +LIST_HEAD(nosave_regions); /** * register_nosave_region - register a range of page frames the contents @@ -815,7 +777,7 @@ static unsigned int count_free_highmem_pages(void) * We should save the page if it isn't Nosave or NosaveFree, or Reserved, * and it isn't a part of a free chunk of pages. */ -static struct page *saveable_highmem_page(struct zone *zone, unsigned long pfn) +struct page *saveable_highmem_page(struct zone *zone, unsigned long pfn) { struct page *page; @@ -859,11 +821,6 @@ unsigned int count_highmem_pages(void) } return n; } -#else -static inline void *saveable_highmem_page(struct zone *z, unsigned long p) -{ - return NULL; -} #endif /* CONFIG_HIGHMEM */ /** @@ -874,7 +831,7 @@ static inline void *saveable_highmem_page(struct zone *z, unsigned long p) * of pages statically defined as 'unsaveable', and it isn't a part of * a free chunk of pages. */ -static struct page *saveable_page(struct zone *zone, unsigned long pfn) +struct page *saveable_page(struct zone *zone, unsigned long pfn) { struct page *page; @@ -1250,14 +1207,14 @@ asmlinkage int swsusp_save(void) } #ifndef CONFIG_ARCH_HIBERNATION_HEADER -static int init_header_complete(struct swsusp_info *info) +int init_header_complete(struct swsusp_info *info) { memcpy(&info->uts, init_utsname(), sizeof(struct new_utsname)); info->version_code = LINUX_VERSION_CODE; return 0; } -static char *check_image_kernel(struct swsusp_info *info) +char *check_image_kernel(struct swsusp_info *info) { if (info->version_code != LINUX_VERSION_CODE) return "kernel version"; @@ -1278,7 +1235,7 @@ unsigned long snapshot_get_image_size(void) return nr_copy_pages + nr_meta_pages + 1; } -static int init_header(struct swsusp_info *info) +int init_header(struct swsusp_info *info) { memset(info, 0, sizeof(struct swsusp_info)); info->num_physpages = num_physpages; -- 1.5.6.3 _______________________________________________ linux-pm mailing list linux-pm@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/linux-pm