[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [UNIKRAFT PATCH v2 5/9] lib/uk9p: Add uk_traces
This patch enables nanosecond-resolution tracing of 9pfs performance. Excerpt from the output traces for a read(): 2167560470 uk_9p_trace_request_create 2167564237 uk_9p_trace_request_allocated 2167564277 uk_9p_trace_ready tag 0 2167567134 uk_9p_trace_sent tag 0 2167625854 uk_9p_trace_received tag 0 Signed-off-by: Cristian Banu <cristb@xxxxxxxxx> --- lib/uk9p/9p.c | 57 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 15 deletions(-) diff --git a/lib/uk9p/9p.c b/lib/uk9p/9p.c index f17a938..14ba299 100644 --- a/lib/uk9p/9p.c +++ b/lib/uk9p/9p.c @@ -39,6 +39,13 @@ #include <uk/9pdev.h> #include <uk/9preq.h> #include <uk/9pfid.h> +#include <uk/trace.h> + +UK_TRACEPOINT(uk_9p_trace_request_create, ""); +UK_TRACEPOINT(uk_9p_trace_request_allocated, ""); +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); 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, @@ -46,10 +53,17 @@ static inline int send_and_wait_zc(struct uk_9pdev *dev, struct uk_9preq *req, { 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; + uk_9p_trace_ready(req->tag); + + if ((rc = uk_9pdev_request(dev, req))) return rc; + uk_9p_trace_sent(req->tag); + + if ((rc = uk_9preq_waitreply(req))) + return rc; + uk_9p_trace_received(req->tag); return 0; } @@ -60,6 +74,19 @@ 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); } +static struct uk_9preq *request_create(struct uk_9pdev *dev, + uint8_t type, uint32_t size) +{ + struct uk_9preq *req; + + uk_9p_trace_request_create(); + req = uk_9pdev_req_create(dev, type, size); + if (!PTRISERR(req)) + uk_9p_trace_request_allocated(); + + return req; +} + struct uk_9preq *uk_9p_version(struct uk_9pdev *dev, const char *requested, struct uk_9p_str *received) { @@ -70,7 +97,7 @@ struct uk_9preq *uk_9p_version(struct uk_9pdev *dev, uk_9p_str_init(&requested_str, requested); - req = uk_9pdev_req_create(dev, UK_9P_TVERSION, __PAGE_SIZE); + req = request_create(dev, UK_9P_TVERSION, __PAGE_SIZE); if (PTRISERR(req)) return req; @@ -119,7 +146,7 @@ struct uk_9pfid *uk_9p_attach(struct uk_9pdev *dev, uint32_t afid, if (PTRISERR(fid)) return fid; - req = uk_9pdev_req_create(dev, UK_9P_TATTACH, __PAGE_SIZE); + req = request_create(dev, UK_9P_TATTACH, __PAGE_SIZE); if (PTRISERR(req)) { uk_9pdev_fid_release(fid); return (void *)req; @@ -156,7 +183,7 @@ int uk_9p_flush(struct uk_9pdev *dev, uint16_t oldtag) struct uk_9preq *req; int rc = 0; - req = uk_9pdev_req_create(dev, UK_9P_TFLUSH, __PAGE_SIZE); + req = request_create(dev, UK_9P_TFLUSH, __PAGE_SIZE); if (PTRISERR(req)) return PTR2ERR(req); @@ -189,7 +216,7 @@ struct uk_9pfid *uk_9p_walk(struct uk_9pdev *dev, struct uk_9pfid *fid, nwname = name ? 1 : 0; - req = uk_9pdev_req_create(dev, UK_9P_TWALK, __PAGE_SIZE); + req = request_create(dev, UK_9P_TWALK, __PAGE_SIZE); if (PTRISERR(req)) { rc = PTR2ERR(req); goto out; @@ -245,7 +272,7 @@ int uk_9p_open(struct uk_9pdev *dev, struct uk_9pfid *fid, uint8_t mode) struct uk_9preq *req; int rc = 0; - req = uk_9pdev_req_create(dev, UK_9P_TOPEN, __PAGE_SIZE); + req = request_create(dev, UK_9P_TOPEN, __PAGE_SIZE); if (PTRISERR(req)) return PTR2ERR(req); @@ -279,7 +306,7 @@ int uk_9p_create(struct uk_9pdev *dev, struct uk_9pfid *fid, uk_9p_str_init(&name_str, name); uk_9p_str_init(&extension_str, extension); - req = uk_9pdev_req_create(dev, UK_9P_TCREATE, __PAGE_SIZE); + req = request_create(dev, UK_9P_TCREATE, __PAGE_SIZE); if (PTRISERR(req)) return PTR2ERR(req); @@ -312,7 +339,7 @@ int uk_9p_remove(struct uk_9pdev *dev, struct uk_9pfid *fid) /* The fid is considered invalid even if the remove fails. */ fid->was_removed = 1; - req = uk_9pdev_req_create(dev, UK_9P_TREMOVE, __PAGE_SIZE); + req = request_create(dev, UK_9P_TREMOVE, __PAGE_SIZE); if (PTRISERR(req)) return PTR2ERR(req); @@ -335,7 +362,7 @@ int uk_9p_clunk(struct uk_9pdev *dev, struct uk_9pfid *fid) if (fid->was_removed) return 0; - req = uk_9pdev_req_create(dev, UK_9P_TCLUNK, __PAGE_SIZE); + req = request_create(dev, UK_9P_TCLUNK, __PAGE_SIZE); if (PTRISERR(req)) return PTR2ERR(req); @@ -363,7 +390,7 @@ int64_t uk_9p_read(struct uk_9pdev *dev, struct uk_9pfid *fid, 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); + req = request_create(dev, UK_9P_TREAD, __PAGE_SIZE); if (PTRISERR(req)) return PTR2ERR(req); @@ -395,7 +422,7 @@ int64_t uk_9p_write(struct uk_9pdev *dev, struct uk_9pfid *fid, 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); + req = request_create(dev, UK_9P_TWRITE, __PAGE_SIZE); if (PTRISERR(req)) return PTR2ERR(req); @@ -423,7 +450,7 @@ struct uk_9preq *uk_9p_stat(struct uk_9pdev *dev, struct uk_9pfid *fid, int rc = 0; uint16_t dummy; - req = uk_9pdev_req_create(dev, UK_9P_TSTAT, __PAGE_SIZE); + req = request_create(dev, UK_9P_TSTAT, __PAGE_SIZE); if (PTRISERR(req)) return req; @@ -451,7 +478,7 @@ int uk_9p_wstat(struct uk_9pdev *dev, struct uk_9pfid *fid, int rc = 0; uint16_t *dummy; - req = uk_9pdev_req_create(dev, UK_9P_TWSTAT, __PAGE_SIZE); + req = request_create(dev, UK_9P_TWSTAT, __PAGE_SIZE); if (PTRISERR(req)) return PTR2ERR(req); -- 2.26.2
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |