2009-02-28 05:01:58

by Theodore Ts'o

[permalink] [raw]
Subject: [PATCH] ext4: Track lifetime disk writes


Add a new superblock value which tracks the lifetime amount of writes
to the filesystem. This is useful in estimating the amount of wear on
solid state drives (SSD's) caused by writes to the filesystem.

Signed-off-by: "Theodore Ts'o" <[email protected]>
---
fs/ext4/ext4.h | 3 ++-
fs/ext4/ext4_sb.h | 4 ++++
fs/ext4/super.c | 7 +++++++
3 files changed, 13 insertions(+), 1 deletions(-)

diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index 8599e37..f9a3bc3 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -685,7 +685,8 @@ struct ext4_super_block {
__u8 s_log_groups_per_flex; /* FLEX_BG group size */
__u8 s_reserved_char_pad2;
__le16 s_reserved_pad;
- __u32 s_reserved[162]; /* Padding to the end of the block */
+ __le64 s_kbytes_written; /* nr of lifetime kilobytes written */
+ __u32 s_reserved[160]; /* Padding to the end of the block */
};

#ifdef __KERNEL__
diff --git a/fs/ext4/ext4_sb.h b/fs/ext4/ext4_sb.h
index 4e4d9cc..50ab116 100644
--- a/fs/ext4/ext4_sb.h
+++ b/fs/ext4/ext4_sb.h
@@ -142,6 +142,10 @@ struct ext4_sb_info {
/* locality groups */
struct ext4_locality_group *s_locality_groups;

+ /* for write statistics */
+ unsigned long s_sectors_written_start;
+ u64 s_kbytes_written;
+
unsigned int s_log_groups_per_flex;
struct flex_groups *s_flex_groups;
};
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index c69f04c..007aa0a 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -2039,6 +2039,8 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
sbi->s_resgid = EXT4_DEF_RESGID;
sbi->s_inode_readahead_blks = EXT4_DEF_INODE_READAHEAD_BLKS;
sbi->s_sb_block = sb_block;
+ sbi->s_sectors_written_start = part_stat_read(sb->s_bdev->bd_part,
+ sectors[1]);

unlock_kernel();

@@ -2535,6 +2537,7 @@ no_journal:
}

ext4_setup_super(sb, es, sb->s_flags & MS_RDONLY);
+ sbi->s_kbytes_written = le64_to_cpu(es->s_kbytes_written);

