f2fs: use percpu_counter for total_valid_inode_count
authorJaegeuk Kim <jaegeuk@kernel.org>
Mon, 16 May 2016 18:42:32 +0000 (11:42 -0700)
committerJaegeuk Kim <jaegeuk@kernel.org>
Wed, 18 May 2016 20:57:30 +0000 (13:57 -0700)
This patch uses percpu_counter to avoid stat_lock.

Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/f2fs.h
fs/f2fs/super.c

index c8833c8..02f0656 100644 (file)
@@ -801,7 +801,6 @@ struct f2fs_sb_info {
        unsigned int total_sections;            /* total section count */
        unsigned int total_node_count;          /* total node block count */
        unsigned int total_valid_node_count;    /* valid node block count */
-       unsigned int total_valid_inode_count;   /* valid inode count */
        loff_t max_file_blocks;                 /* max block index of file */
        int active_logs;                        /* # of active logs */
        int dir_level;                          /* directory level */
@@ -818,6 +817,9 @@ struct f2fs_sb_info {
        /* # of allocated blocks */
        struct percpu_counter alloc_valid_block_count;
 
+       /* valid inode count */
+       struct percpu_counter total_valid_inode_count;
+
        struct f2fs_mount_info mount_opt;       /* mount options */
 
        /* for cleaning operations */
@@ -1325,23 +1327,17 @@ static inline unsigned int valid_node_count(struct f2fs_sb_info *sbi)
 
 static inline void inc_valid_inode_count(struct f2fs_sb_info *sbi)
 {
-       spin_lock(&sbi->stat_lock);
-       f2fs_bug_on(sbi, sbi->total_valid_inode_count == sbi->total_node_count);
-       sbi->total_valid_inode_count++;
-       spin_unlock(&sbi->stat_lock);
+       percpu_counter_inc(&sbi->total_valid_inode_count);
 }
 
 static inline void dec_valid_inode_count(struct f2fs_sb_info *sbi)
 {
-       spin_lock(&sbi->stat_lock);
-       f2fs_bug_on(sbi, !sbi->total_valid_inode_count);
-       sbi->total_valid_inode_count--;
-       spin_unlock(&sbi->stat_lock);
+       percpu_counter_dec(&sbi->total_valid_inode_count);
 }
 
-static inline unsigned int valid_inode_count(struct f2fs_sb_info *sbi)
+static inline s64 valid_inode_count(struct f2fs_sb_info *sbi)
 {
-       return sbi->total_valid_inode_count;
+       return percpu_counter_sum_positive(&sbi->total_valid_inode_count);
 }
 
 static inline struct page *f2fs_grab_cache_page(struct address_space *mapping,
index 43e3e9c..173cf3a 100644 (file)
@@ -618,6 +618,7 @@ static void destroy_percpu_info(struct f2fs_sb_info *sbi)
        for (i = 0; i < NR_COUNT_TYPE; i++)
                percpu_counter_destroy(&sbi->nr_pages[i]);
        percpu_counter_destroy(&sbi->alloc_valid_block_count);
+       percpu_counter_destroy(&sbi->total_valid_inode_count);
 }
 
 static void f2fs_put_super(struct super_block *sb)
@@ -1384,7 +1385,11 @@ static int init_percpu_info(struct f2fs_sb_info *sbi)
                        return err;
        }
 
-       return percpu_counter_init(&sbi->alloc_valid_block_count, 0,
+       err = percpu_counter_init(&sbi->alloc_valid_block_count, 0, GFP_KERNEL);
+       if (err)
+               return err;
+
+       return percpu_counter_init(&sbi->total_valid_inode_count, 0,
                                                                GFP_KERNEL);
 }
 
@@ -1598,8 +1603,8 @@ try_onemore:
 
        sbi->total_valid_node_count =
                                le32_to_cpu(sbi->ckpt->valid_node_count);
-       sbi->total_valid_inode_count =
-                               le32_to_cpu(sbi->ckpt->valid_inode_count);
+       percpu_counter_set(&sbi->total_valid_inode_count,
+                               le32_to_cpu(sbi->ckpt->valid_inode_count));
        sbi->user_block_count = le64_to_cpu(sbi->ckpt->user_block_count);
        sbi->total_valid_block_count =
                                le64_to_cpu(sbi->ckpt->valid_block_count);