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 <t...@linutronix.de>
Co-developed-by: Andrei Vagin <ava...@gmail.com>
Signed-off-by: Andrei Vagin <ava...@gmail.com>
Signed-off-by: Dmitry Safonov <d...@arista.com>
---
 arch/x86/entry/vdso/vma.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/arch/x86/entry/vdso/vma.c b/arch/x86/entry/vdso/vma.c
index f6e13ab29d94..d6cb8a16f368 100644
--- a/arch/x86/entry/vdso/vma.c
+++ b/arch/x86/entry/vdso/vma.c
@@ -169,8 +169,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) {
-- 
2.23.0

Reply via email to