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...@samsung.com>
Signed-off-by: Jaegeuk Kim <jaeg...@kernel.org>
Signed-off-by: Changman Lee <cm224....@samsung.com>
---
 fs/f2fs/f2fs.h | 36 ++++++++++++++++++++++++++++++++----
 fs/f2fs/node.h |  1 +
 2 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 8e1d78d..63edc22 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -267,13 +267,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*/
 };
 
 /*
@@ -553,6 +573,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 */
diff --git a/fs/f2fs/node.h b/fs/f2fs/node.h
index f405bbf..c56026f 100644
--- a/fs/f2fs/node.h
+++ b/fs/f2fs/node.h
@@ -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 */
 };
 
-- 
2.2.1


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to