From: zwu.kernel@gmail.com
To: linux-fsdevel@vger.kernel.org
Cc: linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org,
linux-kernel@vger.kernel.org, linuxram@linux.vnet.ibm.com,
viro@zeniv.linux.org.uk, david@fromorbit.com, dave@jikos.cz,
tytso@mit.edu, cmm@us.ibm.com,
Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
Subject: [RFC v3 05/13] vfs: add two map arrays
Date: Wed, 10 Oct 2012 18:07:27 +0800 [thread overview]
Message-ID: <1349863655-29320-6-git-send-email-zwu.kernel@gmail.com> (raw)
In-Reply-To: <1349863655-29320-1-git-send-email-zwu.kernel@gmail.com>
From: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
Adds two map arrays which contains
a lot of list and is used to efficiently
look up the data temperature of a file or its
ranges.
In each list of map arrays, the array node
will keep track of temperature info.
Signed-off-by: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
---
fs/hot_tracking.c | 50 ++++++++++++++++++++++++++++++++++++++++++
include/linux/hot_tracking.h | 16 +++++++++++++
2 files changed, 66 insertions(+), 0 deletions(-)
diff --git a/fs/hot_tracking.c b/fs/hot_tracking.c
index 86c87c7..08c42c5 100644
--- a/fs/hot_tracking.c
+++ b/fs/hot_tracking.c
@@ -60,6 +60,7 @@ static void hot_range_item_init(struct hot_range_item *hr, u32 start,
hr->hot_inode = he;
kref_init(&hr->hot_range.refs);
spin_lock_init(&hr->hot_range.lock);
+ INIT_LIST_HEAD(&hr->hot_range.n_list);
hr->hot_range.hot_freq_data.avg_delta_reads = (u64) -1;
hr->hot_range.hot_freq_data.avg_delta_writes = (u64) -1;
hr->hot_range.hot_freq_data.flags = FREQ_DATA_TYPE_RANGE;
@@ -77,6 +78,7 @@ static void hot_inode_item_init(struct hot_inode_item *he, u64 ino,
he->hot_inode_tree = hot_inode_tree;
kref_init(&he->hot_inode.refs);
spin_lock_init(&he->hot_inode.lock);
+ INIT_LIST_HEAD(&he->hot_inode.n_list);
he->hot_inode.hot_freq_data.avg_delta_reads = (u64) -1;
he->hot_inode.hot_freq_data.avg_delta_writes = (u64) -1;
he->hot_inode.hot_freq_data.flags = FREQ_DATA_TYPE_INODE;
@@ -90,6 +92,11 @@ static void hot_range_item_free(struct kref *kref)
struct hot_range_item *hr = container_of(comm_item,
struct hot_range_item, hot_range);
+ spin_lock(&hr->hot_range.lock);
+ if (!list_empty(&hr->hot_range.n_list))
+ list_del_init(&hr->hot_range.n_list);
+ spin_unlock(&hr->hot_range.lock);
+
radix_tree_delete(&hr->hot_inode->hot_range_tree, hr->start);
kmem_cache_free(hot_range_item_cachep, hr);
}
@@ -135,6 +142,11 @@ static void hot_inode_item_free(struct kref *kref)
struct hot_inode_item *he = container_of(comm_item,
struct hot_inode_item, hot_inode);
+ spin_lock(&he->hot_inode.lock);
+ if (!list_empty(&he->hot_inode.n_list))
+ list_del_init(&he->hot_inode.n_list);
+ spin_unlock(&he->hot_inode.lock);
+
hot_range_tree_free(he);
radix_tree_delete(he->hot_inode_tree, he->i_ino);
kmem_cache_free(hot_inode_item_cachep, he);
@@ -365,6 +377,42 @@ inline void hot_update_freqs(struct hot_info *root,
}
/*
+ * Initialize inode and range map arrays.
+ */
+static void hot_map_array_init(struct hot_info *root)
+{
+ int i;
+ for (i = 0; i < HEAT_MAP_SIZE; i++) {
+ INIT_LIST_HEAD(&root->heat_inode_map[i].node_list);
+ INIT_LIST_HEAD(&root->heat_range_map[i].node_list);
+ root->heat_inode_map[i].temperature = i;
+ root->heat_range_map[i].temperature = i;
+ }
+}
+
+static void hot_map_list_free(struct list_head *node_list)
+{
+ struct list_head *pos, *next;
+ struct hot_comm_item *node;
+
+ list_for_each_safe(pos, next, node_list) {
+ node = list_entry(pos, struct hot_comm_item, n_list);
+ list_del_init(&node->n_list);
+ }
+
+}
+
+/* Free inode and range map arrays */
+static void hot_map_array_exit(struct hot_info *root)
+{
+ int i;
+ for (i = 0; i < HEAT_MAP_SIZE; i++) {
+ hot_map_list_free(&root->heat_inode_map[i].node_list);
+ hot_map_list_free(&root->heat_range_map[i].node_list);
+ }
+}
+
+/*
* Initialize kmem cache for hot_inode_item and hot_range_item.
*/
static int __init hot_cache_init(void)
@@ -426,6 +474,7 @@ void hot_track_init(struct super_block *sb)
global_hot_tracking_info = root;
sb->hot_flags |= MS_HOT_TRACKING;
hot_inode_tree_init(root);
+ hot_map_array_init(root);
printk(KERN_INFO "vfs: turning on hot data tracking\n");
@@ -439,6 +488,7 @@ void hot_track_exit(struct super_block *sb)
{
struct hot_info *root = global_hot_tracking_info;
+ hot_map_array_exit(root);
hot_inode_tree_exit(root);
sb->hot_flags &= ~MS_HOT_TRACKING;
hot_cache_exit();
diff --git a/include/linux/hot_tracking.h b/include/linux/hot_tracking.h
index 1e0aed5..7114179 100644
--- a/include/linux/hot_tracking.h
+++ b/include/linux/hot_tracking.h
@@ -22,6 +22,9 @@
#define MS_HOT_TRACKING (1<<0)
+#define HEAT_MAP_BITS 8
+#define HEAT_MAP_SIZE (1 << HEAT_MAP_BITS)
+
/*
* A frequency data struct holds values that are used to
* determine temperature of files and file ranges. These structs
@@ -38,11 +41,18 @@ struct hot_freq_data {
u32 last_temperature;
};
+/* List heads in hot map array */
+struct hot_map_head {
+ struct list_head node_list;
+ u32 temperature;
+};
+
/* The common info for both following structures */
struct hot_comm_item {
struct hot_freq_data hot_freq_data; /* frequency data */
spinlock_t lock; /* protects object data */
struct kref refs; /* prevents kfree */
+ struct list_head n_list; /* list node index */
};
/* An item representing an inode and its access frequency */
@@ -68,6 +78,12 @@ struct hot_range_item {
struct hot_info {
struct radix_tree_root hot_inode_tree;
spinlock_t lock; /*protect inode tree */
+
+ /* map of inode temperature */
+ struct hot_map_head heat_inode_map[HEAT_MAP_SIZE];
+
+ /* map of range temperature */
+ struct hot_map_head heat_range_map[HEAT_MAP_SIZE];
};
extern struct hot_info *global_hot_tracking_info;
--
1.7.6.5
next prev parent reply other threads:[~2012-10-10 10:08 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-10 10:07 [RFC v3 00/13] vfs: hot data tracking zwu.kernel
2012-10-10 10:07 ` [RFC v3 01/13] btrfs: add one new mount option '-o hot_track' zwu.kernel
[not found] ` <5075632c.03cc440a.1b33.7805SMTPIN_ADDED@mx.google.com>
2012-10-10 12:21 ` Zhi Yong Wu
2012-10-10 12:21 ` Zhi Yong Wu
2012-10-10 13:11 ` Lukáš Czerner
2012-10-10 13:16 ` Zhi Yong Wu
2012-10-10 16:28 ` David Sterba
2012-10-11 13:41 ` Zhi Yong Wu
2012-10-11 14:35 ` Zhi Yong Wu
2012-10-11 14:41 ` David Sterba
2012-10-11 14:46 ` Zhi Yong Wu
2012-10-10 10:07 ` [RFC v3 02/13] vfs: introduce private radix tree structures zwu.kernel
2012-10-10 15:34 ` David Sterba
2012-10-11 13:35 ` Zhi Yong Wu
2012-10-10 10:07 ` [RFC v3 03/13] vfs: Initialize and free main data structures zwu.kernel
2012-10-10 10:07 ` [RFC v3 04/13] vfs: add function for collecting raw access info zwu.kernel
2012-10-10 10:07 ` zwu.kernel [this message]
2012-10-10 10:07 ` [RFC v3 06/13] vfs: add hooks to enable hot data tracking zwu.kernel
2012-10-10 10:07 ` [RFC v3 07/13] vfs: add function for updating map arrays zwu.kernel
2012-10-10 10:07 ` [RFC v3 08/13] vfs: add aging function for old map info zwu.kernel
2012-10-10 10:07 ` [RFC v3 09/13] vfs: add one wq to update map info periodically zwu.kernel
2012-10-16 0:27 ` Dave Chinner
2012-10-17 6:34 ` Zhi Yong Wu
2012-10-18 2:25 ` Zheng Liu
2012-10-18 2:26 ` Zhi Yong Wu
2012-10-10 10:07 ` [RFC v3 10/13] vfs: register one memory shrinker zwu.kernel
2012-10-10 10:07 ` [RFC v3 11/13] vfs: add 3 new ioctl interfaces zwu.kernel
2012-10-15 7:48 ` Dave Chinner
2012-10-15 7:57 ` Zhi Yong Wu
2012-10-16 3:17 ` Dave Chinner
2012-10-16 4:18 ` Zhi Yong Wu
2012-10-19 8:21 ` Zhi Yong Wu
2012-10-10 10:07 ` [RFC v3 12/13] vfs: add debugfs support zwu.kernel
2012-10-10 16:53 ` David Sterba
2012-10-10 21:05 ` David Sterba
2012-10-15 7:55 ` Dave Chinner
2012-10-15 8:15 ` Zhi Yong Wu
2012-10-15 8:04 ` Dave Chinner
2012-10-15 8:47 ` Zhi Yong Wu
2012-10-10 10:07 ` [RFC v3 13/13] vfs: add documentation zwu.kernel
2012-10-15 0:35 ` Zheng Liu
2012-10-15 7:04 ` Zhi Yong Wu
2012-10-15 0:39 ` [RFC v3 00/13] vfs: hot data tracking Zheng Liu
2012-10-15 7:05 ` Zhi Yong Wu
2012-10-15 20:42 ` Dave Chinner
2012-10-17 8:57 ` Zhi Yong Wu
2012-10-18 4:29 ` Dave Chinner
2012-10-18 4:44 ` Zhi Yong Wu
2012-10-18 5:17 ` Dave Chinner
2012-10-18 5:24 ` Zhi Yong Wu
2012-10-19 8:29 ` Zhi Yong Wu
2012-10-16 0:04 ` [PATCH] xfs: add hot tracking support Dave Chinner
2012-11-07 8:38 ` Zhi Yong Wu
2012-11-08 5:13 ` Dave Chinner
2012-10-16 0:11 ` [RFC v3 00/13] vfs: hot data tracking Dave Chinner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1349863655-29320-6-git-send-email-zwu.kernel@gmail.com \
--to=zwu.kernel@gmail.com \
--cc=cmm@us.ibm.com \
--cc=dave@jikos.cz \
--cc=david@fromorbit.com \
--cc=linux-btrfs@vger.kernel.org \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxram@linux.vnet.ibm.com \
--cc=tytso@mit.edu \
--cc=viro@zeniv.linux.org.uk \
--cc=wuzhy@linux.vnet.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.