[Virtio-fs] [PATCH 3/3] virtio-fs: add tracepoints

Masayoshi Mizuma msys.mizuma at gmail.com
Mon Aug 12 21:04:55 UTC 2019


From: Masayoshi Mizuma <m.mizuma at jp.fujitsu.com>

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-1432        [006] .... 37.592694: virtio_fs_request_dispatched:
      opcode FUSE_READ unique 0x1a nodeid 0x2 in.len 80 flags
      ISREPLY|WAITING|SENT notify 1
  kworker/4:1-103 [004] .... 37.592809: virtio_fs_request_done:
      opcode FUSE_READ unique 0x1a nodeid 0x2 in.len 80 flags
      ISREPLY|WAITING

Signed-off-by: Masayoshi Mizuma <m.mizuma at jp.fujitsu.com>
---
 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..c348f745e 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/virtio_fs.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_virtio_fs_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_virtio_fs_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_virtio_fs_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_virtio_fs_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




More information about the Virtio-fs mailing list