x86/vdso: On timens page fault prefault also VVAR page
authorDmitry Safonov <dima@arista.com>
Tue, 12 Nov 2019 01:27:14 +0000 (01:27 +0000)
committerThomas Gleixner <tglx@linutronix.de>
Tue, 14 Jan 2020 11:20:59 +0000 (12:20 +0100)
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
arch/x86/entry/vdso/vma.c

index e5f3361..d2fd8a5 100644 (file)
@@ -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) {