Skip to content

Commit

Permalink
[PATCH] swsusp: avoid problems if there are too many pages to save
Browse files Browse the repository at this point in the history
The following patch makes swsusp avoid problems during resume if there are
too many pages to save on suspend.  It adds a constant that allows us to
verify if we are going to save too many pages and implements the check
(this is done as early as we can tell that the check will trigger, which is
in swsusp_alloc()).

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>
  • Loading branch information
Rafael J. Wysocki authored and Linus Torvalds committed Sep 28, 2005
1 parent f65a4d1 commit 0f7347c
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 1 deletion.
5 changes: 4 additions & 1 deletion kernel/power/power.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
#define SUSPEND_CONSOLE (MAX_NR_CONSOLES-1)
#endif

#define MAX_PBES ((PAGE_SIZE - sizeof(struct new_utsname) \
- 4 - 3*sizeof(unsigned long) - sizeof(int) \
- sizeof(void *)) / sizeof(swp_entry_t))

struct swsusp_info {
struct new_utsname uts;
Expand All @@ -18,7 +21,7 @@ struct swsusp_info {
unsigned long image_pages;
unsigned long pagedir_pages;
suspend_pagedir_t * suspend_pagedir;
swp_entry_t pagedir[768];
swp_entry_t pagedir[MAX_PBES];
} __attribute__((aligned(PAGE_SIZE)));


Expand Down
4 changes: 4 additions & 0 deletions kernel/power/swsusp.c
Original file line number Diff line number Diff line change
Expand Up @@ -931,6 +931,10 @@ static int swsusp_alloc(void)
if (!enough_swap())
return -ENOSPC;

if (MAX_PBES < nr_copy_pages / PBES_PER_PAGE +
!!(nr_copy_pages % PBES_PER_PAGE))
return -ENOSPC;

if (!(pagedir_save = alloc_pagedir(nr_copy_pages))) {
printk(KERN_ERR "suspend: Allocating pagedir failed.\n");
return -ENOMEM;
Expand Down

0 comments on commit 0f7347c

Please sign in to comment.