add patch set-lazytime-on-remount
[ext4-patch-queue.git] / cover-letter
blob17ce4237ec8913536166784588a8e63f2794f8a0
1 Subject: [PATCH-v9 0/3] add support for a lazytime mount option
3 This is an updated version of what had originally been an
4 ext4-specific patch which significantly improves performance by lazily
5 writing timestamp updates (and in particular, mtime updates) to disk.
6 The in-memory timestamps are always correct, but they are only written
7 to disk when required for correctness.
9 This provides a huge performance boost for ext4 due to how it handles
10 journalling, but it's valuable for all file systems running on flash
11 storage or drive-managed SMR disks by reducing the metadata write
12 load.  So upon request, I've moved the functionality to the VFS layer.
13 Once the /sbin/mount program adds support for MS_LAZYTIME, all file
14 systems should be able to benefit from this optimization.
16 There is still an ext4-specific optimization, which may be applicable
17 for other file systems which store more than one inode in a block, but
18 it will require file system specific code.  It is purely optional,
19 however.
21 For people interested seeing how timestamp updates are held back, the
22 following example commands to enable the tracepoints debugging may be
23 helpful:
25   mount -o remount,lazytime /
26   cd /sys/kernel/debug/tracing
27   echo 1 > events/writeback/writeback_lazytime/enable
28   echo 1 > events/writeback/writeback_lazytime_iput/enable
29   echo "state & 2048" > events/writeback/writeback_dirty_inode_enqueue/filter
30   echo 1 > events/writeback/writeback_dirty_inode_enqueue/enable
31   echo 1 > events/ext4/ext4_other_inode_update_time/enable
32   cat trace_pipe
34 You can also see how many lazytime inodes are in memory by looking in
35 /sys/kernel/debug/bdi/<bdi>/stats
37 Changes since -v8:
38   - in ext4_update_other_inodes_time() clear I_DIRTY_TIME_EXPIRED as
39     well as I_DIRTY_TIME
40   - Fixed a bug which broke writeback in some cases (introduced in -v7)
42 Changes since -v7:
43    - Fix comment typos
44    - Clear the I_DIRTY_TIME flag if I_DIRTY_INODE gets added in
45      __mark_inode_dirty()
46    - Fix a bug accidentally introduced in -v7 which broke lazytime altogether 
48 Changes since -v6:
49    - Add a new tracepoint writeback_dirty_inode_enqueue
50    - Move generic handling of update_time() to generic_update_time(),
51      so filesystems can more easily hook or modify update_time()
52    - The file system's dirty_inode() will now always get called with
53      I_DIRTY_TIME when the inode time is updated.   (I_DIRTY_SYNC will
54      also be set if the inode should be updated right away.)   This allows
55      file systems such as XFS to update its on-disk copy of the inode if
56      I_DIRTY_TIME is set.
58 Changes since -v5:
59    - Tweak move_expired_inodes to handle sync() and syncfs(), and drop
60      flush_sb_dirty_time().
61    - Move logic for handling the b_dirty_time list into
62      __mark_inode_dirty().
63    - Move I_DIRTY back to its original definition, and use I_DIRTY_ALL
64      for I_DIRTY plus I_DIRTY_TIME.
65    - Fold some patches together to make the first patch easier to
66      review (and modify/update).
67    - Use the pre-existing writeback tracepoints instead of creating a new
68      fs tracepoints.
70 Changes since -v4:
71    - Fix ext4 optimization so it does not need to increment (and more
72      problematically, decrement) the inode reference count
73    - Per Christoph's suggestion, drop support for btrfs and xfs for now,
74      issues with how btrfs and xfs handle dirty inode tracking.  We can add
75      btrfs and xfs support back later or at the end of this series if we
76      want to revisit this decision.
77    - Miscellaneous cleanups
79 Changes since -v3:
80    - inodes with I_DIRTY_TIME set are placed on a new bdi list,
81         b_dirty_time.  This allows filesystem-level syncs to more
82         easily iterate over those inodes that need to have their
83         timestamps written to disk.
84    - dirty timestamps will be written out asynchronously on the final
85         iput, instead of when the inode gets evicted.
86    - separate the definition of the new function
87         find_active_inode_nowait() to a separate patch
88    - create separate flag masks: I_DIRTY_WB and I_DIRTY_INODE, which
89        indicate whether the inode needs to be on the write back lists,
90        or whether the inode itself is dirty, while I_DIRTY means any one
91        of the inode dirty flags are set.  This simplifies the fs
92        writeback logic which needs to test for different combinations of
93        the inode dirty flags in different places.
95 Changes since -v2:
96    - If update_time() updates i_version, it will not use lazytime (i..e,
97        the inode will be marked dirty so the change will be persisted on to
98        disk sooner rather than later).  Yes, this eliminates the
99        benefits of lazytime if the user is experting the file system via
100        NFSv4.  Sad, but NFS's requirements seem to mandate this.
101    - Fix time wrapping bug 49 days after the system boots (on a system
102         with a 32-bit jiffies).   Use get_monotonic_boottime() instead.
103    - Clean up type warning in include/tracing/ext4.h
104    - Added explicit parenthesis for stylistic reasons    
105    - Added an is_readonly() inode operations method so btrfs doesn't
106        have to duplicate code in update_time().
108 Changes since -v1:
109    - Added explanatory comments in update_time() regarding i_ts_dirty_days
110    - Fix type used for days_since_boot
111    - Improve SMP scalability in update_time and ext4_update_other_inodes_time
112    - Added tracepoints to help test and characterize how often and under
113          what circumstances inodes have their timestamps lazily updated
115 Theodore Ts'o (3):
116   vfs: add support for a lazytime mount option
117   vfs: add find_inode_nowait() function
118   ext4: add optimization for the lazytime mount option
120  fs/ext4/inode.c                  |  70 +++++++++++++++++++++++++-
121  fs/ext4/super.c                  |  10 ++++
122  fs/fs-writeback.c                |  62 +++++++++++++++++++----
123  fs/gfs2/file.c                   |   4 +-
124  fs/inode.c                       | 106 +++++++++++++++++++++++++++++++++------
125  fs/jfs/file.c                    |   2 +-
126  fs/libfs.c                       |   2 +-
127  fs/proc_namespace.c              |   1 +
128  fs/sync.c                        |   8 +++
129  include/linux/backing-dev.h      |   1 +
130  include/linux/fs.h               |  10 ++++
131  include/trace/events/ext4.h      |  30 +++++++++++
132  include/trace/events/writeback.h |  60 +++++++++++++++++++++-
133  include/uapi/linux/fs.h          |   4 +-
134  mm/backing-dev.c                 |  10 +++-
135  15 files changed, 343 insertions(+), 37 deletions(-)
137 -- 
138 2.1.0