Skip to content

Commit d879ac6

Browse files
Alexander GordeevVasily Gorbik
authored andcommitted
s390/pfault: Fix virtual vs physical address confusion
When Linux is running as guest, runs a user space process and the user space process accesses a page that the host has paged out, the guest gets a pfault interrupt and schedules a different process. Without this mechanism the host would have to suspend the whole virtual CPU until the page has been paged in. To setup the pfault interrupt the real address of parameter list should be passed to DIAGNOSE 0x258, but a virtual address is passed instead. That has a performance impact, since the pfault setup never succeeds, the interrupt is never delivered to a guest and the whole virtual CPU is suspended as result. Cc: stable@vger.kernel.org Fixes: c98d2ec ("s390/mm: Uncouple physical vs virtual address spaces") Reported-by: Claudio Imbrenda <imbrenda@linux.ibm.com> Reviewed-by: Heiko Carstens <hca@linux.ibm.com> Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com> Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
1 parent 1623a55 commit d879ac6

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

arch/s390/mm/pfault.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ int __pfault_init(void)
6262
"0: nopr %%r7\n"
6363
EX_TABLE(0b, 0b)
6464
: [rc] "+d" (rc)
65-
: [refbk] "a" (&pfault_init_refbk), "m" (pfault_init_refbk)
65+
: [refbk] "a" (virt_to_phys(&pfault_init_refbk)), "m" (pfault_init_refbk)
6666
: "cc");
6767
return rc;
6868
}
@@ -84,7 +84,7 @@ void __pfault_fini(void)
8484
"0: nopr %%r7\n"
8585
EX_TABLE(0b, 0b)
8686
:
87-
: [refbk] "a" (&pfault_fini_refbk), "m" (pfault_fini_refbk)
87+
: [refbk] "a" (virt_to_phys(&pfault_fini_refbk)), "m" (pfault_fini_refbk)
8888
: "cc");
8989
}
9090

0 commit comments

Comments
 (0)