Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 940d67f6 authored by Johannes Berg's avatar Johannes Berg Committed by Paul Mackerras
Browse files

[POWERPC] swsusp: Introduce register_nosave_region_late



This patch introduces a new register_nosave_region_late function that
can be called from initcalls when register_nosave_region can no longer
be used because it uses bootmem.

Signed-off-by: default avatarJohannes Berg <johannes@sipsolutions.net>
Acked-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent de372ecd
Loading
Loading
Loading
Loading
+10 −1
Original line number Original line Diff line number Diff line
@@ -34,13 +34,22 @@ static inline void pm_restore_console(void) {}


#if defined(CONFIG_PM) && defined(CONFIG_SOFTWARE_SUSPEND)
#if defined(CONFIG_PM) && defined(CONFIG_SOFTWARE_SUSPEND)
/* kernel/power/snapshot.c */
/* kernel/power/snapshot.c */
extern void __init register_nosave_region(unsigned long, unsigned long);
extern void __register_nosave_region(unsigned long b, unsigned long e, int km);
static inline void register_nosave_region(unsigned long b, unsigned long e)
{
	__register_nosave_region(b, e, 0);
}
static inline void register_nosave_region_late(unsigned long b, unsigned long e)
{
	__register_nosave_region(b, e, 1);
}
extern int swsusp_page_is_forbidden(struct page *);
extern int swsusp_page_is_forbidden(struct page *);
extern void swsusp_set_page_free(struct page *);
extern void swsusp_set_page_free(struct page *);
extern void swsusp_unset_page_free(struct page *);
extern void swsusp_unset_page_free(struct page *);
extern unsigned long get_safe_page(gfp_t gfp_mask);
extern unsigned long get_safe_page(gfp_t gfp_mask);
#else
#else
static inline void register_nosave_region(unsigned long b, unsigned long e) {}
static inline void register_nosave_region(unsigned long b, unsigned long e) {}
static inline void register_nosave_region_late(unsigned long b, unsigned long e) {}
static inline int swsusp_page_is_forbidden(struct page *p) { return 0; }
static inline int swsusp_page_is_forbidden(struct page *p) { return 0; }
static inline void swsusp_set_page_free(struct page *p) {}
static inline void swsusp_set_page_free(struct page *p) {}
static inline void swsusp_unset_page_free(struct page *p) {}
static inline void swsusp_unset_page_free(struct page *p) {}
+9 −3
Original line number Original line Diff line number Diff line
@@ -607,7 +607,8 @@ static LIST_HEAD(nosave_regions);
 */
 */


void __init
void __init
register_nosave_region(unsigned long start_pfn, unsigned long end_pfn)
__register_nosave_region(unsigned long start_pfn, unsigned long end_pfn,
			 int use_kmalloc)
{
{
	struct nosave_region *region;
	struct nosave_region *region;


@@ -623,6 +624,11 @@ register_nosave_region(unsigned long start_pfn, unsigned long end_pfn)
			goto Report;
			goto Report;
		}
		}
	}
	}
	if (use_kmalloc) {
		/* during init, this shouldn't fail */
		region = kmalloc(sizeof(struct nosave_region), GFP_KERNEL);
		BUG_ON(!region);
	} else
		/* This allocation cannot fail */
		/* This allocation cannot fail */
		region = alloc_bootmem_low(sizeof(struct nosave_region));
		region = alloc_bootmem_low(sizeof(struct nosave_region));
	region->start_pfn = start_pfn;
	region->start_pfn = start_pfn;