2024-04-18 20:03:35

by Michael Roth

[permalink] [raw]
Subject: Re: [PATCH v12 22/29] KVM: SEV: Implement gmem hook for invalidating private pages

On Sat, Mar 30, 2024 at 10:31:47PM +0100, Paolo Bonzini wrote:
> On 3/29/24 23:58, Michael Roth wrote:
> > + /*
> > + * If an unaligned PFN corresponds to a 2M region assigned as a
> > + * large page in he RMP table, PSMASH the region into individual
> > + * 4K RMP entries before attempting to convert a 4K sub-page.
> > + */
> > + if (!use_2m_update && rmp_level > PG_LEVEL_4K) {
> > + rc = snp_rmptable_psmash(pfn);
> > + if (rc)
> > + pr_err_ratelimited("SEV: Failed to PSMASH RMP entry for PFN 0x%llx error %d\n",
> > + pfn, rc);
> > + }
>
> Ignoring the PSMASH failure is pretty scary... At this point .free_folio
> cannot fail, should the psmash part of this patch be done in
> kvm_gmem_invalidate_begin() before kvm_mmu_unmap_gfn_range()?
>
> Also, can you get PSMASH_FAIL_INUSE and if so what's the best way to address
> it? Should fallocate() return -EBUSY?

FAIL_INUSE shouldn't occur since at this point the pages have been unmapped
from NPT and only the task doing the cleanup should be attempting to
access/PSMASH this particular 2M HPA range at this point.

However, since FAIL_INUSE is transient, there isn't a good reason why we
shouldn't retry until it clears itself up rather than risk hosing the
system if some unexpected case ever did pop up, so I've updated
snp_rmptable_psmash() to handle that case automatically and simplify the
handling in sev_handle_rmp_fault() as well. (in the case of #NPF RMP
faults there is actually potential for PSMASH errors other than
FAIL_INUSE due to races with other vCPU threads which can interleave and
put the RMP entry in an unexpected state, so there's additional
handling/reporting to deal with those cases, but here they are not expected
and will trigger WARN_*ONCE()'s now)

I used this hacked up version of Sean's original patch to re-enable 2MB
hugepage support in gmem for the purposes of re-testing this:

https://github.com/mdroth/linux/commit/15aa4f81811485997953130fc184e829ba4399d2

-Mike

>
> Thanks,
>
> Paolo
>
>