Thread (21 messages) 21 messages, 3 authors, 2011-11-18

Re: [PATCH v2 2/8] ext4: Add new data structures and related functions to count io types

From: Zheng Liu <hidden>
Date: 2011-11-11 15:45:55
Also in: linux-fsdevel

On Fri, Nov 11, 2011 at 10:58:11AM +0000, Steven Whitehouse wrote:
Hi,

On Thu, 2011-11-10 at 18:34 +0800, Zheng Liu wrote:
quoted
From: Zheng Liu <redacted>

A per-cpu counter is defined to store io types in ext4. We define 10 io types
in ext4, which includes 9 metadata types and 1 data type. Read and write
operations are counted separately. When checks 'Issue' flag, filesystem needs
to lock buffer.

Signed-off-by: Zheng Liu <redacted>
Signed-off-by: Wang Shaoyan <redacted>
---
 fs/ext4/ext4.h  |   53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 fs/ext4/super.c |   19 +++++++++++++++++++
 2 files changed, 72 insertions(+), 0 deletions(-)
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index 5b0e26a..39a1495 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -1108,6 +1108,23 @@ struct ext4_super_block {
 #define EXT4_MF_FS_ABORTED	0x0002	/* Fatal error detected */
 
 /*
+ * ext4 io types
+ */
+enum {
+	EXT4_IOS_SUPER_BLOCK = 0,
+	EXT4_IOS_GROUP_DESC,
+	EXT4_IOS_INODE_BITMAP,
+	EXT4_IOS_BLOCK_BITMAP,
+	EXT4_IOS_INODE_TABLE,
+	EXT4_IOS_EXTENT_BLOCK,
+	EXT4_IOS_INDIRECT_BLOCK,
+	EXT4_IOS_DIR_ENTRY,
+	EXT4_IOS_EXTENDED_ATTR,
+	EXT4_IOS_REGULAR_DATA,
+	EXT4_IOS_TYPE_END,
+};
+
+/*
  * fourth extended-fs super-block data in memory
  */
 struct ext4_sb_info {
@@ -1284,6 +1301,11 @@ static inline void ext4_set_io_unwritten_flag(struct inode *inode,
 	}
 }
 
+static inline unsigned ext4_blocks_per_page(struct inode *inode)
+{
+	return PAGE_CACHE_SIZE >> inode->i_blkbits;
+}
+
 /*
  * Inode dynamic state flags
  */
@@ -1926,6 +1948,37 @@ extern int ext4_group_extend(struct super_block *sb,
 				ext4_fsblk_t n_blocks_count);
 
 /* super.c */
+extern void __ext4_io_stat(int, int, unsigned long);
+#define ext4_ios_read(bh, type, count)					\
+	do {								\
+		if (!bh)						\
+			break;						\
+		lock_buffer(bh);					\
+		if (buffer_issue(bh)) {					\
+			clear_buffer_issue(bh);				\
+			__ext4_io_stat(READ, type, count);		\
+		}							\
+		unlock_buffer(bh);					\
+	} while (0)
Why not just test_and_clear_bit(BH_Issue) ? I don't follow why the
buffer needs to be locked and unlocked,
test_and_clear_bit(BH_Issue) is better. Calling lock/unlock_buffer() is
to ensure 'Issue' flag can be set or cleared atomically. It is
unnecessary after using test_and_clear_bit(BH_Issue).

Regards,
Zheng
Steve.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help