Re: [RESEND v2] ext4: Optimization of no-op ext4_truncate triggers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



‫בתאריך יום ה׳, 7 בנוב׳ 2024 ב-7:03 מאת ‪Theodore Ts'o‬‏ <‪tytso@xxxxxxx‬‏>:‬
>
> On Wed, Oct 16, 2024 at 02:16:24PM +0300, Max Brener wrote:
> > Closes: https://bugzilla.kernel.org/show_bug.cgi?id=219306
> > v1: https://lore.kernel.org/lkml/20240926221103.24423-1-linmaxi@xxxxxxxxx/T/
> >
> > Changes from last version: Moved vfs-level changes to be ext4-level,
> > and improved the description of the patch.
> >
> > This patch enables skipping no-op 'ext4_truncate' calls. Analyzing the kernel
> > with ftrace shows ext4_truncate is being sometimes called without making any
> > impact, and sometimes userspace programs might call ext4_truncate in vein. By
> > detecting these calls and skipping them, cpu time is saved.
> >
> > I'll fix this by skipping ext4_truncate call in 'ext4_setattr' when the file's size
> > hasn't changed AND it hasn't been truncated since the last disk space preallocation.
> > It is meant to consider the case when ext4_truncate is being called to truncate
> > preallocated blocks too. Notice that so far, the condition to triggering
> > ext4_truncate by the user was: if (attr->ia_size <= oldsize) which means it is
> > being triggered when attr->ia_size == oldsize regardless of whether there are
> > preallocated blocks or not - if there are none, then the call is redundant.
> >
> > Steps:
> > 1.Add a new inode state flag: EXT4_STATE_TRUNCATED
> > 2.Clear the flag when ext4_fallocate is being called with FALLOC_FL_KEEP_SIZE flag
> > to enable using ext4_truncate again, to remove preallocated disk space that may
> > have resulted from this call.
> > 3.Set EXT4_STATE_TRUNCATED when ext4_truncated is called successfully.
> > 4.Don't skip ext4_truncate in ext4_setattr when the size of the file has either been
> > reduced OR stayed the same, but hasn't been truncated yet. This is in order to allow
> > truncating of preallocated blocks.
>
> This patch is still not quite right.  See Jan's comment from [1]:
>
>    Agreed as well. I'll also note that keeping such flag uptodate is not as
>    simple as it seems because there are various places that may be allocating
>    blocks beyond EOF (for example extending writes) and that rely on
>    ext4_truncate() removing them so one needs to be careful to capture all the
>    places where the "truncated" state needs to be cleared.
>
> [1] https://lore.kernel.org/all/20240930095601.x66iqw74bxffytgq@quack3/
>
>                                                 - Ted

Okay I understand now, I initially thought any preallocation is necessarily done
through a VFS interface. Now that I see preallocations are done at mballoc,
what I can offer is to clear the TRUNCATED flag at ext4_mb_new_blocks().
Would that be ok in your opinion?





[Index of Archives]     [Reiser Filesystem Development]     [Ceph FS]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite National Park]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Device Mapper]     [Linux Media]

  Powered by Linux