From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.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 8B06E34BA33 for ; Mon, 23 Feb 2026 07:05:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771830303; cv=none; b=azn/TWCtI52JI6eQ+xMFLmRuiDrBJef+8ovFTeClXn5TIrKQSjXpePnkMyp4y6wBcfrpNLpTFjd4KWwab0xhNJV4uqDLWkkWjjNibRCoIKkUG9e8FOxHxTuRpC3PJAgRJ788ZQITO3Y5AyaSc6YlD9bixBgHRHHvwK6PAmNyd9I= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771830303; c=relaxed/simple; bh=4AzPo53RW7z1u/HbYb3WJwZj9BjSBVUkolJYB1GMnjw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=NMUhb5dWaQPaKiyqdS4UerVj3BpMCTEndO97JYmXLYYE4/bUTeRSTxu7Dbr2pn3YzafOXUqZq5i/QXrNMPg+MCQ9ftshCw7liHcLb5EexPVqjSumIO9hY1ZEl94S48s0tXxRGZQ80DOiy69WdOWUMPST66JTZhrXk4fkGi0JsYA= 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.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="OdYFkPBf" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-82436a49592so1674849b3a.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=F4aXDqkea0eHJYWxKhCdttJWmGApnretcMZGTcgKzgrYO9SmfUxPdqmkx6m9iopOj4 /ankHIJB/jk5kbzf7ks1coOkt2T0ipNmGDLov0nmtoxXga0vrzxzfzPyqKbTLKv0nBKO /gJrBW19gkxKxJEUkhX+IUWh67yCaN4zqdTx15NafbBMjm7DoSyVlPDJieUFiEs4R50T zXHpUme9363arb7ZDiIVpkUb4e9RkiPTPOfKZblEbUw2GabK7Ugtd0tTGMwBX3czNakR z/wYB3dVDkRXovpZR0T4CMLDOXBCV7ivM+ZZYYOkdFE7Dt1QZlTanNeOL8I53GCXqRvb FSCQ== X-Forwarded-Encrypted: i=1; AJvYcCUdnrM7fppSz3tUUlXKlX4sOliPlOOPnlAMgrlsSl2SSwKZ0jZ4R1UmyFeiorJ7L9Sizinm6kyePwC5hZtXSfY=@vger.kernel.org X-Gm-Message-State: AOJu0Yx4NY9ghC/UnDPQZgHaoSz54bACh827Dz7O9mcn2x/l9cMuVU73 Zct+LUy2SYJMQ9ArQQ12a0aokfzb5t+m11dNLVbJTFR4oZ6mtDw7smqHgqfS7afyGRG64sfdvZE UmwuYP/A9aofpw42utprAWNvG+Q== 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-kselftest@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