f2fs: introduce infra macro and data structure of rb-tree extent cache
authorChao Yu <chao2.yu@samsung.com>
Thu, 5 Feb 2015 09:52:58 +0000 (17:52 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Tue, 3 Mar 2015 17:58:46 +0000 (09:58 -0800)
Introduce infra macro and data structure for rb-tree based extent cache:

Macros:
 * EXT_TREE_VEC_SIZE: indicate vector size for gang lookup in extent tree.
 * F2FS_MIN_EXTENT_LEN: indicate minimum length of extent managed in cache.
 * EXTENT_CACHE_SHRINK_NUMBER: indicate number of extent in cache will be shrunk.

Basic data structures for extent cache:
 * struct extent_tree: extent tree entry per inode.
 * struct extent_node: extent info node linked in extent tree.

Besides, adding new extent cache related fields in f2fs_sb_info.

Signed-off-by: Chao Yu <chao2.yu@samsung.com>
Signed-off-by: Changman Lee <cm224.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/f2fs.h
fs/f2fs/node.h

index f3fbfa91de8eb1ae81376ec09ff3c7d819a06e1a..a214cce9fe70b4c94a2a6d8369501d050619540c 100644 (file)
@@ -273,13 +273,33 @@ enum {
 
 #define MAX_DIR_RA_PAGES       4       /* maximum ra pages of dir */
 
+/* vector size for gang look-up from extent cache that consists of radix tree */
+#define EXT_TREE_VEC_SIZE      64
+
 /* for in-memory extent cache entry */
-#define F2FS_MIN_EXTENT_LEN    16      /* minimum extent length */
+#define F2FS_MIN_EXTENT_LEN    64      /* minimum extent length */
+
+/* number of extent info in extent cache we try to shrink */
+#define EXTENT_CACHE_SHRINK_NUMBER     128
 
 struct extent_info {
-       unsigned int fofs;      /* start offset in a file */
-       u32 blk;                /* start block address of the extent */
-       unsigned int len;       /* length of the extent */
+       unsigned int fofs;              /* start offset in a file */
+       u32 blk;                        /* start block address of the extent */
+       unsigned int len;               /* length of the extent */
+};
+
+struct extent_node {
+       struct rb_node rb_node;         /* rb node located in rb-tree */
+       struct list_head list;          /* node in global extent list of sbi */
+       struct extent_info ei;          /* extent info */
+};
+
+struct extent_tree {
+       nid_t ino;                      /* inode number */
+       struct rb_root root;            /* root of extent info rb-tree */
+       rwlock_t lock;                  /* protect extent info rb-tree */
+       atomic_t refcount;              /* reference count of rb-tree */
+       unsigned int count;             /* # of extent node in rb-tree*/
 };
 
 /*
@@ -567,6 +587,14 @@ struct f2fs_sb_info {
        struct list_head dir_inode_list;        /* dir inode list */
        spinlock_t dir_inode_lock;              /* for dir inode list lock */
 
+       /* for extent tree cache */
+       struct radix_tree_root extent_tree_root;/* cache extent cache entries */
+       struct rw_semaphore extent_tree_lock;   /* locking extent radix tree */
+       struct list_head extent_list;           /* lru list for shrinker */
+       spinlock_t extent_lock;                 /* locking extent lru list */
+       int total_ext_tree;                     /* extent tree count */
+       atomic_t total_ext_node;                /* extent info count */
+
        /* basic filesystem units */
        unsigned int log_sectors_per_block;     /* log2 sectors per block */
        unsigned int log_blocksize;             /* log2 block size */
index f405bbf2435a50d8608ff901f9eadc76b0b5f6a9..c56026f1725c90f44393ad38ce4ea53d705d349d 100644 (file)
@@ -120,6 +120,7 @@ enum mem_type {
        NAT_ENTRIES,    /* indicates the cached nat entry */
        DIRTY_DENTS,    /* indicates dirty dentry pages */
        INO_ENTRIES,    /* indicates inode entries */
+       EXTENT_CACHE,   /* indicates extent cache */
        BASE_CHECK,     /* check kernel status */
 };