RE: [PATCH v3 1/3] x86/hyperv: Use slow_virt_to_phys() in page transition hypervisor callback
From: Michael Kelley <hidden>
Date: 2024-01-08 16:00:36
Also in:
linux-coco, lkml
From: kirill.shutemov@linux.intel.com <redacted> Sent: Monday, January 8, 2024 5:08 AM
On Fri, Jan 05, 2024 at 10:30:23AM -0800, mhkelley58@gmail.com wrote:quoted
From: Michael Kelley <redacted> In preparation for temporarily marking pages not present during a transition between encrypted and decrypted, use slow_virt_to_phys() in the hypervisor callback. As long as the PFN is correct, slow_virt_to_phys() works even if the leaf PTE is not present. The existing functions that depend on vmalloc_to_page() all require that the leaf PTE be marked present, so they don't work. Update the comments for slow_virt_to_phys() to note this broader usage and the requirement to work even if the PTE is not marked present. Signed-off-by: Michael Kelley <redacted> --- arch/x86/hyperv/ivm.c | 9 ++++++++- arch/x86/mm/pat/set_memory.c | 13 +++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-)diff --git a/arch/x86/hyperv/ivm.c b/arch/x86/hyperv/ivm.c index 02e55237d919..8ba18635e338 100644 --- a/arch/x86/hyperv/ivm.c +++ b/arch/x86/hyperv/ivm.c@@ -524,7 +524,14 @@ static bool hv_vtom_set_host_visibility(unsignedlong kbuffer, int pagecount, boquoted
return false; for (i = 0, pfn = 0; i < pagecount; i++) { - pfn_array[pfn] = virt_to_hvpfn((void *)kbuffer + i * HV_HYP_PAGE_SIZE); + /* + * Use slow_virt_to_phys() because the PRESENT bit has been + * temporarily cleared in the PTEs. slow_virt_to_phys() works + * without the PRESENT bit while virt_to_hvpfn() or similar + * does not. + */ + pfn_array[pfn] = slow_virt_to_phys((void *)kbuffer + + i * HV_HYP_PAGE_SIZE) >> HV_HYP_PAGE_SHIFT;I think you can make it much more readable by introducing few variables: virt = (void *)kbuffer + i * HV_HYPPAGE_SIZE; phys = slow_virt_to_phys(virt); pfn_array[pfn] = phys >> HV_HYP_PAGE_SHIFT;
Agreed. I'll do this in the next version. Michael