ocfs2: add locking filter debugfs file
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>
This commit is contained in:
parent
8a7f5f4c26
commit
8056773ac4
|
@ -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;
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue