mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-04 09:59:32 +00:00
![Youling Tang](/assets/img/avatar_default.png)
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: Youling Tang <tangyouling@loongson.cn> Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
38 lines
1,012 B
C
38 lines
1,012 B
C
// SPDX-License-Identifier: GPL-2.0
|
|
#include <linux/highmem.h>
|
|
#include <linux/crash_dump.h>
|
|
|
|
/**
|
|
* copy_oldmem_page - copy one page from "oldmem"
|
|
* @pfn: page frame number to be copied
|
|
* @buf: target memory address for the copy; this can be in kernel address
|
|
* space or user address space (see @userbuf)
|
|
* @csize: number of bytes to copy
|
|
* @offset: offset in bytes into the page (based on pfn) to begin the copy
|
|
* @userbuf: if set, @buf is in user address space, use copy_to_user(),
|
|
* otherwise @buf is in kernel address space, use memcpy().
|
|
*
|
|
* Copy a page from "oldmem". For this page, there is no pte mapped
|
|
* in the current kernel.
|
|
*/
|
|
ssize_t copy_oldmem_page(unsigned long pfn, char *buf,
|
|
size_t csize, unsigned long offset, int userbuf)
|
|
{
|
|
void *vaddr;
|
|
|
|
if (!csize)
|
|
return 0;
|
|
|
|
vaddr = kmap_local_pfn(pfn);
|
|
|
|
if (!userbuf) {
|
|
memcpy(buf, vaddr + offset, csize);
|
|
} else {
|
|
if (copy_to_user(buf, vaddr + offset, csize))
|
|
csize = -EFAULT;
|
|
}
|
|
|
|
kunmap_local(vaddr);
|
|
|
|
return csize;
|
|
}
|