On Tue, Mar 18, 2025 at 8:42 AM Adrian Hunter <adrian.hunter@xxxxxxxxx> wrote: > > On 17/03/25 10:13, Kirill A. Shutemov wrote: > > On Thu, Mar 13, 2025 at 08:16:29PM +0200, Adrian Hunter wrote: > >> @@ -3221,6 +3241,19 @@ int tdx_gmem_private_max_mapping_level(struct kvm *kvm, kvm_pfn_t pfn) > >> return PG_LEVEL_4K; > >> } > >> > >> +int tdx_gmem_defer_removal(struct kvm *kvm, struct inode *inode) > >> +{ > >> + struct kvm_tdx *kvm_tdx = to_kvm_tdx(kvm); > >> + > >> + if (kvm_tdx->nr_gmem_inodes >= TDX_MAX_GMEM_INODES) > >> + return 0; > > > > We have graceful way to handle this, but should we pr_warn_once() or > > something if we ever hit this limit? > > > > Hm. It is also a bit odd that we need to wait until removal to add a link > > to guest_memfd inode from struct kvm/kvm_tdx. Can we do it right away in > > __kvm_gmem_create()? > > Sure. > > The thing is, the inode is currently private within virt/kvm/guest_memfd.c > so there needs to be a way to make it accessible to arch code. Either a > callback passes it, or it is put on struct kvm in some way. > > > > > Do I read correctly that inode->i_mapping->i_private_list only ever has > > single entry of the gmem? Seems wasteful. > > Yes, it is presently used for only 1 gmem. Intrahost migration support[1] will make use of this list to track additional linked files. We are planning to float a next revision soon. [1] https://lore.kernel.org/lkml/ZN%2F81KNAWofRCaQK@xxxxxxxxxx/t/ > > > > > Maybe move it to i_private (I don't see flags being used anywhere) and > > re-use the list_head to link all inodes of the struct kvm? > > > > No need in the gmem_inodes array. > > There is also inode->i_mapping->i_private_data which is unused. >