Merge tag 'for-f2fs-4.12' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs
Pull f2fs updates from Jaegeuk Kim: "In this round, we've focused on enhancing performance with regards to block allocation, GC, and discard/in-place-update IO controls. There are a bunch of clean-ups as well as minor bug fixes. Enhancements: - disable heap-based allocation by default - issue small-sized discard commands by default - change the policy of data hotness for logging - distinguish IOs in terms of size and wbc type - start SSR earlier to avoid foreground GC - enhance data structures managing discard commands - enhance in-place update flow - add some more fault injection routines - secure one more xattr entry Bug fixes: - calculate victim cost for GC correctly - remain correct victim segment number for GC - race condition in nid allocator and initializer - stale pointer produced by atomic_writes - fix missing REQ_SYNC for flush commands - handle missing errors in more corner cases" * tag 'for-f2fs-4.12' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs: (111 commits) f2fs: fix a mount fail for wrong next_scan_nid f2fs: enhance scalability of trace macro f2fs: relocate inode_{,un}lock in F2FS_IOC_SETFLAGS f2fs: Make flush bios explicitely sync f2fs: show available_nids in f2fs/status f2fs: flush dirty nats periodically f2fs: introduce CP_TRIMMED_FLAG to avoid unneeded discard f2fs: allow cpc->reason to indicate more than one reason f2fs: release cp and dnode lock before IPU f2fs: shrink size of struct discard_cmd f2fs: don't hold cmd_lock during waiting discard command f2fs: nullify fio->encrypted_page for each writes f2fs: sanity check segment count f2fs: introduce valid_ipu_blkaddr to clean up f2fs: lookup extent cache first under IPU scenario f2fs: reconstruct code to write a data page f2fs: introduce __wait_discard_cmd f2fs: introduce __issue_discard_cmd f2fs: enable small discard by default f2fs: delay awaking discard thread ...
Šī revīzija ir iekļauta:
@@ -15,6 +15,8 @@ TRACE_DEFINE_ENUM(META);
|
||||
TRACE_DEFINE_ENUM(META_FLUSH);
|
||||
TRACE_DEFINE_ENUM(INMEM);
|
||||
TRACE_DEFINE_ENUM(INMEM_DROP);
|
||||
TRACE_DEFINE_ENUM(INMEM_INVALIDATE);
|
||||
TRACE_DEFINE_ENUM(INMEM_REVOKE);
|
||||
TRACE_DEFINE_ENUM(IPU);
|
||||
TRACE_DEFINE_ENUM(OPU);
|
||||
TRACE_DEFINE_ENUM(CURSEG_HOT_DATA);
|
||||
@@ -42,6 +44,7 @@ TRACE_DEFINE_ENUM(CP_FASTBOOT);
|
||||
TRACE_DEFINE_ENUM(CP_SYNC);
|
||||
TRACE_DEFINE_ENUM(CP_RECOVERY);
|
||||
TRACE_DEFINE_ENUM(CP_DISCARD);
|
||||
TRACE_DEFINE_ENUM(CP_TRIMMED);
|
||||
|
||||
#define show_block_type(type) \
|
||||
__print_symbolic(type, \
|
||||
@@ -51,12 +54,13 @@ TRACE_DEFINE_ENUM(CP_DISCARD);
|
||||
{ META_FLUSH, "META_FLUSH" }, \
|
||||
{ INMEM, "INMEM" }, \
|
||||
{ INMEM_DROP, "INMEM_DROP" }, \
|
||||
{ INMEM_INVALIDATE, "INMEM_INVALIDATE" }, \
|
||||
{ INMEM_REVOKE, "INMEM_REVOKE" }, \
|
||||
{ IPU, "IN-PLACE" }, \
|
||||
{ OPU, "OUT-OF-PLACE" })
|
||||
|
||||
#define F2FS_OP_FLAGS (REQ_RAHEAD | REQ_SYNC | REQ_PREFLUSH | REQ_META |\
|
||||
REQ_PRIO)
|
||||
#define F2FS_OP_FLAGS (REQ_RAHEAD | REQ_SYNC | REQ_META | REQ_PRIO | \
|
||||
REQ_PREFLUSH | REQ_FUA)
|
||||
#define F2FS_BIO_FLAG_MASK(t) (t & F2FS_OP_FLAGS)
|
||||
|
||||
#define show_bio_type(op,op_flags) show_bio_op(op), \
|
||||
@@ -75,16 +79,13 @@ TRACE_DEFINE_ENUM(CP_DISCARD);
|
||||
{ REQ_OP_WRITE_ZEROES, "WRITE_ZEROES" })
|
||||
|
||||
#define show_bio_op_flags(flags) \
|
||||
__print_symbolic(F2FS_BIO_FLAG_MASK(flags), \
|
||||
{ REQ_RAHEAD, "(RA)" }, \
|
||||
{ REQ_SYNC, "(S)" }, \
|
||||
{ REQ_SYNC | REQ_PRIO, "(SP)" }, \
|
||||
{ REQ_META, "(M)" }, \
|
||||
{ REQ_META | REQ_PRIO, "(MP)" }, \
|
||||
{ REQ_SYNC | REQ_PREFLUSH , "(SF)" }, \
|
||||
{ REQ_SYNC | REQ_META | REQ_PRIO, "(SMP)" }, \
|
||||
{ REQ_PREFLUSH | REQ_META | REQ_PRIO, "(FMP)" }, \
|
||||
{ 0, " \b" })
|
||||
__print_flags(F2FS_BIO_FLAG_MASK(flags), "|", \
|
||||
{ REQ_RAHEAD, "R" }, \
|
||||
{ REQ_SYNC, "S" }, \
|
||||
{ REQ_META, "M" }, \
|
||||
{ REQ_PRIO, "P" }, \
|
||||
{ REQ_PREFLUSH, "PF" }, \
|
||||
{ REQ_FUA, "FUA" })
|
||||
|
||||
#define show_data_type(type) \
|
||||
__print_symbolic(type, \
|
||||
@@ -117,12 +118,14 @@ TRACE_DEFINE_ENUM(CP_DISCARD);
|
||||
{ GC_CB, "Cost-Benefit" })
|
||||
|
||||
#define show_cpreason(type) \
|
||||
__print_symbolic(type, \
|
||||
__print_flags(type, "|", \
|
||||
{ CP_UMOUNT, "Umount" }, \
|
||||
{ CP_FASTBOOT, "Fastboot" }, \
|
||||
{ CP_SYNC, "Sync" }, \
|
||||
{ CP_RECOVERY, "Recovery" }, \
|
||||
{ CP_DISCARD, "Discard" })
|
||||
{ CP_DISCARD, "Discard" }, \
|
||||
{ CP_UMOUNT, "Umount" }, \
|
||||
{ CP_TRIMMED, "Trimmed" })
|
||||
|
||||
struct victim_sel_policy;
|
||||
struct f2fs_map_blocks;
|
||||
@@ -769,7 +772,7 @@ DECLARE_EVENT_CLASS(f2fs__submit_page_bio,
|
||||
),
|
||||
|
||||
TP_printk("dev = (%d,%d), ino = %lu, page_index = 0x%lx, "
|
||||
"oldaddr = 0x%llx, newaddr = 0x%llx, rw = %s%s, type = %s",
|
||||
"oldaddr = 0x%llx, newaddr = 0x%llx, rw = %s(%s), type = %s",
|
||||
show_dev_ino(__entry),
|
||||
(unsigned long)__entry->index,
|
||||
(unsigned long long)__entry->old_blkaddr,
|
||||
@@ -822,7 +825,7 @@ DECLARE_EVENT_CLASS(f2fs__bio,
|
||||
__entry->size = bio->bi_iter.bi_size;
|
||||
),
|
||||
|
||||
TP_printk("dev = (%d,%d)/(%d,%d), rw = %s%s, %s, sector = %lld, size = %u",
|
||||
TP_printk("dev = (%d,%d)/(%d,%d), rw = %s(%s), %s, sector = %lld, size = %u",
|
||||
show_dev(__entry->target),
|
||||
show_dev(__entry->dev),
|
||||
show_bio_type(__entry->op, __entry->op_flags),
|
||||
@@ -1126,7 +1129,7 @@ TRACE_EVENT(f2fs_write_checkpoint,
|
||||
__entry->msg)
|
||||
);
|
||||
|
||||
TRACE_EVENT(f2fs_issue_discard,
|
||||
DECLARE_EVENT_CLASS(f2fs_discard,
|
||||
|
||||
TP_PROTO(struct block_device *dev, block_t blkstart, block_t blklen),
|
||||
|
||||
@@ -1150,6 +1153,20 @@ TRACE_EVENT(f2fs_issue_discard,
|
||||
(unsigned long long)__entry->blklen)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(f2fs_discard, f2fs_queue_discard,
|
||||
|
||||
TP_PROTO(struct block_device *dev, block_t blkstart, block_t blklen),
|
||||
|
||||
TP_ARGS(dev, blkstart, blklen)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(f2fs_discard, f2fs_issue_discard,
|
||||
|
||||
TP_PROTO(struct block_device *dev, block_t blkstart, block_t blklen),
|
||||
|
||||
TP_ARGS(dev, blkstart, blklen)
|
||||
);
|
||||
|
||||
TRACE_EVENT(f2fs_issue_reset_zone,
|
||||
|
||||
TP_PROTO(struct block_device *dev, block_t blkstart),
|
||||
@@ -1174,26 +1191,29 @@ TRACE_EVENT(f2fs_issue_reset_zone,
|
||||
TRACE_EVENT(f2fs_issue_flush,
|
||||
|
||||
TP_PROTO(struct block_device *dev, unsigned int nobarrier,
|
||||
unsigned int flush_merge),
|
||||
unsigned int flush_merge, int ret),
|
||||
|
||||
TP_ARGS(dev, nobarrier, flush_merge),
|
||||
TP_ARGS(dev, nobarrier, flush_merge, ret),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(dev_t, dev)
|
||||
__field(unsigned int, nobarrier)
|
||||
__field(unsigned int, flush_merge)
|
||||
__field(int, ret)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->dev = dev->bd_dev;
|
||||
__entry->nobarrier = nobarrier;
|
||||
__entry->flush_merge = flush_merge;
|
||||
__entry->ret = ret;
|
||||
),
|
||||
|
||||
TP_printk("dev = (%d,%d), %s %s",
|
||||
TP_printk("dev = (%d,%d), %s %s, ret = %d",
|
||||
show_dev(__entry->dev),
|
||||
__entry->nobarrier ? "skip (nobarrier)" : "issue",
|
||||
__entry->flush_merge ? " with flush_merge" : "")
|
||||
__entry->flush_merge ? " with flush_merge" : "",
|
||||
__entry->ret)
|
||||
);
|
||||
|
||||
TRACE_EVENT(f2fs_lookup_extent_tree_start,
|
||||
|
Atsaukties uz šo jaunā problēmā
Block a user