Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
  1/* SPDX-License-Identifier: GPL-2.0 */
  2/*
  3 * Copyright (c) 2014 Christoph Hellwig.
  4 */
  5#undef TRACE_SYSTEM
  6#define TRACE_SYSTEM nfsd
  7
  8#if !defined(_NFSD_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
  9#define _NFSD_TRACE_H
 10
 11#include <linux/tracepoint.h>
 12#include "nfsfh.h"
 13
 14TRACE_EVENT(nfsd_compound,
 15	TP_PROTO(const struct svc_rqst *rqst,
 16		 u32 args_opcnt),
 17	TP_ARGS(rqst, args_opcnt),
 18	TP_STRUCT__entry(
 19		__field(u32, xid)
 20		__field(u32, args_opcnt)
 21	),
 22	TP_fast_assign(
 23		__entry->xid = be32_to_cpu(rqst->rq_xid);
 24		__entry->args_opcnt = args_opcnt;
 25	),
 26	TP_printk("xid=0x%08x opcnt=%u",
 27		__entry->xid, __entry->args_opcnt)
 28)
 29
 30TRACE_EVENT(nfsd_compound_status,
 31	TP_PROTO(u32 args_opcnt,
 32		 u32 resp_opcnt,
 33		 __be32 status,
 34		 const char *name),
 35	TP_ARGS(args_opcnt, resp_opcnt, status, name),
 36	TP_STRUCT__entry(
 37		__field(u32, args_opcnt)
 38		__field(u32, resp_opcnt)
 39		__field(int, status)
 40		__string(name, name)
 41	),
 42	TP_fast_assign(
 43		__entry->args_opcnt = args_opcnt;
 44		__entry->resp_opcnt = resp_opcnt;
 45		__entry->status = be32_to_cpu(status);
 46		__assign_str(name, name);
 47	),
 48	TP_printk("op=%u/%u %s status=%d",
 49		__entry->resp_opcnt, __entry->args_opcnt,
 50		__get_str(name), __entry->status)
 51)
 52
 53DECLARE_EVENT_CLASS(nfsd_io_class,
 54	TP_PROTO(struct svc_rqst *rqstp,
 55		 struct svc_fh	*fhp,
 56		 loff_t		offset,
 57		 unsigned long	len),
 58	TP_ARGS(rqstp, fhp, offset, len),
 59	TP_STRUCT__entry(
 60		__field(u32, xid)
 61		__field(u32, fh_hash)
 62		__field(loff_t, offset)
 63		__field(unsigned long, len)
 64	),
 65	TP_fast_assign(
 66		__entry->xid = be32_to_cpu(rqstp->rq_xid);
 67		__entry->fh_hash = knfsd_fh_hash(&fhp->fh_handle);
 68		__entry->offset = offset;
 69		__entry->len = len;
 70	),
 71	TP_printk("xid=0x%08x fh_hash=0x%08x offset=%lld len=%lu",
 72		  __entry->xid, __entry->fh_hash,
 73		  __entry->offset, __entry->len)
 74)
 75
 76#define DEFINE_NFSD_IO_EVENT(name)		\
 77DEFINE_EVENT(nfsd_io_class, nfsd_##name,	\
 78	TP_PROTO(struct svc_rqst *rqstp,	\
 79		 struct svc_fh	*fhp,		\
 80		 loff_t		offset,		\
 81		 unsigned long	len),		\
 82	TP_ARGS(rqstp, fhp, offset, len))
 83
 84DEFINE_NFSD_IO_EVENT(read_start);
 85DEFINE_NFSD_IO_EVENT(read_splice);
 86DEFINE_NFSD_IO_EVENT(read_vector);
 87DEFINE_NFSD_IO_EVENT(read_io_done);
 88DEFINE_NFSD_IO_EVENT(read_done);
 89DEFINE_NFSD_IO_EVENT(write_start);
 90DEFINE_NFSD_IO_EVENT(write_opened);
 91DEFINE_NFSD_IO_EVENT(write_io_done);
 92DEFINE_NFSD_IO_EVENT(write_done);
 93
 94DECLARE_EVENT_CLASS(nfsd_err_class,
 95	TP_PROTO(struct svc_rqst *rqstp,
 96		 struct svc_fh	*fhp,
 97		 loff_t		offset,
 98		 int		status),
 99	TP_ARGS(rqstp, fhp, offset, status),
100	TP_STRUCT__entry(
101		__field(u32, xid)
102		__field(u32, fh_hash)
103		__field(loff_t, offset)
104		__field(int, status)
105	),
106	TP_fast_assign(
107		__entry->xid = be32_to_cpu(rqstp->rq_xid);
108		__entry->fh_hash = knfsd_fh_hash(&fhp->fh_handle);
109		__entry->offset = offset;
110		__entry->status = status;
111	),
112	TP_printk("xid=0x%08x fh_hash=0x%08x offset=%lld status=%d",
113		  __entry->xid, __entry->fh_hash,
114		  __entry->offset, __entry->status)
115)
116
117#define DEFINE_NFSD_ERR_EVENT(name)		\
118DEFINE_EVENT(nfsd_err_class, nfsd_##name,	\
119	TP_PROTO(struct svc_rqst *rqstp,	\
120		 struct svc_fh	*fhp,		\
121		 loff_t		offset,		\
122		 int		len),		\
123	TP_ARGS(rqstp, fhp, offset, len))
124
125DEFINE_NFSD_ERR_EVENT(read_err);
126DEFINE_NFSD_ERR_EVENT(write_err);
127
128#include "state.h"
129#include "filecache.h"
130#include "vfs.h"
131
132DECLARE_EVENT_CLASS(nfsd_stateid_class,
133	TP_PROTO(stateid_t *stp),
134	TP_ARGS(stp),
135	TP_STRUCT__entry(
136		__field(u32, cl_boot)
137		__field(u32, cl_id)
138		__field(u32, si_id)
139		__field(u32, si_generation)
140	),
141	TP_fast_assign(
142		__entry->cl_boot = stp->si_opaque.so_clid.cl_boot;
143		__entry->cl_id = stp->si_opaque.so_clid.cl_id;
144		__entry->si_id = stp->si_opaque.so_id;
145		__entry->si_generation = stp->si_generation;
146	),
147	TP_printk("client %08x:%08x stateid %08x:%08x",
148		__entry->cl_boot,
149		__entry->cl_id,
150		__entry->si_id,
151		__entry->si_generation)
152)
153
154#define DEFINE_STATEID_EVENT(name) \
155DEFINE_EVENT(nfsd_stateid_class, nfsd_##name, \
156	TP_PROTO(stateid_t *stp), \
157	TP_ARGS(stp))
158DEFINE_STATEID_EVENT(layoutstate_alloc);
159DEFINE_STATEID_EVENT(layoutstate_unhash);
160DEFINE_STATEID_EVENT(layoutstate_free);
161DEFINE_STATEID_EVENT(layout_get_lookup_fail);
162DEFINE_STATEID_EVENT(layout_commit_lookup_fail);
163DEFINE_STATEID_EVENT(layout_return_lookup_fail);
164DEFINE_STATEID_EVENT(layout_recall);
165DEFINE_STATEID_EVENT(layout_recall_done);
166DEFINE_STATEID_EVENT(layout_recall_fail);
167DEFINE_STATEID_EVENT(layout_recall_release);
168
169#define show_nf_flags(val)						\
170	__print_flags(val, "|",						\
171		{ 1 << NFSD_FILE_HASHED,	"HASHED" },		\
172		{ 1 << NFSD_FILE_PENDING,	"PENDING" },		\
173		{ 1 << NFSD_FILE_BREAK_READ,	"BREAK_READ" },		\
174		{ 1 << NFSD_FILE_BREAK_WRITE,	"BREAK_WRITE" },	\
175		{ 1 << NFSD_FILE_REFERENCED,	"REFERENCED"})
176
177/* FIXME: This should probably be fleshed out in the future. */
178#define show_nf_may(val)						\
179	__print_flags(val, "|",						\
180		{ NFSD_MAY_READ,		"READ" },		\
181		{ NFSD_MAY_WRITE,		"WRITE" },		\
182		{ NFSD_MAY_NOT_BREAK_LEASE,	"NOT_BREAK_LEASE" })
183
184DECLARE_EVENT_CLASS(nfsd_file_class,
185	TP_PROTO(struct nfsd_file *nf),
186	TP_ARGS(nf),
187	TP_STRUCT__entry(
188		__field(unsigned int, nf_hashval)
189		__field(void *, nf_inode)
190		__field(int, nf_ref)
191		__field(unsigned long, nf_flags)
192		__field(unsigned char, nf_may)
193		__field(struct file *, nf_file)
194	),
195	TP_fast_assign(
196		__entry->nf_hashval = nf->nf_hashval;
197		__entry->nf_inode = nf->nf_inode;
198		__entry->nf_ref = atomic_read(&nf->nf_ref);
199		__entry->nf_flags = nf->nf_flags;
200		__entry->nf_may = nf->nf_may;
201		__entry->nf_file = nf->nf_file;
202	),
203	TP_printk("hash=0x%x inode=0x%p ref=%d flags=%s may=%s file=%p",
204		__entry->nf_hashval,
205		__entry->nf_inode,
206		__entry->nf_ref,
207		show_nf_flags(__entry->nf_flags),
208		show_nf_may(__entry->nf_may),
209		__entry->nf_file)
210)
211
212#define DEFINE_NFSD_FILE_EVENT(name) \
213DEFINE_EVENT(nfsd_file_class, name, \
214	TP_PROTO(struct nfsd_file *nf), \
215	TP_ARGS(nf))
216
217DEFINE_NFSD_FILE_EVENT(nfsd_file_alloc);
218DEFINE_NFSD_FILE_EVENT(nfsd_file_put_final);
219DEFINE_NFSD_FILE_EVENT(nfsd_file_unhash);
220DEFINE_NFSD_FILE_EVENT(nfsd_file_put);
221DEFINE_NFSD_FILE_EVENT(nfsd_file_unhash_and_release_locked);
222
223TRACE_EVENT(nfsd_file_acquire,
224	TP_PROTO(struct svc_rqst *rqstp, unsigned int hash,
225		 struct inode *inode, unsigned int may_flags,
226		 struct nfsd_file *nf, __be32 status),
227
228	TP_ARGS(rqstp, hash, inode, may_flags, nf, status),
229
230	TP_STRUCT__entry(
231		__field(__be32, xid)
232		__field(unsigned int, hash)
233		__field(void *, inode)
234		__field(unsigned int, may_flags)
235		__field(int, nf_ref)
236		__field(unsigned long, nf_flags)
237		__field(unsigned char, nf_may)
238		__field(struct file *, nf_file)
239		__field(__be32, status)
240	),
241
242	TP_fast_assign(
243		__entry->xid = rqstp->rq_xid;
244		__entry->hash = hash;
245		__entry->inode = inode;
246		__entry->may_flags = may_flags;
247		__entry->nf_ref = nf ? atomic_read(&nf->nf_ref) : 0;
248		__entry->nf_flags = nf ? nf->nf_flags : 0;
249		__entry->nf_may = nf ? nf->nf_may : 0;
250		__entry->nf_file = nf ? nf->nf_file : NULL;
251		__entry->status = status;
252	),
253
254	TP_printk("xid=0x%x hash=0x%x inode=0x%p may_flags=%s ref=%d nf_flags=%s nf_may=%s nf_file=0x%p status=%u",
255			be32_to_cpu(__entry->xid), __entry->hash, __entry->inode,
256			show_nf_may(__entry->may_flags), __entry->nf_ref,
257			show_nf_flags(__entry->nf_flags),
258			show_nf_may(__entry->nf_may), __entry->nf_file,
259			be32_to_cpu(__entry->status))
260);
261
262DECLARE_EVENT_CLASS(nfsd_file_search_class,
263	TP_PROTO(struct inode *inode, unsigned int hash, int found),
264	TP_ARGS(inode, hash, found),
265	TP_STRUCT__entry(
266		__field(struct inode *, inode)
267		__field(unsigned int, hash)
268		__field(int, found)
269	),
270	TP_fast_assign(
271		__entry->inode = inode;
272		__entry->hash = hash;
273		__entry->found = found;
274	),
275	TP_printk("hash=0x%x inode=0x%p found=%d", __entry->hash,
276			__entry->inode, __entry->found)
277);
278
279#define DEFINE_NFSD_FILE_SEARCH_EVENT(name)				\
280DEFINE_EVENT(nfsd_file_search_class, name,				\
281	TP_PROTO(struct inode *inode, unsigned int hash, int found),	\
282	TP_ARGS(inode, hash, found))
283
284DEFINE_NFSD_FILE_SEARCH_EVENT(nfsd_file_close_inode_sync);
285DEFINE_NFSD_FILE_SEARCH_EVENT(nfsd_file_close_inode);
286DEFINE_NFSD_FILE_SEARCH_EVENT(nfsd_file_is_cached);
287
288TRACE_EVENT(nfsd_file_fsnotify_handle_event,
289	TP_PROTO(struct inode *inode, u32 mask),
290	TP_ARGS(inode, mask),
291	TP_STRUCT__entry(
292		__field(struct inode *, inode)
293		__field(unsigned int, nlink)
294		__field(umode_t, mode)
295		__field(u32, mask)
296	),
297	TP_fast_assign(
298		__entry->inode = inode;
299		__entry->nlink = inode->i_nlink;
300		__entry->mode = inode->i_mode;
301		__entry->mask = mask;
302	),
303	TP_printk("inode=0x%p nlink=%u mode=0%ho mask=0x%x", __entry->inode,
304			__entry->nlink, __entry->mode, __entry->mask)
305);
306
307#endif /* _NFSD_TRACE_H */
308
309#undef TRACE_INCLUDE_PATH
310#define TRACE_INCLUDE_PATH .
311#define TRACE_INCLUDE_FILE trace
312#include <trace/define_trace.h>