forked from Minki/linux
7088a5c001
This patch introduces the swap map structure that can be used by swsusp for keeping tracks of data pages written to the swap. The structure itself is described in a comment within the patch. The overall idea is to reduce the amount of metadata written to the swap and to write and read the image pages sequentially, in a file-alike way. This makes the swap-handling part of swsusp fairly independent of its snapshot-handling part and will hopefully allow us to completely separate these two parts in the future. This patch is needed to remove the suspend image size limit imposed by the limited size of the swsusp_info structure, which is essential for x86-64 systems with more than 512 MB of RAM. Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> Acked-by: Pavel Machek <pavel@suse.cz> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
70 lines
1.8 KiB
C
70 lines
1.8 KiB
C
#include <linux/suspend.h>
|
|
#include <linux/utsname.h>
|
|
|
|
/* With SUSPEND_CONSOLE defined suspend looks *really* cool, but
|
|
we probably do not take enough locks for switching consoles, etc,
|
|
so bad things might happen.
|
|
*/
|
|
#if defined(CONFIG_VT) && defined(CONFIG_VT_CONSOLE)
|
|
#define SUSPEND_CONSOLE (MAX_NR_CONSOLES-1)
|
|
#endif
|
|
|
|
struct swsusp_info {
|
|
struct new_utsname uts;
|
|
u32 version_code;
|
|
unsigned long num_physpages;
|
|
int cpus;
|
|
unsigned long image_pages;
|
|
unsigned long pages;
|
|
swp_entry_t start;
|
|
} __attribute__((aligned(PAGE_SIZE)));
|
|
|
|
|
|
|
|
#ifdef CONFIG_SOFTWARE_SUSPEND
|
|
extern int pm_suspend_disk(void);
|
|
|
|
#else
|
|
static inline int pm_suspend_disk(void)
|
|
{
|
|
return -EPERM;
|
|
}
|
|
#endif
|
|
extern struct semaphore pm_sem;
|
|
#define power_attr(_name) \
|
|
static struct subsys_attribute _name##_attr = { \
|
|
.attr = { \
|
|
.name = __stringify(_name), \
|
|
.mode = 0644, \
|
|
}, \
|
|
.show = _name##_show, \
|
|
.store = _name##_store, \
|
|
}
|
|
|
|
extern struct subsystem power_subsys;
|
|
|
|
extern int freeze_processes(void);
|
|
extern void thaw_processes(void);
|
|
|
|
extern int pm_prepare_console(void);
|
|
extern void pm_restore_console(void);
|
|
|
|
|
|
/* References to section boundaries */
|
|
extern const void __nosave_begin, __nosave_end;
|
|
|
|
extern unsigned int nr_copy_pages;
|
|
extern suspend_pagedir_t *pagedir_nosave;
|
|
extern suspend_pagedir_t *pagedir_save;
|
|
|
|
extern asmlinkage int swsusp_arch_suspend(void);
|
|
extern asmlinkage int swsusp_arch_resume(void);
|
|
|
|
extern void free_pagedir(struct pbe *pblist);
|
|
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);
|