Add tracepoints for read and write operations on cache files. Signed-off-by: David Howells <dhowells@xxxxxxxxxx> --- fs/cachefiles/io.c | 6 +++- include/trace/events/cachefiles.h | 58 +++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/fs/cachefiles/io.c b/fs/cachefiles/io.c index 0e1fb44b5d04..f703a93e238b 100644 --- a/fs/cachefiles/io.c +++ b/fs/cachefiles/io.c @@ -62,6 +62,7 @@ static int cachefiles_read(struct netfs_cache_resources *cres, netfs_io_terminated_t term_func, void *term_func_priv) { + struct cachefiles_object *object = cres->cache_priv; struct cachefiles_kiocb *ki; struct file *file = cachefiles_cres_file(cres); unsigned int old_nofs; @@ -124,6 +125,7 @@ static int cachefiles_read(struct netfs_cache_resources *cres, get_file(ki->iocb.ki_filp); + trace_cachefiles_read(object, file_inode(file), ki->iocb.ki_pos, len - skipped); old_nofs = memalloc_nofs_save(); ret = vfs_iocb_iter_read(file, &ki->iocb, iter); memalloc_nofs_restore(old_nofs); @@ -188,6 +190,7 @@ static int cachefiles_write(struct netfs_cache_resources *cres, netfs_io_terminated_t term_func, void *term_func_priv) { + struct cachefiles_object *object = cres->cache_priv; struct cachefiles_kiocb *ki; struct inode *inode; struct file *file = cachefiles_cres_file(cres); @@ -229,6 +232,7 @@ static int cachefiles_write(struct netfs_cache_resources *cres, get_file(ki->iocb.ki_filp); + trace_cachefiles_write(object, inode, ki->iocb.ki_pos, len); old_nofs = memalloc_nofs_save(); ret = vfs_iocb_iter_write(file, &ki->iocb, iter); memalloc_nofs_restore(old_nofs); @@ -418,7 +422,7 @@ int cachefiles_begin_operation(struct netfs_cache_resources *cres) _enter(""); - cres->cache_priv = op; + cres->cache_priv = object; cres->cache_priv2 = get_file(object->file); cres->ops = &cachefiles_netfs_cache_ops; cres->debug_id = object->cookie->debug_id; diff --git a/include/trace/events/cachefiles.h b/include/trace/events/cachefiles.h index 09d76c160451..47df44550ad6 100644 --- a/include/trace/events/cachefiles.h +++ b/include/trace/events/cachefiles.h @@ -302,6 +302,64 @@ TRACE_EVENT(cachefiles_coherency, __entry->content) ); +TRACE_EVENT(cachefiles_read, + TP_PROTO(struct cachefiles_object *obj, + struct inode *backer, + loff_t start, + size_t len), + + TP_ARGS(obj, backer, start, len), + + TP_STRUCT__entry( + __field(unsigned int, obj ) + __field(unsigned int, backer ) + __field(size_t, len ) + __field(loff_t, start ) + ), + + TP_fast_assign( + __entry->obj = obj->debug_id; + __entry->backer = backer->i_ino; + __entry->start = start; + __entry->len = len; + ), + + TP_printk("o=%08x b=%08x s=%llx l=%zx", + __entry->obj, + __entry->backer, + __entry->start, + __entry->len) + ); + +TRACE_EVENT(cachefiles_write, + TP_PROTO(struct cachefiles_object *obj, + struct inode *backer, + loff_t start, + size_t len), + + TP_ARGS(obj, backer, start, len), + + TP_STRUCT__entry( + __field(unsigned int, obj ) + __field(unsigned int, backer ) + __field(size_t, len ) + __field(loff_t, start ) + ), + + TP_fast_assign( + __entry->obj = obj->debug_id; + __entry->backer = backer->i_ino; + __entry->start = start; + __entry->len = len; + ), + + TP_printk("o=%08x b=%08x s=%llx l=%zx", + __entry->obj, + __entry->backer, + __entry->start, + __entry->len) + ); + TRACE_EVENT(cachefiles_trunc, TP_PROTO(struct cachefiles_object *obj, struct inode *backer, loff_t from, loff_t to, enum cachefiles_trunc_trace why),