From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.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 95D9C34D922 for ; Mon, 23 Feb 2026 07:05:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771830304; cv=none; b=rol+5aYIZfs9LBn1iTzLf2mcsviTUWSMI4pdjipN1je5arBLZlEqSXJWvvcrs7dKoPuhzEm7/15n3nJu7Bvyu7zjb80sAZRPMF/3syxkJDYUqwTX8+RDO/snGA29tqEs6q32O0JHTV1IvmI80Haf0diySx/JTjAvhwBX9Mb2xu4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771830304; c=relaxed/simple; bh=4AzPo53RW7z1u/HbYb3WJwZj9BjSBVUkolJYB1GMnjw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=jRjeWota8rLs2Ps6RDiXcEmZIGFAOsAI/xw2MUUfSxeQV1Cw8kKOu61cg645URaeVxIPACejCjHU0h5C3xLZLLN7zPQ3u8c6+Bdd+S6KX9Ut8dqXyGdknjMpd9P7OqL7N8+jO2Jz+LlvgLpeq+/ua6lVeUZ7SyQfgVea7hKbk9M= 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=OdYFkPBf; arc=none smtp.client-ip=209.85.210.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="OdYFkPBf" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-82436a49592so1674850b3a.2 for ; Sun, 22 Feb 2026 23:05:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1771830301; x=1772435101; 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=LofWqILwJgF/mJhvsOWfJxePDPZCogY694ZgccXLsPg=; b=OdYFkPBfQH4Od8qHGMA/2NYywEzCZPCaiMbzPeT2P1O4bPQO6lgX37BBuYJgY+uVdl uZFSi6I89L0ezxGImCQizgqr/u/jSdeaNky8s1uFmNRwaEEkk6Ghfex10g+KS5SigmMu VF/w1xhRRhxa5hEf6Zf7vhTkJa/1xMNFy7II99r8u99fnZXh0nwgHbwz5b3Bc4DOqfwP 4EIPp+IFB3T8ePLrruXguj1Z0+zMU7iUrie/K2wI5LllZLxzrx5AwuZnQxb6BxTKTBMZ BCe+uXR5qX25sl0+edj5NbA6pgXnSA4hjDlcA1hvzp/pUkbAEC+tTmY4gyoswRqnUETK Nehw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771830301; x=1772435101; 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=LofWqILwJgF/mJhvsOWfJxePDPZCogY694ZgccXLsPg=; b=VL9RvorcZA8wlByMkM+0WZ/Nt9Rgy4LiGqckII4Tvhechjzst9uuFu4+gxU/0pmeOJ KRk01n0nkNk07XgEk7d7SrVTm7qB0v45Shr+4Y8bHf53rm+FCoj4yXZkGHPpftewOXeT grvjtVkLqh/iVIPtEonlgzsu5jzygIC7ehZcnkF1TfQqOuPCc1hK80VcmsYd4PordhCo snbbhPIuz53j9PXEv77SpnB+4r5KK1e30oJaQAizR3y/HY1dhV4KpAoGFVRWWtv6I1Cj tFNm4ceUChFTQx29ytfHIkY8kfPMs5ccJKcyMQubhj8/vgmDDDNEp3mJCPTZZHEmateo klYw== X-Forwarded-Encrypted: i=1; AJvYcCV83PeOa8e0ocCRyFAMKFl7I16KqpBFwzbvY+rugYqKkOvHppaQ4M8Ulewdl1F9KZfBZ1M4sB6SjyDLjPA=@vger.kernel.org X-Gm-Message-State: AOJu0Ywjh3/wEchcBRznh3GKh4bdv49cIByIXTvc+WdrpNqcwsxudHsd oPgh0DyG1C8FH4aNzvlRMBZaS00BqFb0Y2vaSqiddYXRrQqqtHUfjleTKQBHsMIMwpsAYHPE9Pp uvf+GMDAu51T9EaZzYkZgmDwbqg== X-Received: from pfwz14.prod.google.com ([2002:a05:6a00:1d8e:b0:7cf:2dad:ff87]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:438e:b0:823:3056:78c6 with SMTP id d2e1a72fcca58-826da9f10bfmr6260281b3a.41.1771830300774; Sun, 22 Feb 2026 23:05:00 -0800 (PST) Date: Mon, 23 Feb 2026 07:04:40 +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: <976ac2117ed9be6339e898cd80daed8f32b5044e.1771826352.git.ackerleytng@google.com> Subject: [RFC PATCH v1 07/10] KVM: guest_memfd: Implement custom truncation function 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" Implement custom truncation function for guest_memfd, and replace calls to truncate_inode_pages_range() with calls to this custom truncation function. The custom truncation function removes a lot of the generality supported by truncate_inode_pages_range() not required by guest_memfd, such as + sub-PAGE_SIZE truncations + Support for writeback In a later patch, guest_memfd use this custom truncation function to handle updating of i_blocks and i_bytes in the inode during truncation. Signed-off-by: Ackerley Tng --- virt/kvm/guest_memfd.c | 43 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 57dec458bfa77..e6c66ab7062b3 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -247,6 +247,45 @@ static void kvm_gmem_invalidate_end(struct inode *inode, pgoff_t start, __kvm_gmem_invalidate_end(f, start, end); } +static void kvm_gmem_truncate_folio(struct folio *folio) +{ + folio_lock(folio); + + if (folio_mapped(folio)) + unmap_mapping_folio(folio); + + /* + * guest_memfd doesn't need writeback, skip anything to do with + * writeback and just clear the dirty flag. + */ + folio_clear_dirty(folio); + filemap_remove_folio(folio); + + folio_unlock(folio); +} + +static void kvm_gmem_truncate_range(struct inode *inode, pgoff_t start, + size_t nr_pages) + +{ + struct folio_batch fbatch; + pgoff_t next; + pgoff_t last; + int i; + + last = start + nr_pages - 1; + + folio_batch_init(&fbatch); + next = start; + while (filemap_get_folios(inode->i_mapping, &next, last, &fbatch)) { + for (i = 0; i < folio_batch_count(&fbatch); ++i) + kvm_gmem_truncate_folio(fbatch.folios[i]); + + folio_batch_release(&fbatch); + cond_resched(); + } +} + static long kvm_gmem_punch_hole(struct inode *inode, loff_t offset, loff_t len) { pgoff_t start = offset >> PAGE_SHIFT; @@ -260,7 +299,7 @@ static long kvm_gmem_punch_hole(struct inode *inode, loff_t offset, loff_t len) kvm_gmem_invalidate_begin(inode, start, end); - truncate_inode_pages_range(inode->i_mapping, offset, offset + len - 1); + kvm_gmem_truncate_range(inode, offset, len >> PAGE_SHIFT); kvm_gmem_invalidate_end(inode, start, end); @@ -984,7 +1023,7 @@ static void kvm_gmem_evict_inode(struct inode *inode) truncate_inode_pages_final_prepare(mapping); - truncate_inode_pages_range(mapping, 0, inode->i_size); + kvm_gmem_truncate_range(inode, 0, inode->i_size >> PAGE_SHIFT); clear_inode(inode); } -- 2.53.0.345.g96ddfc5eaa-goog