From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2550C34AB1D for ; Mon, 23 Feb 2026 07:04:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771830296; cv=none; b=b7O3ibaPhTqb5BAt2zZUBM7stoAp0Y8eEkW+hih3mioXz12sINXLEWb2QCGLkfnGDwU6PcKrCFmhS7MjzDJuAbqlPzgWVDwJZbJT8hylhUcvqo2973nkGOCEbrGNbycS8G0wQ/wF2KQY+t6za3xvFtWL2CTd25dtC5afvphgNtg= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771830296; c=relaxed/simple; bh=jh3ZPt1ZHay6YAxI3Ut5XTGeyxbcY4vqjvfPdGHfjT0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=t6O96/p/sikCWsEGjQfv5YjNsGFD9J3f3XHV5iwXjPPA2jIMDtOYkqrb8y1kKdrR/UL/2PzXhItdZLTTZEIru0J/8CqRWLRanNxex4CFHWx7Aa7imoX0nJdJosxJZbCNu5n/yzpYwNcWwPIDKc4wSKtk1VYru/QfGfrJtOjPT9Q= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=fGeXqjTn; arc=none smtp.client-ip=209.85.215.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--ackerleytng.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="fGeXqjTn" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-c6de0bd0896so22535294a12.1 for ; Sun, 22 Feb 2026 23:04:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1771830293; x=1772435093; darn=vger.kernel.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=MlhRSEkvP3hGcg7973jpELqHCKZWjzo4VY3xzNikZZA=; b=fGeXqjTnG/p6rTgKq+0NXmRzXAVLOG+COq+HX6nJpElAssSG8Bg0N4Ljgi3QMfyM77 mjTMrxCUGs9CBC4QhUUfuZpF2cUlhiL5Z8Ow+8Jxg4SfcgKHQwzsE8EmJTRz7uGJe0Wy UT22IN64pPaqzo7YoRH7Wgatsz3nFV6XN7zz9IECFkyNK5j6fr5id13DJsqZGZugCYuV m/obNMpoL4qFbeQ0Pfk9hegYXoaVDMjnLiXu0FTASF2V9Jtg1Wv11R1gHfpW0NPKq6mO 3wu7fMrYjhdWY/HfhyCi4dZwwUa54olkRf8evWVVsYbqQZMGw5YsAvgOlepPlyDAPbbX lidQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771830293; x=1772435093; 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=MlhRSEkvP3hGcg7973jpELqHCKZWjzo4VY3xzNikZZA=; b=CuFAT6uNl3Jx6yKD7/1gK/MPyPwD+7yx+/9/uQQw0JhyRdC0ny43X2604PtRhRIim9 clpDXPSi0s5Waer+iwpPQYLbcRYwmOny/ctCt1KkG+QjeJ4RArCXCJJGkLGEr6ofSiQ+ YE/txEZOSCXWpuxYb9VCjw82abbJfy3jqGm7AJxA7ICPRTOPYCxxF2KF2r/yNfaYTqP7 ZC/Jn4qVQQLYsTka6XvswyyqWs95a6DIwju2BCnE2ddCe9/q36FS1+ibdUpUmg4TCtQe iaGkIzQSWv67RfetXTuqSwMqRx2ob7aaN7D2BjZAcX5U/ykfXHhFjLS7XX/MjOL4z0gI LUeA== X-Forwarded-Encrypted: i=1; AJvYcCWcSjHc6Vr9lIkljlXvEiR348ApUSnK+yGPQD5x0eSaRNc8KxZ9unj5ih529Uz79Je0UlysIZxLvmJaEDI=@vger.kernel.org X-Gm-Message-State: AOJu0YxTeSHoQjH/84x7Spl7QemWm80+2j9OanQsXFEhM+PQnzr64KrY YppXkPoOCDbncjRDLWsDnOz1rhAyM2ZgcZFU77Dk+LlHMg0Ihfz/vtq1JbhEvM13HaAmh5WwVFt ER0SnaFT4FgzawuyhlSg73NOSDQ== X-Received: from pjbjz17.prod.google.com ([2002:a17:90b:14d1:b0:354:7c70:1a9]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:e0a4:b0:393:f002:ff59 with SMTP id adf61e73a8af0-39545e91cd1mr6474154637.19.1771830293252; Sun, 22 Feb 2026 23:04:53 -0800 (PST) Date: Mon, 23 Feb 2026 07:04:35 +0000 In-Reply-To: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: X-Mailer: git-send-email 2.53.0.345.g96ddfc5eaa-goog Message-ID: <3e363901b177d8c2ae5088cfaeb3862621bbce9b.1771826352.git.ackerleytng@google.com> Subject: [RFC PATCH v1 02/10] KVM: guest_memfd: Directly allocate folios with filemap_alloc_folio() From: Ackerley Tng To: linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org Cc: akpm@linux-foundation.org, david@kernel.org, lorenzo.stoakes@oracle.com, Liam.Howlett@oracle.com, vbabka@suse.cz, rppt@kernel.org, surenb@google.com, mhocko@suse.com, willy@infradead.org, pbonzini@redhat.com, shuah@kernel.org, ackerleytng@google.com, seanjc@google.com, shivankg@amd.com, rick.p.edgecombe@intel.com, yan.y.zhao@intel.com, rientjes@google.com, fvdl@google.com, jthoughton@google.com, vannapurve@google.com, pratyush@kernel.org, pasha.tatashin@soleen.com, kalyazin@amazon.com, tabba@google.com, michael.roth@amd.com Content-Type: text/plain; charset="UTF-8" __filemap_get_folio_mpol() is parametrized by a bunch of GFP flags, which adds complexity for the reader. Since guest_memfd doesn't meaningfully use any of the other FGP flags, undo that complexity by directly calling filemap_alloc_folio(). Directly calling filemap_alloc_folio() also allows the order of 0 to be explicitly specified, which is the only order guest_memfd supports. This is easier to understand, and removes the chance of anything else being able to unintentionally influence allocated folio size. Signed-off-by: Ackerley Tng --- virt/kvm/guest_memfd.c | 51 +++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 2df27b6443115..2488d7b8f2b0d 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -107,6 +107,39 @@ static int kvm_gmem_prepare_folio(struct kvm *kvm, struct kvm_memory_slot *slot, return __kvm_gmem_prepare_folio(kvm, slot, index, folio); } +static struct folio *__kvm_gmem_get_folio(struct inode *inode, pgoff_t index) +{ + /* TODO: Support huge pages. */ + struct mempolicy *policy; + struct folio *folio; + gfp_t gfp; + int ret; + + /* + * Fast-path: See if folio is already present in mapping to avoid + * policy_lookup. + */ + folio = filemap_lock_folio(inode->i_mapping, index); + if (!IS_ERR(folio)) + return folio; + + gfp = mapping_gfp_mask(inode->i_mapping); + + policy = mpol_shared_policy_lookup(&GMEM_I(inode)->policy, index); + folio = filemap_alloc_folio(gfp, 0, policy); + mpol_cond_put(policy); + if (!folio) + return ERR_PTR(-ENOMEM); + + ret = filemap_add_folio(inode->i_mapping, folio, index, gfp); + if (ret) { + folio_put(folio); + return ERR_PTR(ret); + } + + return folio; +} + /* * Returns a locked folio on success. The caller is responsible for * setting the up-to-date flag before the memory is mapped into the guest. @@ -118,23 +151,11 @@ static int kvm_gmem_prepare_folio(struct kvm *kvm, struct kvm_memory_slot *slot, */ static struct folio *kvm_gmem_get_folio(struct inode *inode, pgoff_t index) { - /* TODO: Support huge pages. */ - struct mempolicy *policy; struct folio *folio; - /* - * Fast-path: See if folio is already present in mapping to avoid - * policy_lookup. - */ - folio = filemap_lock_folio(inode->i_mapping, index); - if (!IS_ERR(folio)) - return folio; - - policy = mpol_shared_policy_lookup(&GMEM_I(inode)->policy, index); - folio = __filemap_get_folio_mpol(inode->i_mapping, index, - FGP_LOCK | FGP_CREAT, - mapping_gfp_mask(inode->i_mapping), policy); - mpol_cond_put(policy); + do { + folio = __kvm_gmem_get_folio(inode, index); + } while (PTR_ERR(folio) == -EEXIST); /* * External interfaces like kvm_gmem_get_pfn() support dealing -- 2.53.0.345.g96ddfc5eaa-goog