Message ID | 20210726153836.031515657@linuxfoundation.org |
---|---|
State | Superseded |
Headers | show |
Series | None | expand |
Hi, On 7/27/21 1:02 AM, Paolo Bonzini wrote: > [Please note: This e-mail is from an EXTERNAL e-mail address] > > On 26/07/21 23:17, Sudip Mukherjee wrote: >> Hi Greg, >> >> On Mon, Jul 26, 2021 at 4:58 PM Greg Kroah-Hartman >> <gregkh@linuxfoundation.org> wrote: >>> >>> From: Paolo Bonzini <pbonzini@redhat.com> >>> >>> commit bd2fae8da794b55bf2ac02632da3a151b10e664c upstream. >> >> The build of mips malta_kvm_defconfig fails with the error: >> In file included from arch/mips/kvm/../../../virt/kvm/kvm_main.c:21: >> arch/mips/kvm/../../../virt/kvm/kvm_main.c: In function >> 'hva_to_pfn_remapped': >> ./include/linux/kvm_host.h:70:33: error: conversion from 'long long >> unsigned int' to 'long unsigned int' changes value from >> '9218868437227405314' to '2' [-Werror=overflow] >> 70 | #define KVM_PFN_ERR_RO_FAULT (KVM_PFN_ERR_MASK + 2) >> | ^ >> arch/mips/kvm/../../../virt/kvm/kvm_main.c:1530:23: note: in expansion >> of macro 'KVM_PFN_ERR_RO_FAULT' >> 1530 | pfn = KVM_PFN_ERR_RO_FAULT; >> >> It built fine after reverting this patch. >> gcc version 11.1.1 20210723 > > I'll resend a version that works tomorrow (including the second patch > too, which depends on this one for context). > The following upstream commit needed to be backported as well: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a9545779ee9e9e103648f6f2552e73cfe808d0f4 I have sent v2 for this patchset. Thanks! Ovidiu > Paolo >
--- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -1495,9 +1495,11 @@ static int hva_to_pfn_remapped(struct vm kvm_pfn_t *p_pfn) { unsigned long pfn; + pte_t *ptep; + spinlock_t *ptl; int r; - r = follow_pfn(vma, addr, &pfn); + r = follow_pte_pmd(vma->vm_mm, addr, NULL, NULL, &ptep, NULL, &ptl); if (r) { /* * get_user_pages fails for VM_IO and VM_PFNMAP vmas and does @@ -1512,14 +1514,19 @@ static int hva_to_pfn_remapped(struct vm if (r) return r; - r = follow_pfn(vma, addr, &pfn); + r = follow_pte_pmd(vma->vm_mm, addr, NULL, NULL, &ptep, NULL, &ptl); if (r) return r; + } + if (write_fault && !pte_write(*ptep)) { + pfn = KVM_PFN_ERR_RO_FAULT; + goto out; } if (writable) - *writable = true; + *writable = pte_write(*ptep); + pfn = pte_pfn(*ptep); /* * Get a reference here because callers of *hva_to_pfn* and @@ -1534,6 +1541,8 @@ static int hva_to_pfn_remapped(struct vm */ kvm_get_pfn(pfn); +out: + pte_unmap_unlock(ptep, ptl); *p_pfn = pfn; return 0; }