]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
s390/pfault: Fix virtual vs physical address confusion
authorAlexander Gordeev <agordeev@linux.ibm.com>
Tue, 24 Feb 2026 06:41:07 +0000 (07:41 +0100)
committerVasily Gorbik <gor@linux.ibm.com>
Wed, 25 Feb 2026 16:00:25 +0000 (17:00 +0100)
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: c98d2ecae08f ("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>
arch/s390/mm/pfault.c

index 2f829448c719e3ada1fd9b1e7cd391cb61bac869..6ecd6b0a22a8cb057a052d7a0d2a98c37866cabf 100644 (file)
@@ -62,7 +62,7 @@ int __pfault_init(void)
                "0:     nopr    %%r7\n"
                EX_TABLE(0b, 0b)
                : [rc] "+d" (rc)
-               : [refbk] "a" (&pfault_init_refbk), "m" (pfault_init_refbk)
+               : [refbk] "a" (virt_to_phys(&pfault_init_refbk)), "m" (pfault_init_refbk)
                : "cc");
        return rc;
 }
@@ -84,7 +84,7 @@ void __pfault_fini(void)
                "0:     nopr    %%r7\n"
                EX_TABLE(0b, 0b)
                :
-               : [refbk] "a" (&pfault_fini_refbk), "m" (pfault_fini_refbk)
+               : [refbk] "a" (virt_to_phys(&pfault_fini_refbk)), "m" (pfault_fini_refbk)
                : "cc");
 }