Merge branch 'for-linus' of git://one.firstfloor.org/home/andi/git/linux-2.6
* 'for-linus' of git://one.firstfloor.org/home/andi/git/linux-2.6: (231 commits) [PATCH] i386: Don't delete cpu_devs data to identify different x86 types in late_initcall [PATCH] i386: type may be unused [PATCH] i386: Some additional chipset register values validation. [PATCH] i386: Add missing !X86_PAE dependincy to the 2G/2G split. [PATCH] x86-64: Don't exclude asm-offsets.c in Documentation/dontdiff [PATCH] i386: avoid redundant preempt_disable in __unlazy_fpu [PATCH] i386: white space fixes in i387.h [PATCH] i386: Drop noisy e820 debugging printks [PATCH] x86-64: Fix allnoconfig error in genapic_flat.c [PATCH] x86-64: Shut up warnings for vfat compat ioctls on other file systems [PATCH] x86-64: Share identical video.S between i386 and x86-64 [PATCH] x86-64: Remove CONFIG_REORDER [PATCH] x86-64: Print type and size correctly for unknown compat ioctls [PATCH] i386: Remove copy_*_user BUG_ONs for (size < 0) [PATCH] i386: Little cleanups in smpboot.c [PATCH] x86-64: Don't enable NUMA for a single node in K8 NUMA scanning [PATCH] x86: Use RDTSCP for synchronous get_cycles if possible [PATCH] i386: Add X86_FEATURE_RDTSCP [PATCH] i386: Implement X86_FEATURE_SYNC_RDTSC on i386 [PATCH] i386: Implement alternative_io for i386 ... Fix up trivial conflict in include/linux/highmem.h manually. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
@@ -286,6 +286,8 @@ static inline int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
|
||||
if (retval)
|
||||
goto out;
|
||||
}
|
||||
/* a new mm has just been created */
|
||||
arch_dup_mmap(oldmm, mm);
|
||||
retval = 0;
|
||||
out:
|
||||
up_write(&mm->mmap_sem);
|
||||
|
||||
+5
-5
@@ -348,10 +348,10 @@ static void *percpu_modalloc(unsigned long size, unsigned long align,
|
||||
unsigned int i;
|
||||
void *ptr;
|
||||
|
||||
if (align > SMP_CACHE_BYTES) {
|
||||
printk(KERN_WARNING "%s: per-cpu alignment %li > %i\n",
|
||||
name, align, SMP_CACHE_BYTES);
|
||||
align = SMP_CACHE_BYTES;
|
||||
if (align > PAGE_SIZE) {
|
||||
printk(KERN_WARNING "%s: per-cpu alignment %li > %li\n",
|
||||
name, align, PAGE_SIZE);
|
||||
align = PAGE_SIZE;
|
||||
}
|
||||
|
||||
ptr = __per_cpu_start;
|
||||
@@ -432,7 +432,7 @@ static int percpu_modinit(void)
|
||||
pcpu_size = kmalloc(sizeof(pcpu_size[0]) * pcpu_num_allocated,
|
||||
GFP_KERNEL);
|
||||
/* Static in-kernel percpu data (used). */
|
||||
pcpu_size[0] = -ALIGN(__per_cpu_end-__per_cpu_start, SMP_CACHE_BYTES);
|
||||
pcpu_size[0] = -(__per_cpu_end-__per_cpu_start);
|
||||
/* Free room. */
|
||||
pcpu_size[1] = PERCPU_ENOUGH_ROOM + pcpu_size[0];
|
||||
if (pcpu_size[1] < 0) {
|
||||
|
||||
@@ -23,6 +23,8 @@ static inline int pm_suspend_disk(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
extern int pfn_is_nosave(unsigned long);
|
||||
|
||||
extern struct mutex pm_mutex;
|
||||
|
||||
#define power_attr(_name) \
|
||||
@@ -37,9 +39,6 @@ static struct subsys_attribute _name##_attr = { \
|
||||
|
||||
extern struct kset power_subsys;
|
||||
|
||||
/* References to section boundaries */
|
||||
extern const void __nosave_begin, __nosave_end;
|
||||
|
||||
/* Preferred image size in bytes (default 500 MB) */
|
||||
extern unsigned long image_size;
|
||||
extern int in_suspend;
|
||||
|
||||
@@ -650,17 +650,6 @@ static inline void *saveable_highmem_page(unsigned long pfn) { return NULL; }
|
||||
static inline unsigned int count_highmem_pages(void) { return 0; }
|
||||
#endif /* CONFIG_HIGHMEM */
|
||||
|
||||
/**
|
||||
* pfn_is_nosave - check if given pfn is in the 'nosave' section
|
||||
*/
|
||||
|
||||
static inline int pfn_is_nosave(unsigned long pfn)
|
||||
{
|
||||
unsigned long nosave_begin_pfn = __pa(&__nosave_begin) >> PAGE_SHIFT;
|
||||
unsigned long nosave_end_pfn = PAGE_ALIGN(__pa(&__nosave_end)) >> PAGE_SHIFT;
|
||||
return (pfn >= nosave_begin_pfn) && (pfn < nosave_end_pfn);
|
||||
}
|
||||
|
||||
/**
|
||||
* saveable - Determine whether a non-highmem page should be included in
|
||||
* the suspend image.
|
||||
|
||||
+27
-15
@@ -33,12 +33,14 @@ extern char resume_file[];
|
||||
|
||||
#define SWSUSP_SIG "S1SUSPEND"
|
||||
|
||||
static struct swsusp_header {
|
||||
struct swsusp_header {
|
||||
char reserved[PAGE_SIZE - 20 - sizeof(sector_t)];
|
||||
sector_t image;
|
||||
char orig_sig[10];
|
||||
char sig[10];
|
||||
} __attribute__((packed, aligned(PAGE_SIZE))) swsusp_header;
|
||||
} __attribute__((packed));
|
||||
|
||||
static struct swsusp_header *swsusp_header;
|
||||
|
||||
/*
|
||||
* General things
|
||||
@@ -141,14 +143,14 @@ static int mark_swapfiles(sector_t start)
|
||||
{
|
||||
int error;
|
||||
|
||||
bio_read_page(swsusp_resume_block, &swsusp_header, NULL);
|
||||
if (!memcmp("SWAP-SPACE",swsusp_header.sig, 10) ||
|
||||
!memcmp("SWAPSPACE2",swsusp_header.sig, 10)) {
|
||||
memcpy(swsusp_header.orig_sig,swsusp_header.sig, 10);
|
||||
memcpy(swsusp_header.sig,SWSUSP_SIG, 10);
|
||||
swsusp_header.image = start;
|
||||
bio_read_page(swsusp_resume_block, swsusp_header, NULL);
|
||||
if (!memcmp("SWAP-SPACE",swsusp_header->sig, 10) ||
|
||||
!memcmp("SWAPSPACE2",swsusp_header->sig, 10)) {
|
||||
memcpy(swsusp_header->orig_sig,swsusp_header->sig, 10);
|
||||
memcpy(swsusp_header->sig,SWSUSP_SIG, 10);
|
||||
swsusp_header->image = start;
|
||||
error = bio_write_page(swsusp_resume_block,
|
||||
&swsusp_header, NULL);
|
||||
swsusp_header, NULL);
|
||||
} else {
|
||||
printk(KERN_ERR "swsusp: Swap header not found!\n");
|
||||
error = -ENODEV;
|
||||
@@ -564,7 +566,7 @@ int swsusp_read(void)
|
||||
if (error < PAGE_SIZE)
|
||||
return error < 0 ? error : -EFAULT;
|
||||
header = (struct swsusp_info *)data_of(snapshot);
|
||||
error = get_swap_reader(&handle, swsusp_header.image);
|
||||
error = get_swap_reader(&handle, swsusp_header->image);
|
||||
if (!error)
|
||||
error = swap_read_page(&handle, header, NULL);
|
||||
if (!error)
|
||||
@@ -591,17 +593,17 @@ int swsusp_check(void)
|
||||
resume_bdev = open_by_devnum(swsusp_resume_device, FMODE_READ);
|
||||
if (!IS_ERR(resume_bdev)) {
|
||||
set_blocksize(resume_bdev, PAGE_SIZE);
|
||||
memset(&swsusp_header, 0, sizeof(swsusp_header));
|
||||
memset(swsusp_header, 0, sizeof(PAGE_SIZE));
|
||||
error = bio_read_page(swsusp_resume_block,
|
||||
&swsusp_header, NULL);
|
||||
swsusp_header, NULL);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
if (!memcmp(SWSUSP_SIG, swsusp_header.sig, 10)) {
|
||||
memcpy(swsusp_header.sig, swsusp_header.orig_sig, 10);
|
||||
if (!memcmp(SWSUSP_SIG, swsusp_header->sig, 10)) {
|
||||
memcpy(swsusp_header->sig, swsusp_header->orig_sig, 10);
|
||||
/* Reset swap signature now */
|
||||
error = bio_write_page(swsusp_resume_block,
|
||||
&swsusp_header, NULL);
|
||||
swsusp_header, NULL);
|
||||
} else {
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -632,3 +634,13 @@ void swsusp_close(void)
|
||||
|
||||
blkdev_put(resume_bdev);
|
||||
}
|
||||
|
||||
static int swsusp_header_init(void)
|
||||
{
|
||||
swsusp_header = (struct swsusp_header*) __get_free_page(GFP_KERNEL);
|
||||
if (!swsusp_header)
|
||||
panic("Could not allocate memory for swsusp_header\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
core_initcall(swsusp_header_init);
|
||||
|
||||
Reference in New Issue
Block a user