Skip to content

Commit

Permalink
[PATCH] swsusp: low level interface
Browse files Browse the repository at this point in the history
Introduce the low level interface that can be used for handling the
snapshot of the system memory by the in-kernel swap-writing/reading code of
swsusp and the userland interface code (to be introduced shortly).

Also change the way in which swsusp records the allocated swap pages and,
consequently, simplifies the in-kernel swap-writing/reading code (this is
necessary for the userland interface too).  To this end, it introduces two
helper functions in mm/swapfile.c, so that the swsusp code does not refer
directly to the swap internals.

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Acked-by: Pavel Machek <pavel@ucw.cz>
Signed-off-by: Adrian Bunk <bunk@stusta.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Rafael J. Wysocki authored and Linus Torvalds committed Mar 23, 2006
1 parent 2b322ce commit f577eb3
Show file tree
Hide file tree
Showing 6 changed files with 656 additions and 491 deletions.
5 changes: 3 additions & 2 deletions include/linux/swap.h
Original file line number Diff line number Diff line change
Expand Up @@ -234,14 +234,15 @@ extern struct page * read_swap_cache_async(swp_entry_t, struct vm_area_struct *v
/* linux/mm/swapfile.c */
extern long total_swap_pages;
extern unsigned int nr_swapfiles;
extern struct swap_info_struct swap_info[];
extern void si_swapinfo(struct sysinfo *);
extern swp_entry_t get_swap_page(void);
extern swp_entry_t get_swap_page_of_type(int type);
extern swp_entry_t get_swap_page_of_type(int);
extern int swap_duplicate(swp_entry_t);
extern int valid_swaphandles(swp_entry_t, unsigned long *);
extern void swap_free(swp_entry_t);
extern void free_swap_and_cache(swp_entry_t);
extern int swap_type_of(dev_t);
extern unsigned int count_swap_pages(int, int);
extern sector_t map_swap_page(struct swap_info_struct *, pgoff_t);
extern struct swap_info_struct *get_swap_info_struct(unsigned);
extern int can_share_swap_page(struct page *);
Expand Down
12 changes: 4 additions & 8 deletions kernel/power/disk.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ extern suspend_disk_method_t pm_disk_mode;

extern int swsusp_shrink_memory(void);
extern int swsusp_suspend(void);
extern int swsusp_write(struct pbe *pblist, unsigned int nr_pages);
extern int swsusp_write(void);
extern int swsusp_check(void);
extern int swsusp_read(struct pbe **pblist_ptr);
extern int swsusp_read(void);
extern void swsusp_close(void);
extern int swsusp_resume(void);

Expand Down Expand Up @@ -70,10 +70,6 @@ static void power_down(suspend_disk_method_t mode)
while(1);
}


static int in_suspend __nosavedata = 0;


static inline void platform_finish(void)
{
if (pm_disk_mode == PM_DISK_PLATFORM) {
Expand Down Expand Up @@ -145,7 +141,7 @@ int pm_suspend_disk(void)
if (in_suspend) {
device_resume();
pr_debug("PM: writing image.\n");
error = swsusp_write(pagedir_nosave, nr_copy_pages);
error = swsusp_write();
if (!error)
power_down(pm_disk_mode);
else {
Expand Down Expand Up @@ -216,7 +212,7 @@ static int software_resume(void)

pr_debug("PM: Reading swsusp image.\n");

if ((error = swsusp_read(&pagedir_nosave))) {
if ((error = swsusp_read())) {
swsusp_free();
goto Thaw;
}
Expand Down
26 changes: 18 additions & 8 deletions kernel/power/power.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,21 +37,31 @@ extern struct subsystem power_subsys;
/* References to section boundaries */
extern const void __nosave_begin, __nosave_end;

extern unsigned int nr_copy_pages;
extern struct pbe *pagedir_nosave;

/* Preferred image size in bytes (default 500 MB) */
extern unsigned long image_size;

extern int in_suspend;

extern asmlinkage int swsusp_arch_suspend(void);
extern asmlinkage int swsusp_arch_resume(void);

extern unsigned int count_data_pages(void);
extern void free_pagedir(struct pbe *pblist);
extern void release_eaten_pages(void);
extern struct pbe *alloc_pagedir(unsigned nr_pages, gfp_t gfp_mask, int safe_needed);
extern void swsusp_free(void);
extern int alloc_data_pages(struct pbe *pblist, gfp_t gfp_mask, int safe_needed);
extern unsigned int snapshot_nr_pages(void);
extern struct pbe *snapshot_pblist(void);
extern void snapshot_pblist_set(struct pbe *pblist);

struct snapshot_handle {
loff_t offset;
unsigned int page;
unsigned int page_offset;
unsigned int prev;
struct pbe *pbe;
void *buffer;
unsigned int buf_offset;
};

#define data_of(handle) ((handle).buffer + (handle).buf_offset)

extern int snapshot_read_next(struct snapshot_handle *handle, size_t count);
extern int snapshot_write_next(struct snapshot_handle *handle, size_t count);
int snapshot_image_loaded(struct snapshot_handle *handle);
Loading

0 comments on commit f577eb3

Please sign in to comment.