All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC PATCH 1/3] f2fs: introduce sysfs readdir_ra to readahead inode block in readdir
@ 2017-11-22 10:23 Sheng Yong
  2017-11-22 10:23 ` [PATCH 2/3] f2fs: still write data if preallocate only partial blocks Sheng Yong
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Sheng Yong @ 2017-11-22 10:23 UTC (permalink / raw)
  To: jaegeuk, yuchao0, chao; +Cc: shengyong1, linux-f2fs-devel

This patch introduces a sysfs interface readdir_ra to enable/disable
readaheading inode block in f2fs_readdir. When readdir_ra is enabled,
it improves the performance of "readdir + stat".

For 300,000 files:
	time find /data/test > /dev/null
disable readdir_ra: 1m25.69s real  0m01.94s user  0m50.80s system
enable  readdir_ra: 0m18.55s real  0m00.44s user  0m15.39s system

Signed-off-by: Sheng Yong <shengyong1@huawei.com>
---
 Documentation/ABI/testing/sysfs-fs-f2fs | 6 ++++++
 fs/f2fs/dir.c                           | 4 ++++
 fs/f2fs/f2fs.h                          | 1 +
 fs/f2fs/sysfs.c                         | 2 ++
 4 files changed, 13 insertions(+)

diff --git a/Documentation/ABI/testing/sysfs-fs-f2fs b/Documentation/ABI/testing/sysfs-fs-f2fs
index a7799c2fca28..d870b5514d15 100644
--- a/Documentation/ABI/testing/sysfs-fs-f2fs
+++ b/Documentation/ABI/testing/sysfs-fs-f2fs
@@ -186,3 +186,9 @@ Date:		August 2017
 Contact:	"Jaegeuk Kim" <jaegeuk@kernel.org>
 Description:
 		 Controls sleep time of GC urgent mode
+
+What:		/sys/fs/f2fs/<disk>/readdir_ra
+Date:		November 2017
+Contact:	"Sheng Yong" <shengyong1@huawei.com>
+Description:
+		 Controls readahead inode block in readdir.
diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c
index 2d98d877c09d..724304dc6143 100644
--- a/fs/f2fs/dir.c
+++ b/fs/f2fs/dir.c
@@ -798,6 +798,7 @@ int f2fs_fill_dentries(struct dir_context *ctx, struct f2fs_dentry_ptr *d,
 	unsigned int bit_pos;
 	struct f2fs_dir_entry *de = NULL;
 	struct fscrypt_str de_name = FSTR_INIT(NULL, 0);
+	struct f2fs_sb_info *sbi = F2FS_I_SB(d->inode);
 
 	bit_pos = ((unsigned long)ctx->pos % d->max);
 
@@ -836,6 +837,9 @@ int f2fs_fill_dentries(struct dir_context *ctx, struct f2fs_dentry_ptr *d,
 					le32_to_cpu(de->ino), d_type))
 			return 1;
 
+		if (sbi->readdir_ra == 1)
+			ra_node_page(sbi, le32_to_cpu(de->ino));
+
 		bit_pos += GET_DENTRY_SLOTS(le16_to_cpu(de->name_len));
 		ctx->pos = start_pos + bit_pos;
 	}
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index ca6b0c9bc621..a269d795ba7c 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -1095,6 +1095,7 @@ struct f2fs_sb_info {
 	int dir_level;				/* directory level */
 	int inline_xattr_size;			/* inline xattr size */
 	unsigned int trigger_ssr_threshold;	/* threshold to trigger ssr */
+	int readdir_ra;				/* readahead inode in readdir */
 
 	block_t user_block_count;		/* # of user blocks */
 	block_t total_valid_block_count;	/* # of valid blocks */
diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c
index 9835348b6e5d..93c3364250dd 100644
--- a/fs/f2fs/sysfs.c
+++ b/fs/f2fs/sysfs.c
@@ -299,6 +299,7 @@ F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, dir_level, dir_level);
 F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, cp_interval, interval_time[CP_TIME]);
 F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, idle_interval, interval_time[REQ_TIME]);
 F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, iostat_enable, iostat_enable);
+F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, readdir_ra, readdir_ra);
 #ifdef CONFIG_F2FS_FAULT_INJECTION
 F2FS_RW_ATTR(FAULT_INFO_RATE, f2fs_fault_info, inject_rate, inject_rate);
 F2FS_RW_ATTR(FAULT_INFO_TYPE, f2fs_fault_info, inject_type, inject_type);
@@ -346,6 +347,7 @@ static struct attribute *f2fs_attrs[] = {
 	ATTR_LIST(cp_interval),
 	ATTR_LIST(idle_interval),
 	ATTR_LIST(iostat_enable),
+	ATTR_LIST(readdir_ra),
 #ifdef CONFIG_F2FS_FAULT_INJECTION
 	ATTR_LIST(inject_rate),
 	ATTR_LIST(inject_type),
-- 
2.11.0


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/3] f2fs: still write data if preallocate only partial blocks
  2017-11-22 10:23 [RFC PATCH 1/3] f2fs: introduce sysfs readdir_ra to readahead inode block in readdir Sheng Yong
@ 2017-11-22 10:23 ` Sheng Yong
  2017-11-23 13:17   ` Chao Yu
  2017-11-22 10:23 ` [PATCH 3/3] f2fs: remove unused parameter Sheng Yong
  2017-11-23 13:11 ` [RFC PATCH 1/3] f2fs: introduce sysfs readdir_ra to readahead inode block in readdir Chao Yu
  2 siblings, 1 reply; 8+ messages in thread
From: Sheng Yong @ 2017-11-22 10:23 UTC (permalink / raw)
  To: jaegeuk, yuchao0, chao; +Cc: shengyong1, linux-f2fs-devel

If there is not enough space left, f2fs_preallocate_blocks may only
preallocte partial blocks. As a result, the write operation fails
but i_blocks is not 0.  To avoid this, f2fs should write data in
non-preallocation way and write as many data as the size of i_blocks.

Signed-off-by: Sheng Yong <shengyong1@huawei.com>
---
 fs/f2fs/data.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index b0781edc9ada..e593df628158 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -862,8 +862,14 @@ int f2fs_preallocate_blocks(struct kiocb *iocb, struct iov_iter *from)
 		if (err)
 			return err;
 	}
-	if (!f2fs_has_inline_data(inode))
-		return f2fs_map_blocks(inode, &map, 1, F2FS_GET_BLOCK_PRE_AIO);
+	if (!f2fs_has_inline_data(inode)) {
+		err = f2fs_map_blocks(inode, &map, 1, F2FS_GET_BLOCK_PRE_AIO);
+		if (map.m_len > 0 && err == -ENOSPC) {
+			set_inode_flag(inode, FI_NO_PREALLOC);
+			err = 0;
+		}
+		return err;
+	}
 	return err;
 }
 
-- 
2.11.0


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 3/3] f2fs: remove unused parameter
  2017-11-22 10:23 [RFC PATCH 1/3] f2fs: introduce sysfs readdir_ra to readahead inode block in readdir Sheng Yong
  2017-11-22 10:23 ` [PATCH 2/3] f2fs: still write data if preallocate only partial blocks Sheng Yong
