820 lines · 26.1 KB · C
RawDownload
/* SPDX-License-Identifier: GPL-2.0-or-later *//* Network filesystem support module tracepoints * * Copyright (C) 2021 Red Hat, Inc. All Rights Reserved. * Written by David Howells (dhowells@redhat.com) */#undef TRACE_SYSTEM#define TRACE_SYSTEM netfs #if !defined(_TRACE_NETFS_H) || defined(TRACE_HEADER_MULTI_READ)#define _TRACE_NETFS_H #include <linux/tracepoint.h> /* * Define enums for tracing information. */#define netfs_read_traces					\	EM(netfs_read_trace_dio_read,		"DIO-READ ")	\	EM(netfs_read_trace_expanded,		"EXPANDED ")	\	EM(netfs_read_trace_readahead,		"READAHEAD")	\	EM(netfs_read_trace_readpage,		"READPAGE ")	\	EM(netfs_read_trace_read_gaps,		"READ-GAPS")	\	EM(netfs_read_trace_read_single,	"READ-SNGL")	\	EM(netfs_read_trace_prefetch_for_write,	"PREFETCHW")	\	E_(netfs_read_trace_write_begin,	"WRITEBEGN") #define netfs_write_traces					\	EM(netfs_write_trace_copy_to_cache,	"COPY2CACH")	\	EM(netfs_write_trace_dio_write,		"DIO-WRITE")	\	EM(netfs_write_trace_unbuffered_write,	"UNB-WRITE")	\	EM(netfs_write_trace_writeback,		"WRITEBACK")	\	EM(netfs_write_trace_writeback_single,	"WB-SINGLE") \	E_(netfs_write_trace_writethrough,	"WRITETHRU") #define netfs_rreq_origins					\	EM(NETFS_READAHEAD,			"RA")		\	EM(NETFS_READPAGE,			"RP")		\	EM(NETFS_READ_GAPS,			"RG")		\	EM(NETFS_READ_SINGLE,			"R1")		\	EM(NETFS_READ_FOR_WRITE,		"RW")		\	EM(NETFS_UNBUFFERED_READ,		"UR")		\	EM(NETFS_DIO_READ,			"DR")		\	EM(NETFS_WRITEBACK,			"WB")		\	EM(NETFS_WRITEBACK_SINGLE,		"W1")		\	EM(NETFS_WRITETHROUGH,			"WT")		\	EM(NETFS_UNBUFFERED_WRITE,		"UW")		\	EM(NETFS_DIO_WRITE,			"DW")		\	E_(NETFS_PGPRIV2_COPY_TO_CACHE,		"2C") #define netfs_rreq_traces					\	EM(netfs_rreq_trace_assess,		"ASSESS ")	\	EM(netfs_rreq_trace_collect,		"COLLECT")	\	EM(netfs_rreq_trace_complete,		"COMPLET")	\	EM(netfs_rreq_trace_copy,		"COPY   ")	\	EM(netfs_rreq_trace_dirty,		"DIRTY  ")	\	EM(netfs_rreq_trace_done,		"DONE   ")	\	EM(netfs_rreq_trace_end_copy_to_cache,	"END-C2C")	\	EM(netfs_rreq_trace_free,		"FREE   ")	\	EM(netfs_rreq_trace_intr,		"INTR   ")	\	EM(netfs_rreq_trace_ki_complete,	"KI-CMPL")	\	EM(netfs_rreq_trace_ra_put_ref,		"RA-PUT ")	\	EM(netfs_rreq_trace_recollect,		"RECLLCT")	\	EM(netfs_rreq_trace_redirty,		"REDIRTY")	\	EM(netfs_rreq_trace_resubmit,		"RESUBMT")	\	EM(netfs_rreq_trace_set_abandon,	"S-ABNDN")	\	EM(netfs_rreq_trace_set_pause,		"PAUSE  ")	\	EM(netfs_rreq_trace_unlock,		"UNLOCK ")	\	EM(netfs_rreq_trace_unlock_pgpriv2,	"UNLCK-2")	\	EM(netfs_rreq_trace_unmark,		"UNMARK ")	\	EM(netfs_rreq_trace_unpause,		"UNPAUSE")	\	EM(netfs_rreq_trace_wait_ip,		"WAIT-IP")	\	EM(netfs_rreq_trace_wait_pause,		"--PAUSED--")	\	EM(netfs_rreq_trace_wait_put_ra_refs,	"WAIT-P-RA")	\	EM(netfs_rreq_trace_wait_quiesce,	"WAIT-QUIESCE")	\	EM(netfs_rreq_trace_waited_ip,		"DONE-IP")	\	EM(netfs_rreq_trace_waited_pause,	"--UNPAUSED--")	\	EM(netfs_rreq_trace_waited_put_ra_refs,	"DONE-P-RA")	\	EM(netfs_rreq_trace_waited_quiesce,	"DONE-QUIESCE")	\	EM(netfs_rreq_trace_wake_ip,		"WAKE-IP")	\	EM(netfs_rreq_trace_wake_queue,		"WAKE-Q ")	\	E_(netfs_rreq_trace_write_done,		"WR-DONE") #define netfs_sreq_sources					\	EM(NETFS_SOURCE_UNKNOWN,		"----")		\	EM(NETFS_FILL_WITH_ZEROES,		"ZERO")		\	EM(NETFS_DOWNLOAD_FROM_SERVER,		"DOWN")		\	EM(NETFS_READ_FROM_CACHE,		"READ")		\	EM(NETFS_INVALID_READ,			"INVL")		\	EM(NETFS_UPLOAD_TO_SERVER,		"UPLD")		\	E_(NETFS_WRITE_TO_CACHE,		"WRIT") #define netfs_sreq_traces					\	EM(netfs_sreq_trace_abandoned,		"ABNDN")	\	EM(netfs_sreq_trace_add_donations,	"+DON ")	\	EM(netfs_sreq_trace_added,		"ADD  ")	\	EM(netfs_sreq_trace_cache_nowrite,	"CA-NW")	\	EM(netfs_sreq_trace_cache_prepare,	"CA-PR")	\	EM(netfs_sreq_trace_cache_write,	"CA-WR")	\	EM(netfs_sreq_trace_cancel,		"CANCL")	\	EM(netfs_sreq_trace_clear,		"CLEAR")	\	EM(netfs_sreq_trace_consumed,		"CONSM")	\	EM(netfs_sreq_trace_discard,		"DSCRD")	\	EM(netfs_sreq_trace_donate_to_prev,	"DON-P")	\	EM(netfs_sreq_trace_donate_to_next,	"DON-N")	\	EM(netfs_sreq_trace_download_instead,	"RDOWN")	\	EM(netfs_sreq_trace_fail,		"FAIL ")	\	EM(netfs_sreq_trace_free,		"FREE ")	\	EM(netfs_sreq_trace_hit_eof,		"EOF  ")	\	EM(netfs_sreq_trace_io_bad,		"I-BAD")	\	EM(netfs_sreq_trace_io_malformed,	"I-MLF")	\	EM(netfs_sreq_trace_io_unknown,		"I-UNK")	\	EM(netfs_sreq_trace_io_progress,	"I-OK ")	\	EM(netfs_sreq_trace_io_req_submitted,	"I-RSB")	\	EM(netfs_sreq_trace_io_retry_needed,	"I-RTR")	\	EM(netfs_sreq_trace_limited,		"LIMIT")	\	EM(netfs_sreq_trace_need_clear,		"N-CLR")	\	EM(netfs_sreq_trace_partial_read,	"PARTR")	\	EM(netfs_sreq_trace_need_retry,		"ND-RT")	\	EM(netfs_sreq_trace_prepare,		"PREP ")	\	EM(netfs_sreq_trace_prep_failed,	"PRPFL")	\	EM(netfs_sreq_trace_progress,		"PRGRS")	\	EM(netfs_sreq_trace_reprep_failed,	"REPFL")	\	EM(netfs_sreq_trace_retry,		"RETRY")	\	EM(netfs_sreq_trace_short,		"SHORT")	\	EM(netfs_sreq_trace_split,		"SPLIT")	\	EM(netfs_sreq_trace_submit,		"SUBMT")	\	EM(netfs_sreq_trace_superfluous,	"SPRFL")	\	EM(netfs_sreq_trace_terminated,		"TERM ")	\	EM(netfs_sreq_trace_wait_for,		"_WAIT")	\	EM(netfs_sreq_trace_write,		"WRITE")	\	EM(netfs_sreq_trace_write_skip,		"SKIP ")	\	E_(netfs_sreq_trace_write_term,		"WTERM") #define netfs_failures							\	EM(netfs_fail_check_write_begin,	"check-write-begin")	\	EM(netfs_fail_copy_to_cache,		"copy-to-cache")	\	EM(netfs_fail_dio_read_short,		"dio-read-short")	\	EM(netfs_fail_dio_read_zero,		"dio-read-zero")	\	EM(netfs_fail_read,			"read")			\	EM(netfs_fail_short_read,		"short-read")		\	EM(netfs_fail_prepare_write,		"prep-write")		\	E_(netfs_fail_write,			"write") #define netfs_rreq_ref_traces					\	EM(netfs_rreq_trace_get_for_outstanding,"GET OUTSTND")	\	EM(netfs_rreq_trace_get_subreq,		"GET SUBREQ ")	\	EM(netfs_rreq_trace_put_complete,	"PUT COMPLT ")	\	EM(netfs_rreq_trace_put_discard,	"PUT DISCARD")	\	EM(netfs_rreq_trace_put_failed,		"PUT FAILED ")	\	EM(netfs_rreq_trace_put_no_submit,	"PUT NO-SUBM")	\	EM(netfs_rreq_trace_put_return,		"PUT RETURN ")	\	EM(netfs_rreq_trace_put_subreq,		"PUT SUBREQ ")	\	EM(netfs_rreq_trace_put_work_ip,	"PUT WORK IP ")	\	EM(netfs_rreq_trace_see_work,		"SEE WORK   ")	\	EM(netfs_rreq_trace_see_work_complete,	"SEE WORK CP")	\	E_(netfs_rreq_trace_new,		"NEW        ") #define netfs_sreq_ref_traces					\	EM(netfs_sreq_trace_get_copy_to_cache,	"GET COPY2C ")	\	EM(netfs_sreq_trace_get_resubmit,	"GET RESUBMT")	\	EM(netfs_sreq_trace_get_submit,		"GET SUBMIT ")	\	EM(netfs_sreq_trace_get_short_read,	"GET SHORTRD")	\	EM(netfs_sreq_trace_new,		"NEW        ")	\	EM(netfs_sreq_trace_put_abandon,	"PUT ABANDON")	\	EM(netfs_sreq_trace_put_cancel,		"PUT CANCEL ")	\	EM(netfs_sreq_trace_put_clear,		"PUT CLEAR  ")	\	EM(netfs_sreq_trace_put_consumed,	"PUT CONSUME")	\	EM(netfs_sreq_trace_put_done,		"PUT DONE   ")	\	EM(netfs_sreq_trace_put_failed,		"PUT FAILED ")	\	EM(netfs_sreq_trace_put_merged,		"PUT MERGED ")	\	EM(netfs_sreq_trace_put_no_copy,	"PUT NO COPY")	\	EM(netfs_sreq_trace_put_oom,		"PUT OOM    ")	\	EM(netfs_sreq_trace_put_wip,		"PUT WIP    ")	\	EM(netfs_sreq_trace_put_work,		"PUT WORK   ")	\	EM(netfs_sreq_trace_put_terminated,	"PUT TERM   ")	\	E_(netfs_sreq_trace_see_failed,		"SEE FAILED ") #define netfs_folio_traces					\	EM(netfs_folio_is_uptodate,		"mod-uptodate")	\	EM(netfs_just_prefetch,			"mod-prefetch")	\	EM(netfs_whole_folio_modify,		"mod-whole-f")	\	EM(netfs_whole_folio_modify_efault,	"mod-whole-f!")	\	EM(netfs_whole_folio_modify_filled,	"mod-whole-f+")	\	EM(netfs_whole_folio_modify_filled_efault, "mod-whole-f+!") \	EM(netfs_modify_and_clear,		"mod-n-clear")	\	EM(netfs_modify_and_clear_rm_finfo,	"mod-n-clear+")	\	EM(netfs_streaming_write,		"mod-streamw")	\	EM(netfs_streaming_write_cont,		"mod-streamw+")	\	EM(netfs_flush_content,			"flush")	\	EM(netfs_streaming_filled_page,		"mod-streamw-f") \	EM(netfs_streaming_cont_filled_page,	"mod-streamw-f+") \	EM(netfs_folio_trace_abandon,		"abandon")	\	EM(netfs_folio_trace_alloc_buffer,	"alloc-buf")	\	EM(netfs_folio_trace_cancel_copy,	"cancel-copy")	\	EM(netfs_folio_trace_cancel_store,	"cancel-store")	\	EM(netfs_folio_trace_clear,		"clear")	\	EM(netfs_folio_trace_clear_cc,		"clear-cc")	\	EM(netfs_folio_trace_clear_g,		"clear-g")	\	EM(netfs_folio_trace_clear_s,		"clear-s")	\	EM(netfs_folio_trace_end_copy,		"end-copy")	\	EM(netfs_folio_trace_filled_gaps,	"filled-gaps")	\	EM(netfs_folio_trace_invalidate_all,	"inval-all")	\	EM(netfs_folio_trace_invalidate_front,	"inval-front")	\	EM(netfs_folio_trace_invalidate_middle,	"inval-mid")	\	EM(netfs_folio_trace_invalidate_tail,	"inval-tail")	\	EM(netfs_folio_trace_kill,		"kill")		\	EM(netfs_folio_trace_kill_cc,		"kill-cc")	\	EM(netfs_folio_trace_kill_g,		"kill-g")	\	EM(netfs_folio_trace_kill_s,		"kill-s")	\	EM(netfs_folio_trace_mark_copy,		"mark-copy")	\	EM(netfs_folio_trace_mkwrite,		"mkwrite")	\	EM(netfs_folio_trace_mkwrite_plus,	"mkwrite+")	\	EM(netfs_folio_trace_not_locked,	"!locked")	\	EM(netfs_folio_trace_not_under_wback,	"!wback")	\	EM(netfs_folio_trace_pgpriv2_copy,	"pgpriv2-copy")	\	EM(netfs_folio_trace_put,		"put")		\	EM(netfs_folio_trace_read,		"read")		\	EM(netfs_folio_trace_read_done,		"read-done")	\	EM(netfs_folio_trace_read_gaps,		"read-gaps")	\	EM(netfs_folio_trace_read_unlock,	"read-unlock")	\	EM(netfs_folio_trace_redirtied,		"redirtied")	\	EM(netfs_folio_trace_sched_copy,	"sched-copy")	\	EM(netfs_folio_trace_store,		"store")	\	EM(netfs_folio_trace_store_copy,	"store-copy")	\	EM(netfs_folio_trace_store_plus,	"store+")	\	EM(netfs_folio_trace_wthru,		"wthru")	\	E_(netfs_folio_trace_wthru_plus,	"wthru+") #define netfs_collect_contig_traces				\	EM(netfs_contig_trace_collect,		"Collect")	\	EM(netfs_contig_trace_jump,		"-->JUMP-->")	\	E_(netfs_contig_trace_unlock,		"Unlock") #define netfs_donate_traces					\	EM(netfs_trace_donate_tail_to_prev,	"tail-to-prev")	\	EM(netfs_trace_donate_to_prev,		"to-prev")	\	EM(netfs_trace_donate_to_next,		"to-next")	\	E_(netfs_trace_donate_to_deferred_next,	"defer-next") #define netfs_folioq_traces					\	EM(netfs_trace_folioq_alloc_buffer,	"alloc-buf")	\	EM(netfs_trace_folioq_clear,		"clear")	\	EM(netfs_trace_folioq_delete,		"delete")	\	EM(netfs_trace_folioq_make_space,	"make-space")	\	EM(netfs_trace_folioq_rollbuf_init,	"roll-init")	\	E_(netfs_trace_folioq_read_progress,	"r-progress") #ifndef __NETFS_DECLARE_TRACE_ENUMS_ONCE_ONLY#define __NETFS_DECLARE_TRACE_ENUMS_ONCE_ONLY #undef EM#undef E_#define EM(a, b) a,#define E_(a, b) a enum netfs_read_trace { netfs_read_traces } __mode(byte);enum netfs_write_trace { netfs_write_traces } __mode(byte);enum netfs_rreq_trace { netfs_rreq_traces } __mode(byte);enum netfs_sreq_trace { netfs_sreq_traces } __mode(byte);enum netfs_failure { netfs_failures } __mode(byte);enum netfs_rreq_ref_trace { netfs_rreq_ref_traces } __mode(byte);enum netfs_sreq_ref_trace { netfs_sreq_ref_traces } __mode(byte);enum netfs_folio_trace { netfs_folio_traces } __mode(byte);enum netfs_collect_contig_trace { netfs_collect_contig_traces } __mode(byte);enum netfs_donate_trace { netfs_donate_traces } __mode(byte);enum netfs_folioq_trace { netfs_folioq_traces } __mode(byte); #endif /* * Export enum symbols via userspace. */#undef EM#undef E_#define EM(a, b) TRACE_DEFINE_ENUM(a);#define E_(a, b) TRACE_DEFINE_ENUM(a); netfs_read_traces;netfs_write_traces;netfs_rreq_origins;netfs_rreq_traces;netfs_sreq_sources;netfs_sreq_traces;netfs_failures;netfs_rreq_ref_traces;netfs_sreq_ref_traces;netfs_folio_traces;netfs_collect_contig_traces;netfs_donate_traces;netfs_folioq_traces; /* * Now redefine the EM() and E_() macros to map the enums to the strings that * will be printed in the output. */#undef EM#undef E_#define EM(a, b)	{ a, b },#define E_(a, b)	{ a, b } TRACE_EVENT(netfs_read,	    TP_PROTO(struct netfs_io_request *rreq,		     loff_t start, size_t len,		     enum netfs_read_trace what), 	    TP_ARGS(rreq, start, len, what), 	    TP_STRUCT__entry(		    __field(unsigned int,		rreq)		    __field(unsigned int,		cookie)		    __field(loff_t,			i_size)		    __field(loff_t,			start)		    __field(size_t,			len)		    __field(enum netfs_read_trace,	what)		    __field(u64,			netfs_inode)			     ), 	    TP_fast_assign(		    __entry->rreq	= rreq->debug_id;		    __entry->cookie	= rreq->cache_resources.debug_id;		    __entry->i_size	= rreq->i_size;		    __entry->start	= start;		    __entry->len	= len;		    __entry->what	= what;		    __entry->netfs_inode = rreq->inode->i_ino;			   ), 	    TP_printk("R=%08x %s c=%08x ni=%llx s=%llx l=%zx sz=%llx",		      __entry->rreq,		      __print_symbolic(__entry->what, netfs_read_traces),		      __entry->cookie,		      __entry->netfs_inode,		      __entry->start, __entry->len, __entry->i_size)	    ); TRACE_EVENT(netfs_rreq,	    TP_PROTO(struct netfs_io_request *rreq,		     enum netfs_rreq_trace what), 	    TP_ARGS(rreq, what), 	    TP_STRUCT__entry(		    __field(unsigned int,		rreq)		    __field(unsigned int,		flags)		    __field(enum netfs_io_origin,	origin)		    __field(enum netfs_rreq_trace,	what)			     ), 	    TP_fast_assign(		    __entry->rreq	= rreq->debug_id;		    __entry->flags	= rreq->flags;		    __entry->origin	= rreq->origin;		    __entry->what	= what;			   ), 	    TP_printk("R=%08x %s %s f=%02x",		      __entry->rreq,		      __print_symbolic(__entry->origin, netfs_rreq_origins),		      __print_symbolic(__entry->what, netfs_rreq_traces),		      __entry->flags)	    ); TRACE_EVENT(netfs_sreq,	    TP_PROTO(struct netfs_io_subrequest *sreq,		     enum netfs_sreq_trace what), 	    TP_ARGS(sreq, what), 	    TP_STRUCT__entry(		    __field(unsigned int,		rreq)		    __field(unsigned short,		index)		    __field(short,			error)		    __field(unsigned short,		flags)		    __field(enum netfs_io_source,	source)		    __field(enum netfs_sreq_trace,	what)		    __field(u8,				slot)		    __field(size_t,			len)		    __field(size_t,			transferred)		    __field(loff_t,			start)			     ), 	    TP_fast_assign(		    __entry->rreq	= sreq->rreq->debug_id;		    __entry->index	= sreq->debug_index;		    __entry->error	= sreq->error;		    __entry->flags	= sreq->flags;		    __entry->source	= sreq->source;		    __entry->what	= what;		    __entry->len	= sreq->len;		    __entry->transferred = sreq->transferred;		    __entry->start	= sreq->start;		    __entry->slot	= sreq->io_iter.folioq_slot;			   ), 	    TP_printk("R=%08x[%x] %s %s f=%03x s=%llx %zx/%zx s=%u e=%d",		      __entry->rreq, __entry->index,		      __print_symbolic(__entry->source, netfs_sreq_sources),		      __print_symbolic(__entry->what, netfs_sreq_traces),		      __entry->flags,		      __entry->start, __entry->transferred, __entry->len,		      __entry->slot, __entry->error)	    ); TRACE_EVENT(netfs_failure,	    TP_PROTO(struct netfs_io_request *rreq,		     struct netfs_io_subrequest *sreq,		     int error, enum netfs_failure what), 	    TP_ARGS(rreq, sreq, error, what), 	    TP_STRUCT__entry(		    __field(unsigned int,		rreq)		    __field(short,			index)		    __field(short,			error)		    __field(unsigned short,		flags)		    __field(enum netfs_io_source,	source)		    __field(enum netfs_failure,		what)		    __field(size_t,			len)		    __field(size_t,			transferred)		    __field(loff_t,			start)			     ), 	    TP_fast_assign(		    __entry->rreq	= rreq->debug_id;		    __entry->index	= sreq ? sreq->debug_index : -1;		    __entry->error	= error;		    __entry->flags	= sreq ? sreq->flags : 0;		    __entry->source	= sreq ? sreq->source : NETFS_INVALID_READ;		    __entry->what	= what;		    __entry->len	= sreq ? sreq->len : rreq->len;		    __entry->transferred = sreq ? sreq->transferred : 0;		    __entry->start	= sreq ? sreq->start : 0;			   ), 	    TP_printk("R=%08x[%x] %s f=%02x s=%llx %zx/%zx %s e=%d",		      __entry->rreq, __entry->index,		      __print_symbolic(__entry->source, netfs_sreq_sources),		      __entry->flags,		      __entry->start, __entry->transferred, __entry->len,		      __print_symbolic(__entry->what, netfs_failures),		      __entry->error)	    ); TRACE_EVENT(netfs_rreq_ref,	    TP_PROTO(unsigned int rreq_debug_id, int ref,		     enum netfs_rreq_ref_trace what), 	    TP_ARGS(rreq_debug_id, ref, what), 	    TP_STRUCT__entry(		    __field(unsigned int,		rreq)		    __field(int,			ref)		    __field(enum netfs_rreq_ref_trace,	what)			     ), 	    TP_fast_assign(		    __entry->rreq	= rreq_debug_id;		    __entry->ref	= ref;		    __entry->what	= what;			   ), 	    TP_printk("R=%08x %s r=%u",		      __entry->rreq,		      __print_symbolic(__entry->what, netfs_rreq_ref_traces),		      __entry->ref)	    ); TRACE_EVENT(netfs_sreq_ref,	    TP_PROTO(unsigned int rreq_debug_id, unsigned int subreq_debug_index,		     int ref, enum netfs_sreq_ref_trace what), 	    TP_ARGS(rreq_debug_id, subreq_debug_index, ref, what), 	    TP_STRUCT__entry(		    __field(unsigned int,		rreq)		    __field(unsigned int,		subreq)		    __field(int,			ref)		    __field(enum netfs_sreq_ref_trace,	what)			     ), 	    TP_fast_assign(		    __entry->rreq	= rreq_debug_id;		    __entry->subreq	= subreq_debug_index;		    __entry->ref	= ref;		    __entry->what	= what;			   ), 	    TP_printk("R=%08x[%x] %s r=%u",		      __entry->rreq,		      __entry->subreq,		      __print_symbolic(__entry->what, netfs_sreq_ref_traces),		      __entry->ref)	    ); TRACE_EVENT(netfs_folio,	    TP_PROTO(struct folio *folio, enum netfs_folio_trace why), 	    TP_ARGS(folio, why), 

Lines 1–500 of 820.