From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 665C8C3ABD8 for ; Wed, 14 May 2025 23:45:38 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id C0DDE6B00E3; Wed, 14 May 2025 19:44:01 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id BBB446B00E4; Wed, 14 May 2025 19:44:01 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 9E4AE6B00E5; Wed, 14 May 2025 19:44:01 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 797F56B00E3 for ; Wed, 14 May 2025 19:44:01 -0400 (EDT) Received: from smtpin06.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id AF63180F78 for ; Wed, 14 May 2025 23:44:02 +0000 (UTC) X-FDA: 83443143924.06.626C90C Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) by imf10.hostedemail.com (Postfix) with ESMTP id D987FC0009 for ; Wed, 14 May 2025 23:44:00 +0000 (UTC) Authentication-Results: imf10.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=QBzeO+Kb; spf=pass (imf10.hostedemail.com: domain of 3vyolaAsKCPASUcWjdWqlfYYggYdW.Ugedafmp-eecnSUc.gjY@flex--ackerleytng.bounces.google.com designates 209.85.216.74 as permitted sender) smtp.mailfrom=3vyolaAsKCPASUcWjdWqlfYYggYdW.Ugedafmp-eecnSUc.gjY@flex--ackerleytng.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Authentication-Results: i=1; imf10.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=QBzeO+Kb; spf=pass (imf10.hostedemail.com: domain of 3vyolaAsKCPASUcWjdWqlfYYggYdW.Ugedafmp-eecnSUc.gjY@flex--ackerleytng.bounces.google.com designates 209.85.216.74 as permitted sender) smtp.mailfrom=3vyolaAsKCPASUcWjdWqlfYYggYdW.Ugedafmp-eecnSUc.gjY@flex--ackerleytng.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1747266240; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=w59iMjR8iadMOYtl6Kc2hNNZvpxUqRzRIVqBODddmXk=; b=YYVnbmD3ZnAbqp2cfyPOzh5SKBvkxo9EMnrIapL0A4kULNfDery/fKxDBAF8ANtSPlI6yN 0O+J+l0671u8lB+viOK/Th/5wU6OexrhMX5mYUouhausNdFQXBcxJXy5hjfNoxHpAcqP0L akHzxFT8BQT1M0FEacqW/uc9Tj+n1Nc= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1747266240; a=rsa-sha256; cv=none; b=6xanO7orW3sQJVzZHbfPc3/2FARJ+9ujoenBxhRUbduFWFquWW6d/bHMd6hCzKnPOlOYnt qzafQIuCyQ9AFi908mVwdCSTQgwKqPVadaeDnyJiy8UqySxuKxejVeDVfQ9k/vpQZA5Oi4 H6iAGBcV7sQukB+E/S2Qeq6BMEP0Jr4= Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-30ac618952eso280552a91.2 for ; Wed, 14 May 2025 16:44:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1747266240; x=1747871040; darn=kvack.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=w59iMjR8iadMOYtl6Kc2hNNZvpxUqRzRIVqBODddmXk=; b=QBzeO+Kbz2Qxn6PV8XEvV2gPxmAB9WDBzekmY6izNek/ggTna2CoU/xtoZoS0EawhS 6ujLiBXdDmFaTq8aRd6IhRo6tsUi2H6fmKxgMjaXS9M4P0NJlwcGZsEHIGSkTNaVlBmP DfkmwDATUvODGDpfqy+1+8BgvsZBM4vSJQTPibmMSm4abZ1kl+fSR0/aJFNnvnRvB5M8 smXtDrq4Tt2UHWblr4qk5ER1Xxg3+TkQXNU3XTmfUxLsehU49HxoNZBrTN70YwzL5gjf yIqlhewDCIf/12oRbif2O/IHh4ygeMDlyLtgV1ND4+4OuWhwjdEpQCZv+kCXC1+6NXsW Q6Ow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747266240; x=1747871040; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=w59iMjR8iadMOYtl6Kc2hNNZvpxUqRzRIVqBODddmXk=; b=UK6BF9torJZ+sDFWjk3wx6lj+R1UCckxImQGMjSJmyzLsfDsG6G/2bdivtWZCGJoNH Z6eojExvdGFgpv2xGowdSo9FXRHLXcKDhbOs9A52D9/Fd2KMGNBEfVhYoD5IFH3dxfXx E9O39zM5WVwoeOFhu5U/UDbv1dl5E4tMW6Dt8HFAgO8J4YeOymWT07FoKr3/I8kOaoLV mO0Cv12UDHH0kKDV8HjEud7Is1W7Nmx+65rul3I9nfhe9L+KXRU0ZCHdHXTEF3mkPmz7 NYHamTsomLoQWLoIezjnHoKVAYZqvRwhACwWqOqXD5ryOOPZYiFJpcdknjrACp4ps4KG tmjg== X-Forwarded-Encrypted: i=1; AJvYcCW9YfPCvyp0ezKSfeH+sVgzAwUlE5/B7GmkUZcsN9qEZPas1phSA8PiD+w5mqamjyaqmt9qrL1V+w==@kvack.org X-Gm-Message-State: AOJu0YztXOFkqTL4+FlNQSWNOp+roTh9vVF9UUMJyKaKXZSMc9raKPHH CLX8kwAFnMgb/e4rpKV7/VZTB4tblg+U52Hg3DlXxU1JcZvMWo0pTTbDMPeEXRap/8RUl/AOP3b 6Ce1ogVLkfuJ8+ZiM0g7QnQ== X-Google-Smtp-Source: AGHT+IGyLkn3nqeNKfrPwmXh8d7PdkrS0NNj4rvg8/rg8+lUUn5fqkFx2CkNgkz2N4cDBWoYAECpFAIq4YtOUG++oA== X-Received: from pjbsy6.prod.google.com ([2002:a17:90b:2d06:b0:2e0:915d:d594]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:38cc:b0:2ff:5ec1:6c6a with SMTP id 98e67ed59e1d1-30e2e5dcdcamr9260937a91.18.1747266239615; Wed, 14 May 2025 16:43:59 -0700 (PDT) Date: Wed, 14 May 2025 16:42:19 -0700 In-Reply-To: Mime-Version: 1.0 References: X-Mailer: git-send-email 2.49.0.1045.g170613ef41-goog Message-ID: <3f48795c0c34f4faf661394e5ad9805f9014ae23.1747264138.git.ackerleytng@google.com> Subject: [RFC PATCH v2 40/51] KVM: guest_memfd: Update kvm_gmem_mapping_order to account for page status From: Ackerley Tng To: kvm@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, x86@kernel.org, linux-fsdevel@vger.kernel.org Cc: ackerleytng@google.com, aik@amd.com, ajones@ventanamicro.com, akpm@linux-foundation.org, amoorthy@google.com, anthony.yznaga@oracle.com, anup@brainfault.org, aou@eecs.berkeley.edu, bfoster@redhat.com, binbin.wu@linux.intel.com, brauner@kernel.org, catalin.marinas@arm.com, chao.p.peng@intel.com, chenhuacai@kernel.org, dave.hansen@intel.com, david@redhat.com, dmatlack@google.com, dwmw@amazon.co.uk, erdemaktas@google.com, fan.du@intel.com, fvdl@google.com, graf@amazon.com, haibo1.xu@intel.com, hch@infradead.org, hughd@google.com, ira.weiny@intel.com, isaku.yamahata@intel.com, jack@suse.cz, james.morse@arm.com, jarkko@kernel.org, jgg@ziepe.ca, jgowans@amazon.com, jhubbard@nvidia.com, jroedel@suse.de, jthoughton@google.com, jun.miao@intel.com, kai.huang@intel.com, keirf@google.com, kent.overstreet@linux.dev, kirill.shutemov@intel.com, liam.merwick@oracle.com, maciej.wieczor-retman@intel.com, mail@maciej.szmigiero.name, maz@kernel.org, mic@digikod.net, michael.roth@amd.com, mpe@ellerman.id.au, muchun.song@linux.dev, nikunj@amd.com, nsaenz@amazon.es, oliver.upton@linux.dev, palmer@dabbelt.com, pankaj.gupta@amd.com, paul.walmsley@sifive.com, pbonzini@redhat.com, pdurrant@amazon.co.uk, peterx@redhat.com, pgonda@google.com, pvorel@suse.cz, qperret@google.com, quic_cvanscha@quicinc.com, quic_eberman@quicinc.com, quic_mnalajal@quicinc.com, quic_pderrin@quicinc.com, quic_pheragu@quicinc.com, quic_svaddagi@quicinc.com, quic_tsoni@quicinc.com, richard.weiyang@gmail.com, rick.p.edgecombe@intel.com, rientjes@google.com, roypat@amazon.co.uk, rppt@kernel.org, seanjc@google.com, shuah@kernel.org, steven.price@arm.com, steven.sistare@oracle.com, suzuki.poulose@arm.com, tabba@google.com, thomas.lendacky@amd.com, usama.arif@bytedance.com, vannapurve@google.com, vbabka@suse.cz, viro@zeniv.linux.org.uk, vkuznets@redhat.com, wei.w.wang@intel.com, will@kernel.org, willy@infradead.org, xiaoyao.li@intel.com, yan.y.zhao@intel.com, yilun.xu@intel.com, yuzenghui@huawei.com, zhiquan1.li@intel.com Content-Type: text/plain; charset="UTF-8" X-Rspamd-Server: rspam04 X-Rspamd-Queue-Id: D987FC0009 X-Stat-Signature: dis8cooi63k1b5t3riymrgzdugg3sfgn X-Rspam-User: X-HE-Tag: 1747266240-418189 X-HE-Meta: U2FsdGVkX19Cgiv0rDLLMIgGdWonbkQls70kLAM3oCTcfmzXoCzqIYmZRPKYiwt+bUrGeOK3XScvLukHbWnNqV3PlxZLX3ggIosj8kBYsaZHz0XIooLjNJ8dA1ztj2hAfmS9i5KetAVKLjBB0bByUbULiZK8XbdIMEB51o8ILCtaip8dH43Y7p/DLoGJMXgUEz+2RwPyCnfnxwM/dnCrTOiXamEfpgHm1XsByFRHltn7LChvSDVbXznzWUv60cMMubKz6t8DcsqpTEx6O/nmp03s0CB10t8qfVSFLZFgf7ogYvrZH7M2kQYUv6ovA+qbRdDarrRVW40RJVR6QQ+TyvwB1Neg30qa5Y+iVYLb1lhNTDelCc0EN8SJS+GSiyjM5HMBZuHGtimeXhYuiUMIN3Mvdz+C/yPLYiGLVvMaYzZPESZVmfdPu2FHpdUonCAUeAzEEBCZ1RTnx9GKBIX9ZHFPkL9aHFyiM0fXaePPdGJeT2+pnMiGYXwOnf8Jw1uvQhYmOIHO8fjvHooz88INa//1uaoeQJKJ9GNuynmSopF2Y3XrI3oi+KxwAEXo2oq1nMjaHFAjzqRL0TDr4ioz1nCmadPZEROgtxRuhZA3N2i1FqBsmG8UVFrOi07dty8ixxwIHGBntzG2q7nU283rNJ+s9XpjmtSFoDiVe6DHndNS/JVOLk2F/t28m1o8+3Gax4k8JTfASG1G3n4fQD/XNF1aMyd8RkZUSgUn1vIrJ6hqzpDVmDklNFb/dg1Uq1EyqZJT4CSnXHJxrcI5OdMpTQBh9etZM8X/Zpm3SoU2I3lzvRb1wyitVWoHQiY7qDg/jtGaKRMBTRCDAIKuaQHDgy9royQg2tzHjXT6xrYpdKS2tNp6eC3SQBiDudJWdJ/xBHAdKMw30XSCkLrTJC3dMEdNGuDdRFERvLZxT+aaUaCHgdwf5fSJF8oiH56s3YOg+IyNGaTqKi37og7f7NS AFB0A8bm k1VdeKuK5UQTReUS0tPTbZVZ3UcK+NixSUZX3JsjXROZ0V4qedAFOBtrxTdItpRiSMkIZc/UNVAhgcxrcPk/mcT0zZCEE74ey+p4Tcpka2B3dpVojseheiMmgEkqTnwJAFLtgrOJjLtuDWtqq1DcMZVvf+42xNwUrbhlIYolsfvvoN5apCeUUTCXvKTsKxRSEPHpt1y83lolpcZwuEctzTxTc3Ljk+QWWM/Y7pU90HM04jDKKIkcqDsB6IXiEgb9cK1+H4EvA+TDkUf7lszy0Tgpm/9MepPLzz6AzvcH6RkPWgJ2IbSBjKoqP9aRldalCsWEq9ZtM3uBA3FN8ZS4e4ZfEYYOqMoA2Po7UlM+V004e1NsgCD1MmIpthpbHdz88bEKEv3IqF7JEBNOvV+e+sJN2mtbqYd2a7jVgqezlPcRjQ1th6rtlORpYrfDlCmddFMQ1IY3MTKukXCRyXMFEhrdRffi+oQg4ILafhKwwMpk10KTZ2Flp/bd/efmqkPcRo5kqsgDzYpfwullMwyj+eyQTBeAZYv3CIoOfOh6uNO+sTZ4lIvwzAM2xC3Yh3Edpt9ASnYYLewBH+/kO1Bj3xp53u4l0dEGrdd6J4gZhwycx+xCXgDNFPQs2S7yXXaHP0rqJMsCxbBtlPkQL3ibXwrHFmPmu4Na1AdRF8eUf5tJXtM2sB3d2+ZTazxtXcJAKZFghm/XqKMzR3Jg= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: kvm_gmem_mapping_order() should return the maximum mapping order for a gfn if a page were to be faulted in for that gfn. For inodes that support a custom allocator, the maximum mapping order should be determined by the custom allocator in conjunction with guest_memfd. This patch updates kvm_gmem_mapping_order() to take into account that for the guestmem_hugetlb custom allocator, pages are split if any page in a huge page range is shared. Change-Id: I5c061af6cefdcbd708a4334cd58edc340afcf44e Signed-off-by: Ackerley Tng --- virt/kvm/guest_memfd.c | 72 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 62 insertions(+), 10 deletions(-) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 04b1513c2998..8b5fe1360e58 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -709,19 +709,27 @@ static int kvm_gmem_split_folio_in_filemap(struct inode *inode, struct folio *fo return ret; } +static inline bool kvm_gmem_should_split_at_index(struct inode *inode, + pgoff_t index) +{ + pgoff_t index_floor; + size_t nr_pages; + void *priv; + + priv = kvm_gmem_allocator_private(inode); + nr_pages = kvm_gmem_allocator_ops(inode)->nr_pages_in_folio(priv); + index_floor = round_down(index, nr_pages); + + return kvm_gmem_has_some_shared(inode, index_floor, nr_pages); +} + static inline int kvm_gmem_try_split_folio_in_filemap(struct inode *inode, struct folio *folio) { - size_t to_nr_pages; - void *priv; - if (!kvm_gmem_has_custom_allocator(inode)) return 0; - priv = kvm_gmem_allocator_private(inode); - to_nr_pages = kvm_gmem_allocator_ops(inode)->nr_pages_in_page(priv); - - if (kvm_gmem_has_some_shared(inode, folio->index, to_nr_pages)) + if (kvm_gmem_should_split_at_index(inode, folio->index)) return kvm_gmem_split_folio_in_filemap(inode, folio); return 0; @@ -890,6 +898,12 @@ static long kvm_gmem_merge_truncate_indices(struct inode *inode, pgoff_t index, #else +static inline bool kvm_gmem_should_split_at_index(struct inode *inode, + pgoff_t index) +{ + return false; +} + static inline int kvm_gmem_try_split_folio_in_filemap(struct inode *inode, struct folio *folio) { @@ -1523,7 +1537,7 @@ static inline struct file *kvm_gmem_get_file(struct kvm_memory_slot *slot) return get_file_active(&slot->gmem.file); } -static pgoff_t kvm_gmem_get_index(struct kvm_memory_slot *slot, gfn_t gfn) +static pgoff_t kvm_gmem_get_index(const struct kvm_memory_slot *slot, gfn_t gfn) { return gfn - slot->base_gfn + slot->gmem.pgoff; } @@ -2256,14 +2270,52 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot, EXPORT_SYMBOL_GPL(kvm_gmem_get_pfn); /** - * Returns the mapping order for this @gfn in @slot. + * kvm_gmem_mapping_order() - Get the mapping order for this @gfn in @slot. + * + * @slot: the memslot that gfn belongs to. + * @gfn: the gfn to look up mapping order for. * * This is equal to max_order that would be returned if kvm_gmem_get_pfn() were * called now. + * + * Return: the mapping order for this @gfn in @slot. */ int kvm_gmem_mapping_order(const struct kvm_memory_slot *slot, gfn_t gfn) { - return 0; + struct inode *inode; + struct file *file; + int ret; + + file = kvm_gmem_get_file((struct kvm_memory_slot *)slot); + if (!file) + return 0; + + inode = file_inode(file); + + ret = 0; + if (kvm_gmem_has_custom_allocator(inode)) { + bool should_split; + pgoff_t index; + + index = kvm_gmem_get_index(slot, gfn); + + filemap_invalidate_lock_shared(inode->i_mapping); + should_split = kvm_gmem_should_split_at_index(inode, index); + filemap_invalidate_unlock_shared(inode->i_mapping); + + if (!should_split) { + size_t nr_pages; + void *priv; + + priv = kvm_gmem_allocator_private(inode); + nr_pages = kvm_gmem_allocator_ops(inode)->nr_pages_in_folio(priv); + + ret = ilog2(nr_pages); + } + } + + fput(file); + return ret; } EXPORT_SYMBOL_GPL(kvm_gmem_mapping_order); -- 2.49.0.1045.g170613ef41-goog