@ 2017-11-22 10:23 ` Sheng Yong
  2017-11-23 13:17   ` Chao Yu
  2017-11-23 13:11 ` [RFC PATCH 1/3] f2fs: introduce sysfs readdir_ra to readahead inode block in readdir Chao Yu
  2 siblings, 1 reply; 8+ messages in thread
From: Sheng Yong @ 2017-11-22 10:23 UTC (permalink / raw)
  To: jaegeuk, yuchao0, chao; +Cc: shengyong1, linux-f2fs-devel

Commit d260081ccf37 ("f2fs: change recovery policy of xattr node block")
removes the use of blkaddr, which is no longer used. So remove the
parameter.

Signed-off-by: Sheng Yong <shengyong1@huawei.com>
---
 fs/f2fs/f2fs.h     | 3 +--
 fs/f2fs/node.c     | 2 +-
 fs/f2fs/recovery.c | 6 +++---
 3 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index a269d795ba7c..bab4c2287090 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -2607,8 +2607,7 @@ void alloc_nid_done(struct f2fs_sb_info *sbi, nid_t nid);
 void alloc_nid_failed(struct f2fs_sb_info *sbi, nid_t nid);
 int try_to_free_nids(struct f2fs_sb_info *sbi, int nr_shrink);
 void recover_inline_xattr(struct inode *inode, struct page *page);
-int recover_xattr_data(struct inode *inode, struct page *page,
-			block_t blkaddr);
+int recover_xattr_data(struct inode *inode, struct page *page);
 int recover_inode_page(struct f2fs_sb_info *sbi, struct page *page);
 int restore_node_summary(struct f2fs_sb_info *sbi,
 			unsigned int segno, struct f2fs_summary_block *sum);
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c
index fe1fc662af2a..ebb0d1797431 100644
--- a/fs/f2fs/node.c
+++ b/fs/f2fs/node.c
@@ -2238,7 +2238,7 @@ void recover_inline_xattr(struct inode *inode, struct page *page)
 	f2fs_put_page(ipage, 1);
 }
 
-int recover_xattr_data(struct inode *inode, struct page *page, block_t blkaddr)
+int recover_xattr_data(struct inode *inode, struct page *page)
 {
 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
 	nid_t prev_xnid = F2FS_I(inode)->i_xattr_nid;
diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c
index 92c57ace1939..7d63faf51e52 100644
--- a/fs/f2fs/recovery.c
+++ b/fs/f2fs/recovery.c
@@ -404,7 +404,7 @@ static int check_index_in_prev_nodes(struct f2fs_sb_info *sbi,
 }
 
 static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode,
-					struct page *page, block_t blkaddr)
+					struct page *page)
 {
 	struct dnode_of_data dn;
 	struct node_info ni;
@@ -415,7 +415,7 @@ static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode,
 	if (IS_INODE(page)) {
 		recover_inline_xattr(inode, page);
 	} else if (f2fs_has_xattr_block(ofs_of_node(page))) {
-		err = recover_xattr_data(inode, page, blkaddr);
+		err = recover_xattr_data(inode, page);
 		if (!err)
 			recovered++;
 		goto out;
@@ -568,7 +568,7 @@ static int recover_data(struct f2fs_sb_info *sbi, struct list_head *inode_list,
 				break;
 			}
 		}
-		err = do_recover_data(sbi, entry->inode, page, blkaddr);
+		err = do_recover_data(sbi, entry->inode, page);
 		if (err) {
 			f2fs_put_page(page, 1);
 			break;
-- 
2.11.0


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [RFC PATCH 1/3] f2fs: introduce sysfs readdir_ra to readahead inode block in readdir
  2017-11-22 10:23 [RFC PATCH 1/3] f2fs: introduce sysfs readdir_ra to readahead inode block in readdir Sheng Yong
  2017-11-22 10:23 ` [PATCH 2/3] f2fs: still write data if preallocate only partial blocks Sheng Yong
  2017-11-22 10:23 ` [PATCH 3/3] f2fs: remove unused parameter Sheng Yong
@ 2017-11-23 13:11 ` Chao Yu
  2017-12-30 20:37   ` Ju Hyung Park
  2 siblings, 1 reply; 8+ messages in thread
From: Chao Yu @ 2017-11-23 13:11 UTC (permalink / raw)
  To: Sheng Yong, jaegeuk, yuchao0; +Cc: linux-f2fs-devel

On 2017/11/22 18:23, Sheng Yong wrote:
> This patch introduces a sysfs interface readdir_ra to enable/disable
> readaheading inode block in f2fs_readdir. When readdir_ra is enabled,
> it improves the performance of "readdir + stat".
> 
> For 300,000 files:
> 	time find /data/test > /dev/null
> disable readdir_ra: 1m25.69s real  0m01.94s user  0m50.80s system
> enable  readdir_ra: 0m18.55s real  0m00.44s user  0m15.39s system
> 
> Signed-off-by: Sheng Yong <shengyong1@huawei.com>

Reviewed-by: Chao Yu <yuchao0@huawei.com>

Thanks,

> ---
>  Documentation/ABI/testing/sysfs-fs-f2fs | 6 ++++++
>  fs/f2fs/dir.c                           | 4 ++++
>  fs/f2fs/f2fs.h                          | 1 +
>  fs/f2fs/sysfs.c                         | 2 ++
>  4 files changed, 13 insertions(+)
> 
> diff --git a/Documentation/ABI/testing/sysfs-fs-f2fs b/Documentation/ABI/testing/sysfs-fs-f2fs
> index a7799c2fca28..d870b5514d15 100644
> --- a/Documentation/ABI/testing/sysfs-fs-f2fs
> +++ b/Documentation/ABI/testing/sysfs-fs-f2fs
> @@ -186,3 +186,9 @@ Date:		August 2017
>  Contact:	"Jaegeuk Kim" <jaegeuk@kernel.org>
>  Description:
>  		 Controls sleep time of GC urgent mode
> +
> +What:		/sys/fs/f2fs/<disk>/readdir_ra
> +Date:		November 2017
> +Contact:	"Sheng Yong" <shengyong1@huawei.com>
> +Description:
> +		 Controls readahead inode block in readdir.
> diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c
> index 2d98d877c09d..724304dc6143 100644
> --- a/fs/f2fs/dir.c
> +++ b/fs/f2fs/dir.c
> @@ -798,6 +798,7 @@ int f2fs_fill_dentries(struct dir_context *ctx, struct f2fs_dentry_ptr *d,
>  	unsigned int bit_pos;
>  	struct f2fs_dir_entry *de = NULL;
>  	struct fscrypt_str de_name = FSTR_INIT(NULL, 0);
> +	struct f2fs_sb_info *sbi = F2FS_I_SB(d->inode);
>  
>  	bit_pos = ((unsigned long)ctx->pos % d->max);
>  
> @@ -836,6 +837,9 @@ int f2fs_fill_dentries(struct dir_context *ctx, struct f2fs_dentry_ptr *d,
>  					le32_to_cpu(de->ino), d_type))
>  			return 1;
>  
> +		if (sbi->readdir_ra == 1)
> +			ra_node_page(sbi, le32_to_cpu(de->ino));
> +
>  		bit_pos += GET_DENTRY_SLOTS(le16_to_cpu(de->name_len));
>  		ctx->pos = start_pos + bit_pos;
>  	}
> diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
> index ca6b0c9bc621..a269d795ba7c 100644
> --- a/fs/f2fs/f2fs.h
> +++ b/fs/f2fs/f2fs.h
> @@ -1095,6 +1095,7 @@ struct f2fs_sb_info {
>  	int dir_level;				/* directory level */
>  	int inline_xattr_size;			/* inline xattr size */
>  	unsigned int trigger_ssr_threshold;	/* threshold to trigger ssr */
> +	int readdir_ra;				/* readahead inode in readdir */
>  
>  	block_t user_block_count;		/* # of user blocks */
>  	block_t total_valid_block_count;	/* # of valid blocks */
> diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c
> index 9835348b6e5d..93c3364250dd 100644
> --- a/fs/f2fs/sysfs.c
> +++ b/fs/f2fs/sysfs.c
> @@ -299,6 +299,7 @@ F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, dir_level, dir_level);
>  F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, cp_interval, interval_time[CP_TIME]);
>  F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, idle_interval, interval_time[REQ_TIME]);
>  F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, iostat_enable, iostat_enable);
> +F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, readdir_ra, readdir_ra);
>  #ifdef CONFIG_F2FS_FAULT_INJECTION
>  F2FS_RW_ATTR(FAULT_INFO_RATE, f2fs_fault_info, inject_rate, inject_rate);
>  F2FS_RW_ATTR(FAULT_INFO_TYPE, f2fs_fault_info, inject_type, inject_type);
> @@ -346,6 +347,7 @@ static struct attribute *f2fs_attrs[] = {
>  	ATTR_LIST(cp_interval),
>  	ATTR_LIST(idle_interval),
>  	ATTR_LIST(iostat_enable),
> +	ATTR_LIST(readdir_ra),
>  #ifdef CONFIG_F2FS_FAULT_INJECTION
>  	ATTR_LIST(inject_rate),
>  	ATTR_LIST(inject_type),
> 

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/3] f2fs: still write data if preallocate only partial blocks
  2017-11-22 10:23 ` [PATCH 2/3] f2fs: still write data if preallocate only partial blocks Sheng Yong
@ 2017-11-23 13:17   ` Chao Yu
  0 siblings, 0 replies; 8+ messages in thread
From: Chao Yu @ 2017-11-23 13:17 UTC (permalink / raw)
  To: Sheng Yong, jaegeuk, yuchao0; +Cc: linux-f2fs-devel

On 2017/11/22 18:23, Sheng Yong wrote:
> If there is not enough space left, f2fs_preallocate_blocks may only
> preallocte partial blocks. As a result, the write operation fails
> but i_blocks is not 0.  To avoid this, f2fs should write data in
> non-preallocation way and write as many data as the size of i_blocks.
> 
> Signed-off-by: Sheng Yong <shengyong1@huawei.com>

Reviewed-by: Chao Yu <yuchao0@huawei.com>

Thanks,

> ---
>  fs/f2fs/data.c | 10 ++++++++--
>  1 file changed, 8 insertions(+), 2 deletions(-)
> 
> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
> index b0781edc9ada..e593df628158 100644
> --- a/fs/f2fs/data.c
> +++ b/fs/f2fs/data.c
> @@ -862,8 +862,14 @@ int f2fs_preallocate_blocks(struct kiocb *iocb, struct iov_iter *from)
>  		if (err)
>  			return err;
>  	}
> -	if (!f2fs_has_inline_data(inode))
> -		return f2fs_map_blocks(inode, &map, 1, F2FS_GET_BLOCK_PRE_AIO);
> +	if (!f2fs_has_inline_data(inode)) {
> +		err = f2fs_map_blocks(inode, &map, 1, F2FS_GET_BLOCK_PRE_AIO);
> +		if (map.m_len > 0 && err == -ENOSPC) {
> +			set_inode_flag(inode, FI_NO_PREALLOC);
> +			err = 0;
> +		}
> +		return err;
> +	}
>  	return err;
>  }
>  
> 

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 3/3] f2fs: remove unused parameter
  2017-11-22 10:23 ` [PATCH 3/3] f2fs: remove unused parameter Sheng Yong
