From nobody Thu Apr 16 22:34:02 2026 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (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 3CDDB311599 for ; Wed, 25 Feb 2026 07:20:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772004048; cv=none; b=K2Mex+c6gMvodK30y4GBCeDFLteldeY/zStBPcfbJ0dolEWEGFre8y0uS4fvNIcd5ri8JHtfznxK7AJs/K45lwAygV0cSfUscq7/BrA3BiZpRrzk343FyyryrSZn0c2zvGan7WUDKDs+GtJeDqPafcGVjNU2RlPiB29Nz8ff+UY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772004048; c=relaxed/simple; bh=ZMQPV7Y8H88+MGQYlAsk4qj1ohZaV8k9fkkraEOtToU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=AIbWnIkGo9rIz0QKxSNm5cmvAt/7wb5oUJKvARHMlFf+LBlQER35YWj2jogcYvsBn5/QEWKFYUz2rUu3k6Z+q/Z3RyXtt+wAkGN1ifVioz24FADb6RH3H3TqjcxI7KEbn5mIJK6i9WoK/ssb0SyR8Bu5MMJ5R6/afgMKPblTYuo= 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=esOssuLF; arc=none smtp.client-ip=209.85.215.201 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="esOssuLF" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-c6e1d32a128so4047995a12.3 for ; Tue, 24 Feb 2026 23:20:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1772004046; x=1772608846; 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=RxvzdHDHaSHLdjnOnYt7Pz8oF0XFcbFcMtFEzYFn1AQ=; b=esOssuLFcA56b+69h2S6cCu4y9evuNJTX/UOpJs4VmtUTLfgRz7J5Di4T2ocXlyJpa aHmNTJ24bp0tauf8kdLZAfe7NaPLIkFzpOoIwBKJ0VvOqdjRm6gMCtKLT3EahwYnVn4w MkKMITpVyFmUuA+s+OaphgQq/iRgZS00rUmTvP7ZZToJpgEI0GFfl/4UPN1cF5CuRfEQ tS7lGSDQ8XzL684soyjjntfVtTXsBYiZxX/5iVWHxV+2lQD+DlhpeVj8mW+6J9PyuVdb Ew9+soXzKmOgIwZu5eq3loLlatAVZNyi895LWexOpewTFKzMqPMncyP/mquQmWerq+0J yS4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772004046; x=1772608846; 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=RxvzdHDHaSHLdjnOnYt7Pz8oF0XFcbFcMtFEzYFn1AQ=; b=YYd8cY0JGDK5rs+8Qp4FVMe8jETIX+5NiZ9qTrh7xRMzMk1XoWZRHDFCmmvWAMmkfR ri17WgMvF3AGOPqreWkzaV7f4YGZDz2FwDw2T2JNBwmF961zyaghk8M8xwWBHrhvvKIt i7DLWq2mncbzEIzKFb6sHqQoeYfRPdhg6fY5tBZO2RqnfpK0Uwaz73U2Owi1yVd/venE y9jZaE38A67JVXlLyiiSHaEk8jNlMkGCwThbkUb9FIrlbSw+NmtQi8wHwxj4r/2Cr6SN R15wIV/QIzx9NbSulU6l+D+hV99Avzd0iNuwWz8kN5cFNcEWUi+X6c7ryrW37T+sMeXr S5tw== X-Forwarded-Encrypted: i=1; AJvYcCVsb4F7O74rWK8JogN/3esN57d6f0XQ023rXeSAD+A2pBiOzFTl06XcEJgI635Uk4QTYvTwrUomRcyZZQs=@vger.kernel.org X-Gm-Message-State: AOJu0YxHT6lg1DfIkOw0DseXFav8g3rYCYOGKnAA/TNHbVkGVBWobyna qAob6WzSlNX2AxeCM/2P56CRcyb2YWK6Z5OHqwz9g8ppzuUoXcAjLI7lYu4Ic49zYSGjt1Aqbax 3vdYfOow7KvRrptCcoakzcPaYxA== X-Received: from pjbjs14.prod.google.com ([2002:a17:90b:148e:b0:358:df96:881]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:2982:b0:35d:53dc:cb61 with SMTP id adf61e73a8af0-39545ed4ecbmr13199551637.24.1772004046254; Tue, 24 Feb 2026 23:20:46 -0800 (PST) Date: Wed, 25 Feb 2026 07:20:36 +0000 In-Reply-To: <20260225-gmem-st-blocks-v2-0-87d7098119a9@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260225-gmem-st-blocks-v2-0-87d7098119a9@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1772004043; l=1374; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=ZMQPV7Y8H88+MGQYlAsk4qj1ohZaV8k9fkkraEOtToU=; b=UnVR/uLYP7ieBpWEAadpA6sROUIT4SgE39FHR7vRTz9HvHgkz8Qjcpq+AL3FU4w88yU1gGUOS sJFEPjg87ZGArJKumnOvSjc+SZz2h+qBgaWpg2xkrvCz9aXcDFKM56w X-Mailer: b4 0.14.3 Message-ID: <20260225-gmem-st-blocks-v2-1-87d7098119a9@google.com> Subject: [PATCH RFC v2 1/6] KVM: guest_memfd: Don't set FGP_ACCESSED when getting folios From: Ackerley Tng To: Paolo Bonzini , Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , "Matthew Wilcox (Oracle)" , Shuah Khan , Jonathan Corbet , Alexander Viro , Christian Brauner , Jan Kara , seanjc@google.com, rientjes@google.com, rick.p.edgecombe@intel.com, yan.y.zhao@intel.com, fvdl@google.com, jthoughton@google.com, vannapurve@google.com, shivankg@amd.com, michael.roth@amd.com, pratyush@kernel.org, pasha.tatashin@soleen.com, kalyazin@amazon.com, tabba@google.com Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-doc@vger.kernel.org, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable guest_memfd folios don't care about accessed flags since the memory is unevictable and there is no storage to write back to, hence, cleanup the allocation path by not setting FGP_ACCESSED. Signed-off-by: Ackerley Tng Signed-off-by: Sean Christopherson Acked-by: Vlastimil Babka Acked-by: David Hildenbrand (arm) --- virt/kvm/guest_memfd.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 923c51a3a5256..2df27b6443115 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -126,14 +126,13 @@ static struct folio *kvm_gmem_get_folio(struct inode = *inode, pgoff_t index) * Fast-path: See if folio is already present in mapping to avoid * policy_lookup. */ - folio =3D __filemap_get_folio(inode->i_mapping, index, - FGP_LOCK | FGP_ACCESSED, 0); + folio =3D filemap_lock_folio(inode->i_mapping, index); if (!IS_ERR(folio)) return folio; =20 policy =3D mpol_shared_policy_lookup(&GMEM_I(inode)->policy, index); folio =3D __filemap_get_folio_mpol(inode->i_mapping, index, - FGP_LOCK | FGP_ACCESSED | FGP_CREAT, + FGP_LOCK | FGP_CREAT, mapping_gfp_mask(inode->i_mapping), policy); mpol_cond_put(policy); =20 --=20 2.53.0.414.gf7e9f6c205-goog From nobody Thu Apr 16 22:34:02 2026 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (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 A60B9314D0F for ; Wed, 25 Feb 2026 07:20:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772004050; cv=none; b=lKkIqmCzWWDn8+pJKS15ujRb9g2mJ85pbFAcJXt1JOBipZu5rxmU6LAN5K33up6hrq/zqdYNYOLCpZwcay4o4QCFo8yWVWGO1zSeiV3FFuMBRQ8h/GQY8W3m9B4uI9c1ZC5PpNKo2jk5QPb4wS9mHOEg+cJqEo7KA5hN9mLDv4w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772004050; c=relaxed/simple; bh=8mavK4GAEJyfzQeJv7/hD42p9ioK1z0FeEYGJdf10ss=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=kE9IMn6yQld7q8uKbO5hQJKltoZDKxtxfWrPdweclusXGLrtTCj1DnPkztBfLoeCirTb1swOceGLw00X8EprHSRSVOGiri5Yt1g+QmGoxD3y0KkIbU2iXMRQArMnrRZfgsgYx/P00vZIXeED4iwiyhvWszJyrceXK5s+p8H6rj8= 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=XGHQ6fUJ; arc=none smtp.client-ip=209.85.216.74 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="XGHQ6fUJ" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-358df8fbd1cso1816024a91.0 for ; Tue, 24 Feb 2026 23:20:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1772004048; x=1772608848; 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=OVs0Hnm474cWoV833GLo9MNmWlUj207hFkSykyvopd4=; b=XGHQ6fUJsiyeW6/flR7Ha9ULHmAjbO3JNzeE+lnEaqiNaqOHT+xTI29dU/FfYd15/S WB9XySh8aQyQJnjnb8qU9KE+R2yadsOEGd+bH2hjbgu51sy3fkr/sY7/F3+rVkhZ9thO 9uJGsZtsY25n2IDbh4dmK3b9NpBjTGg2NKyhzaQh4P/cdwfstrzVgYfZSJ9iLcRIlPiL 4bPgy3iJxr5q5DyjVknGjqwqpMoitrP7AiYTI2uNzm+Sswk6s+MBvL8J/4brpTyO2yXC A0TfjzJLQ8QjgrX119df4WPKGDs2ZkLGHTUvvCzjay4cyIPgAfhwskq6iBbh9hjbTaXO 2Qbg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772004048; x=1772608848; 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=OVs0Hnm474cWoV833GLo9MNmWlUj207hFkSykyvopd4=; b=FaXz8LsSMtQCfor3W/BD6e2xcco8DH02ktZ5vczvTuhmpm3G4GmS3omKCkScKDhgzw vFNYiOUfxZzHbCqKirMcScQLDLk3rDYou3KhH1T+pmpH9wHtxIbECFGuVA4uhY6l2Aeg 28pR4TgL7ynLCirAsJvpvEJC0TYsboFQflxSgx9cW7bWt3WSDCrMmLQICwrhsvsngyHq cbTz3nAChcFoWtsEA/TQoQimVB9+CUW13xr3RZCskt2ZTbXJy8zaS8erIDBfQ3EuoqcC 2QZkGqVG7o3XPplcD08FLfBP+qnVk8yVTejw/Z1Ri/iVvD4XksZh9+UM1P3O5v1WqegG 8b3A== X-Forwarded-Encrypted: i=1; AJvYcCXk4EQC1KBNafxo4gNEkHpWyvVXaDPIUDT0Nkz9ANhgw26YTedcsoO8NqRwagylGOHA22+aNP4WLLl4yxU=@vger.kernel.org X-Gm-Message-State: AOJu0YzCxp8uEQzHHs/RG7rpfPXmFNOXOnzQloX19uAwQLWD4p8yxvMK OCaWrDYzaJeKhq9sh3/QFCw0zPmGLeXl2V3C8aCYXI8U/qVUfiT0HZwgjuTAeYFw7CVp5J4B4fC 3yJ4NFd42adLqoiNwZI3iBbSaAg== X-Received: from pjbcx18.prod.google.com ([2002:a17:90a:fd92:b0:34c:64ab:be12]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:4987:b0:349:7f0a:381b with SMTP id 98e67ed59e1d1-358ae7f824amr12058965a91.8.1772004047924; Tue, 24 Feb 2026 23:20:47 -0800 (PST) Date: Wed, 25 Feb 2026 07:20:37 +0000 In-Reply-To: <20260225-gmem-st-blocks-v2-0-87d7098119a9@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260225-gmem-st-blocks-v2-0-87d7098119a9@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1772004043; l=2942; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=8mavK4GAEJyfzQeJv7/hD42p9ioK1z0FeEYGJdf10ss=; b=n5HyVsPKnVDH4PevFzPZC0SURMs/a4aw01ly03D56U81pYoGm3xjhy0a96R2oMYy/oWparMvX 0N/vWJdxHi/DhAl1wJaJFq98Amz6oOt1OmvqMUx13/SxRSVR8WBVXyz X-Mailer: b4 0.14.3 Message-ID: <20260225-gmem-st-blocks-v2-2-87d7098119a9@google.com> Subject: [PATCH RFC v2 2/6] KVM: guest_memfd: Directly allocate folios with filemap_alloc_folio() From: Ackerley Tng To: Paolo Bonzini , Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , "Matthew Wilcox (Oracle)" , Shuah Khan , Jonathan Corbet , Alexander Viro , Christian Brauner , Jan Kara , seanjc@google.com, rientjes@google.com, rick.p.edgecombe@intel.com, yan.y.zhao@intel.com, fvdl@google.com, jthoughton@google.com, vannapurve@google.com, shivankg@amd.com, michael.roth@amd.com, pratyush@kernel.org, pasha.tatashin@soleen.com, kalyazin@amazon.com, tabba@google.com Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-doc@vger.kernel.org, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable __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 Acked-by: Vlastimil Babka --- 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, str= uct kvm_memory_slot *slot, return __kvm_gmem_prepare_folio(kvm, slot, index, folio); } =20 +static struct folio *__kvm_gmem_get_folio(struct inode *inode, pgoff_t ind= ex) +{ + /* 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 =3D filemap_lock_folio(inode->i_mapping, index); + if (!IS_ERR(folio)) + return folio; + + gfp =3D mapping_gfp_mask(inode->i_mapping); + + policy =3D mpol_shared_policy_lookup(&GMEM_I(inode)->policy, index); + folio =3D filemap_alloc_folio(gfp, 0, policy); + mpol_cond_put(policy); + if (!folio) + return ERR_PTR(-ENOMEM); + + ret =3D 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, st= ruct 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; =20 - /* - * Fast-path: See if folio is already present in mapping to avoid - * policy_lookup. - */ - folio =3D filemap_lock_folio(inode->i_mapping, index); - if (!IS_ERR(folio)) - return folio; - - policy =3D mpol_shared_policy_lookup(&GMEM_I(inode)->policy, index); - folio =3D __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 =3D __kvm_gmem_get_folio(inode, index); + } while (PTR_ERR(folio) =3D=3D -EEXIST); =20 /* * External interfaces like kvm_gmem_get_pfn() support dealing --=20 2.53.0.414.gf7e9f6c205-goog From nobody Thu Apr 16 22:34:02 2026 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (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 5F71B318ED5 for ; Wed, 25 Feb 2026 07:20:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772004053; cv=none; b=Ij+yk1cuxVih1h0EWaJztjMY0AffUaJ8CxOlFymlxanxuoBh41+JHp/dvjhddfzYv/66q6sePNX9Z+AtKXqaqC/thqB6BSGVtAaBTyi/gNO3FgZ9bRKkdLRhZiNYzwSXoMu6emEG/sCiRCII48tANopetYA1vgngS8H2MPX1Mj8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772004053; c=relaxed/simple; bh=+MHXSU/V11E98W6bAwMdpmIpdBoJLEJvOCREqpfDnG0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=otRoIGnaJydTwqD0iwKoiky2DuoWuVVoqEwGKKjM0Efad4VwGmEUnG/ouPIftaHnGGBlCWyLuoLCK05QBmf06fr/I/5uIbxOXitrkL7+i1jDEgNtDZpJ3oSvkptdXCv/mJuj9IUjk0YNQKadjTMpyIVee9buHOvEWwY6ZpbiyBw= 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=vOaO09bs; arc=none smtp.client-ip=209.85.216.73 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="vOaO09bs" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-358e5e33ddcso1398719a91.1 for ; Tue, 24 Feb 2026 23:20:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1772004050; x=1772608850; 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=/OzVXGrSvNTobLr90pUtUa2BKuGgT0v7RjuQ020m/80=; b=vOaO09bso+xnxcobuyNRaQd7HOFqUhH6anqZc4F3sIPJ20xtYFg32HjHLIVuBGkftY AfsT8/nZtZXB1l0Cg3e9f2pTJslLDlUsEkXP77ypCwnH6SWocOCmukxTLor07m1+eyud cbQW4ikwgGRO2PWRc+8QnD6B+vvoqGxS6K9vmfumQcWKefuQh3ggX8pGbIQzY96oiaw2 +QzCjPSpsS7j9Cbi0ftIS5Ylp9alOrI975nDT/1kB3f0FBGE46yhRS+1sX1tFP1JTbvV pAwn4zb9diLL1cg7f6VHZpeuvPhXS7ywJTEzYpznfj47smk8x91NeXJ4LNZ/Aqwd/Mdm GPDQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772004050; x=1772608850; 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=/OzVXGrSvNTobLr90pUtUa2BKuGgT0v7RjuQ020m/80=; b=bCzdlhY/ExfYhcCyiaGuJglWQPyoDZXg7exzufIe7P3eV399GrGtopTtS2M65R6PDZ nL1RGmDcte88SC/9eL5w7MoH0TDgEoq5G++ywxDJuu4GCZSYoNi7bJMIPGJQ4MUBuu+A uUIbB7+FOlEJ8nc1XCXus45EFeEjSh1boxV8KCSWyK/b8hhWKJZ2/ZxY2Z+GpAUz+4ui P2ApF0PFt1WfACVXdhvUvRw/FfnoZ9AKEjxrPQALq/VMXTLUeoSQKXNZYE2WGZHgue6S PCeQjZfK2xiA/5aJMyiviLEtXrjBXHSVSqvLP99mXHkbl0kP1NP2Njg4zQMxoBB5/mwa Irvg== X-Forwarded-Encrypted: i=1; AJvYcCVKOCARLhQGnGHjp+3ifMUV6kXAlP3IHNkEuzS/jRi+rrgznIxME3cSW1h7oXDzKvzVjo0F7XKukbZAZms=@vger.kernel.org X-Gm-Message-State: AOJu0YyhNI8SCHzytu4fVmCsyWnbyAGtxBg18XlLKyy0743hvSY49NCa Dt24qtOhDCwGFmVulhJ/rajmMxVdo04XBoTeJuqZ87Nlfcv1hIb/7LRqzvQYLgVL8jKLKL0ZCpq XTgaPQ3PVS4vqQglayY9gKXTHfQ== X-Received: from pgar14.prod.google.com ([2002:a05:6a02:2e8e:b0:c6e:4387:496a]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:3297:b0:35f:27d:2ded with SMTP id adf61e73a8af0-39545ea8a07mr12406592637.25.1772004049471; Tue, 24 Feb 2026 23:20:49 -0800 (PST) Date: Wed, 25 Feb 2026 07:20:38 +0000 In-Reply-To: <20260225-gmem-st-blocks-v2-0-87d7098119a9@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260225-gmem-st-blocks-v2-0-87d7098119a9@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1772004043; l=3726; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=+MHXSU/V11E98W6bAwMdpmIpdBoJLEJvOCREqpfDnG0=; b=KKEMJylkZyQJS+IxTxG9HS0TUG+xGT7E9m0Nde3MM1Szh24vjYNbYhe+Zg9jWgMOtoQmg2xvM IBdn2AEimOhD80lhpH2xrQdgnNMxZuX0jFXVYJErsuwoepz+kV933x6 X-Mailer: b4 0.14.3 Message-ID: <20260225-gmem-st-blocks-v2-3-87d7098119a9@google.com> Subject: [PATCH RFC v2 3/6] fs: Add .unaccount_folio callback From: Ackerley Tng To: Paolo Bonzini , Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , "Matthew Wilcox (Oracle)" , Shuah Khan , Jonathan Corbet , Alexander Viro , Christian Brauner , Jan Kara , seanjc@google.com, rientjes@google.com, rick.p.edgecombe@intel.com, yan.y.zhao@intel.com, fvdl@google.com, jthoughton@google.com, vannapurve@google.com, shivankg@amd.com, michael.roth@amd.com, pratyush@kernel.org, pasha.tatashin@soleen.com, kalyazin@amazon.com, tabba@google.com Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-doc@vger.kernel.org, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Add .unaccount_folio callback to allow filesystems to do accounting-related updates to the inode or struct address_space mapping, when the folio is about to be removed from the filemap/page_cache. .free_folio cannot be used since .free_folio cannot assume that struct address_space mapping still exists. From the name, .invalidate_folio and .release_folio seem suitable, but those are meant only to handle freeing of a folio's private data. .release_folio is also not called in the truncation path. An alternative would be to add a more general callback and call that from filemap_remove_folio() and delete_from_page_cache_batch(). .unaccount_folio was chosen as it is more specific to the how guest_memfd will be using this callback in later patches. Also, .unaccount_folio only needs a single call site. This further refactoring was considered: if (mapping->a_ops->unaccount_folio && mapping->a_ops->unaccount_folio(folio)) ... do generic page_cache unaccounting ... but that was abandoned since a hugetlb folio may not have an associated mapping. Signed-off-by: Ackerley Tng --- Documentation/filesystems/vfs.rst | 8 ++++++++ include/linux/fs.h | 1 + mm/filemap.c | 3 +++ 3 files changed, 12 insertions(+) diff --git a/Documentation/filesystems/vfs.rst b/Documentation/filesystems/= vfs.rst index 670ba66b60e49..5ed5c43d5768b 100644 --- a/Documentation/filesystems/vfs.rst +++ b/Documentation/filesystems/vfs.rst @@ -809,6 +809,7 @@ cache in your filesystem. The following members are de= fined: sector_t (*bmap)(struct address_space *, sector_t); void (*invalidate_folio) (struct folio *, size_t start, size_t len); bool (*release_folio)(struct folio *, gfp_t); + void (*unaccount_folio)(struct folio *folio); void (*free_folio)(struct folio *); ssize_t (*direct_IO)(struct kiocb *, struct iov_iter *iter); int (*migrate_folio)(struct mapping *, struct folio *dst, @@ -967,6 +968,13 @@ cache in your filesystem. The following members are d= efined: its release_folio will need to ensure this. Possibly it can clear the uptodate flag if it cannot free private data yet. =20 +``unaccount_folio`` + unaccount_folio is called under inode lock and struct + address_space's xa_lock, just before the folio is removed from + the page cache in order to allow updating any kind of + accounting on the inode or address_space mapping while the + address_space mapping still exists. + ``free_folio`` free_folio is called once the folio is no longer visible in the page cache in order to allow the cleanup of any private data. diff --git a/include/linux/fs.h b/include/linux/fs.h index a01621fa636a6..c71f327032142 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -422,6 +422,7 @@ struct address_space_operations { sector_t (*bmap)(struct address_space *, sector_t); void (*invalidate_folio) (struct folio *, size_t offset, size_t len); bool (*release_folio)(struct folio *, gfp_t); + void (*unaccount_folio)(struct folio *folio); void (*free_folio)(struct folio *folio); ssize_t (*direct_IO)(struct kiocb *, struct iov_iter *iter); /* diff --git a/mm/filemap.c b/mm/filemap.c index ebd75684cb0a7..ff957929e6087 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -176,6 +176,9 @@ static void filemap_unaccount_folio(struct address_spac= e *mapping, } } =20 + if (unlikely(mapping->a_ops->unaccount_folio)) + mapping->a_ops->unaccount_folio(folio); + /* hugetlb folios do not participate in page cache accounting. */ if (folio_test_hugetlb(folio)) return; --=20 2.53.0.414.gf7e9f6c205-goog From nobody Thu Apr 16 22:34:02 2026 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.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 1BF6B31A7E4 for ; Wed, 25 Feb 2026 07:20:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772004054; cv=none; b=VDhcUvkhWJ/wyTo3qL1hzTfCp6E1vMlm2qV4RTAo+HiJWswS8egpSrPyKoqE84AMPB3vVB8VcF22YpdU3g1zvBZ2MVyb5nAdjKbS8xd3fy+9SwyiicsDxIg7y35l25hcv+rTaKbhC+XM+EFYzZ4JqcyplcmeoWlLUtz8DEfRZwU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772004054; c=relaxed/simple; bh=qLKykmEADbn2/q4Ccup9gI+7j5uvqRK9sZMPeThKEJc=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Nt6FeAZtyQaa5Ov57TKpQRyMxZ4GwaUV7MAlmoiPF6EuwnKdksuWiavd+IvRAOqk+vqmd7JsFO5uG1fPRJ4QY0qomXmb39n08zfC6UjXkwOMskgHuWx8Pp6Plu94XUIsyiB2dMVhWBcai053cvWbf9BGViAjsxDXgwVLjpAUM4o= 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=J8hvozdN; arc=none smtp.client-ip=209.85.214.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="J8hvozdN" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2aae146bab0so69242785ad.0 for ; Tue, 24 Feb 2026 23:20:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1772004051; x=1772608851; 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=RDRU6RwH6vqwiVf/LjeEDphDyyED18VHPEr6YXDP6Vo=; b=J8hvozdNtDA3NzVOs1KNUY/r7i+r3udah8KOFjQLlchj7a7IV5MessOrVuVPrF7y03 46SqF+Ukc5gNENA4d53VRu/Own3cYGNmYhPrvVV9h76jj3HA/Qm4/r9cP+CFjn812T9M wvEZ/uq0JH7WJo7BR4emeyHFPs1s0gz35sQzKty3dEJVfOW5+8ggLDEYeg0SFcSkx9vJ Vg5zcn4jEbwWtB+vJi16I0q1OHZ3aw+FEDhV4njHxGwOyi2CgPWNPZIitDGS98iQjIfd fV6hcvGjedF4gtfCYRCmC92Z3HYVd9i68nrsIQrijJ4iEi2vuuylOMd7+TGbv/cwFoLt U/4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772004051; x=1772608851; 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=RDRU6RwH6vqwiVf/LjeEDphDyyED18VHPEr6YXDP6Vo=; b=usC1kM+lGWtvz3ufuTflOHN6rHMSZansxyD4wdWzLIIa72Y38/gdiHO3DFmb4+Uj20 tLICfeMvvmz8IXXpFaCRodZ27rthnj3zQPq7NCpncaoqM3SX58YST72wuMwFMF74lHvY tgFL6KZGv4FkkNI665s8s2rS/XCN1A+znROouSyhET02odFIS/kWf0pEWdQK48mehTIQ ccIKbuzr0WjMw3L3Tpf/3Oa5gnCp1yxgsnYarm47/26Jx1JxQEZPZaPiM2vvhk7Sm857 mBt8QsU9a1s49vrY2TmSgfnFLf03IPzzkpVeOHHbGOBmJOUbrIDQypj4mkpPaoz6cOaq zaSg== X-Forwarded-Encrypted: i=1; AJvYcCX5baKZCeqqWf6xEajBXHtNEbCA0A5zsSGlmJhHeTaxq71vX0d0Q5yGAKegQkLpUdvfpfgnm6JEZPqcycI=@vger.kernel.org X-Gm-Message-State: AOJu0YxTxTgVQ8AL6e1h5mBVMqTpSj02dd94fLFrtR5xLYQi5mkeekjL cThx/MsxpcqXbKOV13Nlb2pnn1gARj9ukDOVDHKNB2f0tBNRbIe04/cbER4g5j73xD7YKN9qyxl Uy1iI/dXuqrg8K/Z67SEA8jitdQ== X-Received: from plgz12.prod.google.com ([2002:a17:903:18c:b0:2ad:ae4d:4a00]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:2c5:b0:2a0:c58c:fdd2 with SMTP id d9443c01a7336-2ad74516011mr136747995ad.26.1772004051111; Tue, 24 Feb 2026 23:20:51 -0800 (PST) Date: Wed, 25 Feb 2026 07:20:39 +0000 In-Reply-To: <20260225-gmem-st-blocks-v2-0-87d7098119a9@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260225-gmem-st-blocks-v2-0-87d7098119a9@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1772004043; l=1673; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=qLKykmEADbn2/q4Ccup9gI+7j5uvqRK9sZMPeThKEJc=; b=PxKzCcZpN4XBlCkb+5wYqal7atRqWZJGyLYGiwIgdVnxm+1x2H3IPSPZKe0CxJWfo9pjig1VC VIXLsNc8fL3CSev+ABXwmk1qEQrJyPu2C3V81bGGt4IF7QyCFliofNZ X-Mailer: b4 0.14.3 Message-ID: <20260225-gmem-st-blocks-v2-4-87d7098119a9@google.com> Subject: [PATCH RFC v2 4/6] KVM: guest_memfd: Track amount of memory allocated on inode From: Ackerley Tng To: Paolo Bonzini , Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , "Matthew Wilcox (Oracle)" , Shuah Khan , Jonathan Corbet , Alexander Viro , Christian Brauner , Jan Kara , seanjc@google.com, rientjes@google.com, rick.p.edgecombe@intel.com, yan.y.zhao@intel.com, fvdl@google.com, jthoughton@google.com, vannapurve@google.com, shivankg@amd.com, michael.roth@amd.com, pratyush@kernel.org, pasha.tatashin@soleen.com, kalyazin@amazon.com, tabba@google.com Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-doc@vger.kernel.org, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable The guest memfd currently does not update the inode's i_blocks and i_bytes count when memory is allocated or freed. Hence, st_blocks returned from fstat() is always 0. Introduce byte accounting for guest memfd inodes. When a new folio is added to the filemap, add the folio's size. Conversely, when folios are truncated and removed from the mapping, deduct the folio's size. With this change, stat.st_blocks for a guest_memfd will correctly report the number of 512-byte blocks allocated to the file, consistent with other memory-based filesystems like tmpfs. Signed-off-by: Ackerley Tng --- virt/kvm/guest_memfd.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 2488d7b8f2b0d..b31e6612d16a8 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -137,6 +137,8 @@ static struct folio *__kvm_gmem_get_folio(struct inode = *inode, pgoff_t index) return ERR_PTR(ret); } =20 + inode_add_bytes(inode, folio_size(folio)); + return folio; } =20 @@ -553,10 +555,16 @@ static void kvm_gmem_free_folio(struct folio *folio) } #endif =20 +static void kvm_gmem_unaccount_folio(struct folio *folio) +{ + __inode_sub_bytes(folio_inode(folio), folio_size(folio)); +} + static const struct address_space_operations kvm_gmem_aops =3D { .dirty_folio =3D noop_dirty_folio, .migrate_folio =3D kvm_gmem_migrate_folio, .error_remove_folio =3D kvm_gmem_error_folio, + .unaccount_folio =3D kvm_gmem_unaccount_folio, #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE .free_folio =3D kvm_gmem_free_folio, #endif --=20 2.53.0.414.gf7e9f6c205-goog From nobody Thu Apr 16 22:34:02 2026 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (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 8D6B231B830 for ; Wed, 25 Feb 2026 07:20:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772004055; cv=none; b=IIHVVPOkOZQoam5SAeL2oSkoItEpX7PWmWERvHsjRagWOpYPNByVvfB1srAgY3Cr+yqtldz0k3ZsR4/VaEvYWm0Cpzxdb0KV4msy10lWkxGc0RBHy36TyPabIYzjUSpdD/s7NSbWQFx5Mh5V01rXibCb5Aj9D5sy6iG29QFkiK0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772004055; c=relaxed/simple; bh=41+6neAL0d27ks2wQws7sEuDZgQjzT5nG62AnxD5qpc=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=UmMLu4Uqw7uZIhj0nl5a4kiLKosuTg/lLyGDScSdk1xpNtydWPhjf97CbulMc+qtW2K436X7cqJ+wSImgowu/zWJo6xnY0vFp77Ii+joXvCEBBmS69qOYAFFkSmyCdJihl2NohL7q0OzZRl9rkJ1G7UAUuaZxZ5qua4iShFEDAo= 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=kl49/QXT; arc=none smtp.client-ip=209.85.216.74 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="kl49/QXT" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-354c72d23dfso38261517a91.2 for ; Tue, 24 Feb 2026 23:20:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1772004053; x=1772608853; 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=lmqeDy1YGPO6heAH4dtg7V9yIhQw7gZPhshB9Ud1SBU=; b=kl49/QXTyHNtzK3awy/yDH8SdYKO5eimqBUQi+UII5h9a9SBFLxjantR3qhGW+uYd8 mYgQLJVaw0XA6/AV9emQXbYPTYlV4sNCnCj3XUCI8QdJcRtMWv3kYRCiSsZJ+1hV9Hcp hBuwHtRnVIszSeYM465KYcCumfhasyjWMat+2JnYCcBAWI9Rl9AhupAbcrc5jdp6chno TxlQX9RNq5CXzsQ72qm7LnUK7P286lheZHu9aVJULLBDqjMAokM6/p/U9zeINILNcUMH 2+ZPyG4CREVQWJ2erErVhEeUsY2SCnGFCAojzxw/ZLnUtQgiogxK004UD809ZrIm8z1j b3+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772004053; x=1772608853; 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=lmqeDy1YGPO6heAH4dtg7V9yIhQw7gZPhshB9Ud1SBU=; b=BsbdPucXCLoo+usskrU4zYhTB5SV8FtZzVfT5/HWpBlwETZTzwo4YsGXg8jKVwEoDd 8rjJF7gJAAw8OnZp4d2UGS8ZPnbCydfG6SayqCYT94Yp7dxxqLlaZ6oHX6X2v1ON3a2u iobmuY1h5/nBnrt4VYKJAMXtXcJCoCnRhT7dtpIMMV+r/sk3w70okbG73zPVWZJX30PX kZZZT5o14WxIynYt0QLjNbOPsCjsQvW/JznU5OVf0JWeSNDX1fQ0GUWOxRAjdvI8qBQ0 ygYsJZFVGi7XjEi88jpIqoZkzhCEqAeM5MV0XOR7CF9aWJ4q8EFUJt46n796HoZHhCXr 2cXw== X-Forwarded-Encrypted: i=1; AJvYcCWxBddQ3ntTACAN7tcjW13r0B8BQOhnTIOwdyifCYPR2sWXvRqLV5B8jQxyUFLsEGQf1KVBvJw+XNbifug=@vger.kernel.org X-Gm-Message-State: AOJu0Yz39/zNoF/61cpCZiaLWH0/CAXIUR7Th7tM/y1LDdAZTART/KU/ UYjYrQOUhm7Norad4MZzZjxlhktCYKm0rxxIj4FNd6lc8uPtirXgY2zqO6hnxWa2KwDzrP+WLbK vxNBvJTgWI8ACb/E7C02cdnoObA== X-Received: from pgbfp5.prod.google.com ([2002:a05:6a02:2ce5:b0:c0e:c1b4:51a5]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:7f89:b0:394:58eb:48fa with SMTP id adf61e73a8af0-39545dc0482mr14694770637.6.1772004052747; Tue, 24 Feb 2026 23:20:52 -0800 (PST) Date: Wed, 25 Feb 2026 07:20:40 +0000 In-Reply-To: <20260225-gmem-st-blocks-v2-0-87d7098119a9@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260225-gmem-st-blocks-v2-0-87d7098119a9@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1772004043; l=3022; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=41+6neAL0d27ks2wQws7sEuDZgQjzT5nG62AnxD5qpc=; b=Qf0H2UQ2mVaGwE9fmA4IWjbnRJGJ7WGDq8UI2QM5uIsOM4kNu9y1rdgzh53H+jjev44oOi+/r kT+aePH4Im8Br8uVg3C6xnPFChAqWmmulNjoE70K9V+ksKWXjrvsGjL X-Mailer: b4 0.14.3 Message-ID: <20260225-gmem-st-blocks-v2-5-87d7098119a9@google.com> Subject: [PATCH RFC v2 5/6] KVM: selftests: Wrap fstat() to assert success From: Ackerley Tng To: Paolo Bonzini , Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , "Matthew Wilcox (Oracle)" , Shuah Khan , Jonathan Corbet , Alexander Viro , Christian Brauner , Jan Kara , seanjc@google.com, rientjes@google.com, rick.p.edgecombe@intel.com, yan.y.zhao@intel.com, fvdl@google.com, jthoughton@google.com, vannapurve@google.com, shivankg@amd.com, michael.roth@amd.com, pratyush@kernel.org, pasha.tatashin@soleen.com, kalyazin@amazon.com, tabba@google.com Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-doc@vger.kernel.org, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Extend kvm_syscalls.h to wrap fstat() to assert success. This will be used in the next patch. Signed-off-by: Ackerley Tng --- tools/testing/selftests/kvm/guest_memfd_test.c | 15 +++++---------- tools/testing/selftests/kvm/include/kvm_syscalls.h | 2 ++ 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing= /selftests/kvm/guest_memfd_test.c index 618c937f3c90f..81387f06e770a 100644 --- a/tools/testing/selftests/kvm/guest_memfd_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -212,10 +212,8 @@ static void test_mmap_not_supported(int fd, size_t tot= al_size) static void test_file_size(int fd, size_t total_size) { struct stat sb; - int ret; =20 - ret =3D fstat(fd, &sb); - TEST_ASSERT(!ret, "fstat should succeed"); + kvm_fstat(fd, &sb); TEST_ASSERT_EQ(sb.st_size, total_size); TEST_ASSERT_EQ(sb.st_blksize, page_size); } @@ -303,25 +301,22 @@ static void test_create_guest_memfd_invalid_sizes(str= uct kvm_vm *vm, =20 static void test_create_guest_memfd_multiple(struct kvm_vm *vm) { - int fd1, fd2, ret; + int fd1, fd2; struct stat st1, st2; =20 fd1 =3D __vm_create_guest_memfd(vm, page_size, 0); TEST_ASSERT(fd1 !=3D -1, "memfd creation should succeed"); =20 - ret =3D fstat(fd1, &st1); - TEST_ASSERT(ret !=3D -1, "memfd fstat should succeed"); + kvm_fstat(fd1, &st1); TEST_ASSERT(st1.st_size =3D=3D page_size, "memfd st_size should match req= uested size"); =20 fd2 =3D __vm_create_guest_memfd(vm, page_size * 2, 0); TEST_ASSERT(fd2 !=3D -1, "memfd creation should succeed"); =20 - ret =3D fstat(fd2, &st2); - TEST_ASSERT(ret !=3D -1, "memfd fstat should succeed"); + kvm_fstat(fd2, &st2); TEST_ASSERT(st2.st_size =3D=3D page_size * 2, "second memfd st_size shoul= d match requested size"); =20 - ret =3D fstat(fd1, &st1); - TEST_ASSERT(ret !=3D -1, "memfd fstat should succeed"); + kvm_fstat(fd1, &st1); TEST_ASSERT(st1.st_size =3D=3D page_size, "first memfd st_size should sti= ll match requested size"); TEST_ASSERT(st1.st_ino !=3D st2.st_ino, "different memfd should have diff= erent inode numbers"); =20 diff --git a/tools/testing/selftests/kvm/include/kvm_syscalls.h b/tools/tes= ting/selftests/kvm/include/kvm_syscalls.h index d4e613162bba9..3f039c34e12e0 100644 --- a/tools/testing/selftests/kvm/include/kvm_syscalls.h +++ b/tools/testing/selftests/kvm/include/kvm_syscalls.h @@ -2,6 +2,7 @@ #ifndef SELFTEST_KVM_SYSCALLS_H #define SELFTEST_KVM_SYSCALLS_H =20 +#include #include =20 #define MAP_ARGS0(m,...) @@ -77,5 +78,6 @@ __KVM_SYSCALL_DEFINE(munmap, 2, void *, mem, size_t, size= ); __KVM_SYSCALL_DEFINE(close, 1, int, fd); __KVM_SYSCALL_DEFINE(fallocate, 4, int, fd, int, mode, loff_t, offset, lof= f_t, len); __KVM_SYSCALL_DEFINE(ftruncate, 2, unsigned int, fd, off_t, length); +__KVM_SYSCALL_DEFINE(fstat, 2, int, fd, struct stat *, buf); =20 #endif /* SELFTEST_KVM_SYSCALLS_H */ --=20 2.53.0.414.gf7e9f6c205-goog From nobody Thu Apr 16 22:34:02 2026 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.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 185BB32AADC for ; Wed, 25 Feb 2026 07:20:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772004056; cv=none; b=Q0kzZ/c9S4I2d5otxZHoxlzJY9bJD22zuT0lfgVDKZogm1Ai7GM5A06kfi1ZgUDe4Bn1z/j3xT9QWzRPr3IjW0LP8IAaHHg3TWPxrzX9gqcrLt68Fp5cBRqe6ezgXTmfdLXcEnSOW746bpH/cCQxNu4XhMCz+j6URQB9Mf3BdtE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772004056; c=relaxed/simple; bh=dOYyBdQXA1usfepnnNuDszu6x3QfaYGIbNqVbOtmh7o=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=islUydcBT/5j0Zl2v1WgAzqLHps5gFHpFUpgQWKzqlwS3CYePhS2r84rJItTzQ7laO496Tzu4WxnTHDnxBqx7QI7QIDW31m1xr3PFlLC1twbi/IuFCV7vvjN5fA45+StcCD7YOw8EPWZAwabJIeThjcsO/xCS+488ipTlL3W6kI= 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=I3tpnjvQ; arc=none smtp.client-ip=209.85.214.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="I3tpnjvQ" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2ad7e454f38so283655265ad.0 for ; Tue, 24 Feb 2026 23:20:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1772004054; x=1772608854; 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=uCRWKaRAQP2gBMw/IwAKqq2A0WtVFQ88sM/7soXGb8M=; b=I3tpnjvQuA+B/47Xi93nsUnNz4ABiLiO81bZWolQQPkRP1MvkYIHXHPcOHtDzHOify PgkdDgVxvzLGDnW4K8ka2w2JP7gAWU/wkpwAidUfBD69+O43IxV94mlbrPqfLgAdHPcX OjRh81UOBI/d6q5DtwbrYBvaSMeukq6Dd7aU4gwXzzBpAizPc8bmGZM0Mh9YCMD0gdYd TGdtNxefz49ybrs2EHiWpLKfZiSrI454tp9hIaJQyJ7zubi2ke7h0SM5+ngCPTHdfan4 q0noHo7uCAamVcCngr2oNwYcdDTHvf6jzPQJQ3AA/JXPJp/fldP4KQ33wlrj5hM34Ab4 vBhw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772004054; x=1772608854; 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=uCRWKaRAQP2gBMw/IwAKqq2A0WtVFQ88sM/7soXGb8M=; b=Y08g8W7E36hLPEAzAzj3d0GJhzzkxu87wODyzkS+g+Ci0NPsn/YhLBINsc7FZzCych N8GrcfUnAcaEvVVkLMTdE/Ju1pV4Z1mLU72u7PXePdAmNh3vZX8FJXa/xNeBHYnr5w6s WAv715zl4xXOyqNNjQDvPbXcPXWzNZfQnILPjmx4dzTxyM2No5JXKzk6iuvlxhTgEwca YdPF23uc0w0DfnXzMFbf4F/5wqsxDYmFgVEvdgIQUmyTieOiT9LpeOhnCF0eVFCVVw8T V+2gHPjhIu5AmHXzx32No1YrLUhn8v49srLxOXiGAMkw8kTPgvtWIzv8h77U+t32Z5SX p0IA== X-Forwarded-Encrypted: i=1; AJvYcCWUQfYTUklw15zOwGsjoFxbgOfLUYMXDRc7Idj5iexI6y26sVHrDADuV/v5pcAWXGanwBOJHUcd429vjYA=@vger.kernel.org X-Gm-Message-State: AOJu0YxSLBGPmXZErwEl6XKHhFcKoWzrTAYBOQQ4vSl901OUg4M6RiTS RG+NeUWKrHXGgkgCTDgOgERJhsxLreVIMg7xbBoacTbz/1Q41Cj+vv7NPS0EE/3u4gIB+TAs8HR GjZ6h/k1Agill4h1gAh/Vs7XA/Q== X-Received: from plsk6.prod.google.com ([2002:a17:902:ba86:b0:29f:1738:99f3]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:d511:b0:2a7:c188:bd1f with SMTP id d9443c01a7336-2add14146b1mr15540455ad.40.1772004054358; Tue, 24 Feb 2026 23:20:54 -0800 (PST) Date: Wed, 25 Feb 2026 07:20:41 +0000 In-Reply-To: <20260225-gmem-st-blocks-v2-0-87d7098119a9@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260225-gmem-st-blocks-v2-0-87d7098119a9@google.com> X-Developer-Key: i=ackerleytng@google.com; a=ed25519; pk=sAZDYXdm6Iz8FHitpHeFlCMXwabodTm7p8/3/8xUxuU= X-Developer-Signature: v=1; a=ed25519-sha256; t=1772004043; l=3384; i=ackerleytng@google.com; s=20260225; h=from:subject:message-id; bh=dOYyBdQXA1usfepnnNuDszu6x3QfaYGIbNqVbOtmh7o=; b=zZrSG7T8hLIyNxblKZAGfB+9IN1V9IOqYlhpVMvYXXGbthbgU9tmocvsvN/c7FJF4snDqAhSr TzWnTmDXwh2DG87+Tp1yHs6y/+kQ/SVsCjVtOclQbRZ0IyhxW13o7OV X-Mailer: b4 0.14.3 Message-ID: <20260225-gmem-st-blocks-v2-6-87d7098119a9@google.com> Subject: [PATCH RFC v2 6/6] KVM: selftests: Test that st_blocks is updated on allocation From: Ackerley Tng To: Paolo Bonzini , Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , "Matthew Wilcox (Oracle)" , Shuah Khan , Jonathan Corbet , Alexander Viro , Christian Brauner , Jan Kara , seanjc@google.com, rientjes@google.com, rick.p.edgecombe@intel.com, yan.y.zhao@intel.com, fvdl@google.com, jthoughton@google.com, vannapurve@google.com, shivankg@amd.com, michael.roth@amd.com, pratyush@kernel.org, pasha.tatashin@soleen.com, kalyazin@amazon.com, tabba@google.com Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-doc@vger.kernel.org, Ackerley Tng Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable The st_blocks field reported by fstat should reflect the number of allocated 512-byte blocks for the guest memfd file. Extend the fallocate test to verify that st_blocks is correctly updated when memory is allocated or deallocated via fallocate(FALLOC_FL_PUNCH_HOLE). Add checks after each fallocate call to ensure that st_blocks increases on allocation, decreases when a hole is punched, and is restored when the hole is re-allocated. Also verify that st_blocks remains unchanged for failing fallocate calls. Signed-off-by: Ackerley Tng --- tools/testing/selftests/kvm/guest_memfd_test.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing= /selftests/kvm/guest_memfd_test.c index 81387f06e770a..89228d73fa736 100644 --- a/tools/testing/selftests/kvm/guest_memfd_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -218,41 +218,58 @@ static void test_file_size(int fd, size_t total_size) TEST_ASSERT_EQ(sb.st_blksize, page_size); } =20 +static void assert_st_blocks_matches_size(int fd, size_t expected_size) +{ + struct stat sb; + + kvm_fstat(fd, &sb); + TEST_ASSERT_EQ(sb.st_blocks, expected_size / 512); +} + static void test_fallocate(int fd, size_t total_size) { int ret; =20 ret =3D fallocate(fd, FALLOC_FL_KEEP_SIZE, 0, total_size); TEST_ASSERT(!ret, "fallocate with aligned offset and size should succeed"= ); + assert_st_blocks_matches_size(fd, total_size); =20 ret =3D fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, page_size - 1, page_size); TEST_ASSERT(ret, "fallocate with unaligned offset should fail"); + assert_st_blocks_matches_size(fd, total_size); =20 ret =3D fallocate(fd, FALLOC_FL_KEEP_SIZE, total_size, page_size); TEST_ASSERT(ret, "fallocate beginning at total_size should fail"); + assert_st_blocks_matches_size(fd, total_size); =20 ret =3D fallocate(fd, FALLOC_FL_KEEP_SIZE, total_size + page_size, page_s= ize); TEST_ASSERT(ret, "fallocate beginning after total_size should fail"); + assert_st_blocks_matches_size(fd, total_size); =20 ret =3D fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, total_size, page_size); TEST_ASSERT(!ret, "fallocate(PUNCH_HOLE) at total_size should succeed"); + assert_st_blocks_matches_size(fd, total_size); =20 ret =3D fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, total_size + page_size, page_size); TEST_ASSERT(!ret, "fallocate(PUNCH_HOLE) after total_size should succeed"= ); + assert_st_blocks_matches_size(fd, total_size); =20 ret =3D fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, page_size, page_size - 1); TEST_ASSERT(ret, "fallocate with unaligned size should fail"); + assert_st_blocks_matches_size(fd, total_size); =20 ret =3D fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, page_size, page_size); TEST_ASSERT(!ret, "fallocate(PUNCH_HOLE) with aligned offset and size sho= uld succeed"); + assert_st_blocks_matches_size(fd, total_size - page_size); =20 ret =3D fallocate(fd, FALLOC_FL_KEEP_SIZE, page_size, page_size); TEST_ASSERT(!ret, "fallocate to restore punched hole should succeed"); + assert_st_blocks_matches_size(fd, total_size); } =20 static void test_invalid_punch_hole(int fd, size_t total_size) --=20 2.53.0.414.gf7e9f6c205-goog