From: Masayoshi Mizuma <[email protected]>

Add tracepoint to the following function. It will be useful
to debug the I/O request flow.

  - virtio_fs_enqueue_req
  - virtio_fs_requests_done_work
  - virtio_fs_hiprio_dispatch_work
  - virtio_fs_hiprio_done_work

Example of the trace record:

  cat-1420        [002] .... 34.687462: virtiofs_request_dispatched: opcode
      FUSE_READ unique 0x1a nodeid 0x2 in.len 80 flags ISREPLY|WAITING|SENT
      notify 1
  kworker/4:1-67  [004] .... 34.687531: virtiofs_request_done: opcode FUSE_READ
      unique 0x1a nodeid 0x2 in.len 80 flags ISREPLY|WAITING

Signed-off-by: Masayoshi Mizuma <[email protected]>
---
 fs/fuse/virtio_fs.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/fs/fuse/virtio_fs.c b/fs/fuse/virtio_fs.c
index 558d090af..611da2765 100644
--- a/fs/fuse/virtio_fs.c
+++ b/fs/fuse/virtio_fs.c
@@ -14,6 +14,9 @@
 #include <linux/delay.h>
 #include "fuse_i.h"

+#define CREATE_TRACE_POINTS
+#include <trace/events/virtiofs.h>
+
 /* List of virtio-fs device instances and a lock for the list */
 static DEFINE_MUTEX(virtio_fs_mutex);
 static LIST_HEAD(virtio_fs_instances);
@@ -175,6 +178,7 @@ static void virtio_fs_hiprio_done_work(struct work_struct 
*work)
        struct virtio_fs_vq *fsvq = container_of(work, struct virtio_fs_vq,
                                                 done_work);
        struct virtqueue *vq = fsvq->vq;
+       struct virtio_fs_forget *forget;

        /* Free completed FUSE_FORGET requests */
        spin_lock(&fsvq->lock);
@@ -185,6 +189,10 @@ static void virtio_fs_hiprio_done_work(struct work_struct 
*work)
                virtqueue_disable_cb(vq);

                while ((req = virtqueue_get_buf(vq, &len)) != NULL) {
+                       forget = (struct virtio_fs_forget *)req;
+                       trace_virtiofs_hiprio_request_done(
+                               forget->ih.opcode, forget->ih.unique,
+                               forget->ih.nodeid, forget->ih.len);
                        kfree(req);
                        fsvq->in_flight--;
                }
@@ -251,6 +259,11 @@ static void virtio_fs_hiprio_dispatch_work(struct 
work_struct *work)
                notify = virtqueue_kick_prepare(vq);
                spin_unlock(&fsvq->lock);

+               trace_virtiofs_hiprio_request_dispatched(
+                       forget->ih.opcode, forget->ih.unique,
+                       forget->ih.nodeid, forget->ih.len,
+                       notify);
+
                if (notify)
                        virtqueue_notify(vq);
                pr_debug("worker virtio_fs_hiprio_dispatch_work() dispatched 
one forget request.\n");
@@ -364,6 +377,10 @@ static void virtio_fs_requests_done_work(struct 
work_struct *work)
                list_del_init(&req->list);
                spin_unlock(&fpq->lock);

+               trace_virtiofs_request_done(
+                       req->in.h.opcode, req->in.h.unique,
+                       req->in.h.nodeid, req->in.h.len, req->flags);
+
                fuse_request_end(fc, req);
        }
 }
@@ -914,6 +931,10 @@ static int virtio_fs_enqueue_req(struct virtqueue *vq, 
struct fuse_req *req)

        spin_unlock(&fsvq->lock);

+       trace_virtiofs_request_dispatched(
+               req->in.h.opcode, req->in.h.unique,
+               req->in.h.nodeid, req->in.h.len, req->flags, notify);
+
        if (notify)
                virtqueue_notify(vq);

-- 
2.18.1

Reply via email to