diff options
| author | Andy Lutomirski <luto@amacapital.net> | 2014-10-29 17:33:45 -0400 |
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2014-11-03 15:44:57 -0500 |
| commit | 87983c66bc02c9cd8e4a42e7924435145d52bb13 (patch) | |
| tree | 55948cf6d9d58e55cad84fdfb276819fba65bf6b | |
| parent | e76b027e6408f5570dc940b731ec9ae870c6188a (diff) | |
x86_64, vsyscall: Turn vsyscalls all the way off when vsyscall==none
I see no point in having an unusable read-only page sitting at
0xffffffffff600000 when vsyscall=none. Instead, skip mapping it and
remove it from /proc/PID/maps.
I kept the ratelimited warning when programs try to use a vsyscall
in this mode, since it may help admins avoid confusion.
Signed-off-by: Andy Lutomirski <luto@amacapital.net>
Reviewed-by: Josh Triplett <josh@joshtriplett.org>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Link: http://lkml.kernel.org/r/0dddbadc1d4e3bfbaf887938ff42afc97a7cc1f2.1414618407.git.luto@amacapital.net
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
| -rw-r--r-- | arch/x86/kernel/vsyscall_64.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/arch/x86/kernel/vsyscall_64.c b/arch/x86/kernel/vsyscall_64.c index 419e83b58436..2d912629c96e 100644 --- a/arch/x86/kernel/vsyscall_64.c +++ b/arch/x86/kernel/vsyscall_64.c | |||
| @@ -307,6 +307,8 @@ struct vm_area_struct *get_gate_vma(struct mm_struct *mm) | |||
| 307 | if (!mm || mm->context.ia32_compat) | 307 | if (!mm || mm->context.ia32_compat) |
| 308 | return NULL; | 308 | return NULL; |
| 309 | #endif | 309 | #endif |
| 310 | if (vsyscall_mode == NONE) | ||
| 311 | return NULL; | ||
| 310 | return &gate_vma; | 312 | return &gate_vma; |
| 311 | } | 313 | } |
| 312 | 314 | ||
| @@ -327,7 +329,7 @@ int in_gate_area(struct mm_struct *mm, unsigned long addr) | |||
| 327 | */ | 329 | */ |
| 328 | int in_gate_area_no_mm(unsigned long addr) | 330 | int in_gate_area_no_mm(unsigned long addr) |
| 329 | { | 331 | { |
| 330 | return (addr & PAGE_MASK) == VSYSCALL_ADDR; | 332 | return vsyscall_mode != NONE && (addr & PAGE_MASK) == VSYSCALL_ADDR; |
| 331 | } | 333 | } |
| 332 | 334 | ||
| 333 | void __init map_vsyscall(void) | 335 | void __init map_vsyscall(void) |
| @@ -335,10 +337,12 @@ void __init map_vsyscall(void) | |||
| 335 | extern char __vsyscall_page; | 337 | extern char __vsyscall_page; |
| 336 | unsigned long physaddr_vsyscall = __pa_symbol(&__vsyscall_page); | 338 | unsigned long physaddr_vsyscall = __pa_symbol(&__vsyscall_page); |
| 337 | 339 | ||
| 338 | __set_fixmap(VSYSCALL_PAGE, physaddr_vsyscall, | 340 | if (vsyscall_mode != NONE) |
| 339 | vsyscall_mode == NATIVE | 341 | __set_fixmap(VSYSCALL_PAGE, physaddr_vsyscall, |
| 340 | ? PAGE_KERNEL_VSYSCALL | 342 | vsyscall_mode == NATIVE |
| 341 | : PAGE_KERNEL_VVAR); | 343 | ? PAGE_KERNEL_VSYSCALL |
| 344 | : PAGE_KERNEL_VVAR); | ||
| 345 | |||
| 342 | BUILD_BUG_ON((unsigned long)__fix_to_virt(VSYSCALL_PAGE) != | 346 | BUILD_BUG_ON((unsigned long)__fix_to_virt(VSYSCALL_PAGE) != |
| 343 | (unsigned long)VSYSCALL_ADDR); | 347 | (unsigned long)VSYSCALL_ADDR); |
| 344 | } | 348 | } |
