forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
NFS: Add event tracing for generic NFS events
Add tracepoints for inode attribute updates, attribute revalidation, writeback start/end fsync start/end, attribute change start/end, permission check start/end. The intention is to enable performance tracing using 'perf'as well as improving debugging. Signed-off-by: Trond Myklebust <[email protected]>
- Loading branch information
Trond Myklebust
authored and
Trond Myklebust
committed
Aug 22, 2013
1 parent
1264a2f
commit f4ce129
Showing
7 changed files
with
231 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
/* | ||
* Copyright (c) 2013 Trond Myklebust <[email protected]> | ||
*/ | ||
#include <linux/nfs_fs.h> | ||
#include "internal.h" | ||
|
||
#define CREATE_TRACE_POINTS | ||
#include "nfstrace.h" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,166 @@ | ||
/* | ||
* Copyright (c) 2013 Trond Myklebust <[email protected]> | ||
*/ | ||
#undef TRACE_SYSTEM | ||
#define TRACE_SYSTEM nfs | ||
|
||
#if !defined(_TRACE_NFS_H) || defined(TRACE_HEADER_MULTI_READ) | ||
#define _TRACE_NFS_H | ||
|
||
#include <linux/tracepoint.h> | ||
|
||
#define nfs_show_file_type(ftype) \ | ||
__print_symbolic(ftype, \ | ||
{ DT_UNKNOWN, "UNKNOWN" }, \ | ||
{ DT_FIFO, "FIFO" }, \ | ||
{ DT_CHR, "CHR" }, \ | ||
{ DT_DIR, "DIR" }, \ | ||
{ DT_BLK, "BLK" }, \ | ||
{ DT_REG, "REG" }, \ | ||
{ DT_LNK, "LNK" }, \ | ||
{ DT_SOCK, "SOCK" }, \ | ||
{ DT_WHT, "WHT" }) | ||
|
||
#define nfs_show_cache_validity(v) \ | ||
__print_flags(v, "|", \ | ||
{ NFS_INO_INVALID_ATTR, "INVALID_ATTR" }, \ | ||
{ NFS_INO_INVALID_DATA, "INVALID_DATA" }, \ | ||
{ NFS_INO_INVALID_ATIME, "INVALID_ATIME" }, \ | ||
{ NFS_INO_INVALID_ACCESS, "INVALID_ACCESS" }, \ | ||
{ NFS_INO_INVALID_ACL, "INVALID_ACL" }, \ | ||
{ NFS_INO_REVAL_PAGECACHE, "REVAL_PAGECACHE" }, \ | ||
{ NFS_INO_REVAL_FORCED, "REVAL_FORCED" }, \ | ||
{ NFS_INO_INVALID_LABEL, "INVALID_LABEL" }) | ||
|
||
#define nfs_show_nfsi_flags(v) \ | ||
__print_flags(v, "|", \ | ||
{ 1 << NFS_INO_ADVISE_RDPLUS, "ADVISE_RDPLUS" }, \ | ||
{ 1 << NFS_INO_STALE, "STALE" }, \ | ||
{ 1 << NFS_INO_FLUSHING, "FLUSHING" }, \ | ||
{ 1 << NFS_INO_FSCACHE, "FSCACHE" }, \ | ||
{ 1 << NFS_INO_COMMIT, "COMMIT" }, \ | ||
{ 1 << NFS_INO_LAYOUTCOMMIT, "NEED_LAYOUTCOMMIT" }, \ | ||
{ 1 << NFS_INO_LAYOUTCOMMITTING, "LAYOUTCOMMIT" }) | ||
|
||
DECLARE_EVENT_CLASS(nfs_inode_event, | ||
TP_PROTO( | ||
const struct inode *inode | ||
), | ||
|
||
TP_ARGS(inode), | ||
|
||
TP_STRUCT__entry( | ||
__field(dev_t, dev) | ||
__field(u32, fhandle) | ||
__field(u64, fileid) | ||
__field(u64, version) | ||
), | ||
|
||
TP_fast_assign( | ||
const struct nfs_inode *nfsi = NFS_I(inode); | ||
__entry->dev = inode->i_sb->s_dev; | ||
__entry->fileid = nfsi->fileid; | ||
__entry->fhandle = nfs_fhandle_hash(&nfsi->fh); | ||
__entry->version = inode->i_version; | ||
), | ||
|
||
TP_printk( | ||
"fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu ", | ||
MAJOR(__entry->dev), MINOR(__entry->dev), | ||
(unsigned long long)__entry->fileid, | ||
__entry->fhandle, | ||
(unsigned long long)__entry->version | ||
) | ||
); | ||
|
||
DECLARE_EVENT_CLASS(nfs_inode_event_done, | ||
TP_PROTO( | ||
const struct inode *inode, | ||
int error | ||
), | ||
|
||
TP_ARGS(inode, error), | ||
|
||
TP_STRUCT__entry( | ||
__field(int, error) | ||
__field(dev_t, dev) | ||
__field(u32, fhandle) | ||
__field(unsigned char, type) | ||
__field(u64, fileid) | ||
__field(u64, version) | ||
__field(loff_t, size) | ||
__field(unsigned long, nfsi_flags) | ||
__field(unsigned long, cache_validity) | ||
), | ||
|
||
TP_fast_assign( | ||
const struct nfs_inode *nfsi = NFS_I(inode); | ||
__entry->error = error; | ||
__entry->dev = inode->i_sb->s_dev; | ||
__entry->fileid = nfsi->fileid; | ||
__entry->fhandle = nfs_fhandle_hash(&nfsi->fh); | ||
__entry->type = nfs_umode_to_dtype(inode->i_mode); | ||
__entry->version = inode->i_version; | ||
__entry->size = i_size_read(inode); | ||
__entry->nfsi_flags = nfsi->flags; | ||
__entry->cache_validity = nfsi->cache_validity; | ||
), | ||
|
||
TP_printk( | ||
"error=%d fileid=%02x:%02x:%llu fhandle=0x%08x " | ||
"type=%u (%s) version=%llu size=%lld " | ||
"cache_validity=%lu (%s) nfs_flags=%ld (%s)", | ||
__entry->error, | ||
MAJOR(__entry->dev), MINOR(__entry->dev), | ||
(unsigned long long)__entry->fileid, | ||
__entry->fhandle, | ||
__entry->type, | ||
nfs_show_file_type(__entry->type), | ||
(unsigned long long)__entry->version, | ||
(long long)__entry->size, | ||
__entry->cache_validity, | ||
nfs_show_cache_validity(__entry->cache_validity), | ||
__entry->nfsi_flags, | ||
nfs_show_nfsi_flags(__entry->nfsi_flags) | ||
) | ||
); | ||
|
||
#define DEFINE_NFS_INODE_EVENT(name) \ | ||
DEFINE_EVENT(nfs_inode_event, name, \ | ||
TP_PROTO( \ | ||
const struct inode *inode \ | ||
), \ | ||
TP_ARGS(inode)) | ||
#define DEFINE_NFS_INODE_EVENT_DONE(name) \ | ||
DEFINE_EVENT(nfs_inode_event_done, name, \ | ||
TP_PROTO( \ | ||
const struct inode *inode, \ | ||
int error \ | ||
), \ | ||
TP_ARGS(inode, error)) | ||
DEFINE_NFS_INODE_EVENT(nfs_refresh_inode_enter); | ||
DEFINE_NFS_INODE_EVENT_DONE(nfs_refresh_inode_exit); | ||
DEFINE_NFS_INODE_EVENT(nfs_revalidate_inode_enter); | ||
DEFINE_NFS_INODE_EVENT_DONE(nfs_revalidate_inode_exit); | ||
DEFINE_NFS_INODE_EVENT(nfs_invalidate_mapping_enter); | ||
DEFINE_NFS_INODE_EVENT_DONE(nfs_invalidate_mapping_exit); | ||
DEFINE_NFS_INODE_EVENT(nfs_getattr_enter); | ||
DEFINE_NFS_INODE_EVENT_DONE(nfs_getattr_exit); | ||
DEFINE_NFS_INODE_EVENT(nfs_setattr_enter); | ||
DEFINE_NFS_INODE_EVENT_DONE(nfs_setattr_exit); | ||
DEFINE_NFS_INODE_EVENT(nfs_writeback_page_enter); | ||
DEFINE_NFS_INODE_EVENT_DONE(nfs_writeback_page_exit); | ||
DEFINE_NFS_INODE_EVENT(nfs_writeback_inode_enter); | ||
DEFINE_NFS_INODE_EVENT_DONE(nfs_writeback_inode_exit); | ||
DEFINE_NFS_INODE_EVENT(nfs_fsync_enter); | ||
DEFINE_NFS_INODE_EVENT_DONE(nfs_fsync_exit); | ||
DEFINE_NFS_INODE_EVENT(nfs_access_enter); | ||
DEFINE_NFS_INODE_EVENT_DONE(nfs_access_exit); | ||
|
||
#endif /* _TRACE_NFS_H */ | ||
|
||
#undef TRACE_INCLUDE_PATH | ||
#define TRACE_INCLUDE_PATH . | ||
#define TRACE_INCLUDE_FILE nfstrace | ||
/* This part must be outside protection */ | ||
#include <trace/define_trace.h> |
Oops, something went wrong.