@ 2017-11-23 13:17   ` Chao Yu
  0 siblings, 0 replies; 8+ messages in thread
From: Chao Yu @ 2017-11-23 13:17 UTC (permalink / raw)
  To: Sheng Yong, jaegeuk, yuchao0; +Cc: linux-f2fs-devel

On 2017/11/22 18:23, Sheng Yong wrote:
> Commit d260081ccf37 ("f2fs: change recovery policy of xattr node block")
> removes the use of blkaddr, which is no longer used. So remove the
> parameter.
> 
> Signed-off-by: Sheng Yong <shengyong1@huawei.com>

Reviewed-by: Chao Yu <yuchao0@huawei.com>

Thanks,

> ---
>  fs/f2fs/f2fs.h     | 3 +--
>  fs/f2fs/node.c     | 2 +-
>  fs/f2fs/recovery.c | 6 +++---
>  3 files changed, 5 insertions(+), 6 deletions(-)
> 
> diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
> index a269d795ba7c..bab4c2287090 100644
> --- a/fs/f2fs/f2fs.h
> +++ b/fs/f2fs/f2fs.h
> @@ -2607,8 +2607,7 @@ void alloc_nid_done(struct f2fs_sb_info *sbi, nid_t nid);
>  void alloc_nid_failed(struct f2fs_sb_info *sbi, nid_t nid);
>  int try_to_free_nids(struct f2fs_sb_info *sbi, int nr_shrink);
>  void recover_inline_xattr(struct inode *inode, struct page *page);
> -int recover_xattr_data(struct inode *inode, struct page *page,
> -			block_t blkaddr);
> +int recover_xattr_data(struct inode *inode, struct page *page);
>  int recover_inode_page(struct f2fs_sb_info *sbi, struct page *page);
>  int restore_node_summary(struct f2fs_sb_info *sbi,
>  			unsigned int segno, struct f2fs_summary_block *sum);
> diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c
> index fe1fc662af2a..ebb0d1797431 100644
> --- a/fs/f2fs/node.c
> +++ b/fs/f2fs/node.c
> @@ -2238,7 +2238,7 @@ void recover_inline_xattr(struct inode *inode, struct page *page)
>  	f2fs_put_page(ipage, 1);
>  }
>  
> -int recover_xattr_data(struct inode *inode, struct page *page, block_t blkaddr)
> +int recover_xattr_data(struct inode *inode, struct page *page)
>  {
>  	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
>  	nid_t prev_xnid = F2FS_I(inode)->i_xattr_nid;
> diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c
> index 92c57ace1939..7d63faf51e52 100644
> --- a/fs/f2fs/recovery.c
> +++ b/fs/f2fs/recovery.c
> @@ -404,7 +404,7 @@ static int check_index_in_prev_nodes(struct f2fs_sb_info *sbi,
>  }
>  
>  static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode,
> -					struct page *page, block_t blkaddr)
> +					struct page *page)
>  {
>  	struct dnode_of_data dn;
>  	struct node_info ni;
> @@ -415,7 +415,7 @@ static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode,
>  	if (IS_INODE(page)) {
>  		recover_inline_xattr(inode, page);
>  	} else if (f2fs_has_xattr_block(ofs_of_node(page))) {
> -		err = recover_xattr_data(inode, page, blkaddr);
> +		err = recover_xattr_data(inode, page);
>  		if (!err)
>  			recovered++;
>  		goto out;
> @@ -568,7 +568,7 @@ static int recover_data(struct f2fs_sb_info *sbi, struct list_head *inode_list,
>  				break;
>  			}
>  		}
> -		err = do_recover_data(sbi, entry->inode, page, blkaddr);
> +		err = do_recover_data(sbi, entry->inode, page);
>  		if (err) {
>  			f2fs_put_page(page, 1);
>  			break;
> 

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC PATCH 1/3] f2fs: introduce sysfs readdir_ra to readahead inode block in readdir
  2017-11-23 13:11 ` [RFC PATCH 1/3] f2fs: introduce sysfs readdir_ra to readahead inode block in readdir Chao Yu
@ 2017-12-30 20:37   ` Ju Hyung Park
  2018-01-02  1:45     ` Sheng Yong
  0 siblings, 1 reply; 8+ messages in thread
From: Ju Hyung Park @ 2017-12-30 20:37 UTC (permalink / raw)
  To: Chao Yu; +Cc: jaegeuk, Sheng Yong, linux-f2fs-devel

May I ask why is this disabled by default?

On Thu, Nov 23, 2017 at 10:11 PM, Chao Yu <chao@kernel.org> wrote:
> On 2017/11/22 18:23, Sheng Yong wrote:
>> This patch introduces a sysfs interface readdir_ra to enable/disable
>> readaheading inode block in f2fs_readdir. When readdir_ra is enabled,
>> it improves the performance of "readdir + stat".
>>
>> For 300,000 files:
>>       time find /data/test > /dev/null
>> disable readdir_ra: 1m25.69s real  0m01.94s user  0m50.80s system
>> enable  readdir_ra: 0m18.55s real  0m00.44s user  0m15.39s system
>>
>> Signed-off-by: Sheng Yong <shengyong1@huawei.com>
>
> Reviewed-by: Chao Yu <yuchao0@huawei.com>
>
> Thanks,
>
>> ---
>>  Documentation/ABI/testing/sysfs-fs-f2fs | 6 ++++++
>>  fs/f2fs/dir.c                           | 4 ++++
>>  fs/f2fs/f2fs.h                          | 1 +
>>  fs/f2fs/sysfs.c                         | 2 ++
>>  4 files changed, 13 insertions(+)
>>
>> diff --git a/Documentation/ABI/testing/sysfs-fs-f2fs b/Documentation/ABI/testing/sysfs-fs-f2fs
>> index a7799c2fca28..d870b5514d15 100644
>> --- a/Documentation/ABI/testing/sysfs-fs-f2fs
>> +++ b/Documentation/ABI/testing/sysfs-fs-f2fs
>> @@ -186,3 +186,9 @@ Date:             August 2017
>>  Contact:     "Jaegeuk Kim" <jaegeuk@kernel.org>
>>  Description:
>>                Controls sleep time of GC urgent mode
>> +
>> +What:                /sys/fs/f2fs/<disk>/readdir_ra
>> +Date:                November 2017
>> +Contact:     "Sheng Yong" <shengyong1@huawei.com>
>> +Description:
>> +              Controls readahead inode block in readdir.
>> diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c
>> index 2d98d877c09d..724304dc6143 100644
>> --- a/fs/f2fs/dir.c
>> +++ b/fs/f2fs/dir.c
>> @@ -798,6 +798,7 @@ int f2fs_fill_dentries(struct dir_context *ctx, struct f2fs_dentry_ptr *d,
>>       unsigned int bit_pos;
>>       struct f2fs_dir_entry *de = NULL;
>>       struct fscrypt_str de_name = FSTR_INIT(NULL, 0);
>> +     struct f2fs_sb_info *sbi = F2FS_I_SB(d->inode);
>>
>>       bit_pos = ((unsigned long)ctx->pos % d->max);
>>
>> @@ -836,6 +837,9 @@ int f2fs_fill_dentries(struct dir_context *ctx, struct f2fs_dentry_ptr *d,
>>                                       le32_to_cpu(de->ino), d_type))
>>                       return 1;
>>
>> +             if (sbi->readdir_ra == 1)
>> +                     ra_node_page(sbi, le32_to_cpu(de->ino));
>> +
>>               bit_pos += GET_DENTRY_SLOTS(le16_to_cpu(de->name_len));
>>               ctx->pos = start_pos + bit_pos;
>>       }
>> diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
>> index ca6b0c9bc621..a269d795ba7c 100644
>> --- a/fs/f2fs/f2fs.h
>> +++ b/fs/f2fs/f2fs.h
>> @@ -1095,6 +1095,7 @@ struct f2fs_sb_info {
>>       int dir_level;                          /* directory level */
>>       int inline_xattr_size;                  /* inline xattr size */
>>       unsigned int trigger_ssr_threshold;     /* threshold to trigger ssr */
>> +     int readdir_ra;                         /* readahead inode in readdir */
>>
>>       block_t user_block_count;               /* # of user blocks */
>>       block_t total_valid_block_count;        /* # of valid blocks */
>> diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c
>> index 9835348b6e5d..93c3364250dd 100644
>> --- a/fs/f2fs/sysfs.c
>> +++ b/fs/f2fs/sysfs.c
>> @@ -299,6 +299,7 @@ F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, dir_level, dir_level);
>>  F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, cp_interval, interval_time[CP_TIME]);
>>  F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, idle_interval, interval_time[REQ_TIME]);
>>  F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, iostat_enable, iostat_enable);
>> +F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, readdir_ra, readdir_ra);
>>  #ifdef CONFIG_F2FS_FAULT_INJECTION
>>  F2FS_RW_ATTR(FAULT_INFO_RATE, f2fs_fault_info, inject_rate, inject_rate);
>>  F2FS_RW_ATTR(FAULT_INFO_TYPE, f2fs_fault_info, inject_type, inject_type);
>> @@ -346,6 +347,7 @@ static struct attribute *f2fs_attrs[] = {
>>       ATTR_LIST(cp_interval),
>>       ATTR_LIST(idle_interval),
>>       ATTR_LIST(iostat_enable),
>> +     ATTR_LIST(readdir_ra),
>>  #ifdef CONFIG_F2FS_FAULT_INJECTION
>>       ATTR_LIST(inject_rate),
>>       ATTR_LIST(inject_type),
>>
>
> ------------------------------------------------------------------------------
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> _______________________________________________
> Linux-f2fs-devel mailing list
> Linux-f2fs-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC PATCH 1/3] f2fs: introduce sysfs readdir_ra to readahead inode block in readdir
  2017-12-30 20:37   ` Ju Hyung Park
@ 2018-01-02  1:45     ` Sheng Yong
  0 siblings, 0 replies; 8+ messages in thread
