2 * Copyright (c) 2014 Christoph Hellwig.
5 #define TRACE_SYSTEM nfsd
7 #if !defined(_NFSD_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
10 #include <linux/tracepoint.h>
13 #include "filecache.h"
16 DECLARE_EVENT_CLASS(nfsd_stateid_class,
17 TP_PROTO(stateid_t *stp),
23 __field(u32, si_generation)
26 __entry->cl_boot = stp->si_opaque.so_clid.cl_boot;
27 __entry->cl_id = stp->si_opaque.so_clid.cl_id;
28 __entry->si_id = stp->si_opaque.so_id;
29 __entry->si_generation = stp->si_generation;
31 TP_printk("client %08x:%08x stateid %08x:%08x",
35 __entry->si_generation)
38 #define DEFINE_STATEID_EVENT(name) \
39 DEFINE_EVENT(nfsd_stateid_class, name, \
40 TP_PROTO(stateid_t *stp), \
42 DEFINE_STATEID_EVENT(layoutstate_alloc);
43 DEFINE_STATEID_EVENT(layoutstate_unhash);
44 DEFINE_STATEID_EVENT(layoutstate_free);
45 DEFINE_STATEID_EVENT(layout_get_lookup_fail);
46 DEFINE_STATEID_EVENT(layout_commit_lookup_fail);
47 DEFINE_STATEID_EVENT(layout_return_lookup_fail);
48 DEFINE_STATEID_EVENT(layout_recall);
49 DEFINE_STATEID_EVENT(layout_recall_done);
50 DEFINE_STATEID_EVENT(layout_recall_fail);
51 DEFINE_STATEID_EVENT(layout_recall_release);
53 #define show_nf_flags(val) \
54 __print_flags(val, "|", \
55 { 1 << NFSD_FILE_HASHED, "HASHED" }, \
56 { 1 << NFSD_FILE_PENDING, "PENDING" }, \
57 { 1 << NFSD_FILE_BREAK_READ, "BREAK_READ" }, \
58 { 1 << NFSD_FILE_BREAK_WRITE, "BREAK_WRITE" })
60 /* FIXME: This should probably be fleshed out in the future. */
61 #define show_nf_may(val) \
62 __print_flags(val, "|", \
63 { NFSD_MAY_READ, "READ" }, \
64 { NFSD_MAY_WRITE, "WRITE" }, \
65 { NFSD_MAY_NOT_BREAK_LEASE, "NOT_BREAK_LEASE" })
67 DECLARE_EVENT_CLASS(nfsd_file_class,
68 TP_PROTO(struct nfsd_file *nf),
71 __field(unsigned int, nf_hashval)
72 __field(void *, nf_inode)
74 __field(unsigned long, nf_flags)
75 __field(unsigned char, nf_may)
76 __field(struct file *, nf_file)
79 __entry->nf_hashval = nf->nf_hashval;
80 __entry->nf_inode = nf->nf_inode;
81 __entry->nf_ref = atomic_read(&nf->nf_ref);
82 __entry->nf_flags = nf->nf_flags;
83 __entry->nf_may = nf->nf_may;
84 __entry->nf_file = nf->nf_file;
86 TP_printk("hash=0x%x inode=0x%p ref=%d flags=%s may=%s file=%p",
90 show_nf_flags(__entry->nf_flags),
91 show_nf_may(__entry->nf_may),
95 #define DEFINE_NFSD_FILE_EVENT(name) \
96 DEFINE_EVENT(nfsd_file_class, name, \
97 TP_PROTO(struct nfsd_file *nf), \
100 DEFINE_NFSD_FILE_EVENT(nfsd_file_alloc);
101 DEFINE_NFSD_FILE_EVENT(nfsd_file_put_final);
102 DEFINE_NFSD_FILE_EVENT(nfsd_file_unhash);
103 DEFINE_NFSD_FILE_EVENT(nfsd_file_put);
104 DEFINE_NFSD_FILE_EVENT(nfsd_file_unhash_and_release_locked);
106 TRACE_EVENT(nfsd_file_acquire,
107 TP_PROTO(unsigned int hash, struct inode *inode,
108 unsigned int may_flags, struct nfsd_file *nf,
111 TP_ARGS(hash, inode, may_flags, nf, status),
114 __field(unsigned int, hash)
115 __field(void *, inode)
116 __field(unsigned int, may_flags)
118 __field(unsigned long, nf_flags)
119 __field(unsigned char, nf_may)
120 __field(struct file *, nf_file)
121 __field(__be32, status)
125 __entry->hash = hash;
126 __entry->inode = inode;
127 __entry->may_flags = may_flags;
128 __entry->nf_ref = nf ? atomic_read(&nf->nf_ref) : 0;
129 __entry->nf_flags = nf ? nf->nf_flags : 0;
130 __entry->nf_may = nf ? nf->nf_may : 0;
131 __entry->nf_file = nf ? nf->nf_file : NULL;
132 __entry->status = status;
135 TP_printk("hash=0x%x inode=0x%p may_flags=%s ref=%d nf_flags=%s nf_may=%s nf_file=0x%p status=%u",
136 __entry->hash, __entry->inode,
137 show_nf_may(__entry->may_flags), __entry->nf_ref,
138 show_nf_flags(__entry->nf_flags),
139 show_nf_may(__entry->nf_may), __entry->nf_file,
140 be32_to_cpu(__entry->status))
143 DECLARE_EVENT_CLASS(nfsd_file_search_class,
144 TP_PROTO(struct inode *inode, unsigned int hash, int found),
145 TP_ARGS(inode, hash, found),
147 __field(struct inode *, inode)
148 __field(unsigned int, hash)
152 __entry->inode = inode;
153 __entry->hash = hash;
154 __entry->found = found;
156 TP_printk("hash=0x%x inode=0x%p found=%d", __entry->hash,
157 __entry->inode, __entry->found)
160 #define DEFINE_NFSD_FILE_SEARCH_EVENT(name) \
161 DEFINE_EVENT(nfsd_file_search_class, name, \
162 TP_PROTO(struct inode *inode, unsigned int hash, int found), \
163 TP_ARGS(inode, hash, found))
165 DEFINE_NFSD_FILE_SEARCH_EVENT(nfsd_file_close_inode_sync);
166 DEFINE_NFSD_FILE_SEARCH_EVENT(nfsd_file_close_inode);
168 TRACE_EVENT(nfsd_file_fsnotify_handle_event,
169 TP_PROTO(struct inode *inode, u32 mask),
170 TP_ARGS(inode, mask),
172 __field(struct inode *, inode)
173 __field(unsigned int, nlink)
174 __field(umode_t, mode)
178 __entry->inode = inode;
179 __entry->nlink = inode->i_nlink;
180 __entry->mode = inode->i_mode;
181 __entry->mask = mask;
183 TP_printk("inode=0x%p nlink=%u mode=0%ho mask=0x%x", __entry->inode,
184 __entry->nlink, __entry->mode, __entry->mask)
186 #endif /* _NFSD_TRACE_H */
188 #undef TRACE_INCLUDE_PATH
189 #define TRACE_INCLUDE_PATH .
190 #define TRACE_INCLUDE_FILE trace
191 #include <trace/define_trace.h>