f2fs: deprecate f2fs_trace_io
This patch deprecates f2fs_trace_io, since f2fs uses page->private more broadly, resulting in more buggy cases. Acked-by: Chao Yu <yuchao0@huawei.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
parent
12699fb781
commit
d5f7bc0064
|
@ -76,16 +76,6 @@ config F2FS_CHECK_FS
|
||||||
|
|
||||||
If you want to improve the performance, say N.
|
If you want to improve the performance, say N.
|
||||||
|
|
||||||
config F2FS_IO_TRACE
|
|
||||||
bool "F2FS IO tracer"
|
|
||||||
depends on F2FS_FS
|
|
||||||
depends on FUNCTION_TRACER
|
|
||||||
help
|
|
||||||
F2FS IO trace is based on a function trace, which gathers process
|
|
||||||
information and block IO patterns in the filesystem level.
|
|
||||||
|
|
||||||
If unsure, say N.
|
|
||||||
|
|
||||||
config F2FS_FAULT_INJECTION
|
config F2FS_FAULT_INJECTION
|
||||||
bool "F2FS fault injection facility"
|
bool "F2FS fault injection facility"
|
||||||
depends on F2FS_FS
|
depends on F2FS_FS
|
||||||
|
|
|
@ -7,6 +7,5 @@ f2fs-y += shrinker.o extent_cache.o sysfs.o
|
||||||
f2fs-$(CONFIG_F2FS_STAT_FS) += debug.o
|
f2fs-$(CONFIG_F2FS_STAT_FS) += debug.o
|
||||||
f2fs-$(CONFIG_F2FS_FS_XATTR) += xattr.o
|
f2fs-$(CONFIG_F2FS_FS_XATTR) += xattr.o
|
||||||
f2fs-$(CONFIG_F2FS_FS_POSIX_ACL) += acl.o
|
f2fs-$(CONFIG_F2FS_FS_POSIX_ACL) += acl.o
|
||||||
f2fs-$(CONFIG_F2FS_IO_TRACE) += trace.o
|
|
||||||
f2fs-$(CONFIG_FS_VERITY) += verity.o
|
f2fs-$(CONFIG_FS_VERITY) += verity.o
|
||||||
f2fs-$(CONFIG_F2FS_FS_COMPRESSION) += compress.o
|
f2fs-$(CONFIG_F2FS_FS_COMPRESSION) += compress.o
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
#include "f2fs.h"
|
#include "f2fs.h"
|
||||||
#include "node.h"
|
#include "node.h"
|
||||||
#include "segment.h"
|
#include "segment.h"
|
||||||
#include "trace.h"
|
|
||||||
#include <trace/events/f2fs.h>
|
#include <trace/events/f2fs.h>
|
||||||
|
|
||||||
static struct kmem_cache *ino_entry_slab;
|
static struct kmem_cache *ino_entry_slab;
|
||||||
|
@ -443,7 +442,6 @@ static int f2fs_set_meta_page_dirty(struct page *page)
|
||||||
__set_page_dirty_nobuffers(page);
|
__set_page_dirty_nobuffers(page);
|
||||||
inc_page_count(F2FS_P_SB(page), F2FS_DIRTY_META);
|
inc_page_count(F2FS_P_SB(page), F2FS_DIRTY_META);
|
||||||
f2fs_set_page_private(page, 0);
|
f2fs_set_page_private(page, 0);
|
||||||
f2fs_trace_pid(page);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1017,7 +1015,6 @@ void f2fs_update_dirty_page(struct inode *inode, struct page *page)
|
||||||
spin_unlock(&sbi->inode_lock[type]);
|
spin_unlock(&sbi->inode_lock[type]);
|
||||||
|
|
||||||
f2fs_set_page_private(page, 0);
|
f2fs_set_page_private(page, 0);
|
||||||
f2fs_trace_pid(page);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void f2fs_remove_dirty_inode(struct inode *inode)
|
void f2fs_remove_dirty_inode(struct inode *inode)
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
#include "f2fs.h"
|
#include "f2fs.h"
|
||||||
#include "node.h"
|
#include "node.h"
|
||||||
#include "segment.h"
|
#include "segment.h"
|
||||||
#include "trace.h"
|
|
||||||
#include <trace/events/f2fs.h>
|
#include <trace/events/f2fs.h>
|
||||||
|
|
||||||
#define NUM_PREALLOC_POST_READ_CTXS 128
|
#define NUM_PREALLOC_POST_READ_CTXS 128
|
||||||
|
@ -679,7 +678,6 @@ int f2fs_submit_page_bio(struct f2fs_io_info *fio)
|
||||||
return -EFSCORRUPTED;
|
return -EFSCORRUPTED;
|
||||||
|
|
||||||
trace_f2fs_submit_page_bio(page, fio);
|
trace_f2fs_submit_page_bio(page, fio);
|
||||||
f2fs_trace_ios(fio, 0);
|
|
||||||
|
|
||||||
/* Allocate a new bio */
|
/* Allocate a new bio */
|
||||||
bio = __bio_alloc(fio, 1);
|
bio = __bio_alloc(fio, 1);
|
||||||
|
@ -884,7 +882,6 @@ int f2fs_merge_page_bio(struct f2fs_io_info *fio)
|
||||||
return -EFSCORRUPTED;
|
return -EFSCORRUPTED;
|
||||||
|
|
||||||
trace_f2fs_submit_page_bio(page, fio);
|
trace_f2fs_submit_page_bio(page, fio);
|
||||||
f2fs_trace_ios(fio, 0);
|
|
||||||
|
|
||||||
if (bio && !page_is_mergeable(fio->sbi, bio, *fio->last_block,
|
if (bio && !page_is_mergeable(fio->sbi, bio, *fio->last_block,
|
||||||
fio->new_blkaddr))
|
fio->new_blkaddr))
|
||||||
|
@ -981,7 +978,6 @@ alloc_new:
|
||||||
wbc_account_cgroup_owner(fio->io_wbc, bio_page, PAGE_SIZE);
|
wbc_account_cgroup_owner(fio->io_wbc, bio_page, PAGE_SIZE);
|
||||||
|
|
||||||
io->last_block_in_bio = fio->new_blkaddr;
|
io->last_block_in_bio = fio->new_blkaddr;
|
||||||
f2fs_trace_ios(fio, 0);
|
|
||||||
|
|
||||||
trace_f2fs_submit_page_write(fio->page, fio);
|
trace_f2fs_submit_page_write(fio->page, fio);
|
||||||
skip:
|
skip:
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
#include "xattr.h"
|
#include "xattr.h"
|
||||||
#include "acl.h"
|
#include "acl.h"
|
||||||
#include "gc.h"
|
#include "gc.h"
|
||||||
#include "trace.h"
|
|
||||||
#include <trace/events/f2fs.h>
|
#include <trace/events/f2fs.h>
|
||||||
#include <uapi/linux/f2fs.h>
|
#include <uapi/linux/f2fs.h>
|
||||||
|
|
||||||
|
@ -369,7 +368,6 @@ flush_out:
|
||||||
f2fs_update_time(sbi, REQ_TIME);
|
f2fs_update_time(sbi, REQ_TIME);
|
||||||
out:
|
out:
|
||||||
trace_f2fs_sync_file_exit(inode, cp_reason, datasync, ret);
|
trace_f2fs_sync_file_exit(inode, cp_reason, datasync, ret);
|
||||||
f2fs_trace_ios(NULL, 1);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
#include "node.h"
|
#include "node.h"
|
||||||
#include "segment.h"
|
#include "segment.h"
|
||||||
#include "xattr.h"
|
#include "xattr.h"
|
||||||
#include "trace.h"
|
|
||||||
#include <trace/events/f2fs.h>
|
#include <trace/events/f2fs.h>
|
||||||
|
|
||||||
#define on_f2fs_build_free_nids(nmi) mutex_is_locked(&(nm_i)->build_lock)
|
#define on_f2fs_build_free_nids(nmi) mutex_is_locked(&(nm_i)->build_lock)
|
||||||
|
@ -2089,7 +2088,6 @@ static int f2fs_set_node_page_dirty(struct page *page)
|
||||||
__set_page_dirty_nobuffers(page);
|
__set_page_dirty_nobuffers(page);
|
||||||
inc_page_count(F2FS_P_SB(page), F2FS_DIRTY_NODES);
|
inc_page_count(F2FS_P_SB(page), F2FS_DIRTY_NODES);
|
||||||
f2fs_set_page_private(page, 0);
|
f2fs_set_page_private(page, 0);
|
||||||
f2fs_trace_pid(page);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -20,7 +20,6 @@
|
||||||
#include "segment.h"
|
#include "segment.h"
|
||||||
#include "node.h"
|
#include "node.h"
|
||||||
#include "gc.h"
|
#include "gc.h"
|
||||||
#include "trace.h"
|
|
||||||
#include <trace/events/f2fs.h>
|
#include <trace/events/f2fs.h>
|
||||||
|
|
||||||
#define __reverse_ffz(x) __reverse_ffs(~(x))
|
#define __reverse_ffz(x) __reverse_ffs(~(x))
|
||||||
|
@ -187,8 +186,6 @@ void f2fs_register_inmem_page(struct inode *inode, struct page *page)
|
||||||
{
|
{
|
||||||
struct inmem_pages *new;
|
struct inmem_pages *new;
|
||||||
|
|
||||||
f2fs_trace_pid(page);
|
|
||||||
|
|
||||||
f2fs_set_page_private(page, ATOMIC_WRITTEN_PAGE);
|
f2fs_set_page_private(page, ATOMIC_WRITTEN_PAGE);
|
||||||
|
|
||||||
new = f2fs_kmem_cache_alloc(inmem_entry_slab, GFP_NOFS);
|
new = f2fs_kmem_cache_alloc(inmem_entry_slab, GFP_NOFS);
|
||||||
|
|
|
@ -33,7 +33,6 @@
|
||||||
#include "segment.h"
|
#include "segment.h"
|
||||||
#include "xattr.h"
|
#include "xattr.h"
|
||||||
#include "gc.h"
|
#include "gc.h"
|
||||||
#include "trace.h"
|
|
||||||
|
|
||||||
#define CREATE_TRACE_POINTS
|
#define CREATE_TRACE_POINTS
|
||||||
#include <trace/events/f2fs.h>
|
#include <trace/events/f2fs.h>
|
||||||
|
@ -1448,8 +1447,6 @@ int f2fs_sync_fs(struct super_block *sb, int sync)
|
||||||
err = f2fs_write_checkpoint(sbi, &cpc);
|
err = f2fs_write_checkpoint(sbi, &cpc);
|
||||||
up_write(&sbi->gc_lock);
|
up_write(&sbi->gc_lock);
|
||||||
}
|
}
|
||||||
f2fs_trace_ios(NULL, 1);
|
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4127,8 +4124,6 @@ static int __init init_f2fs_fs(void)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
f2fs_build_trace_ios();
|
|
||||||
|
|
||||||
err = init_inodecache();
|
err = init_inodecache();
|
||||||
if (err)
|
if (err)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -4221,7 +4216,6 @@ static void __exit exit_f2fs_fs(void)
|
||||||
f2fs_destroy_segment_manager_caches();
|
f2fs_destroy_segment_manager_caches();
|
||||||
f2fs_destroy_node_manager_caches();
|
f2fs_destroy_node_manager_caches();
|
||||||
destroy_inodecache();
|
destroy_inodecache();
|
||||||
f2fs_destroy_trace_ios();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module_init(init_f2fs_fs)
|
module_init(init_f2fs_fs)
|
||||||
|
|
165
fs/f2fs/trace.c
165
fs/f2fs/trace.c
|
@ -1,165 +0,0 @@
|
||||||
// SPDX-License-Identifier: GPL-2.0
|
|
||||||
/*
|
|
||||||
* f2fs IO tracer
|
|
||||||
*
|
|
||||||
* Copyright (c) 2014 Motorola Mobility
|
|
||||||
* Copyright (c) 2014 Jaegeuk Kim <jaegeuk@kernel.org>
|
|
||||||
*/
|
|
||||||
#include <linux/fs.h>
|
|
||||||
#include <linux/f2fs_fs.h>
|
|
||||||
#include <linux/sched.h>
|
|
||||||
#include <linux/radix-tree.h>
|
|
||||||
|
|
||||||
#include "f2fs.h"
|
|
||||||
#include "trace.h"
|
|
||||||
|
|
||||||
static RADIX_TREE(pids, GFP_ATOMIC);
|
|
||||||
static spinlock_t pids_lock;
|
|
||||||
static struct last_io_info last_io;
|
|
||||||
|
|
||||||
static inline void __print_last_io(void)
|
|
||||||
{
|
|
||||||
if (!last_io.len)
|
|
||||||
return;
|
|
||||||
|
|
||||||
trace_printk("%3x:%3x %4x %-16s %2x %5x %5x %12x %4x\n",
|
|
||||||
last_io.major, last_io.minor,
|
|
||||||
last_io.pid, "----------------",
|
|
||||||
last_io.type,
|
|
||||||
last_io.fio.op, last_io.fio.op_flags,
|
|
||||||
last_io.fio.new_blkaddr,
|
|
||||||
last_io.len);
|
|
||||||
memset(&last_io, 0, sizeof(last_io));
|
|
||||||
}
|
|
||||||
|
|
||||||
static int __file_type(struct inode *inode, pid_t pid)
|
|
||||||
{
|
|
||||||
if (f2fs_is_atomic_file(inode))
|
|
||||||
return __ATOMIC_FILE;
|
|
||||||
else if (f2fs_is_volatile_file(inode))
|
|
||||||
return __VOLATILE_FILE;
|
|
||||||
else if (S_ISDIR(inode->i_mode))
|
|
||||||
return __DIR_FILE;
|
|
||||||
else if (inode->i_ino == F2FS_NODE_INO(F2FS_I_SB(inode)))
|
|
||||||
return __NODE_FILE;
|
|
||||||
else if (inode->i_ino == F2FS_META_INO(F2FS_I_SB(inode)))
|
|
||||||
return __META_FILE;
|
|
||||||
else if (pid)
|
|
||||||
return __NORMAL_FILE;
|
|
||||||
else
|
|
||||||
return __MISC_FILE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void f2fs_trace_pid(struct page *page)
|
|
||||||
{
|
|
||||||
struct inode *inode = page->mapping->host;
|
|
||||||
pid_t pid = task_pid_nr(current);
|
|
||||||
void *p;
|
|
||||||
|
|
||||||
set_page_private(page, (unsigned long)pid);
|
|
||||||
|
|
||||||
retry:
|
|
||||||
if (radix_tree_preload(GFP_NOFS))
|
|
||||||
return;
|
|
||||||
|
|
||||||
spin_lock(&pids_lock);
|
|
||||||
p = radix_tree_lookup(&pids, pid);
|
|
||||||
if (p == current)
|
|
||||||
goto out;
|
|
||||||
if (p)
|
|
||||||
radix_tree_delete(&pids, pid);
|
|
||||||
|
|
||||||
if (radix_tree_insert(&pids, pid, current)) {
|
|
||||||
spin_unlock(&pids_lock);
|
|
||||||
radix_tree_preload_end();
|
|
||||||
cond_resched();
|
|
||||||
goto retry;
|
|
||||||
}
|
|
||||||
|
|
||||||
trace_printk("%3x:%3x %4x %-16s\n",
|
|
||||||
MAJOR(inode->i_sb->s_dev), MINOR(inode->i_sb->s_dev),
|
|
||||||
pid, current->comm);
|
|
||||||
out:
|
|
||||||
spin_unlock(&pids_lock);
|
|
||||||
radix_tree_preload_end();
|
|
||||||
}
|
|
||||||
|
|
||||||
void f2fs_trace_ios(struct f2fs_io_info *fio, int flush)
|
|
||||||
{
|
|
||||||
struct inode *inode;
|
|
||||||
pid_t pid;
|
|
||||||
int major, minor;
|
|
||||||
|
|
||||||
if (flush) {
|
|
||||||
__print_last_io();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
inode = fio->page->mapping->host;
|
|
||||||
pid = page_private(fio->page);
|
|
||||||
|
|
||||||
major = MAJOR(inode->i_sb->s_dev);
|
|
||||||
minor = MINOR(inode->i_sb->s_dev);
|
|
||||||
|
|
||||||
if (last_io.major == major && last_io.minor == minor &&
|
|
||||||
last_io.pid == pid &&
|
|
||||||
last_io.type == __file_type(inode, pid) &&
|
|
||||||
last_io.fio.op == fio->op &&
|
|
||||||
last_io.fio.op_flags == fio->op_flags &&
|
|
||||||
last_io.fio.new_blkaddr + last_io.len ==
|
|
||||||
fio->new_blkaddr) {
|
|
||||||
last_io.len++;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
__print_last_io();
|
|
||||||
|
|
||||||
last_io.major = major;
|
|
||||||
last_io.minor = minor;
|
|
||||||
last_io.pid = pid;
|
|
||||||
last_io.type = __file_type(inode, pid);
|
|
||||||
last_io.fio = *fio;
|
|
||||||
last_io.len = 1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void f2fs_build_trace_ios(void)
|
|
||||||
{
|
|
||||||
spin_lock_init(&pids_lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define PIDVEC_SIZE 128
|
|
||||||
static unsigned int gang_lookup_pids(pid_t *results, unsigned long first_index,
|
|
||||||
unsigned int max_items)
|
|
||||||
{
|
|
||||||
struct radix_tree_iter iter;
|
|
||||||
void **slot;
|
|
||||||
unsigned int ret = 0;
|
|
||||||
|
|
||||||
if (unlikely(!max_items))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
radix_tree_for_each_slot(slot, &pids, &iter, first_index) {
|
|
||||||
results[ret] = iter.index;
|
|
||||||
if (++ret == max_items)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
void f2fs_destroy_trace_ios(void)
|
|
||||||
{
|
|
||||||
pid_t pid[PIDVEC_SIZE];
|
|
||||||
pid_t next_pid = 0;
|
|
||||||
unsigned int found;
|
|
||||||
|
|
||||||
spin_lock(&pids_lock);
|
|
||||||
while ((found = gang_lookup_pids(pid, next_pid, PIDVEC_SIZE))) {
|
|
||||||
unsigned idx;
|
|
||||||
|
|
||||||
next_pid = pid[found - 1] + 1;
|
|
||||||
for (idx = 0; idx < found; idx++)
|
|
||||||
radix_tree_delete(&pids, pid[idx]);
|
|
||||||
}
|
|
||||||
spin_unlock(&pids_lock);
|
|
||||||
}
|
|
|
@ -1,43 +0,0 @@
|
||||||
/* SPDX-License-Identifier: GPL-2.0 */
|
|
||||||
/*
|
|
||||||
* f2fs IO tracer
|
|
||||||
*
|
|
||||||
* Copyright (c) 2014 Motorola Mobility
|
|
||||||
* Copyright (c) 2014 Jaegeuk Kim <jaegeuk@kernel.org>
|
|
||||||
*/
|
|
||||||
#ifndef __F2FS_TRACE_H__
|
|
||||||
#define __F2FS_TRACE_H__
|
|
||||||
|
|
||||||
#ifdef CONFIG_F2FS_IO_TRACE
|
|
||||||
#include <trace/events/f2fs.h>
|
|
||||||
|
|
||||||
enum file_type {
|
|
||||||
__NORMAL_FILE,
|
|
||||||
__DIR_FILE,
|
|
||||||
__NODE_FILE,
|
|
||||||
__META_FILE,
|
|
||||||
__ATOMIC_FILE,
|
|
||||||
__VOLATILE_FILE,
|
|
||||||
__MISC_FILE,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct last_io_info {
|
|
||||||
int major, minor;
|
|
||||||
pid_t pid;
|
|
||||||
enum file_type type;
|
|
||||||
struct f2fs_io_info fio;
|
|
||||||
block_t len;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern void f2fs_trace_pid(struct page *);
|
|
||||||
extern void f2fs_trace_ios(struct f2fs_io_info *, int);
|
|
||||||
extern void f2fs_build_trace_ios(void);
|
|
||||||
extern void f2fs_destroy_trace_ios(void);
|
|
||||||
#else
|
|
||||||
#define f2fs_trace_pid(p)
|
|
||||||
#define f2fs_trace_ios(i, n)
|
|
||||||
#define f2fs_build_trace_ios()
|
|
||||||
#define f2fs_destroy_trace_ios()
|
|
||||||
|
|
||||||
#endif
|
|
||||||
#endif /* __F2FS_TRACE_H__ */
|
|
Loading…
Reference in New Issue