summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Safonov <dima@arista.com>2019-11-12 02:27:14 +0100
committerThomas Gleixner <tglx@linutronix.de>2020-01-14 12:20:59 +0100
commite6b28ec65b6d433624a2c290073bc356c4fce914 (patch)
tree81ff9cf584ab535118721371a8b6111c81dddb60
parentx86/vdso: Handle faults on timens page (diff)
downloadlinux-e6b28ec65b6d433624a2c290073bc356c4fce914.tar.xz
linux-e6b28ec65b6d433624a2c290073bc356c4fce914.zip
x86/vdso: On timens page fault prefault also VVAR page
As timens page has offsets to data on VVAR page VVAR is going to be accessed shortly. Set it up with timens in one page fault as optimization. Suggested-by: Thomas Gleixner <tglx@linutronix.de> Co-developed-by: Andrei Vagin <avagin@gmail.com> Signed-off-by: Andrei Vagin <avagin@gmail.com> Signed-off-by: Dmitry Safonov <dima@arista.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lore.kernel.org/r/20191112012724.250792-26-dima@arista.com
-rw-r--r--arch/x86/entry/vdso/vma.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/arch/x86/entry/vdso/vma.c b/arch/x86/entry/vdso/vma.c
index e5f336112cb1..d2fd8a57af7d 100644
--- a/arch/x86/entry/vdso/vma.c
+++ b/arch/x86/entry/vdso/vma.c
@@ -170,8 +170,23 @@ static vm_fault_t vvar_fault(const struct vm_special_mapping *sm,
* offset.
* See also the comment near timens_setup_vdso_data().
*/
- if (timens_page)
+ if (timens_page) {
+ unsigned long addr;
+ vm_fault_t err;
+
+ /*
+ * Optimization: inside time namespace pre-fault
+ * VVAR page too. As on timens page there are only
+ * offsets for clocks on VVAR, it'll be faulted
+ * shortly by VDSO code.
+ */
+ addr = vmf->address + (image->sym_timens_page - sym_offset);
+ err = vmf_insert_pfn(vma, addr, pfn);
+ if (unlikely(err & VM_FAULT_ERROR))
+ return err;
+
pfn = page_to_pfn(timens_page);
+ }
return vmf_insert_pfn(vma, vmf->address, pfn);
} else if (sym_offset == image->sym_pvclock_page) {