Skip to content

Commit

Permalink
ocfs2: add locking filter debugfs file
Browse files Browse the repository at this point in the history
Add locking filter debugfs file, which is used to filter lock resources
dump from locking_state debugfs file.  We use d_filter_secs field to
filter lock resources dump, the default d_filter_secs(0) value filters
nothing, otherwise, only dump the last N seconds active lock resources.
This enhancement can avoid dumping lots of old records.  The
d_filter_secs value can be changed via locking_filter file.

[akpm@linux-foundation.org: fix undefined reference to `__udivdi3']
Link: http://lkml.kernel.org/r/20190611015414.27754-2-ghe@suse.com
Signed-off-by: Gang He <ghe@suse.com>
Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com>
Acked-by: Randy Dunlap <rdunlap@infradead.org>	[build-tested]
Cc: Mark Fasheh <mark@fasheh.com>
Cc: Joel Becker <jlbec@evilplan.org>
Cc: Junxiao Bi <junxiao.bi@oracle.com>
Cc: Changwei Ge <gechangwei@live.cn>
Cc: Gang He <ghe@suse.com>
Cc: Jun Piao <piaojun@huawei.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Gang He authored and Linus Torvalds committed Jul 12, 2019
1 parent 8a7f5f4 commit 8056773
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 0 deletions.
38 changes: 38 additions & 0 deletions fs/ocfs2/dlmglue.c
Original file line number Diff line number Diff line change
Expand Up @@ -2991,6 +2991,8 @@ struct ocfs2_dlm_debug *ocfs2_new_dlm_debug(void)
kref_init(&dlm_debug->d_refcnt);
INIT_LIST_HEAD(&dlm_debug->d_lockres_tracking);
dlm_debug->d_locking_state = NULL;
dlm_debug->d_locking_filter = NULL;
dlm_debug->d_filter_secs = 0;
out:
return dlm_debug;
}
Expand Down Expand Up @@ -3090,10 +3092,34 @@ static int ocfs2_dlm_seq_show(struct seq_file *m, void *v)
int i;
char *lvb;
struct ocfs2_lock_res *lockres = v;
#ifdef CONFIG_OCFS2_FS_STATS
u64 now, last;
struct ocfs2_dlm_debug *dlm_debug =
((struct ocfs2_dlm_seq_priv *)m->private)->p_dlm_debug;
#endif

if (!lockres)
return -EINVAL;

#ifdef CONFIG_OCFS2_FS_STATS
if (dlm_debug->d_filter_secs) {
now = ktime_to_us(ktime_get_real());
if (lockres->l_lock_prmode.ls_last >
lockres->l_lock_exmode.ls_last)
last = lockres->l_lock_prmode.ls_last;
else
last = lockres->l_lock_exmode.ls_last;
/*
* Use d_filter_secs field to filter lock resources dump,
* the default d_filter_secs(0) value filters nothing,
* otherwise, only dump the last N seconds active lock
* resources.
*/
if (div_u64(now - last, 1000000) > dlm_debug->d_filter_secs)
return 0;
}
#endif

seq_printf(m, "0x%x\t", OCFS2_DLM_DEBUG_STR_VERSION);

if (lockres->l_type == OCFS2_LOCK_TYPE_DENTRY)
Expand Down Expand Up @@ -3243,6 +3269,17 @@ static int ocfs2_dlm_init_debug(struct ocfs2_super *osb)
goto out;
}

dlm_debug->d_locking_filter = debugfs_create_u32("locking_filter",
0600,
osb->osb_debug_root,
&dlm_debug->d_filter_secs);
if (!dlm_debug->d_locking_filter) {
ret = -EINVAL;
mlog(ML_ERROR,
"Unable to create locking filter debugfs file.\n");
goto out;
}

ocfs2_get_dlm_debug(dlm_debug);
out:
return ret;
Expand All @@ -3254,6 +3291,7 @@ static void ocfs2_dlm_shutdown_debug(struct ocfs2_super *osb)

if (dlm_debug) {
debugfs_remove(dlm_debug->d_locking_state);
debugfs_remove(dlm_debug->d_locking_filter);
ocfs2_put_dlm_debug(dlm_debug);
}
}
Expand Down
2 changes: 2 additions & 0 deletions fs/ocfs2/ocfs2.h
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,8 @@ struct ocfs2_orphan_scan {
struct ocfs2_dlm_debug {
struct kref d_refcnt;
struct dentry *d_locking_state;
struct dentry *d_locking_filter;
u32 d_filter_secs;
struct list_head d_lockres_tracking;
};

Expand Down

0 comments on commit 8056773

Please sign in to comment.