On  7.06.2017 21:09, Sargun Dhillon wrote:
> This patch is a small performance optimization to get rid of a spin
> lock, where instead an atomic64_t can be used.
> 
> Signed-off-by: Sargun Dhillon <sar...@sargun.me>

I've already sent similar patch 1 month ago:

https://patchwork.kernel.org/patch/9720999/


> ---
>  fs/btrfs/ctree.h       |  4 ++--
>  fs/btrfs/disk-io.c     |  3 +--
>  fs/btrfs/extent-tree.c |  4 +---
>  fs/btrfs/volumes.c     | 26 +++++++-------------------
>  4 files changed, 11 insertions(+), 26 deletions(-)
> 
> diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
> index 643c70d..01bf42c 100644
> --- a/fs/btrfs/ctree.h
> +++ b/fs/btrfs/ctree.h
> @@ -40,6 +40,7 @@
>  #include <linux/sizes.h>
>  #include <linux/dynamic_debug.h>
>  #include <linux/refcount.h>
> +#include <linux/types.h>
>  #include "extent_io.h"
>  #include "extent_map.h"
>  #include "async-thread.h"
> @@ -748,8 +749,7 @@ struct btrfs_fs_info {
>       struct rb_root block_group_cache_tree;
>  
>       /* keep track of unallocated space */
> -     spinlock_t free_chunk_lock;
> -     u64 free_chunk_space;
> +     atomic64_t free_chunk_space;
>  
>       struct extent_io_tree freed_extents[2];
>       struct extent_io_tree *pinned_extents;
> diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
> index 8685d67..3700b68 100644
> --- a/fs/btrfs/disk-io.c
> +++ b/fs/btrfs/disk-io.c
> @@ -2626,7 +2626,6 @@ int open_ctree(struct super_block *sb,
>       spin_lock_init(&fs_info->fs_roots_radix_lock);
>       spin_lock_init(&fs_info->delayed_iput_lock);
>       spin_lock_init(&fs_info->defrag_inodes_lock);
> -     spin_lock_init(&fs_info->free_chunk_lock);
>       spin_lock_init(&fs_info->tree_mod_seq_lock);
>       spin_lock_init(&fs_info->super_lock);
>       spin_lock_init(&fs_info->qgroup_op_lock);
> @@ -2667,7 +2666,7 @@ int open_ctree(struct super_block *sb,
>       fs_info->max_inline = BTRFS_DEFAULT_MAX_INLINE;
>       fs_info->metadata_ratio = 0;
>       fs_info->defrag_inodes = RB_ROOT;
> -     fs_info->free_chunk_space = 0;
> +     atomic64_set(&fs_info->free_chunk_space, 0);
>       fs_info->tree_mod_log = RB_ROOT;
>       fs_info->commit_interval = BTRFS_DEFAULT_COMMIT_INTERVAL;
>       fs_info->avg_delayed_ref_runtime = NSEC_PER_SEC >> 6; /* div by 64 */
> diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
> index e390451..955733c 100644
> --- a/fs/btrfs/extent-tree.c
> +++ b/fs/btrfs/extent-tree.c
> @@ -4645,9 +4645,7 @@ static int can_overcommit(struct btrfs_root *root,
>  
>       used += space_info->bytes_may_use;
>  
> -     spin_lock(&fs_info->free_chunk_lock);
> -     avail = fs_info->free_chunk_space;
> -     spin_unlock(&fs_info->free_chunk_lock);
> +     avail = atomic64_read(&fs_info->free_chunk_space);
>  
>       /*
>        * If we have dup, raid1 or raid10 then only half of the free
> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
> index 017b67d..0123974 100644
> --- a/fs/btrfs/volumes.c
> +++ b/fs/btrfs/volumes.c
> @@ -2417,9 +2417,7 @@ int btrfs_init_new_device(struct btrfs_fs_info 
> *fs_info, const char *device_path
>       fs_info->fs_devices->total_devices++;
>       fs_info->fs_devices->total_rw_bytes += device->total_bytes;
>  
> -     spin_lock(&fs_info->free_chunk_lock);
> -     fs_info->free_chunk_space += device->total_bytes;
> -     spin_unlock(&fs_info->free_chunk_lock);
> +     atomic64_add(device->total_bytes, &fs_info->free_chunk_space);
>  
>       if (!blk_queue_nonrot(q))
>               fs_info->fs_devices->rotating = 1;
> @@ -2874,9 +2872,7 @@ int btrfs_remove_chunk(struct btrfs_trans_handle *trans,
>                       mutex_lock(&fs_info->chunk_mutex);
>                       btrfs_device_set_bytes_used(device,
>                                       device->bytes_used - dev_extent_len);
> -                     spin_lock(&fs_info->free_chunk_lock);
> -                     fs_info->free_chunk_space += dev_extent_len;
> -                     spin_unlock(&fs_info->free_chunk_lock);
> +                     atomic64_add(dev_extent_len, 
> &fs_info->free_chunk_space);
>                       btrfs_clear_space_info_full(fs_info);
>                       mutex_unlock(&fs_info->chunk_mutex);
>               }
> @@ -4409,9 +4405,7 @@ int btrfs_shrink_device(struct btrfs_device *device, 
> u64 new_size)
>       btrfs_device_set_total_bytes(device, new_size);
>       if (device->writeable) {
>               device->fs_devices->total_rw_bytes -= diff;
> -             spin_lock(&fs_info->free_chunk_lock);
> -             fs_info->free_chunk_space -= diff;
> -             spin_unlock(&fs_info->free_chunk_lock);
> +             atomic64_sub(diff, &fs_info->free_chunk_space);
>       }
>       mutex_unlock(&fs_info->chunk_mutex);
>  
> @@ -4535,9 +4529,7 @@ int btrfs_shrink_device(struct btrfs_device *device, 
> u64 new_size)
>               btrfs_device_set_total_bytes(device, old_size);
>               if (device->writeable)
>                       device->fs_devices->total_rw_bytes += diff;
> -             spin_lock(&fs_info->free_chunk_lock);
> -             fs_info->free_chunk_space += diff;
> -             spin_unlock(&fs_info->free_chunk_lock);
> +             atomic64_add(diff, &fs_info->free_chunk_space);
>               mutex_unlock(&fs_info->chunk_mutex);
>       }
>       return ret;
> @@ -4882,9 +4874,7 @@ static int __btrfs_alloc_chunk(struct 
> btrfs_trans_handle *trans,
>               btrfs_device_set_bytes_used(map->stripes[i].dev, num_bytes);
>       }
>  
> -     spin_lock(&info->free_chunk_lock);
> -     info->free_chunk_space -= (stripe_size * map->num_stripes);
> -     spin_unlock(&info->free_chunk_lock);
> +     atomic64_sub((stripe_size * map->num_stripes), &info->free_chunk_space);
>  
>       free_extent_map(em);
>       check_raid56_incompat_flag(info, type);
> @@ -6684,10 +6674,8 @@ static int read_one_dev(struct btrfs_fs_info *fs_info,
>       device->in_fs_metadata = 1;
>       if (device->writeable && !device->is_tgtdev_for_dev_replace) {
>               device->fs_devices->total_rw_bytes += device->total_bytes;
> -             spin_lock(&fs_info->free_chunk_lock);
> -             fs_info->free_chunk_space += device->total_bytes -
> -                     device->bytes_used;
> -             spin_unlock(&fs_info->free_chunk_lock);
> +             atomic64_add(device->total_bytes - device->bytes_used,
> +                          &fs_info->free_chunk_space);
>       }
>       ret = 0;
>       return ret;
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to