From: Sheng Yong @ 2018-01-02  1:45 UTC (permalink / raw)
  To: Ju Hyung Park, Chao Yu; +Cc: jaegeuk, linux-f2fs-devel

Hi, Ju Hyung

On 2017/12/31 4:37, Ju Hyung Park wrote:
> May I ask why is this disabled by default?
Since the readahead only improves "readdir + stat" scenario, and it will cause
overhead if we only call a readdir, we don't know how user lookup files. So I
think it's better to provide an option for user to decide if the readahead is
needed.

thanks,
Sheng
> 
> On Thu, Nov 23, 2017 at 10:11 PM, Chao Yu <chao@kernel.org> wrote:
>> On 2017/11/22 18:23, Sheng Yong wrote:
>>> This patch introduces a sysfs interface readdir_ra to enable/disable
>>> readaheading inode block in f2fs_readdir. When readdir_ra is enabled,
>>> it improves the performance of "readdir + stat".
>>>
>>> For 300,000 files:
>>>        time find /data/test > /dev/null
>>> disable readdir_ra: 1m25.69s real  0m01.94s user  0m50.80s system
>>> enable  readdir_ra: 0m18.55s real  0m00.44s user  0m15.39s system
>>>
>>> Signed-off-by: Sheng Yong <shengyong1@huawei.com>
>>
>> Reviewed-by: Chao Yu <yuchao0@huawei.com>
>>
>> Thanks,
>>
>>> ---
>>>   Documentation/ABI/testing/sysfs-fs-f2fs | 6 ++++++
>>>   fs/f2fs/dir.c                           | 4 ++++
>>>   fs/f2fs/f2fs.h                          | 1 +
>>>   fs/f2fs/sysfs.c                         | 2 ++
>>>   4 files changed, 13 insertions(+)
>>>
>>> diff --git a/Documentation/ABI/testing/sysfs-fs-f2fs b/Documentation/ABI/testing/sysfs-fs-f2fs
>>> index a7799c2fca28..d870b5514d15 100644
>>> --- a/Documentation/ABI/testing/sysfs-fs-f2fs
>>> +++ b/Documentation/ABI/testing/sysfs-fs-f2fs
>>> @@ -186,3 +186,9 @@ Date:             August 2017
>>>   Contact:     "Jaegeuk Kim" <jaegeuk@kernel.org>
>>>   Description:
>>>                 Controls sleep time of GC urgent mode
>>> +
>>> +What:                /sys/fs/f2fs/<disk>/readdir_ra
>>> +Date:                November 2017
>>> +Contact:     "Sheng Yong" <shengyong1@huawei.com>
>>> +Description:
>>> +              Controls readahead inode block in readdir.
>>> diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c
>>> index 2d98d877c09d..724304dc6143 100644
>>> --- a/fs/f2fs/dir.c
>>> +++ b/fs/f2fs/dir.c
>>> @@ -798,6 +798,7 @@ int f2fs_fill_dentries(struct dir_context *ctx, struct f2fs_dentry_ptr *d,
>>>        unsigned int bit_pos;
>>>        struct f2fs_dir_entry *de = NULL;
>>>        struct fscrypt_str de_name = FSTR_INIT(NULL, 0);
>>> +     struct f2fs_sb_info *sbi = F2FS_I_SB(d->inode);
>>>
>>>        bit_pos = ((unsigned long)ctx->pos % d->max);
>>>
>>> @@ -836,6 +837,9 @@ int f2fs_fill_dentries(struct dir_context *ctx, struct f2fs_dentry_ptr *d,
>>>                                        le32_to_cpu(de->ino), d_type))
>>>                        return 1;
>>>
>>> +             if (sbi->readdir_ra == 1)
>>> +                     ra_node_page(sbi, le32_to_cpu(de->ino));
>>> +
>>>                bit_pos += GET_DENTRY_SLOTS(le16_to_cpu(de->name_len));
>>>                ctx->pos = start_pos + bit_pos;
>>>        }
>>> diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
>>> index ca6b0c9bc621..a269d795ba7c 100644
>>> --- a/fs/f2fs/f2fs.h
>>> +++ b/fs/f2fs/f2fs.h
>>> @@ -1095,6 +1095,7 @@ struct f2fs_sb_info {
>>>        int dir_level;                          /* directory level */
>>>        int inline_xattr_size;                  /* inline xattr size */
>>>        unsigned int trigger_ssr_threshold;     /* threshold to trigger ssr */
>>> +     int readdir_ra;                         /* readahead inode in readdir */
>>>
>>>        block_t user_block_count;               /* # of user blocks */
>>>        block_t total_valid_block_count;        /* # of valid blocks */
>>> diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c
>>> index 9835348b6e5d..93c3364250dd 100644
>>> --- a/fs/f2fs/sysfs.c
>>> +++ b/fs/f2fs/sysfs.c
>>> @@ -299,6 +299,7 @@ F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, dir_level, dir_level);
>>>   F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, cp_interval, interval_time[CP_TIME]);
>>>   F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, idle_interval, interval_time[REQ_TIME]);
>>>   F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, iostat_enable, iostat_enable);
>>> +F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, readdir_ra, readdir_ra);
>>>   #ifdef CONFIG_F2FS_FAULT_INJECTION
>>>   F2FS_RW_ATTR(FAULT_INFO_RATE, f2fs_fault_info, inject_rate, inject_rate);
>>>   F2FS_RW_ATTR(FAULT_INFO_TYPE, f2fs_fault_info, inject_type, inject_type);
>>> @@ -346,6 +347,7 @@ static struct attribute *f2fs_attrs[] = {
>>>        ATTR_LIST(cp_interval),
>>>        ATTR_LIST(idle_interval),
>>>        ATTR_LIST(iostat_enable),
>>> +     ATTR_LIST(readdir_ra),
>>>   #ifdef CONFIG_F2FS_FAULT_INJECTION
>>>        ATTR_LIST(inject_rate),
>>>        ATTR_LIST(inject_type),
>>>
>>
>> ------------------------------------------------------------------------------
>> Check out the vibrant tech community on one of the world's most
>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>> _______________________________________________
>> Linux-f2fs-devel mailing list
>> Linux-f2fs-devel@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
> 
> .
> 


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2018-01-02  1:45 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-11-22 10:23 [RFC PATCH 1/3] f2fs: introduce sysfs readdir_ra to readahead inode block in readdir Sheng Yong
2017-11-22 10:23 ` [PATCH 2/3] f2fs: still write data if preallocate only partial blocks Sheng Yong
2017-11-23 13:17   ` Chao Yu
2017-11-22 10:23 ` [PATCH 3/3] f2fs: remove unused parameter Sheng Yong
2017-11-23 13:17   ` Chao Yu
2017-11-23 13:11 ` [RFC PATCH 1/3] f2fs: introduce sysfs readdir_ra to readahead inode block in readdir Chao Yu
2017-12-30 20:37   ` Ju Hyung Park
2018-01-02  1:45     ` Sheng Yong

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.