Commit fe6c98a1 authored by Youling Tang's avatar Youling Tang Committed by Thomas Bogendoerfer

MIPS: crash_dump.c: Simplify copy_oldmem_page()

Replace kmap_atomic_pfn() with kmap_local_pfn() which is preemptible and
can take page faults.

Remove the indirection of the dump page and the related cruft which is not
longer required.

Remove unused or redundant header files.
Signed-off-by: default avatarYouling Tang <tangyouling@loongson.cn>
Signed-off-by: default avatarThomas Bogendoerfer <tsbogend@alpha.franken.de>
parent 40880243
// SPDX-License-Identifier: GPL-2.0 // SPDX-License-Identifier: GPL-2.0
#include <linux/highmem.h> #include <linux/highmem.h>
#include <linux/memblock.h>
#include <linux/crash_dump.h> #include <linux/crash_dump.h>
#include <linux/uaccess.h>
#include <linux/slab.h>
static void *kdump_buf_page;
/** /**
* copy_oldmem_page - copy one page from "oldmem" * copy_oldmem_page - copy one page from "oldmem"
...@@ -19,10 +14,6 @@ static void *kdump_buf_page; ...@@ -19,10 +14,6 @@ static void *kdump_buf_page;
* *
* Copy a page from "oldmem". For this page, there is no pte mapped * Copy a page from "oldmem". For this page, there is no pte mapped
* in the current kernel. * in the current kernel.
*
* Calling copy_to_user() in atomic context is not desirable. Hence first
* copying the data to a pre-allocated kernel page and then copying to user
* space in non-atomic context.
*/ */
ssize_t copy_oldmem_page(unsigned long pfn, char *buf, ssize_t copy_oldmem_page(unsigned long pfn, char *buf,
size_t csize, unsigned long offset, int userbuf) size_t csize, unsigned long offset, int userbuf)
...@@ -32,36 +23,16 @@ ssize_t copy_oldmem_page(unsigned long pfn, char *buf, ...@@ -32,36 +23,16 @@ ssize_t copy_oldmem_page(unsigned long pfn, char *buf,
if (!csize) if (!csize)
return 0; return 0;
vaddr = kmap_atomic_pfn(pfn); vaddr = kmap_local_pfn(pfn);
if (!userbuf) { if (!userbuf) {
memcpy(buf, (vaddr + offset), csize); memcpy(buf, vaddr + offset, csize);
kunmap_atomic(vaddr);
} else { } else {
if (!kdump_buf_page) { if (copy_to_user(buf, vaddr + offset, csize))
pr_warn("Kdump: Kdump buffer page not allocated\n"); csize = -EFAULT;
return -EFAULT;
}
copy_page(kdump_buf_page, vaddr);
kunmap_atomic(vaddr);
if (copy_to_user(buf, (kdump_buf_page + offset), csize))
return -EFAULT;
} }
return csize; kunmap_local(vaddr);
}
static int __init kdump_buf_page_init(void)
{
int ret = 0;
kdump_buf_page = kmalloc(PAGE_SIZE, GFP_KERNEL); return csize;
if (!kdump_buf_page) {
pr_warn("Kdump: Failed to allocate kdump buffer page\n");
ret = -ENOMEM;
}
return ret;
} }
arch_initcall(kdump_buf_page_init);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment