On 2/23/26 08:04, Ackerley Tng wrote:
Hi,
Currently, guest_memfd doesn't update inode's i_blocks or i_bytes at
all. Hence, st_blocks in the struct populated by a userspace fstat()
call on a guest_memfd will always be 0. This patch series makes
guest_memfd track the amount of memory allocated on an inode, which
allows fstat() to accurately report that on requests from userspace.
The inode's i_blocks and i_bytes fields are updated when the folio is
associated or disassociated from the guest_memfd inode, which are at
allocation and truncation times respectively.
To update inode fields at truncation time, this series implements a
custom truncation function for guest_memfd. An alternative would be to
update truncate_inode_pages_range() to return the number of bytes
truncated or add/use some hook.
Implementing a custom truncation function was chosen to provide
flexibility for handling truncations in future when guest_memfd
supports sources of pages other than the buddy allocator. This
approach of a custom truncation function also aligns with shmem, which
has a custom shmem_truncate_range().
Just wondered how shmem does it: it's through
dquot_alloc_block_nodirty() / dquot_free_block_nodirty().
It's a shame we can't just use folio_free(). Could we maybe have a
different callback (when the mapping is still guaranteed to be around)
from where we could update i_blocks on the freeing path?
--
Cheers,
David