diff options
Diffstat (limited to 'kernel/kexec.c')
| -rw-r--r-- | kernel/kexec.c | 43 | 
1 files changed, 16 insertions, 27 deletions
diff --git a/kernel/kexec.c b/kernel/kexec.c index ffd4e111fd6..59f7b55ba74 100644 --- a/kernel/kexec.c +++ b/kernel/kexec.c @@ -786,7 +786,7 @@ static int kimage_load_normal_segment(struct kimage *image,  					 struct kexec_segment *segment)  {  	unsigned long maddr; -	unsigned long ubytes, mbytes; +	size_t ubytes, mbytes;  	int result;  	unsigned char __user *buf; @@ -819,13 +819,9 @@ static int kimage_load_normal_segment(struct kimage *image,  		/* Start with a clear page */  		clear_page(ptr);  		ptr += maddr & ~PAGE_MASK; -		mchunk = PAGE_SIZE - (maddr & ~PAGE_MASK); -		if (mchunk > mbytes) -			mchunk = mbytes; - -		uchunk = mchunk; -		if (uchunk > ubytes) -			uchunk = ubytes; +		mchunk = min_t(size_t, mbytes, +				PAGE_SIZE - (maddr & ~PAGE_MASK)); +		uchunk = min(ubytes, mchunk);  		result = copy_from_user(ptr, buf, uchunk);  		kunmap(page); @@ -850,7 +846,7 @@ static int kimage_load_crash_segment(struct kimage *image,  	 * We do things a page at a time for the sake of kmap.  	 */  	unsigned long maddr; -	unsigned long ubytes, mbytes; +	size_t ubytes, mbytes;  	int result;  	unsigned char __user *buf; @@ -871,13 +867,10 @@ static int kimage_load_crash_segment(struct kimage *image,  		}  		ptr = kmap(page);  		ptr += maddr & ~PAGE_MASK; -		mchunk = PAGE_SIZE - (maddr & ~PAGE_MASK); -		if (mchunk > mbytes) -			mchunk = mbytes; - -		uchunk = mchunk; -		if (uchunk > ubytes) { -			uchunk = ubytes; +		mchunk = min_t(size_t, mbytes, +				PAGE_SIZE - (maddr & ~PAGE_MASK)); +		uchunk = min(ubytes, mchunk); +		if (mchunk > uchunk) {  			/* Zero the trailing part of the page */  			memset(ptr + uchunk, 0, mchunk - uchunk);  		} @@ -1118,12 +1111,8 @@ void __weak crash_free_reserved_phys_range(unsigned long begin,  {  	unsigned long addr; -	for (addr = begin; addr < end; addr += PAGE_SIZE) { -		ClearPageReserved(pfn_to_page(addr >> PAGE_SHIFT)); -		init_page_count(pfn_to_page(addr >> PAGE_SHIFT)); -		free_page((unsigned long)__va(addr)); -		totalram_pages++; -	} +	for (addr = begin; addr < end; addr += PAGE_SIZE) +		free_reserved_page(pfn_to_page(addr >> PAGE_SHIFT));  }  int crash_shrink_memory(unsigned long new_size) @@ -1544,14 +1533,13 @@ void vmcoreinfo_append_str(const char *fmt, ...)  {  	va_list args;  	char buf[0x50]; -	int r; +	size_t r;  	va_start(args, fmt);  	r = vsnprintf(buf, sizeof(buf), fmt, args);  	va_end(args); -	if (r + vmcoreinfo_size > vmcoreinfo_max_size) -		r = vmcoreinfo_max_size - vmcoreinfo_size; +	r = min(r, vmcoreinfo_max_size - vmcoreinfo_size);  	memcpy(&vmcoreinfo_data[vmcoreinfo_size], buf, r); @@ -1581,7 +1569,7 @@ static int __init crash_save_vmcoreinfo_init(void)  	VMCOREINFO_SYMBOL(swapper_pg_dir);  #endif  	VMCOREINFO_SYMBOL(_stext); -	VMCOREINFO_SYMBOL(vmlist); +	VMCOREINFO_SYMBOL(vmap_area_list);  #ifndef CONFIG_NEED_MULTIPLE_NODES  	VMCOREINFO_SYMBOL(mem_map); @@ -1619,7 +1607,8 @@ static int __init crash_save_vmcoreinfo_init(void)  	VMCOREINFO_OFFSET(free_area, free_list);  	VMCOREINFO_OFFSET(list_head, next);  	VMCOREINFO_OFFSET(list_head, prev); -	VMCOREINFO_OFFSET(vm_struct, addr); +	VMCOREINFO_OFFSET(vmap_area, va_start); +	VMCOREINFO_OFFSET(vmap_area, list);  	VMCOREINFO_LENGTH(zone.free_area, MAX_ORDER);  	log_buf_kexec_setup();  	VMCOREINFO_LENGTH(free_area.free_list, MIGRATE_TYPES);  |