linux_dsm_epyc7002/fs/f2fs
Chao Yu aec71382c6 f2fs: refactor flush_nat_entries codes for reducing NAT writes
Although building NAT journal in cursum reduce the read/write work for NAT
block, but previous design leave us lower performance when write checkpoint
frequently for these cases:
1. if journal in cursum has already full, it's a bit of waste that we flush all
   nat entries to page for persistence, but not to cache any entries.
2. if journal in cursum is not full, we fill nat entries to journal util
   journal is full, then flush the left dirty entries to disk without merge
   journaled entries, so these journaled entries may be flushed to disk at next
   checkpoint but lost chance to flushed last time.

In this patch we merge dirty entries located in same NAT block to nat entry set,
and linked all set to list, sorted ascending order by entries' count of set.
Later we flush entries in sparse set into journal as many as we can, and then
flush merged entries to disk. In this way we can not only gain in performance,
but also save lifetime of flash device.

In my testing environment, it shows this patch can help to reduce NAT block
writes obviously. In hard disk test case: cost time of fsstress is stablely
reduced by about 5%.

1. virtual machine + hard disk:
fsstress -p 20 -n 200 -l 5
		node num	cp count	nodes/cp
based		4599.6		1803.0		2.551
patched		2714.6		1829.6		1.483

2. virtual machine + 32g micro SD card:
fsstress -p 20 -n 200 -l 1 -w -f chown=0 -f creat=4 -f dwrite=0
-f fdatasync=4 -f fsync=4 -f link=0 -f mkdir=4 -f mknod=4 -f rename=5
-f rmdir=5 -f symlink=0 -f truncate=4 -f unlink=5 -f write=0 -S

		node num	cp count	nodes/cp
based		84.5		43.7		1.933
patched		49.2		40.0		1.23

Our latency of merging op shows not bad when handling extreme case like:
merging a great number of dirty nats:
latency(ns)	dirty nat count
3089219		24922
5129423		27422
4000250		24523

change log from v1:
 o fix wrong logic in add_nat_entry when grab a new nat entry set.
 o swith to create slab cache in create_node_manager_caches.
 o use GFP_ATOMIC instead of GFP_NOFS to avoid potential long latency.

change log from v2:
 o make comment position more appropriate suggested by Jaegeuk Kim.

Signed-off-by: Chao Yu <chao2.yu@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2014-07-09 14:04:25 -07:00
..
acl.c f2fs: pass flags field to setxattr functions 2014-05-07 10:21:56 +09:00
acl.h f2fs: use generic posix ACL infrastructure 2014-01-25 23:58:19 -05:00
checkpoint.c f2fs updates for v3.16 2014-06-09 19:11:44 -07:00
data.c f2fs: avoid unneeded SetPageUptodate in f2fs_write_end 2014-07-09 14:04:24 -07:00
debug.c f2fs: remove unnecessary threshold 2014-03-20 22:10:09 +09:00
dir.c f2fs: clean up an unused parameter and assignment 2014-07-09 14:04:25 -07:00
f2fs.h f2fs: refactor flush_nat_entries codes for reducing NAT writes 2014-07-09 14:04:25 -07:00
file.c f2fs: avoid to truncate non-updated page partially 2014-07-09 14:04:24 -07:00
gc.c f2fs: remove the unused ctor argument of f2fs_kmem_cache_create() 2014-03-10 18:45:14 +09:00
gc.h f2fs: add a sysfs entry to control max_victim_search 2014-01-08 13:45:08 +09:00
hash.c f2fs: unify string length declarations and usage 2012-12-28 11:27:53 +09:00
inline.c f2fs: avoid grab_cache_page_write_begin for data pages 2014-05-07 10:21:58 +09:00
inode.c f2fs: check lower bound nid value in check_nid_range 2014-07-09 05:58:08 -07:00
Kconfig f2fs: introduce CONFIG_F2FS_CHECK_FS for BUG_ON control 2013-10-29 15:43:01 +09:00
Makefile f2fs: key functions to handle inline data 2013-12-26 20:40:09 +09:00
namei.c f2fs: clean up an unused parameter and assignment 2014-07-09 14:04:25 -07:00
node.c f2fs: refactor flush_nat_entries codes for reducing NAT writes 2014-07-09 14:04:25 -07:00
node.h f2fs: refactor flush_nat_entries codes for reducing NAT writes 2014-07-09 14:04:25 -07:00
recovery.c f2fs: avoid not to call remove_dirty_inode 2014-06-07 03:18:36 +09:00
segment.c f2fs: avoid to access NULL pointer in issue_flush_thread 2014-07-09 05:59:55 -07:00
segment.h f2fs: change reclaim rate in percentage 2014-03-20 22:10:10 +09:00
super.c f2fs: check lower bound nid value in check_nid_range 2014-07-09 05:58:08 -07:00
xattr.c f2fs: fix recursive lock by f2fs_setxattr 2014-06-02 22:13:16 +09:00
xattr.h f2fs: pass flags field to setxattr functions 2014-05-07 10:21:56 +09:00