Messages in this thread Patch in this message | | | Date | Tue, 20 Dec 2011 16:23:55 +0900 | From | YOSHIDA Masanori <> | Subject | [RFC PATCH 3/5] livedump: Add page splitting functionality |
| |
This patch adds function "wrprotect_split" to split all large pages in kernel space into 4K pages. This patch also adds tools/livedump/livedump to kick wrprotect_split via ioctl operation.
***ATTENTION PLEASE*** Right now, the livedump module can handle only 4K pages. Before setting up write protection, it has to split all large pages into 4K pages. I think this job (page splitting) can be eliminated in the future.
Signed-off-by: YOSHIDA Masanori <masanori.yoshida.tv@hitachi.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ingo Molnar <mingo@redhat.com> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: x86@kernel.org Cc: Tejun Heo <tj@kernel.org> Cc: Yinghai Lu <yinghai@kernel.org> Cc: linux-kernel@vger.kernel.org ---
arch/x86/Kconfig | 16 +++++++++++++++- arch/x86/include/asm/wrprotect.h | 26 ++++++++++++++++++++++++++ arch/x86/mm/Makefile | 2 ++ arch/x86/mm/wrprotect.c | 33 +++++++++++++++++++++++++++++++++ kernel/livedump.c | 5 +++++ tools/livedump/livedump | 13 +++++++++++++ 6 files changed, 94 insertions(+), 1 deletions(-) create mode 100644 arch/x86/include/asm/wrprotect.h create mode 100644 arch/x86/mm/wrprotect.c create mode 100755 tools/livedump/livedump
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 32bc16d..9e6b53a 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -1702,9 +1702,23 @@ config CMDLINE_OVERRIDE This is used to work around broken boot loaders. This should be set to 'N' under normal conditions. +config WRPROTECT + bool "Write protection on kernel space" + depends on X86_64 + ---help--- + Set this option to 'Y' to allow the kernel to write protect + its own memory space and to handle page fault caused by the + write protection. + + This feature regularly causes small overhead on kernel. + Once this feature is activated, it causes much more overhead + on kernel. + + If in doubt, say N. + config LIVEDUMP bool "Live Dump support" - depends on X86_64 + depends on WRPROTECT ---help--- Set this option to 'Y' to allow the kernel support to acquire a consistent snapshot of kernel space without stopping system. diff --git a/arch/x86/include/asm/wrprotect.h b/arch/x86/include/asm/wrprotect.h new file mode 100644 index 0000000..40489e0 --- /dev/null +++ b/arch/x86/include/asm/wrprotect.h @@ -0,0 +1,26 @@ +/* wrprortect.h - Kernel space write protection support + * Copyright (C) 2011 Hitachi, Ltd. + * Author: YOSHIDA Masanori <masanori.yoshida.tv@hitachi.com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + +#ifndef _WRPROTECT_H +#define _WRPROTECT_H + +extern int wrprotect_split(void); + +#endif /* _WRPROTECT_H */ diff --git a/arch/x86/mm/Makefile b/arch/x86/mm/Makefile index 3d11327..781a368 100644 --- a/arch/x86/mm/Makefile +++ b/arch/x86/mm/Makefile @@ -30,3 +30,5 @@ obj-$(CONFIG_NUMA_EMU) += numa_emulation.o obj-$(CONFIG_HAVE_MEMBLOCK) += memblock.o obj-$(CONFIG_MEMTEST) += memtest.o + +obj-$(CONFIG_WRPROTECT) += wrprotect.o diff --git a/arch/x86/mm/wrprotect.c b/arch/x86/mm/wrprotect.c new file mode 100644 index 0000000..2a69735 --- /dev/null +++ b/arch/x86/mm/wrprotect.c @@ -0,0 +1,33 @@ +/* wrprotect.c - Kernel space write protection support + * Copyright (C) 2011 Hitachi, Ltd. + * Author: YOSHIDA Masanori <masanori.yoshida.tv@hitachi.com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + +#include <asm/wrprotect.h> +#include <linux/highmem.h> + +int wrprotect_split(void) +{ + unsigned long pfn; + for (pfn = 0; pfn < num_physpages; pfn++) { + int ret = set_memory_4k((unsigned long)pfn_to_kaddr(pfn), 1); + if (ret) + return ret; + } + return 0; +} diff --git a/kernel/livedump.c b/kernel/livedump.c index 198bda5..899d572 100644 --- a/kernel/livedump.c +++ b/kernel/livedump.c @@ -18,6 +18,8 @@ * MA 02110-1301, USA. */ +#include <asm/wrprotect.h> + #include <linux/module.h> #include <linux/fs.h> #include <linux/miscdevice.h> @@ -25,11 +27,14 @@ #define DEVICE_NAME "livedump" #define LIVEDUMP_IOC(x) _IO(0xff, x) +#define LIVEDUMP_IOC_SPLIT LIVEDUMP_IOC(1) static long livedump_ioctl( struct file *file, unsigned int cmd, unsigned long arg) { switch (cmd) { + case LIVEDUMP_IOC_SPLIT: + return wrprotect_split(); default: return -ENOIOCTLCMD; } diff --git a/tools/livedump/livedump b/tools/livedump/livedump new file mode 100755 index 0000000..c5e34d6 --- /dev/null +++ b/tools/livedump/livedump @@ -0,0 +1,13 @@ +#!/usr/bin/python + +import sys +import fcntl + +cmds = { + 'split':0xff01, + } +cmd = cmds[sys.argv[1]] + +f = open('/dev/livedump') +fcntl.ioctl(f, cmd) +f.close
| |