aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorLuden <luden@ghostmail.com>2016-02-13 23:54:06 +0100
committerZiyan <jaraidaniel@gmail.com>2016-05-01 23:35:56 +0200
commitc3f47a7451568ae3d3e33f75666fc37439794223 (patch)
tree3149c6015cd4157361a44d0fa863464d68d9be9d /fs
parentab26843c057773f42f5b46e4e4a519b39707253e (diff)
downloadkernel_samsung_tuna-c3f47a7451568ae3d3e33f75666fc37439794223.zip
kernel_samsung_tuna-c3f47a7451568ae3d3e33f75666fc37439794223.tar.gz
kernel_samsung_tuna-c3f47a7451568ae3d3e33f75666fc37439794223.tar.bz2
Extra CMA debugging code.
Added extra CMA debugging logging into FS, compaction, isolation and migration code. This makes it easier to see which parts of the kernel are responsible for the most migration failures.
Diffstat (limited to 'fs')
-rw-r--r--fs/block_dev.c18
-rw-r--r--fs/ext4/inode.c40
-rw-r--r--fs/fuse/file.c18
-rw-r--r--fs/inode.c18
-rw-r--r--fs/ramfs/file-mmu.c18
-rw-r--r--fs/sysfs/inode.c18
6 files changed, 130 insertions, 0 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c
index dba761b..e961d3f 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -26,6 +26,9 @@
#include <linux/log2.h>
#include <linux/kmemleak.h>
#include <asm/uaccess.h>
+#ifdef CONFIG_CMA_DEBUG_VERBOSE
+#include <linux/migrate.h>
+#endif
#include "internal.h"
struct bdev_inode {
@@ -1574,6 +1577,18 @@ static int blkdev_releasepage(struct page *page, gfp_t wait)
return try_to_free_buffers(page);
}
+#ifdef CONFIG_CMA_DEBUG_VERBOSE
+int blkdev_migrate_page(struct address_space *mapping,
+ struct page *newpage, struct page *page, enum migrate_mode mode)
+{
+ int rc = fallback_migrate_page(mapping, newpage, page, mode);
+ if (rc) {
+ pr_err("blkdev_migrate_page: fallback_migrate_page failed with error %d\n", rc);
+ }
+ return rc;
+}
+#endif
+
static const struct address_space_operations def_blk_aops = {
.readpage = blkdev_readpage,
.writepage = blkdev_writepage,
@@ -1582,6 +1597,9 @@ static const struct address_space_operations def_blk_aops = {
.writepages = generic_writepages,
.releasepage = blkdev_releasepage,
.direct_IO = blkdev_direct_IO,
+#ifdef CONFIG_CMA_DEBUG_VERBOSE
+ .migratepage = blkdev_migrate_page,
+#endif
};
const struct file_operations def_blk_fops = {
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 4c01932..f16a955 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -42,6 +42,9 @@
#include <linux/printk.h>
#include <linux/slab.h>
#include <linux/ratelimit.h>
+#ifdef CONFIG_CMA_DEBUG_VERBOSE
+#include <linux/migrate.h>
+#endif
#include "ext4_jbd2.h"
#include "xattr.h"
@@ -3868,6 +3871,28 @@ static int ext4_journalled_set_page_dirty(struct page *page)
return __set_page_dirty_nobuffers(page);
}
+#ifdef CONFIG_CMA_DEBUG_VERBOSE
+int ext4_journalled_migrate_page(struct address_space *mapping,
+ struct page *newpage, struct page *page, enum migrate_mode mode)
+{
+ int rc = fallback_migrate_page(mapping, newpage, page, mode);
+ if (rc) {
+ pr_err("ext4_journalled_migrate_page: fallback_migrate_page failed with error %d\n", rc);
+ }
+ return rc;
+}
+
+int ext4_migrate_page(struct address_space *mapping,
+ struct page *newpage, struct page *page, enum migrate_mode mode)
+{
+ int rc = buffer_migrate_page(mapping, newpage, page, mode);
+ if (rc) {
+ pr_err("ext4_migrate_page: buffer_migrate_page failed with error %d\n", rc);
+ }
+ return rc;
+}
+#endif
+
static const struct address_space_operations ext4_ordered_aops = {
.readpage = ext4_readpage,
.readpages = ext4_readpages,
@@ -3878,7 +3903,11 @@ static const struct address_space_operations ext4_ordered_aops = {
.invalidatepage = ext4_invalidatepage,
.releasepage = ext4_releasepage,
.direct_IO = ext4_direct_IO,
+#ifdef CONFIG_CMA_DEBUG_VERBOSE
+ .migratepage = ext4_migrate_page,
+#else
.migratepage = buffer_migrate_page,
+#endif
.is_partially_uptodate = block_is_partially_uptodate,
.error_remove_page = generic_error_remove_page,
};
@@ -3893,7 +3922,11 @@ static const struct address_space_operations ext4_writeback_aops = {
.invalidatepage = ext4_invalidatepage,
.releasepage = ext4_releasepage,
.direct_IO = ext4_direct_IO,
+#ifdef CONFIG_CMA_DEBUG_VERBOSE
+ .migratepage = ext4_migrate_page,
+#else
.migratepage = buffer_migrate_page,
+#endif
.is_partially_uptodate = block_is_partially_uptodate,
.error_remove_page = generic_error_remove_page,
};
@@ -3908,6 +3941,9 @@ static const struct address_space_operations ext4_journalled_aops = {
.bmap = ext4_bmap,
.invalidatepage = ext4_invalidatepage,
.releasepage = ext4_releasepage,
+#ifdef CONFIG_CMA_DEBUG_VERBOSE
+ .migratepage = ext4_journalled_migrate_page,
+#endif
.is_partially_uptodate = block_is_partially_uptodate,
.error_remove_page = generic_error_remove_page,
};
@@ -3923,7 +3959,11 @@ static const struct address_space_operations ext4_da_aops = {
.invalidatepage = ext4_da_invalidatepage,
.releasepage = ext4_releasepage,
.direct_IO = ext4_direct_IO,
+#ifdef CONFIG_CMA_DEBUG_VERBOSE
+ .migratepage = ext4_migrate_page,
+#else
.migratepage = buffer_migrate_page,
+#endif
.is_partially_uptodate = block_is_partially_uptodate,
.error_remove_page = generic_error_remove_page,
};
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index bcd6fd9..dc8dbe4 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -18,6 +18,9 @@
/* Needed for lru_cache_add_lru() */
#include <linux/swap.h>
#endif
+#ifdef CONFIG_CMA_DEBUG_VERBOSE
+#include <linux/migrate.h>
+#endif
static const struct file_operations fuse_direct_io_file_operations;
@@ -2227,6 +2230,18 @@ static const struct file_operations fuse_direct_io_file_operations = {
/* no splice_read */
};
+#ifdef CONFIG_CMA_DEBUG_VERBOSE
+int fuse_migrate_page(struct address_space *mapping,
+ struct page *newpage, struct page *page, enum migrate_mode mode)
+{
+ int rc = fallback_migrate_page(mapping, newpage, page, mode);
+ if (rc) {
+ pr_err("fuse_migrate_page: fallback_migrate_page failed with error %d\n", rc);
+ }
+ return rc;
+}
+#endif
+
static const struct address_space_operations fuse_file_aops = {
.readpage = fuse_readpage,
.writepage = fuse_writepage,
@@ -2236,6 +2251,9 @@ static const struct address_space_operations fuse_file_aops = {
.readpages = fuse_readpages,
.set_page_dirty = __set_page_dirty_nobuffers,
.bmap = fuse_bmap,
+#ifdef CONFIG_CMA_DEBUG_VERBOSE
+ .migratepage = fuse_migrate_page,
+#endif
};
void fuse_init_file_inode(struct inode *inode)
diff --git a/fs/inode.c b/fs/inode.c
index 8f021d0..325b890 100644
--- a/fs/inode.c
+++ b/fs/inode.c
@@ -26,6 +26,9 @@
#include <linux/ima.h>
#include <linux/cred.h>
#include <linux/buffer_head.h> /* for inode_has_buffers */
+#ifdef CONFIG_CMA_DEBUG_VERBOSE
+#include <linux/migrate.h>
+#endif
#include "internal.h"
/*
@@ -81,11 +84,26 @@ __cacheline_aligned_in_smp DEFINE_SPINLOCK(inode_wb_list_lock);
*/
static DECLARE_RWSEM(iprune_sem);
+#ifdef CONFIG_CMA_DEBUG_VERBOSE
+int empty_migrate_page(struct address_space *mapping,
+ struct page *newpage, struct page *page, enum migrate_mode mode)
+{
+ int rc = fallback_migrate_page(mapping, newpage, page, mode);
+ if (rc) {
+ pr_err("empty_migrate_page: fallback_migrate_page failed with error %d\n", rc);
+ }
+ return rc;
+}
+#endif
+
/*
* Empty aops. Can be used for the cases where the user does not
* define any of the address_space operations.
*/
const struct address_space_operations empty_aops = {
+#ifdef CONFIG_CMA_DEBUG_VERBOSE
+ .migratepage = empty_migrate_page,
+#endif
};
EXPORT_SYMBOL(empty_aops);
diff --git a/fs/ramfs/file-mmu.c b/fs/ramfs/file-mmu.c
index 4884ac5..95856d4 100644
--- a/fs/ramfs/file-mmu.c
+++ b/fs/ramfs/file-mmu.c
@@ -27,14 +27,32 @@
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/ramfs.h>
+#ifdef CONFIG_CMA_DEBUG_VERBOSE
+#include <linux/migrate.h>
+#endif
#include "internal.h"
+#ifdef CONFIG_CMA_DEBUG_VERBOSE
+int ramfs_migrate_page(struct address_space *mapping,
+ struct page *newpage, struct page *page, enum migrate_mode mode)
+{
+ int rc = fallback_migrate_page(mapping, newpage, page, mode);
+ if (rc) {
+ pr_err("ramfs_migrate_page: fallback_migrate_page failed with error %d\n", rc);
+ }
+ return rc;
+}
+#endif
+
const struct address_space_operations ramfs_aops = {
.readpage = simple_readpage,
.write_begin = simple_write_begin,
.write_end = simple_write_end,
.set_page_dirty = __set_page_dirty_no_writeback,
+#ifdef CONFIG_CMA_DEBUG_VERBOSE
+ .migratepage = ramfs_migrate_page,
+#endif
};
const struct file_operations ramfs_file_operations = {
diff --git a/fs/sysfs/inode.c b/fs/sysfs/inode.c
index a494413..09a3409 100644
--- a/fs/sysfs/inode.c
+++ b/fs/sysfs/inode.c
@@ -22,14 +22,32 @@
#include <linux/sysfs.h>
#include <linux/xattr.h>
#include <linux/security.h>
+#ifdef CONFIG_CMA_DEBUG_VERBOSE
+#include <linux/migrate.h>
+#endif
#include "sysfs.h"
extern struct super_block * sysfs_sb;
+#ifdef CONFIG_CMA_DEBUG_VERBOSE
+int sysfs_migrate_page(struct address_space *mapping,
+ struct page *newpage, struct page *page, enum migrate_mode mode)
+{
+ int rc = fallback_migrate_page(mapping, newpage, page, mode);
+ if (rc) {
+ pr_err("sysfs_migrate_page: fallback_migrate_page failed with error %d\n", rc);
+ }
+ return rc;
+}
+#endif
+
static const struct address_space_operations sysfs_aops = {
.readpage = simple_readpage,
.write_begin = simple_write_begin,
.write_end = simple_write_end,
+#ifdef CONFIG_CMA_DEBUG_VERBOSE
+ .migratepage = sysfs_migrate_page,
+#endif
};
static struct backing_dev_info sysfs_backing_dev_info = {