cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

cachefiles.h (23332B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/* CacheFiles tracepoints
      3 *
      4 * Copyright (C) 2021 Red Hat, Inc. All Rights Reserved.
      5 * Written by David Howells (dhowells@redhat.com)
      6 */
      7#undef TRACE_SYSTEM
      8#define TRACE_SYSTEM cachefiles
      9
     10#if !defined(_TRACE_CACHEFILES_H) || defined(TRACE_HEADER_MULTI_READ)
     11#define _TRACE_CACHEFILES_H
     12
     13#include <linux/tracepoint.h>
     14
     15/*
     16 * Define enums for tracing information.
     17 */
     18#ifndef __CACHEFILES_DECLARE_TRACE_ENUMS_ONCE_ONLY
     19#define __CACHEFILES_DECLARE_TRACE_ENUMS_ONCE_ONLY
     20
     21enum cachefiles_obj_ref_trace {
     22	cachefiles_obj_get_ioreq,
     23	cachefiles_obj_new,
     24	cachefiles_obj_put_alloc_fail,
     25	cachefiles_obj_put_detach,
     26	cachefiles_obj_put_ioreq,
     27	cachefiles_obj_see_clean_commit,
     28	cachefiles_obj_see_clean_delete,
     29	cachefiles_obj_see_clean_drop_tmp,
     30	cachefiles_obj_see_lookup_cookie,
     31	cachefiles_obj_see_lookup_failed,
     32	cachefiles_obj_see_withdraw_cookie,
     33	cachefiles_obj_see_withdrawal,
     34	cachefiles_obj_get_ondemand_fd,
     35	cachefiles_obj_put_ondemand_fd,
     36};
     37
     38enum fscache_why_object_killed {
     39	FSCACHE_OBJECT_IS_STALE,
     40	FSCACHE_OBJECT_IS_WEIRD,
     41	FSCACHE_OBJECT_INVALIDATED,
     42	FSCACHE_OBJECT_NO_SPACE,
     43	FSCACHE_OBJECT_WAS_RETIRED,
     44	FSCACHE_OBJECT_WAS_CULLED,
     45	FSCACHE_VOLUME_IS_WEIRD,
     46};
     47
     48enum cachefiles_coherency_trace {
     49	cachefiles_coherency_check_aux,
     50	cachefiles_coherency_check_content,
     51	cachefiles_coherency_check_dirty,
     52	cachefiles_coherency_check_len,
     53	cachefiles_coherency_check_objsize,
     54	cachefiles_coherency_check_ok,
     55	cachefiles_coherency_check_type,
     56	cachefiles_coherency_check_xattr,
     57	cachefiles_coherency_set_fail,
     58	cachefiles_coherency_set_ok,
     59	cachefiles_coherency_vol_check_cmp,
     60	cachefiles_coherency_vol_check_ok,
     61	cachefiles_coherency_vol_check_resv,
     62	cachefiles_coherency_vol_check_xattr,
     63	cachefiles_coherency_vol_set_fail,
     64	cachefiles_coherency_vol_set_ok,
     65};
     66
     67enum cachefiles_trunc_trace {
     68	cachefiles_trunc_dio_adjust,
     69	cachefiles_trunc_expand_tmpfile,
     70	cachefiles_trunc_shrink,
     71};
     72
     73enum cachefiles_prepare_read_trace {
     74	cachefiles_trace_read_after_eof,
     75	cachefiles_trace_read_found_hole,
     76	cachefiles_trace_read_found_part,
     77	cachefiles_trace_read_have_data,
     78	cachefiles_trace_read_no_data,
     79	cachefiles_trace_read_no_file,
     80	cachefiles_trace_read_seek_error,
     81	cachefiles_trace_read_seek_nxio,
     82};
     83
     84enum cachefiles_error_trace {
     85	cachefiles_trace_fallocate_error,
     86	cachefiles_trace_getxattr_error,
     87	cachefiles_trace_link_error,
     88	cachefiles_trace_lookup_error,
     89	cachefiles_trace_mkdir_error,
     90	cachefiles_trace_notify_change_error,
     91	cachefiles_trace_open_error,
     92	cachefiles_trace_read_error,
     93	cachefiles_trace_remxattr_error,
     94	cachefiles_trace_rename_error,
     95	cachefiles_trace_seek_error,
     96	cachefiles_trace_setxattr_error,
     97	cachefiles_trace_statfs_error,
     98	cachefiles_trace_tmpfile_error,
     99	cachefiles_trace_trunc_error,
    100	cachefiles_trace_unlink_error,
    101	cachefiles_trace_write_error,
    102};
    103
    104#endif
    105
    106/*
    107 * Define enum -> string mappings for display.
    108 */
    109#define cachefiles_obj_kill_traces				\
    110	EM(FSCACHE_OBJECT_IS_STALE,	"stale")		\
    111	EM(FSCACHE_OBJECT_IS_WEIRD,	"weird")		\
    112	EM(FSCACHE_OBJECT_INVALIDATED,	"inval")		\
    113	EM(FSCACHE_OBJECT_NO_SPACE,	"no_space")		\
    114	EM(FSCACHE_OBJECT_WAS_RETIRED,	"was_retired")		\
    115	EM(FSCACHE_OBJECT_WAS_CULLED,	"was_culled")		\
    116	E_(FSCACHE_VOLUME_IS_WEIRD,	"volume_weird")
    117
    118#define cachefiles_obj_ref_traces					\
    119	EM(cachefiles_obj_get_ioreq,		"GET ioreq")		\
    120	EM(cachefiles_obj_new,			"NEW obj")		\
    121	EM(cachefiles_obj_put_alloc_fail,	"PUT alloc_fail")	\
    122	EM(cachefiles_obj_put_detach,		"PUT detach")		\
    123	EM(cachefiles_obj_put_ioreq,		"PUT ioreq")		\
    124	EM(cachefiles_obj_see_clean_commit,	"SEE clean_commit")	\
    125	EM(cachefiles_obj_see_clean_delete,	"SEE clean_delete")	\
    126	EM(cachefiles_obj_see_clean_drop_tmp,	"SEE clean_drop_tmp")	\
    127	EM(cachefiles_obj_see_lookup_cookie,	"SEE lookup_cookie")	\
    128	EM(cachefiles_obj_see_lookup_failed,	"SEE lookup_failed")	\
    129	EM(cachefiles_obj_see_withdraw_cookie,	"SEE withdraw_cookie")	\
    130	E_(cachefiles_obj_see_withdrawal,	"SEE withdrawal")
    131
    132#define cachefiles_coherency_traces					\
    133	EM(cachefiles_coherency_check_aux,	"BAD aux ")		\
    134	EM(cachefiles_coherency_check_content,	"BAD cont")		\
    135	EM(cachefiles_coherency_check_dirty,	"BAD dirt")		\
    136	EM(cachefiles_coherency_check_len,	"BAD len ")		\
    137	EM(cachefiles_coherency_check_objsize,	"BAD osiz")		\
    138	EM(cachefiles_coherency_check_ok,	"OK      ")		\
    139	EM(cachefiles_coherency_check_type,	"BAD type")		\
    140	EM(cachefiles_coherency_check_xattr,	"BAD xatt")		\
    141	EM(cachefiles_coherency_set_fail,	"SET fail")		\
    142	EM(cachefiles_coherency_set_ok,		"SET ok  ")		\
    143	EM(cachefiles_coherency_vol_check_cmp,	"VOL BAD cmp ")		\
    144	EM(cachefiles_coherency_vol_check_ok,	"VOL OK      ")		\
    145	EM(cachefiles_coherency_vol_check_resv,	"VOL BAD resv")	\
    146	EM(cachefiles_coherency_vol_check_xattr,"VOL BAD xatt")		\
    147	EM(cachefiles_coherency_vol_set_fail,	"VOL SET fail")		\
    148	E_(cachefiles_coherency_vol_set_ok,	"VOL SET ok  ")
    149
    150#define cachefiles_trunc_traces						\
    151	EM(cachefiles_trunc_dio_adjust,		"DIOADJ")		\
    152	EM(cachefiles_trunc_expand_tmpfile,	"EXPTMP")		\
    153	E_(cachefiles_trunc_shrink,		"SHRINK")
    154
    155#define cachefiles_prepare_read_traces					\
    156	EM(cachefiles_trace_read_after_eof,	"after-eof ")		\
    157	EM(cachefiles_trace_read_found_hole,	"found-hole")		\
    158	EM(cachefiles_trace_read_found_part,	"found-part")		\
    159	EM(cachefiles_trace_read_have_data,	"have-data ")		\
    160	EM(cachefiles_trace_read_no_data,	"no-data   ")		\
    161	EM(cachefiles_trace_read_no_file,	"no-file   ")		\
    162	EM(cachefiles_trace_read_seek_error,	"seek-error")		\
    163	E_(cachefiles_trace_read_seek_nxio,	"seek-enxio")
    164
    165#define cachefiles_error_traces						\
    166	EM(cachefiles_trace_fallocate_error,	"fallocate")		\
    167	EM(cachefiles_trace_getxattr_error,	"getxattr")		\
    168	EM(cachefiles_trace_link_error,		"link")			\
    169	EM(cachefiles_trace_lookup_error,	"lookup")		\
    170	EM(cachefiles_trace_mkdir_error,	"mkdir")		\
    171	EM(cachefiles_trace_notify_change_error, "notify_change")	\
    172	EM(cachefiles_trace_open_error,		"open")			\
    173	EM(cachefiles_trace_read_error,		"read")			\
    174	EM(cachefiles_trace_remxattr_error,	"remxattr")		\
    175	EM(cachefiles_trace_rename_error,	"rename")		\
    176	EM(cachefiles_trace_seek_error,		"seek")			\
    177	EM(cachefiles_trace_setxattr_error,	"setxattr")		\
    178	EM(cachefiles_trace_statfs_error,	"statfs")		\
    179	EM(cachefiles_trace_tmpfile_error,	"tmpfile")		\
    180	EM(cachefiles_trace_trunc_error,	"trunc")		\
    181	EM(cachefiles_trace_unlink_error,	"unlink")		\
    182	E_(cachefiles_trace_write_error,	"write")
    183
    184
    185/*
    186 * Export enum symbols via userspace.
    187 */
    188#undef EM
    189#undef E_
    190#define EM(a, b) TRACE_DEFINE_ENUM(a);
    191#define E_(a, b) TRACE_DEFINE_ENUM(a);
    192
    193cachefiles_obj_kill_traces;
    194cachefiles_obj_ref_traces;
    195cachefiles_coherency_traces;
    196cachefiles_trunc_traces;
    197cachefiles_prepare_read_traces;
    198cachefiles_error_traces;
    199
    200/*
    201 * Now redefine the EM() and E_() macros to map the enums to the strings that
    202 * will be printed in the output.
    203 */
    204#undef EM
    205#undef E_
    206#define EM(a, b)	{ a, b },
    207#define E_(a, b)	{ a, b }
    208
    209
    210TRACE_EVENT(cachefiles_ref,
    211	    TP_PROTO(unsigned int object_debug_id,
    212		     unsigned int cookie_debug_id,
    213		     int usage,
    214		     enum cachefiles_obj_ref_trace why),
    215
    216	    TP_ARGS(object_debug_id, cookie_debug_id, usage, why),
    217
    218	    /* Note that obj may be NULL */
    219	    TP_STRUCT__entry(
    220		    __field(unsigned int,			obj		)
    221		    __field(unsigned int,			cookie		)
    222		    __field(enum cachefiles_obj_ref_trace,	why		)
    223		    __field(int,				usage		)
    224			     ),
    225
    226	    TP_fast_assign(
    227		    __entry->obj	= object_debug_id;
    228		    __entry->cookie	= cookie_debug_id;
    229		    __entry->usage	= usage;
    230		    __entry->why	= why;
    231			   ),
    232
    233	    TP_printk("c=%08x o=%08x u=%d %s",
    234		      __entry->cookie, __entry->obj, __entry->usage,
    235		      __print_symbolic(__entry->why, cachefiles_obj_ref_traces))
    236	    );
    237
    238TRACE_EVENT(cachefiles_lookup,
    239	    TP_PROTO(struct cachefiles_object *obj,
    240		     struct dentry *dir,
    241		     struct dentry *de),
    242
    243	    TP_ARGS(obj, dir, de),
    244
    245	    TP_STRUCT__entry(
    246		    __field(unsigned int,		obj	)
    247		    __field(short,			error	)
    248		    __field(unsigned long,		dino	)
    249		    __field(unsigned long,		ino	)
    250			     ),
    251
    252	    TP_fast_assign(
    253		    __entry->obj	= obj ? obj->debug_id : 0;
    254		    __entry->dino	= d_backing_inode(dir)->i_ino;
    255		    __entry->ino	= (!IS_ERR(de) && d_backing_inode(de) ?
    256					   d_backing_inode(de)->i_ino : 0);
    257		    __entry->error	= IS_ERR(de) ? PTR_ERR(de) : 0;
    258			   ),
    259
    260	    TP_printk("o=%08x dB=%lx B=%lx e=%d",
    261		      __entry->obj, __entry->dino, __entry->ino, __entry->error)
    262	    );
    263
    264TRACE_EVENT(cachefiles_mkdir,
    265	    TP_PROTO(struct dentry *dir, struct dentry *subdir),
    266
    267	    TP_ARGS(dir, subdir),
    268
    269	    TP_STRUCT__entry(
    270		    __field(unsigned int,			dir	)
    271		    __field(unsigned int,			subdir	)
    272			     ),
    273
    274	    TP_fast_assign(
    275		    __entry->dir	= d_backing_inode(dir)->i_ino;
    276		    __entry->subdir	= d_backing_inode(subdir)->i_ino;
    277			   ),
    278
    279	    TP_printk("dB=%x sB=%x",
    280		      __entry->dir,
    281		      __entry->subdir)
    282	    );
    283
    284TRACE_EVENT(cachefiles_tmpfile,
    285	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer),
    286
    287	    TP_ARGS(obj, backer),
    288
    289	    TP_STRUCT__entry(
    290		    __field(unsigned int,			obj	)
    291		    __field(unsigned int,			backer	)
    292			     ),
    293
    294	    TP_fast_assign(
    295		    __entry->obj	= obj->debug_id;
    296		    __entry->backer	= backer->i_ino;
    297			   ),
    298
    299	    TP_printk("o=%08x B=%x",
    300		      __entry->obj,
    301		      __entry->backer)
    302	    );
    303
    304TRACE_EVENT(cachefiles_link,
    305	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer),
    306
    307	    TP_ARGS(obj, backer),
    308
    309	    TP_STRUCT__entry(
    310		    __field(unsigned int,			obj	)
    311		    __field(unsigned int,			backer	)
    312			     ),
    313
    314	    TP_fast_assign(
    315		    __entry->obj	= obj->debug_id;
    316		    __entry->backer	= backer->i_ino;
    317			   ),
    318
    319	    TP_printk("o=%08x B=%x",
    320		      __entry->obj,
    321		      __entry->backer)
    322	    );
    323
    324TRACE_EVENT(cachefiles_unlink,
    325	    TP_PROTO(struct cachefiles_object *obj,
    326		     ino_t ino,
    327		     enum fscache_why_object_killed why),
    328
    329	    TP_ARGS(obj, ino, why),
    330
    331	    /* Note that obj may be NULL */
    332	    TP_STRUCT__entry(
    333		    __field(unsigned int,		obj		)
    334		    __field(unsigned int,		ino		)
    335		    __field(enum fscache_why_object_killed, why		)
    336			     ),
    337
    338	    TP_fast_assign(
    339		    __entry->obj	= obj ? obj->debug_id : UINT_MAX;
    340		    __entry->ino	= ino;
    341		    __entry->why	= why;
    342			   ),
    343
    344	    TP_printk("o=%08x B=%x w=%s",
    345		      __entry->obj, __entry->ino,
    346		      __print_symbolic(__entry->why, cachefiles_obj_kill_traces))
    347	    );
    348
    349TRACE_EVENT(cachefiles_rename,
    350	    TP_PROTO(struct cachefiles_object *obj,
    351		     ino_t ino,
    352		     enum fscache_why_object_killed why),
    353
    354	    TP_ARGS(obj, ino, why),
    355
    356	    /* Note that obj may be NULL */
    357	    TP_STRUCT__entry(
    358		    __field(unsigned int,		obj		)
    359		    __field(unsigned int,		ino		)
    360		    __field(enum fscache_why_object_killed, why		)
    361			     ),
    362
    363	    TP_fast_assign(
    364		    __entry->obj	= obj ? obj->debug_id : UINT_MAX;
    365		    __entry->ino	= ino;
    366		    __entry->why	= why;
    367			   ),
    368
    369	    TP_printk("o=%08x B=%x w=%s",
    370		      __entry->obj, __entry->ino,
    371		      __print_symbolic(__entry->why, cachefiles_obj_kill_traces))
    372	    );
    373
    374TRACE_EVENT(cachefiles_coherency,
    375	    TP_PROTO(struct cachefiles_object *obj,
    376		     ino_t ino,
    377		     enum cachefiles_content content,
    378		     enum cachefiles_coherency_trace why),
    379
    380	    TP_ARGS(obj, ino, content, why),
    381
    382	    /* Note that obj may be NULL */
    383	    TP_STRUCT__entry(
    384		    __field(unsigned int,			obj	)
    385		    __field(enum cachefiles_coherency_trace,	why	)
    386		    __field(enum cachefiles_content,		content	)
    387		    __field(u64,				ino	)
    388			     ),
    389
    390	    TP_fast_assign(
    391		    __entry->obj	= obj->debug_id;
    392		    __entry->why	= why;
    393		    __entry->content	= content;
    394		    __entry->ino	= ino;
    395			   ),
    396
    397	    TP_printk("o=%08x %s B=%llx c=%u",
    398		      __entry->obj,
    399		      __print_symbolic(__entry->why, cachefiles_coherency_traces),
    400		      __entry->ino,
    401		      __entry->content)
    402	    );
    403
    404TRACE_EVENT(cachefiles_vol_coherency,
    405	    TP_PROTO(struct cachefiles_volume *volume,
    406		     ino_t ino,
    407		     enum cachefiles_coherency_trace why),
    408
    409	    TP_ARGS(volume, ino, why),
    410
    411	    /* Note that obj may be NULL */
    412	    TP_STRUCT__entry(
    413		    __field(unsigned int,			vol	)
    414		    __field(enum cachefiles_coherency_trace,	why	)
    415		    __field(u64,				ino	)
    416			     ),
    417
    418	    TP_fast_assign(
    419		    __entry->vol	= volume->vcookie->debug_id;
    420		    __entry->why	= why;
    421		    __entry->ino	= ino;
    422			   ),
    423
    424	    TP_printk("V=%08x %s B=%llx",
    425		      __entry->vol,
    426		      __print_symbolic(__entry->why, cachefiles_coherency_traces),
    427		      __entry->ino)
    428	    );
    429
    430TRACE_EVENT(cachefiles_prep_read,
    431	    TP_PROTO(struct netfs_io_subrequest *sreq,
    432		     enum netfs_io_source source,
    433		     enum cachefiles_prepare_read_trace why,
    434		     ino_t cache_inode),
    435
    436	    TP_ARGS(sreq, source, why, cache_inode),
    437
    438	    TP_STRUCT__entry(
    439		    __field(unsigned int,		rreq		)
    440		    __field(unsigned short,		index		)
    441		    __field(unsigned short,		flags		)
    442		    __field(enum netfs_io_source,	source		)
    443		    __field(enum cachefiles_prepare_read_trace,	why	)
    444		    __field(size_t,			len		)
    445		    __field(loff_t,			start		)
    446		    __field(unsigned int,		netfs_inode	)
    447		    __field(unsigned int,		cache_inode	)
    448			     ),
    449
    450	    TP_fast_assign(
    451		    __entry->rreq	= sreq->rreq->debug_id;
    452		    __entry->index	= sreq->debug_index;
    453		    __entry->flags	= sreq->flags;
    454		    __entry->source	= source;
    455		    __entry->why	= why;
    456		    __entry->len	= sreq->len;
    457		    __entry->start	= sreq->start;
    458		    __entry->netfs_inode = sreq->rreq->inode->i_ino;
    459		    __entry->cache_inode = cache_inode;
    460			   ),
    461
    462	    TP_printk("R=%08x[%u] %s %s f=%02x s=%llx %zx ni=%x B=%x",
    463		      __entry->rreq, __entry->index,
    464		      __print_symbolic(__entry->source, netfs_sreq_sources),
    465		      __print_symbolic(__entry->why, cachefiles_prepare_read_traces),
    466		      __entry->flags,
    467		      __entry->start, __entry->len,
    468		      __entry->netfs_inode, __entry->cache_inode)
    469	    );
    470
    471TRACE_EVENT(cachefiles_read,
    472	    TP_PROTO(struct cachefiles_object *obj,
    473		     struct inode *backer,
    474		     loff_t start,
    475		     size_t len),
    476
    477	    TP_ARGS(obj, backer, start, len),
    478
    479	    TP_STRUCT__entry(
    480		    __field(unsigned int,			obj	)
    481		    __field(unsigned int,			backer	)
    482		    __field(size_t,				len	)
    483		    __field(loff_t,				start	)
    484			     ),
    485
    486	    TP_fast_assign(
    487		    __entry->obj	= obj->debug_id;
    488		    __entry->backer	= backer->i_ino;
    489		    __entry->start	= start;
    490		    __entry->len	= len;
    491			   ),
    492
    493	    TP_printk("o=%08x B=%x s=%llx l=%zx",
    494		      __entry->obj,
    495		      __entry->backer,
    496		      __entry->start,
    497		      __entry->len)
    498	    );
    499
    500TRACE_EVENT(cachefiles_write,
    501	    TP_PROTO(struct cachefiles_object *obj,
    502		     struct inode *backer,
    503		     loff_t start,
    504		     size_t len),
    505
    506	    TP_ARGS(obj, backer, start, len),
    507
    508	    TP_STRUCT__entry(
    509		    __field(unsigned int,			obj	)
    510		    __field(unsigned int,			backer	)
    511		    __field(size_t,				len	)
    512		    __field(loff_t,				start	)
    513			     ),
    514
    515	    TP_fast_assign(
    516		    __entry->obj	= obj->debug_id;
    517		    __entry->backer	= backer->i_ino;
    518		    __entry->start	= start;
    519		    __entry->len	= len;
    520			   ),
    521
    522	    TP_printk("o=%08x B=%x s=%llx l=%zx",
    523		      __entry->obj,
    524		      __entry->backer,
    525		      __entry->start,
    526		      __entry->len)
    527	    );
    528
    529TRACE_EVENT(cachefiles_trunc,
    530	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
    531		     loff_t from, loff_t to, enum cachefiles_trunc_trace why),
    532
    533	    TP_ARGS(obj, backer, from, to, why),
    534
    535	    TP_STRUCT__entry(
    536		    __field(unsigned int,			obj	)
    537		    __field(unsigned int,			backer	)
    538		    __field(enum cachefiles_trunc_trace,	why	)
    539		    __field(loff_t,				from	)
    540		    __field(loff_t,				to	)
    541			     ),
    542
    543	    TP_fast_assign(
    544		    __entry->obj	= obj->debug_id;
    545		    __entry->backer	= backer->i_ino;
    546		    __entry->from	= from;
    547		    __entry->to		= to;
    548		    __entry->why	= why;
    549			   ),
    550
    551	    TP_printk("o=%08x B=%x %s l=%llx->%llx",
    552		      __entry->obj,
    553		      __entry->backer,
    554		      __print_symbolic(__entry->why, cachefiles_trunc_traces),
    555		      __entry->from,
    556		      __entry->to)
    557	    );
    558
    559TRACE_EVENT(cachefiles_mark_active,
    560	    TP_PROTO(struct cachefiles_object *obj,
    561		     struct inode *inode),
    562
    563	    TP_ARGS(obj, inode),
    564
    565	    /* Note that obj may be NULL */
    566	    TP_STRUCT__entry(
    567		    __field(unsigned int,		obj		)
    568		    __field(ino_t,			inode		)
    569			     ),
    570
    571	    TP_fast_assign(
    572		    __entry->obj	= obj ? obj->debug_id : 0;
    573		    __entry->inode	= inode->i_ino;
    574			   ),
    575
    576	    TP_printk("o=%08x B=%lx",
    577		      __entry->obj, __entry->inode)
    578	    );
    579
    580TRACE_EVENT(cachefiles_mark_failed,
    581	    TP_PROTO(struct cachefiles_object *obj,
    582		     struct inode *inode),
    583
    584	    TP_ARGS(obj, inode),
    585
    586	    /* Note that obj may be NULL */
    587	    TP_STRUCT__entry(
    588		    __field(unsigned int,		obj		)
    589		    __field(ino_t,			inode		)
    590			     ),
    591
    592	    TP_fast_assign(
    593		    __entry->obj	= obj ? obj->debug_id : 0;
    594		    __entry->inode	= inode->i_ino;
    595			   ),
    596
    597	    TP_printk("o=%08x B=%lx",
    598		      __entry->obj, __entry->inode)
    599	    );
    600
    601TRACE_EVENT(cachefiles_mark_inactive,
    602	    TP_PROTO(struct cachefiles_object *obj,
    603		     struct inode *inode),
    604
    605	    TP_ARGS(obj, inode),
    606
    607	    /* Note that obj may be NULL */
    608	    TP_STRUCT__entry(
    609		    __field(unsigned int,		obj		)
    610		    __field(ino_t,			inode		)
    611			     ),
    612
    613	    TP_fast_assign(
    614		    __entry->obj	= obj ? obj->debug_id : 0;
    615		    __entry->inode	= inode->i_ino;
    616			   ),
    617
    618	    TP_printk("o=%08x B=%lx",
    619		      __entry->obj, __entry->inode)
    620	    );
    621
    622TRACE_EVENT(cachefiles_vfs_error,
    623	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
    624		     int error, enum cachefiles_error_trace where),
    625
    626	    TP_ARGS(obj, backer, error, where),
    627
    628	    TP_STRUCT__entry(
    629		    __field(unsigned int,			obj	)
    630		    __field(unsigned int,			backer	)
    631		    __field(enum cachefiles_error_trace,	where	)
    632		    __field(short,				error	)
    633			     ),
    634
    635	    TP_fast_assign(
    636		    __entry->obj	= obj ? obj->debug_id : 0;
    637		    __entry->backer	= backer->i_ino;
    638		    __entry->error	= error;
    639		    __entry->where	= where;
    640			   ),
    641
    642	    TP_printk("o=%08x B=%x %s e=%d",
    643		      __entry->obj,
    644		      __entry->backer,
    645		      __print_symbolic(__entry->where, cachefiles_error_traces),
    646		      __entry->error)
    647	    );
    648
    649TRACE_EVENT(cachefiles_io_error,
    650	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
    651		     int error, enum cachefiles_error_trace where),
    652
    653	    TP_ARGS(obj, backer, error, where),
    654
    655	    TP_STRUCT__entry(
    656		    __field(unsigned int,			obj	)
    657		    __field(unsigned int,			backer	)
    658		    __field(enum cachefiles_error_trace,	where	)
    659		    __field(short,				error	)
    660			     ),
    661
    662	    TP_fast_assign(
    663		    __entry->obj	= obj ? obj->debug_id : 0;
    664		    __entry->backer	= backer->i_ino;
    665		    __entry->error	= error;
    666		    __entry->where	= where;
    667			   ),
    668
    669	    TP_printk("o=%08x B=%x %s e=%d",
    670		      __entry->obj,
    671		      __entry->backer,
    672		      __print_symbolic(__entry->where, cachefiles_error_traces),
    673		      __entry->error)
    674	    );
    675
    676TRACE_EVENT(cachefiles_ondemand_open,
    677	    TP_PROTO(struct cachefiles_object *obj, struct cachefiles_msg *msg,
    678		     struct cachefiles_open *load),
    679
    680	    TP_ARGS(obj, msg, load),
    681
    682	    TP_STRUCT__entry(
    683		    __field(unsigned int,	obj		)
    684		    __field(unsigned int,	msg_id		)
    685		    __field(unsigned int,	object_id	)
    686		    __field(unsigned int,	fd		)
    687		    __field(unsigned int,	flags		)
    688			     ),
    689
    690	    TP_fast_assign(
    691		    __entry->obj	= obj ? obj->debug_id : 0;
    692		    __entry->msg_id	= msg->msg_id;
    693		    __entry->object_id	= msg->object_id;
    694		    __entry->fd		= load->fd;
    695		    __entry->flags	= load->flags;
    696			   ),
    697
    698	    TP_printk("o=%08x mid=%x oid=%x fd=%d f=%x",
    699		      __entry->obj,
    700		      __entry->msg_id,
    701		      __entry->object_id,
    702		      __entry->fd,
    703		      __entry->flags)
    704	    );
    705
    706TRACE_EVENT(cachefiles_ondemand_copen,
    707	    TP_PROTO(struct cachefiles_object *obj, unsigned int msg_id,
    708		     long len),
    709
    710	    TP_ARGS(obj, msg_id, len),
    711
    712	    TP_STRUCT__entry(
    713		    __field(unsigned int,	obj	)
    714		    __field(unsigned int,	msg_id	)
    715		    __field(long,		len	)
    716			     ),
    717
    718	    TP_fast_assign(
    719		    __entry->obj	= obj ? obj->debug_id : 0;
    720		    __entry->msg_id	= msg_id;
    721		    __entry->len	= len;
    722			   ),
    723
    724	    TP_printk("o=%08x mid=%x l=%lx",
    725		      __entry->obj,
    726		      __entry->msg_id,
    727		      __entry->len)
    728	    );
    729
    730TRACE_EVENT(cachefiles_ondemand_close,
    731	    TP_PROTO(struct cachefiles_object *obj, struct cachefiles_msg *msg),
    732
    733	    TP_ARGS(obj, msg),
    734
    735	    TP_STRUCT__entry(
    736		    __field(unsigned int,	obj		)
    737		    __field(unsigned int,	msg_id		)
    738		    __field(unsigned int,	object_id	)
    739			     ),
    740
    741	    TP_fast_assign(
    742		    __entry->obj	= obj ? obj->debug_id : 0;
    743		    __entry->msg_id	= msg->msg_id;
    744		    __entry->object_id	= msg->object_id;
    745			   ),
    746
    747	    TP_printk("o=%08x mid=%x oid=%x",
    748		      __entry->obj,
    749		      __entry->msg_id,
    750		      __entry->object_id)
    751	    );
    752
    753TRACE_EVENT(cachefiles_ondemand_read,
    754	    TP_PROTO(struct cachefiles_object *obj, struct cachefiles_msg *msg,
    755		     struct cachefiles_read *load),
    756
    757	    TP_ARGS(obj, msg, load),
    758
    759	    TP_STRUCT__entry(
    760		    __field(unsigned int,	obj		)
    761		    __field(unsigned int,	msg_id		)
    762		    __field(unsigned int,	object_id	)
    763		    __field(loff_t,		start		)
    764		    __field(size_t,		len		)
    765			     ),
    766
    767	    TP_fast_assign(
    768		    __entry->obj	= obj ? obj->debug_id : 0;
    769		    __entry->msg_id	= msg->msg_id;
    770		    __entry->object_id	= msg->object_id;
    771		    __entry->start	= load->off;
    772		    __entry->len	= load->len;
    773			   ),
    774
    775	    TP_printk("o=%08x mid=%x oid=%x s=%llx l=%zx",
    776		      __entry->obj,
    777		      __entry->msg_id,
    778		      __entry->object_id,
    779		      __entry->start,
    780		      __entry->len)
    781	    );
    782
    783TRACE_EVENT(cachefiles_ondemand_cread,
    784	    TP_PROTO(struct cachefiles_object *obj, unsigned int msg_id),
    785
    786	    TP_ARGS(obj, msg_id),
    787
    788	    TP_STRUCT__entry(
    789		    __field(unsigned int,	obj	)
    790		    __field(unsigned int,	msg_id	)
    791			     ),
    792
    793	    TP_fast_assign(
    794		    __entry->obj	= obj ? obj->debug_id : 0;
    795		    __entry->msg_id	= msg_id;
    796			   ),
    797
    798	    TP_printk("o=%08x mid=%x",
    799		      __entry->obj,
    800		      __entry->msg_id)
    801	    );
    802
    803TRACE_EVENT(cachefiles_ondemand_fd_write,
    804	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
    805		     loff_t start, size_t len),
    806
    807	    TP_ARGS(obj, backer, start, len),
    808
    809	    TP_STRUCT__entry(
    810		    __field(unsigned int,	obj	)
    811		    __field(unsigned int,	backer	)
    812		    __field(loff_t,		start	)
    813		    __field(size_t,		len	)
    814			     ),
    815
    816	    TP_fast_assign(
    817		    __entry->obj	= obj ? obj->debug_id : 0;
    818		    __entry->backer	= backer->i_ino;
    819		    __entry->start	= start;
    820		    __entry->len	= len;
    821			   ),
    822
    823	    TP_printk("o=%08x iB=%x s=%llx l=%zx",
    824		      __entry->obj,
    825		      __entry->backer,
    826		      __entry->start,
    827		      __entry->len)
    828	    );
    829
    830TRACE_EVENT(cachefiles_ondemand_fd_release,
    831	    TP_PROTO(struct cachefiles_object *obj, int object_id),
    832
    833	    TP_ARGS(obj, object_id),
    834
    835	    TP_STRUCT__entry(
    836		    __field(unsigned int,	obj		)
    837		    __field(unsigned int,	object_id	)
    838			     ),
    839
    840	    TP_fast_assign(
    841		    __entry->obj	= obj ? obj->debug_id : 0;
    842		    __entry->object_id	= object_id;
    843			   ),
    844
    845	    TP_printk("o=%08x oid=%x",
    846		      __entry->obj,
    847		      __entry->object_id)
    848	    );
    849
    850#endif /* _TRACE_CACHEFILES_H */
    851
    852/* This part must be outside protection */
    853#include <trace/define_trace.h>