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 > >