/* determine the minimum size of new large inodes, if present */
if (sbi->s_inode_size > EXT4_GOOD_OLD_INODE_SIZE) {
@@ -2929,6 +2932,10 @@ static int ext4_commit_super(struct super_block *sb,
set_buffer_uptodate(sbh);
}
es->s_wtime = cpu_to_le32(get_seconds());
+ es->s_kbytes_written =
+ cpu_to_le64(EXT4_SB(sb)->s_kbytes_written +
+ ((part_stat_read(sb->s_bdev->bd_part, sectors[1]) -
+ EXT4_SB(sb)->s_sectors_written_start) >> 1));
ext4_free_blocks_count_set(es, percpu_counter_sum_positive(
&EXT4_SB(sb)->s_freeblocks_counter));
es->s_free_inodes_count = cpu_to_le32(percpu_counter_sum_positive(
--
1.5.6.3



2009-03-23 15:50:55

by Aneesh Kumar K.V

[permalink] [raw]
Subject: Re: [PATCH] ext4: Track lifetime disk writes

On Sat, Feb 28, 2009 at 12:01:52AM -0500, Theodore Ts'o wrote:
>
> Add a new superblock value which tracks the lifetime amount of writes
> to the filesystem. This is useful in estimating the amount of wear on
> solid state drives (SSD's) caused by writes to the filesystem.
>
> Signed-off-by: "Theodore Ts'o" <[email protected]>
> ---
> fs/ext4/ext4.h | 3 ++-
> fs/ext4/ext4_sb.h | 4 ++++
> fs/ext4/super.c | 7 +++++++
> 3 files changed, 13 insertions(+), 1 deletions(-)
>
> diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
> index 8599e37..f9a3bc3 100644
> --- a/fs/ext4/ext4.h
> +++ b/fs/ext4/ext4.h
> @@ -685,7 +685,8 @@ struct ext4_super_block {
> __u8 s_log_groups_per_flex; /* FLEX_BG group size */
> __u8 s_reserved_char_pad2;
> __le16 s_reserved_pad;
> - __u32 s_reserved[162]; /* Padding to the end of the block */
> + __le64 s_kbytes_written; /* nr of lifetime kilobytes written */
> + __u32 s_reserved[160]; /* Padding to the end of the block */
> };
>
> #ifdef __KERNEL__
> diff --git a/fs/ext4/ext4_sb.h b/fs/ext4/ext4_sb.h
> index 4e4d9cc..50ab116 100644
> --- a/fs/ext4/ext4_sb.h
> +++ b/fs/ext4/ext4_sb.h
> @@ -142,6 +142,10 @@ struct ext4_sb_info {
> /* locality groups */
> struct ext4_locality_group *s_locality_groups;
>
> + /* for write statistics */
> + unsigned long s_sectors_written_start;
> + u64 s_kbytes_written;
> +
> unsigned int s_log_groups_per_flex;
> struct flex_groups *s_flex_groups;
> };

Do we need this change ? We don't seems to be using it anywhere.

> diff --git a/fs/ext4/super.c b/fs/ext4/super.c
> index c69f04c..007aa0a 100644
> --- a/fs/ext4/super.c
> +++ b/fs/ext4/super.c
> @@ -2039,6 +2039,8 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
> sbi->s_resgid = EXT4_DEF_RESGID;
> sbi->s_inode_readahead_blks = EXT4_DEF_INODE_READAHEAD_BLKS;
> sbi->s_sb_block = sb_block;
> + sbi->s_sectors_written_start = part_stat_read(sb->s_bdev->bd_part,
> + sectors[1]);
>
> unlock_kernel();
>
> @@ -2535,6 +2537,7 @@ no_journal:
> }
>
> ext4_setup_super(sb, es, sb->s_flags & MS_RDONLY);
> + sbi->s_kbytes_written = le64_to_cpu(es->s_kbytes_written);
>
> /* determine the minimum size of new large inodes, if present */
> if (sbi->s_inode_size > EXT4_GOOD_OLD_INODE_SIZE) {
> @@ -2929,6 +2932,10 @@ static int ext4_commit_super(struct super_block *sb,
> set_buffer_uptodate(sbh);
> }
> es->s_wtime = cpu_to_le32(get_seconds());
> + es->s_kbytes_written =
> + cpu_to_le64(EXT4_SB(sb)->s_kbytes_written +
> + ((part_stat_read(sb->s_bdev->bd_part, sectors[1]) -
> + EXT4_SB(sb)->s_sectors_written_start) >> 1));
> ext4_free_blocks_count_set(es, percpu_counter_sum_positive(
> &EXT4_SB(sb)->s_freeblocks_counter));
> es->s_free_inodes_count = cpu_to_le32(percpu_counter_sum_positive(

Can't we just do

es->s_kbytes_written = cpu_to_le64(le64_to_cpu(es->s_kbytes_written) + (part_stat_read(sb->s_bdev->bd_part, sectors[1]) >> 1))

During ext4_commit_super without even touching ext4_sb_info ?

What is being tracked in s_sectors_written_start ?

-aneesh



2009-03-30 10:08:38

by Aneesh Kumar K.V

[permalink] [raw]
Subject: Re: [PATCH] ext4: Track lifetime disk writes

On Mon, Mar 23, 2009 at 09:20:24PM +0530, Aneesh Kumar K.V wrote:
> On Sat, Feb 28, 2009 at 12:01:52AM -0500, Theodore Ts'o wrote:
> >
> > Add a new superblock value which tracks the lifetime amount of writes
> > to the filesystem. This is useful in estimating the amount of wear on
> > solid state drives (SSD's) caused by writes to the filesystem.
> >
> > Signed-off-by: "Theodore Ts'o" <[email protected]>
> > ---
> > fs/ext4/ext4.h | 3 ++-
> > fs/ext4/ext4_sb.h | 4 ++++
> > fs/ext4/super.c | 7 +++++++
> > 3 files changed, 13 insertions(+), 1 deletions(-)
> >
> > diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
> > index 8599e37..f9a3bc3 100644
> > --- a/fs/ext4/ext4.h
> > +++ b/fs/ext4/ext4.h
> > @@ -685,7 +685,8 @@ struct ext4_super_block {
> > __u8 s_log_groups_per_flex; /* FLEX_BG group size */
> > __u8 s_reserved_char_pad2;
> > __le16 s_reserved_pad;
> > - __u32 s_reserved[162]; /* Padding to the end of the block */
> > + __le64 s_kbytes_written; /* nr of lifetime kilobytes written */
> > + __u32 s_reserved[160]; /* Padding to the end of the block */
> > };
> >
> > #ifdef __KERNEL__
> > diff --git a/fs/ext4/ext4_sb.h b/fs/ext4/ext4_sb.h
> > index 4e4d9cc..50ab116 100644
> > --- a/fs/ext4/ext4_sb.h
> > +++ b/fs/ext4/ext4_sb.h
> > @@ -142,6 +142,10 @@ struct ext4_sb_info {
> > /* locality groups */
> > struct ext4_locality_group *s_locality_groups;
> >
> > + /* for write statistics */
> > + unsigned long s_sectors_written_start;
> > + u64 s_kbytes_written;
> > +
> > unsigned int s_log_groups_per_flex;
> > struct flex_groups *s_flex_groups;
> > };
>
> Do we need this change ? We don't seems to be using it anywhere.
>

Looked at the patchqueue and found that you have users in sysfs-support
patch. I guess it would be better if you put this patch after
sysfs-support and moved session_write_kbytes_show and others to this
patch.

-aneesh