dm bitset: only flush the current word if it has been dirtied
authorJoe Thornber <ejt@redhat.com>
Mon, 3 Mar 2014 15:37:24 +0000 (10:37 -0500)
committerMike Snitzer <snitzer@redhat.com>
Thu, 27 Mar 2014 20:56:23 +0000 (16:56 -0400)
This change offers a big performance boost for dm-era.

Signed-off-by: Joe Thornber <ejt@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
drivers/md/persistent-data/dm-bitset.c
drivers/md/persistent-data/dm-bitset.h

index cd9a86d..36f7cc2 100644 (file)
@@ -65,7 +65,7 @@ int dm_bitset_flush(struct dm_disk_bitset *info, dm_block_t root,
        int r;
        __le64 value;
 
-       if (!info->current_index_set)
+       if (!info->current_index_set || !info->dirty)
                return 0;
 
        value = cpu_to_le64(info->current_bits);
@@ -77,6 +77,8 @@ int dm_bitset_flush(struct dm_disk_bitset *info, dm_block_t root,
                return r;
 
        info->current_index_set = false;
+       info->dirty = false;
+
        return 0;
 }
 EXPORT_SYMBOL_GPL(dm_bitset_flush);
@@ -94,6 +96,8 @@ static int read_bits(struct dm_disk_bitset *info, dm_block_t root,
        info->current_bits = le64_to_cpu(value);
        info->current_index_set = true;
        info->current_index = array_index;
+       info->dirty = false;
+
        return 0;
 }
 
@@ -126,6 +130,8 @@ int dm_bitset_set_bit(struct dm_disk_bitset *info, dm_block_t root,
                return r;
 
        set_bit(b, (unsigned long *) &info->current_bits);
+       info->dirty = true;
+
        return 0;
 }
 EXPORT_SYMBOL_GPL(dm_bitset_set_bit);
@@ -141,6 +147,8 @@ int dm_bitset_clear_bit(struct dm_disk_bitset *info, dm_block_t root,
                return r;
 
        clear_bit(b, (unsigned long *) &info->current_bits);
+       info->dirty = true;
+
        return 0;
 }
 EXPORT_SYMBOL_GPL(dm_bitset_clear_bit);
index e1b9bea..c2287d6 100644 (file)
@@ -71,6 +71,7 @@ struct dm_disk_bitset {
        uint64_t current_bits;
 
        bool current_index_set:1;
+       bool dirty:1;
 };
 
 /*