[hack] dump inode for drop_caches
This is dirty hack. Please don't hate me.
Signed-off-by: Minchan Kim <minchan@kernel.org>
diff --git a/fs/drop_caches.c b/fs/drop_caches.c
index c00e055..4e15fe5 100644
--- a/fs/drop_caches.c
+++ b/fs/drop_caches.c
@@ -13,12 +13,39 @@
/* A global variable is a bit ugly, but it keeps the code simple */
int sysctl_drop_caches;
+void dump_reclaimed_pages(struct inode *inode, unsigned long nr_pages,
+ unsigned long nr_extra)
+{
+ struct dentry *dentry;
+ int len = 8;
+ char *name_buf, *name = "unknown";
+
+ name_buf = (char *)__get_free_page(GFP_TEMPORARY);
+
+ dentry = d_find_alias(inode);
+ if (dentry)
+ name = dentry_path_raw(dentry, name_buf, PAGE_SIZE);
+
+ if (!IS_ERR(name))
+ len = PAGE_SIZE + name_buf - name;
+
+ printk("%s reclaim_pages %lu extra_pages %lu\n", name ,
+ nr_pages, nr_extra);
+
+ if (dentry)
+ dput(dentry);
+
+ free_page((unsigned long)name_buf);
+}
+
static void drop_pagecache_sb(struct super_block *sb, void *unused)
{
struct inode *inode, *toput_inode = NULL;
-
spin_lock(&inode_sb_list_lock);
list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
+ unsigned long nr_reclaimed;
+ unsigned long before, after;
+
spin_lock(&inode->i_lock);
if ((inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) ||
(inode->i_mapping->nrpages == 0)) {
@@ -28,7 +55,11 @@
__iget(inode);
spin_unlock(&inode->i_lock);
spin_unlock(&inode_sb_list_lock);
- invalidate_mapping_pages(inode->i_mapping, 0, -1);
+ before = global_page_state(NR_FREE_PAGES);
+ nr_reclaimed =
+ invalidate_mapping_pages(inode->i_mapping, 0, -1);
+ after = global_page_state(NR_FREE_PAGES);
+ dump_reclaimed_pages(inode, nr_reclaimed, after - before);
iput(toput_inode);
toput_inode = inode;
spin_lock(&inode_sb_list_lock);