[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[UNIKRAFT PATCH 2/7] lib/uk9p: Use uk_trace instead of uk_pr_debug



This patch enables nanosecond-resolution tracing of 9pfs performance
without the added noise of having to output the message; the same
mechanism can also be used to inspect the behavior of the protocol.

Excerpt from the output traces for a read() with in-depth tracing:
607016885  uk_9p_trace_read               fid 2 offset 61440 count 4096
607020599  uk_9p_trace_request_allocated
607020627  uk_9p_trace_ready              tag 0
607023469  uk_9p_trace_sent               tag 0
607062214  uk_9p_trace_received           tag 0
607062258  uk_9p_trace_read_end           count 4096

Signed-off-by: Cristian Banu <cristb@xxxxxxxxx>
---
 lib/uk9p/9p.c | 205 +++++++++++++++++++++++++++++++++++---------------
 1 file changed, 145 insertions(+), 60 deletions(-)

diff --git a/lib/uk9p/9p.c b/lib/uk9p/9p.c
index 638555b..d6ba3cf 100644
--- a/lib/uk9p/9p.c
+++ b/lib/uk9p/9p.c
@@ -40,16 +40,40 @@
 #include <uk/9preq.h>
 #include <uk/9pfid.h>
 
+/*
+ * Define UK_DEBUG_TRACE to enable traces in this file.
+ * Also define UK_9P_INDEPTH_TRACES to enable more in-depth traces.
+ *
+ * These lines must be added before including uk/trace.h.
+ */
+#include <uk/trace.h>
+
+UK_TRACEPOINT(uk_9p_trace_ready, "tag %u", uint16_t);
+UK_TRACEPOINT(uk_9p_trace_sent, "tag %u", uint16_t);
+UK_TRACEPOINT(uk_9p_trace_received, "tag %u", uint16_t);
+UK_TRACEPOINT(uk_9p_trace_request_allocated, "");
+
 static inline int send_and_wait_zc(struct uk_9pdev *dev, struct uk_9preq *req,
                enum uk_9preq_zcdir zc_dir, void *zc_buf, uint32_t zc_size,
                uint32_t zc_offset)
 {
        int rc;
 
-       if ((rc = uk_9preq_ready(req, zc_dir, zc_buf, zc_size, zc_offset)) ||
-               (rc = uk_9pdev_request(dev, req)) ||
-               (rc = uk_9preq_waitreply(req)))
+       if ((rc = uk_9preq_ready(req, zc_dir, zc_buf, zc_size, zc_offset)))
+               return rc;
+#ifdef UK_9P_INDEPTH_TRACES
+       uk_9p_trace_ready(req->tag);
+#endif
+       if ((rc = uk_9pdev_request(dev, req)))
                return rc;
+#ifdef UK_9P_INDEPTH_TRACES
+       uk_9p_trace_sent(req->tag);
+#endif
+       if ((rc = uk_9preq_waitreply(req)))
+               return rc;
+#ifdef UK_9P_INDEPTH_TRACES
+       uk_9p_trace_received(req->tag);
+#endif
 
        return 0;
 }
@@ -60,6 +84,10 @@ static inline int send_and_wait_no_zc(struct uk_9pdev *dev,
        return send_and_wait_zc(dev, req, UK_9PREQ_ZCDIR_NONE, NULL, 0, 0);
 }
 
+UK_TRACEPOINT(uk_9p_trace_version, "msize %u version %s",
+               uint32_t, const char *);
+UK_TRACEPOINT(uk_9p_trace_version_end, "msize %u", uint32_t);
+
 struct uk_9preq *uk_9p_version(struct uk_9pdev *dev,
                const char *requested, struct uk_9p_str *received)
 {
@@ -68,14 +96,16 @@ struct uk_9preq *uk_9p_version(struct uk_9pdev *dev,
        int rc = 0;
        uint32_t new_msize;
 
+       uk_9p_trace_version(dev->msize, requested);
        uk_9p_str_init(&requested_str, requested);
 
        req = uk_9pdev_req_create(dev, UK_9P_TVERSION, __PAGE_SIZE);
        if (PTRISERR(req))
                return req;
 
-       uk_pr_debug("TVERSION msize %u version %s\n",
-                       dev->msize, requested);
+#ifdef UK_9P_INDEPTH_TRACES
+       uk_9p_trace_request_allocated();
+#endif
 
        if ((rc = uk_9preq_write32(req, dev->msize)) ||
                (rc = uk_9preq_writestr(req, &requested_str)) ||
@@ -83,9 +113,7 @@ struct uk_9preq *uk_9p_version(struct uk_9pdev *dev,
                (rc = uk_9preq_read32(req, &new_msize)) ||
                (rc = uk_9preq_readstr(req, received)))
                goto free;
-
-       uk_pr_debug("RVERSION msize %u version %.*s\n", new_msize,
-                       received->size, received->data);
+       uk_9p_trace_version_end(new_msize);
 
        /*
         * Note: the 9P specification mentions that new_msize <= dev->msize.
@@ -103,6 +131,11 @@ free:
        return ERR2PTR(rc);
 }
 
+UK_TRACEPOINT(uk_9p_trace_attach, "fid %u afid %u uname %s aname %s n_uname 
%u",
+               uint32_t, uint32_t, const char *, const char *, uint32_t);
+UK_TRACEPOINT(uk_9p_trace_attach_end, "qid type %u version %u path %lu",
+               uint32_t, uint32_t, uint64_t);
+
 struct uk_9pfid *uk_9p_attach(struct uk_9pdev *dev, uint32_t afid,
                const char *uname, const char *aname, uint32_t n_uname)
 {
@@ -119,16 +152,18 @@ struct uk_9pfid *uk_9p_attach(struct uk_9pdev *dev, 
uint32_t afid,
        if (PTRISERR(fid))
                return fid;
 
+       uk_9p_trace_attach(fid->fid, afid, uname, aname, n_uname);
+
        req = uk_9pdev_req_create(dev, UK_9P_TATTACH, __PAGE_SIZE);
        if (PTRISERR(req)) {
                uk_9pdev_fid_release(fid);
                return (void *)req;
        }
 
-       uk_pr_debug("TATTACH fid %u afid %u uname %s aname %s n_uname %u\n",
-                       fid->fid, afid, uname, aname, n_uname);
+#ifdef UK_9P_INDEPTH_TRACES
+       uk_9p_trace_request_allocated();
+#endif
 
-       rc = 0;
        if ((rc = uk_9preq_write32(req, fid->fid)) ||
                (rc = uk_9preq_write32(req, afid)) ||
                (rc = uk_9preq_writestr(req, &uname_str)) ||
@@ -137,11 +172,8 @@ struct uk_9pfid *uk_9p_attach(struct uk_9pdev *dev, 
uint32_t afid,
                (rc = send_and_wait_no_zc(dev, req)) ||
                (rc = uk_9preq_readqid(req, &fid->qid)))
                goto free;
-
        uk_9pdev_req_remove(dev, req);
-
-       uk_pr_debug("RATTACH qid type %u version %u path %lu\n",
-                       fid->qid.type, fid->qid.version, fid->qid.path);
+       uk_9p_trace_attach_end(fid->qid.type, fid->qid.version, fid->qid.path);
 
        return fid;
 
@@ -151,26 +183,38 @@ free:
        return ERR2PTR(rc);
 }
 
+UK_TRACEPOINT(uk_9p_trace_flush, "oldtag %u", uint32_t);
+UK_TRACEPOINT(uk_9p_trace_flush_end, "");
+
 int uk_9p_flush(struct uk_9pdev *dev, uint16_t oldtag)
 {
        struct uk_9preq *req;
        int rc = 0;
 
+       uk_9p_trace_flush(oldtag);
+
        req = uk_9pdev_req_create(dev, UK_9P_TFLUSH, __PAGE_SIZE);
        if (PTRISERR(req))
                return PTR2ERR(req);
 
-       uk_pr_debug("TFLUSH oldtag %u\n", oldtag);
+#ifdef UK_9P_INDEPTH_TRACES
+       uk_9p_trace_request_allocated();
+#endif
+
        if ((rc = uk_9preq_write16(req, oldtag)) ||
                (rc = send_and_wait_no_zc(dev, req)))
                goto out;
-       uk_pr_debug("RFLUSH\n");
+       uk_9p_trace_flush_end();
 
 out:
        uk_9pdev_req_remove(dev, req);
        return rc;
 }
 
+UK_TRACEPOINT(uk_9p_trace_walk, "fid %u newfid %u name %s",
+               uint32_t, uint32_t, const char *);
+UK_TRACEPOINT(uk_9p_trace_walk_end, "nwqid %u", uint32_t);
+
 struct uk_9pfid *uk_9p_walk(struct uk_9pdev *dev, struct uk_9pfid *fid,
                const char *name)
 {
@@ -187,6 +231,7 @@ struct uk_9pfid *uk_9p_walk(struct uk_9pdev *dev, struct 
uk_9pfid *fid,
        if (PTRISERR(newfid))
                return newfid;
 
+       uk_9p_trace_walk(fid->fid, newfid->fid, name ? name : "<NULL>");
        nwname = name ? 1 : 0;
 
        req = uk_9pdev_req_create(dev, UK_9P_TWALK, __PAGE_SIZE);
@@ -195,22 +240,16 @@ struct uk_9pfid *uk_9p_walk(struct uk_9pdev *dev, struct 
uk_9pfid *fid,
                goto out;
        }
 
-       if (name) {
-               uk_pr_debug("TWALK fid %u newfid %u nwname %d name %s\n",
-                               fid->fid, newfid->fid, nwname, name);
-               if ((rc = uk_9preq_write32(req, fid->fid)) ||
-                       (rc = uk_9preq_write32(req, newfid->fid)) ||
-                       (rc = uk_9preq_write16(req, nwname)) ||
-                       (rc = uk_9preq_writestr(req, &name_str)))
-                       goto out;
-       } else {
-               uk_pr_debug("TWALK fid %u newfid %u nwname %d\n",
-                               fid->fid, newfid->fid, nwname);
-               if ((rc = uk_9preq_write32(req, fid->fid)) ||
-                       (rc = uk_9preq_write32(req, newfid->fid)) ||
-                       (rc = uk_9preq_write16(req, nwname)))
-                       goto out;
-       }
+#ifdef UK_9P_INDEPTH_TRACES
+       uk_9p_trace_request_allocated();
+#endif
+
+       if ((rc = uk_9preq_write32(req, fid->fid)) ||
+               (rc = uk_9preq_write32(req, newfid->fid)) ||
+               (rc = uk_9preq_write16(req, nwname)))
+               goto out;
+       if (name && (rc = uk_9preq_writestr(req, &name_str)))
+               goto out;
 
        if ((rc = send_and_wait_no_zc(dev, req))) {
                /*
@@ -224,7 +263,7 @@ struct uk_9pfid *uk_9p_walk(struct uk_9pdev *dev, struct 
uk_9pfid *fid,
        if ((rc = uk_9preq_read16(req, &nwqid)))
                goto out;
 
-       uk_pr_debug("RWALK nwqid %u\n", nwqid);
+       uk_9p_trace_walk_end(nwqid);
 
        if (nwqid != nwname) {
                rc = -ENOENT;
@@ -247,16 +286,24 @@ out:
        return newfid;
 }
 
+UK_TRACEPOINT(uk_9p_trace_open, "fid %u mode %u", uint32_t, uint32_t);
+UK_TRACEPOINT(uk_9p_trace_open_end,
+               "qid type %u version %u path %lu, iounit %u",
+               uint32_t, uint32_t, uint64_t, uint32_t);
+
 int uk_9p_open(struct uk_9pdev *dev, struct uk_9pfid *fid, uint8_t mode)
 {
        struct uk_9preq *req;
        int rc = 0;
 
+       uk_9p_trace_open(fid->fid, mode);
        req = uk_9pdev_req_create(dev, UK_9P_TOPEN, __PAGE_SIZE);
        if (PTRISERR(req))
                return PTR2ERR(req);
 
-       uk_pr_debug("TOPEN fid %u mode %u\n", fid->fid, mode);
+#ifdef UK_9P_INDEPTH_TRACES
+       uk_9p_trace_request_allocated();
+#endif
 
        if ((rc = uk_9preq_write32(req, fid->fid)) ||
                (rc = uk_9preq_write8(req, mode)) ||
@@ -265,8 +312,7 @@ int uk_9p_open(struct uk_9pdev *dev, struct uk_9pfid *fid, 
uint8_t mode)
                (rc = uk_9preq_read32(req, &fid->iounit)))
                goto out;
 
-       uk_pr_debug("ROPEN qid type %u version %u path %lu iounit %u\n",
-                       fid->qid.type, fid->qid.version, fid->qid.path,
+       uk_9p_trace_open_end(fid->qid.type, fid->qid.version, fid->qid.path,
                        fid->iounit);
 
 out:
@@ -274,6 +320,11 @@ out:
        return rc;
 }
 
+UK_TRACEPOINT(uk_9p_trace_create, "fid %u mode %u", uint32_t, uint32_t);
+UK_TRACEPOINT(uk_9p_trace_create_end,
+               "qid type %u version %u path %lu, iounit %u",
+               uint32_t, uint32_t, uint64_t, uint32_t);
+
 int uk_9p_create(struct uk_9pdev *dev, struct uk_9pfid *fid,
                const char *name, uint32_t perm, uint8_t mode,
                const char *extension)
@@ -283,6 +334,7 @@ int uk_9p_create(struct uk_9pdev *dev, struct uk_9pfid *fid,
        struct uk_9p_str extension_str;
        int rc = 0;
 
+       uk_9p_trace_create(fid->fid, mode);
        uk_9p_str_init(&name_str, name);
        uk_9p_str_init(&extension_str, extension);
 
@@ -290,7 +342,9 @@ int uk_9p_create(struct uk_9pdev *dev, struct uk_9pfid *fid,
        if (PTRISERR(req))
                return PTR2ERR(req);
 
-       uk_pr_debug("TOPEN fid %u mode %u\n", fid->fid, mode);
+#ifdef UK_9P_INDEPTH_TRACES
+       uk_9p_trace_request_allocated();
+#endif
 
        if ((rc = uk_9preq_write32(req, fid->fid)) ||
                (rc = uk_9preq_writestr(req, &name_str)) ||
@@ -301,9 +355,7 @@ int uk_9p_create(struct uk_9pdev *dev, struct uk_9pfid *fid,
                (rc = uk_9preq_readqid(req, &fid->qid)) ||
                (rc = uk_9preq_read32(req, &fid->iounit)))
                goto out;
-
-       uk_pr_debug("RCREATE qid type %u version %u path %lu iounit %u\n",
-                       fid->qid.type, fid->qid.version, fid->qid.path,
+       uk_9p_trace_create_end(fid->qid.type, fid->qid.version, fid->qid.path,
                        fid->iounit);
 
 out:
@@ -311,11 +363,16 @@ out:
        return rc;
 }
 
+UK_TRACEPOINT(uk_9p_trace_remove, "fid %u", uint32_t);
+UK_TRACEPOINT(uk_9p_trace_remove_end, "");
+
 int uk_9p_remove(struct uk_9pdev *dev, struct uk_9pfid *fid)
 {
        struct uk_9preq *req;
        int rc = 0;
 
+       uk_9p_trace_remove(fid->fid);
+
        /* The fid is considered invalid even if the remove fails. */
        fid->was_removed = 1;
 
@@ -323,17 +380,23 @@ int uk_9p_remove(struct uk_9pdev *dev, struct uk_9pfid 
*fid)
        if (PTRISERR(req))
                return PTR2ERR(req);
 
-       uk_pr_debug("TREMOVE fid %u\n", fid->fid);
+#ifdef UK_9P_INDEPTH_TRACES
+       uk_9p_trace_request_allocated();
+#endif
+
        if ((rc = uk_9preq_write32(req, fid->fid)) ||
                (rc = send_and_wait_no_zc(dev, req)))
                goto out;
-       uk_pr_debug("RREMOVE\n");
+       uk_9p_trace_remove_end();
 
 out:
        uk_9pdev_req_remove(dev, req);
        return rc;
 }
 
+UK_TRACEPOINT(uk_9p_trace_clunk, "fid %u", uint32_t);
+UK_TRACEPOINT(uk_9p_trace_clunk_end, "");
+
 int uk_9p_clunk(struct uk_9pdev *dev, struct uk_9pfid *fid)
 {
        struct uk_9preq *req;
@@ -346,34 +409,41 @@ int uk_9p_clunk(struct uk_9pdev *dev, struct uk_9pfid 
*fid)
        if (PTRISERR(req))
                return PTR2ERR(req);
 
-       uk_pr_debug("TCLUNK fid %u\n", fid->fid);
+       uk_9p_trace_clunk(fid->fid);
        if ((rc = uk_9preq_write32(req, fid->fid)) ||
                (rc = send_and_wait_no_zc(dev, req)))
                goto out;
-       uk_pr_debug("RCLUNK\n");
+       uk_9p_trace_clunk_end();
 
 out:
        uk_9pdev_req_remove(dev, req);
        return rc;
 }
 
+UK_TRACEPOINT(uk_9p_trace_read, "fid %u offset %lu count %u",
+               uint32_t, uint64_t, uint32_t);
+UK_TRACEPOINT(uk_9p_trace_read_end, "count %u", uint32_t);
+
 int64_t uk_9p_read(struct uk_9pdev *dev, struct uk_9pfid *fid,
                uint64_t offset, uint32_t count, char *buf)
 {
        struct uk_9preq *req;
        int64_t rc;
 
+       uk_9p_trace_read(fid->fid, offset, count);
+
        if (fid->iounit != 0)
                count = MIN(count, fid->iounit);
        count = MIN(count, dev->msize - 11);
 
-       uk_pr_debug("TREAD fid %u offset %lu count %u\n", fid->fid,
-                       offset, count);
-
        req = uk_9pdev_req_create(dev, UK_9P_TREAD, __PAGE_SIZE);
        if (PTRISERR(req))
                return PTR2ERR(req);
 
+#ifdef UK_9P_INDEPTH_TRACES
+       uk_9p_trace_request_allocated();
+#endif
+
        if ((rc = uk_9preq_write32(req, fid->fid)) ||
                (rc = uk_9preq_write64(req, offset)) ||
                (rc = uk_9preq_write32(req, count)) ||
@@ -381,8 +451,7 @@ int64_t uk_9p_read(struct uk_9pdev *dev, struct uk_9pfid 
*fid,
                                       count, 11)) ||
                (rc = uk_9preq_read32(req, &count)))
                goto out;
-
-       uk_pr_debug("RREAD count %u\n", count);
+       uk_9p_trace_read_end(count);
 
        rc = count;
 
@@ -391,21 +460,28 @@ out:
        return rc;
 }
 
+UK_TRACEPOINT(uk_9p_trace_write, "fid %u offset %lu count %u",
+               uint32_t, uint64_t, uint32_t);
+UK_TRACEPOINT(uk_9p_trace_write_end, "count %u", uint32_t);
+
 int64_t uk_9p_write(struct uk_9pdev *dev, struct uk_9pfid *fid,
                uint64_t offset, uint32_t count, const char *buf)
 {
        struct uk_9preq *req;
        int64_t rc;
 
+       uk_9p_trace_write(fid->fid, offset, count);
        count = MIN(count, fid->iounit);
        count = MIN(count, dev->msize - 23);
 
-       uk_pr_debug("TWRITE fid %u offset %lu count %u\n", fid->fid,
-                       offset, count);
        req = uk_9pdev_req_create(dev, UK_9P_TWRITE, __PAGE_SIZE);
        if (PTRISERR(req))
                return PTR2ERR(req);
 
+#ifdef UK_9P_INDEPTH_TRACES
+       uk_9p_trace_request_allocated();
+#endif
+
        if ((rc = uk_9preq_write32(req, fid->fid)) ||
                (rc = uk_9preq_write64(req, offset)) ||
                (rc = uk_9preq_write32(req, count)) ||
@@ -413,8 +489,7 @@ int64_t uk_9p_write(struct uk_9pdev *dev, struct uk_9pfid 
*fid,
                                (void *)buf, count, 23)) ||
                (rc = uk_9preq_read32(req, &count)))
                goto out;
-
-       uk_pr_debug("RWRITE count %u\n", count);
+       uk_9p_trace_write_end(count);
 
        rc = count;
 
@@ -423,6 +498,9 @@ out:
        return rc;
 }
 
+UK_TRACEPOINT(uk_9p_trace_stat, "fid %u", uint32_t);
+UK_TRACEPOINT(uk_9p_trace_stat_end, "");
+
 struct uk_9preq *uk_9p_stat(struct uk_9pdev *dev, struct uk_9pfid *fid,
                struct uk_9p_stat *stat)
 {
@@ -430,19 +508,21 @@ struct uk_9preq *uk_9p_stat(struct uk_9pdev *dev, struct 
uk_9pfid *fid,
        int rc = 0;
        uint16_t dummy;
 
+       uk_9p_trace_stat(fid->fid);
        req = uk_9pdev_req_create(dev, UK_9P_TSTAT, __PAGE_SIZE);
        if (PTRISERR(req))
                return req;
 
-       uk_pr_debug("TSTAT fid %u\n", fid->fid);
+#ifdef UK_9P_INDEPTH_TRACES
+       uk_9p_trace_request_allocated();
+#endif
 
        if ((rc = uk_9preq_write32(req, fid->fid)) ||
                (rc = send_and_wait_no_zc(dev, req)) ||
                (rc = uk_9preq_read16(req, &dummy)) ||
                (rc = uk_9preq_readstat(req, stat)))
                goto out;
-
-       uk_pr_debug("RSTAT\n");
+       uk_9p_trace_stat_end();
 
        return req;
 
@@ -451,6 +531,9 @@ out:
        return ERR2PTR(rc);
 }
 
+UK_TRACEPOINT(uk_9p_trace_wstat, "fid %u", uint32_t);
+UK_TRACEPOINT(uk_9p_trace_wstat_end, "");
+
 int uk_9p_wstat(struct uk_9pdev *dev, struct uk_9pfid *fid,
                struct uk_9p_stat *stat)
 {
@@ -458,11 +541,14 @@ int uk_9p_wstat(struct uk_9pdev *dev, struct uk_9pfid 
*fid,
        int rc = 0;
        uint16_t *dummy;
 
+       uk_9p_trace_wstat(fid->fid);
        req = uk_9pdev_req_create(dev, UK_9P_TWSTAT, __PAGE_SIZE);
        if (PTRISERR(req))
                return PTR2ERR(req);
 
-       uk_pr_debug("TWSTAT fid %u\n", fid->fid);
+#ifdef UK_9P_INDEPTH_TRACES
+       uk_9p_trace_request_allocated();
+#endif
 
        if ((rc = uk_9preq_write32(req, fid->fid)))
                goto out;
@@ -475,8 +561,7 @@ int uk_9p_wstat(struct uk_9pdev *dev, struct uk_9pfid *fid,
 
        if ((rc = send_and_wait_no_zc(dev, req)))
                goto out;
-
-       uk_pr_debug("RWSTAT\n");
+       uk_9p_trace_wstat_end();
 
 out:
        uk_9pdev_req_remove(dev, req);
-- 
2.26.2




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.