Add tracepoints for on-demand read mode. Currently following tracepoints
are added:

        OPEN request / COPEN reply
        CLOSE request
        READ request / CREAD reply
        write through anonymous fd
        release of anonymous fd

Signed-off-by: Jeffle Xu <jeffl...@linux.alibaba.com>
Acked-by: David Howells <dhowe...@redhat.com>
---
 fs/cachefiles/ondemand.c          |   7 ++
 include/trace/events/cachefiles.h | 174 ++++++++++++++++++++++++++++++
 2 files changed, 181 insertions(+)

diff --git a/fs/cachefiles/ondemand.c b/fs/cachefiles/ondemand.c
index 3470d4e8f0cb..a41ae6efc545 100644
--- a/fs/cachefiles/ondemand.c
+++ b/fs/cachefiles/ondemand.c
@@ -30,6 +30,7 @@ static int cachefiles_ondemand_fd_release(struct inode *inode,
        xa_unlock(&cache->reqs);
 
        xa_erase(&cache->ondemand_ids, object_id);
+       trace_cachefiles_ondemand_fd_release(object, object_id);
        cachefiles_put_object(object, cachefiles_obj_put_ondemand_fd);
        cachefiles_put_unbind_pincount(cache);
        return 0;
@@ -55,6 +56,7 @@ static ssize_t cachefiles_ondemand_fd_write_iter(struct kiocb 
*kiocb,
        if (ret < 0)
                return ret;
 
+       trace_cachefiles_ondemand_fd_write(object, file_inode(file), pos, len);
        ret = __cachefiles_write(object, file, pos, iter, NULL, NULL);
        if (!ret)
                ret = len;
@@ -93,6 +95,7 @@ static long cachefiles_ondemand_fd_ioctl(struct file *filp, 
unsigned int ioctl,
        if (!req)
                return -EINVAL;
 
+       trace_cachefiles_ondemand_cread(object, id);
        complete(&req->done);
        return 0;
 }
@@ -166,6 +169,7 @@ int cachefiles_ondemand_copen(struct cachefiles_cache 
*cache, char *args)
                clear_bit(FSCACHE_COOKIE_NO_DATA_TO_READ, &cookie->flags);
        else
                set_bit(FSCACHE_COOKIE_NO_DATA_TO_READ, &cookie->flags);
+       trace_cachefiles_ondemand_copen(req->object, id, size);
 
 out:
        complete(&req->done);
@@ -213,6 +217,7 @@ static int cachefiles_ondemand_get_fd(struct cachefiles_req 
*req)
        object->ondemand_id = object_id;
 
        cachefiles_get_unbind_pincount(cache);
+       trace_cachefiles_ondemand_open(object, &req->msg, load);
        return 0;
 
 err_put_fd:
@@ -426,6 +431,7 @@ static int cachefiles_ondemand_init_close_req(struct 
cachefiles_req *req,
                return -ENOENT;
 
        req->msg.object_id = object_id;
+       trace_cachefiles_ondemand_close(object, &req->msg);
        return 0;
 }
 
@@ -452,6 +458,7 @@ static int cachefiles_ondemand_init_read_req(struct 
cachefiles_req *req,
        req->msg.object_id = object_id;
        load->off = read_ctx->off;
        load->len = read_ctx->len;
+       trace_cachefiles_ondemand_read(object, &req->msg, load);
        return 0;
 }
 
diff --git a/include/trace/events/cachefiles.h 
b/include/trace/events/cachefiles.h
index 93df9391bd7f..d8d4d73fe7b6 100644
--- a/include/trace/events/cachefiles.h
+++ b/include/trace/events/cachefiles.h
@@ -673,6 +673,180 @@ TRACE_EVENT(cachefiles_io_error,
                      __entry->error)
            );
 
+TRACE_EVENT(cachefiles_ondemand_open,
+           TP_PROTO(struct cachefiles_object *obj, struct cachefiles_msg *msg,
+                    struct cachefiles_open *load),
+
+           TP_ARGS(obj, msg, load),
+
+           TP_STRUCT__entry(
+                   __field(unsigned int,       obj             )
+                   __field(unsigned int,       msg_id          )
+                   __field(unsigned int,       object_id       )
+                   __field(unsigned int,       fd              )
+                   __field(unsigned int,       flags           )
+                            ),
+
+           TP_fast_assign(
+                   __entry->obj        = obj ? obj->debug_id : 0;
+                   __entry->msg_id     = msg->msg_id;
+                   __entry->object_id  = msg->object_id;
+                   __entry->fd         = load->fd;
+                   __entry->flags      = load->flags;
+                          ),
+
+           TP_printk("o=%08x mid=%x oid=%x fd=%d f=%x",
+                     __entry->obj,
+                     __entry->msg_id,
+                     __entry->object_id,
+                     __entry->fd,
+                     __entry->flags)
+           );
+
+TRACE_EVENT(cachefiles_ondemand_copen,
+           TP_PROTO(struct cachefiles_object *obj, unsigned int msg_id,
+                    long len),
+
+           TP_ARGS(obj, msg_id, len),
+
+           TP_STRUCT__entry(
+                   __field(unsigned int,       obj     )
+                   __field(unsigned int,       msg_id  )
+                   __field(long,               len     )
+                            ),
+
+           TP_fast_assign(
+                   __entry->obj        = obj ? obj->debug_id : 0;
+                   __entry->msg_id     = msg_id;
+                   __entry->len        = len;
+                          ),
+
+           TP_printk("o=%08x mid=%x l=%lx",
+                     __entry->obj,
+                     __entry->msg_id,
+                     __entry->len)
+           );
+
+TRACE_EVENT(cachefiles_ondemand_close,
+           TP_PROTO(struct cachefiles_object *obj, struct cachefiles_msg *msg),
+
+           TP_ARGS(obj, msg),
+
+           TP_STRUCT__entry(
+                   __field(unsigned int,       obj             )
+                   __field(unsigned int,       msg_id          )
+                   __field(unsigned int,       object_id       )
+                            ),
+
+           TP_fast_assign(
+                   __entry->obj        = obj ? obj->debug_id : 0;
+                   __entry->msg_id     = msg->msg_id;
+                   __entry->object_id  = msg->object_id;
+                          ),
+
+           TP_printk("o=%08x mid=%x oid=%x",
+                     __entry->obj,
+                     __entry->msg_id,
+                     __entry->object_id)
+           );
+
+TRACE_EVENT(cachefiles_ondemand_read,
+           TP_PROTO(struct cachefiles_object *obj, struct cachefiles_msg *msg,
+                    struct cachefiles_read *load),
+
+           TP_ARGS(obj, msg, load),
+
+           TP_STRUCT__entry(
+                   __field(unsigned int,       obj             )
+                   __field(unsigned int,       msg_id          )
+                   __field(unsigned int,       object_id       )
+                   __field(loff_t,             start           )
+                   __field(size_t,             len             )
+                            ),
+
+           TP_fast_assign(
+                   __entry->obj        = obj ? obj->debug_id : 0;
+                   __entry->msg_id     = msg->msg_id;
+                   __entry->object_id  = msg->object_id;
+                   __entry->start      = load->off;
+                   __entry->len        = load->len;
+                          ),
+
+           TP_printk("o=%08x mid=%x oid=%x s=%llx l=%zx",
+                     __entry->obj,
+                     __entry->msg_id,
+                     __entry->object_id,
+                     __entry->start,
+                     __entry->len)
+           );
+
+TRACE_EVENT(cachefiles_ondemand_cread,
+           TP_PROTO(struct cachefiles_object *obj, unsigned int msg_id),
+
+           TP_ARGS(obj, msg_id),
+
+           TP_STRUCT__entry(
+                   __field(unsigned int,       obj     )
+                   __field(unsigned int,       msg_id  )
+                            ),
+
+           TP_fast_assign(
+                   __entry->obj        = obj ? obj->debug_id : 0;
+                   __entry->msg_id     = msg_id;
+                          ),
+
+           TP_printk("o=%08x mid=%x",
+                     __entry->obj,
+                     __entry->msg_id)
+           );
+
+TRACE_EVENT(cachefiles_ondemand_fd_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(loff_t,             start   )
+                   __field(size_t,             len     )
+                            ),
+
+           TP_fast_assign(
+                   __entry->obj        = obj ? obj->debug_id : 0;
+                   __entry->backer     = backer->i_ino;
+                   __entry->start      = start;
+                   __entry->len        = len;
+                          ),
+
+           TP_printk("o=%08x iB=%x s=%llx l=%zx",
+                     __entry->obj,
+                     __entry->backer,
+                     __entry->start,
+                     __entry->len)
+           );
+
+TRACE_EVENT(cachefiles_ondemand_fd_release,
+           TP_PROTO(struct cachefiles_object *obj, int object_id),
+
+           TP_ARGS(obj, object_id),
+
+           TP_STRUCT__entry(
+                   __field(unsigned int,       obj             )
+                   __field(unsigned int,       object_id       )
+                            ),
+
+           TP_fast_assign(
+                   __entry->obj        = obj ? obj->debug_id : 0;
+                   __entry->object_id  = object_id;
+                          ),
+
+           TP_printk("o=%08x oid=%x",
+                     __entry->obj,
+                     __entry->object_id)
+           );
+
 #endif /* _TRACE_CACHEFILES_H */
 
 /* This part must be outside protection */
-- 
2.27.0

--
Linux-cachefs mailing list
Linux-cachefs@redhat.com
https://listman.redhat.com/mailman/listinfo/linux-cachefs

Reply via email to