[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <179fdb45-d8a4-9567-edfe-2168794f599e@redhat.com>
Date: Thu, 16 Sep 2021 11:24:05 +0200
From: Paolo Bonzini <pbonzini@...hat.com>
To: "Kirill A. Shutemov" <kirill.shutemov@...ux.intel.com>,
Chao Peng <chao.p.peng@...ux.intel.com>
Cc: "Kirill A. Shutemov" <kirill@...temov.name>,
Andy Lutomirski <luto@...nel.org>,
Sean Christopherson <seanjc@...gle.com>,
Vitaly Kuznetsov <vkuznets@...hat.com>,
Wanpeng Li <wanpengli@...cent.com>,
Jim Mattson <jmattson@...gle.com>,
Joerg Roedel <joro@...tes.org>, kvm@...r.kernel.org,
linux-kernel@...r.kernel.org, Borislav Petkov <bp@...en8.de>,
Andrew Morton <akpm@...ux-foundation.org>,
Joerg Roedel <jroedel@...e.de>,
Andi Kleen <ak@...ux.intel.com>,
David Rientjes <rientjes@...gle.com>,
Vlastimil Babka <vbabka@...e.cz>,
Tom Lendacky <thomas.lendacky@....com>,
Thomas Gleixner <tglx@...utronix.de>,
Peter Zijlstra <peterz@...radead.org>,
Ingo Molnar <mingo@...hat.com>,
Varad Gautam <varad.gautam@...e.com>,
Dario Faggioli <dfaggioli@...e.com>, x86@...nel.org,
linux-mm@...ck.org, linux-coco@...ts.linux.dev,
Kuppuswamy Sathyanarayanan
<sathyanarayanan.kuppuswamy@...ux.intel.com>,
David Hildenbrand <david@...hat.com>,
Dave Hansen <dave.hansen@...el.com>,
Yu Zhang <yu.c.zhang@...ux.intel.com>
Subject: Re: [RFC] KVM: mm: fd-based approach for supporting KVM guest private
memory
On 15/09/21 16:11, Kirill A. Shutemov wrote:
>> Would introducing memfd_unregister_guest() fix this?
> I considered this, but it get complex quickly.
>
> At what point it gets called? On KVM memslot destroy?
>
> What if multiple KVM slot share the same memfd? Add refcount into memfd on
> how many times the owner registered the memfd?
You will always have multiple KVM slots sharing the same memfd, because
memslots are SRCU-protected. So there will be multiple generations of
memslots around and unregistering must be delayed to after
synchronize_srcu (around the call to kvm_arch_commit_memory_region).
So KVM could just call memfd_{,un}register_guest as many times as it
calls fdget/fput. Looking at your test device, it would be like the
following pseudo-patch:
case GUEST_MEM_REGISTER: {
struct fd memfd = fdget(arg);
memfd_file = memfd.file;
return memfd_register_guest(memfd_file->f_inode, file,
&guest_ops, &guest_mem_ops);
}
case GUEST_MEM_UNREGISTER: {
if (!memfd_file)
return -EINVAL;
+ memfd_unregister_guest(memfd_file->f_inode, file);
fput(memfd_file);
memfd_file = NULL;
guest_mem_ops = NULL;
return 0;
and shmem_unregister_guest would be something like
struct shmem_inode_info *info = SHMEM_I(inode);
if (WARN_ON_ONCE(info->guest_owner != owner))
return;
if (--info->guest_usage_count)
return;
info->guest_owner = NULL;
info->guest_ops = NULL;
Paolo
> It would leave us in strange state: memfd refcount owners (struct KVM) and
> KVM memslot pins the struct file. Weird refcount exchnage program.
Powered by blists - more mailing lists