s390/vdso: on timens page fault prefault also VVAR page
authorHeiko Carstens <hca@linux.ibm.com>
Sun, 31 Jan 2021 22:07:42 +0000 (23:07 +0100)
committerVasily Gorbik <gor@linux.ibm.com>
Tue, 9 Feb 2021 14:57:05 +0000 (15:57 +0100)
This is the s390 variant of commit e6b28ec65b6d ("x86/vdso: On timens
page fault prefault also VVAR page").

Reviewed-by: Alexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/kernel/vdso.c

index dd967af..8c4e07d 100644 (file)
@@ -105,14 +105,23 @@ static vm_fault_t vvar_fault(const struct vm_special_mapping *sm,
                             struct vm_area_struct *vma, struct vm_fault *vmf)
 {
        struct page *timens_page = find_timens_vvar_page(vma);
-       unsigned long pfn;
+       unsigned long addr, pfn;
+       vm_fault_t err;
 
        switch (vmf->pgoff) {
        case VVAR_DATA_PAGE_OFFSET:
-               if (timens_page)
+               pfn = virt_to_pfn(vdso_data);
+               if (timens_page) {
+                       /*
+                        * Fault in VVAR page too, since it will be accessed
+                        * to get clock data anyway.
+                        */
+                       addr = vmf->address + VVAR_TIMENS_PAGE_OFFSET * PAGE_SIZE;
+                       err = vmf_insert_pfn(vma, addr, pfn);
+                       if (unlikely(err & VM_FAULT_ERROR))
+                               return err;
                        pfn = page_to_pfn(timens_page);
-               else
-                       pfn = virt_to_pfn(vdso_data);
+               }
                break;
 #ifdef CONFIG_TIME_NS
        case VVAR_TIMENS_PAGE_OFFSET: