s390/vdso: on timens page fault prefault also VVAR page

This is the s390 variant of commit e6b28ec65b ("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>
This commit is contained in:
Heiko Carstens 2021-01-31 23:07:42 +01:00 committed by Vasily Gorbik
parent eeab78b05d
commit fe8344a092
1 changed files with 13 additions and 4 deletions

View 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 vm_area_struct *vma, struct vm_fault *vmf)
{ {
struct page *timens_page = find_timens_vvar_page(vma); struct page *timens_page = find_timens_vvar_page(vma);
unsigned long pfn; unsigned long addr, pfn;
vm_fault_t err;
switch (vmf->pgoff) { switch (vmf->pgoff) {
case VVAR_DATA_PAGE_OFFSET: 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); pfn = page_to_pfn(timens_page);
else }
pfn = virt_to_pfn(vdso_data);
break; break;
#ifdef CONFIG_TIME_NS #ifdef CONFIG_TIME_NS
case VVAR_TIMENS_PAGE_OFFSET: case VVAR_TIMENS_PAGE_OFFSET: