Trace callers of ceph_osdc_start_request, so that call locations
are identified implicitly.

Put the tracepoints after calls to ceph_osdc_start_request,
since it fills in the request transaction ID and request OSD.

Signed-off-by: Jim Schutt <jasc...@sandia.gov>
---
 fs/ceph/addr.c              |    8 ++++
 fs/ceph/file.c              |    6 +++
 include/trace/events/ceph.h |   77 +++++++++++++++++++++++++++++++++++++++++++
 net/ceph/osd_client.c       |    7 ++++
 4 files changed, 98 insertions(+), 0 deletions(-)
 create mode 100644 include/trace/events/ceph.h

diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
index 173b1d2..f552579 100644
--- a/fs/ceph/addr.c
+++ b/fs/ceph/addr.c
@@ -13,6 +13,12 @@
 #include "mds_client.h"
 #include <linux/ceph/osd_client.h>
 
+
+#include <linux/tracepoint.h>
+#define CREATE_TRACE_POINTS
+#define CEPH_TRACE_FS_ADDR
+#include <trace/events/ceph.h>
+
 /*
  * Ceph address space ops.
  *
@@ -338,6 +344,7 @@ static int start_read(struct inode *inode, struct list_head 
*page_list, int max)
 
        dout("start_read %p starting %p %lld~%lld\n", inode, req, off, len);
        ret = ceph_osdc_start_request(osdc, req, false);
+       trace_ceph_async_readpages_req(req);
        if (ret < 0)
                goto out_pages;
        ceph_osdc_put_request(req);
@@ -902,6 +909,7 @@ get_more_pages:
                req->r_request->hdr.data_len = cpu_to_le32(len);
 
                rc = ceph_osdc_start_request(&fsc->client->osdc, req, true);
+               trace_ceph_async_writepages_req(req);
                BUG_ON(rc);
                req = NULL;
 
diff --git a/fs/ceph/file.c b/fs/ceph/file.c
index ed72428..fc31def 100644
--- a/fs/ceph/file.c
+++ b/fs/ceph/file.c
@@ -10,6 +10,11 @@
 #include "super.h"
 #include "mds_client.h"
 
+#include <linux/tracepoint.h>
+#define CREATE_TRACE_POINTS
+#define CEPH_TRACE_FS_FILE
+#include <trace/events/ceph.h>
+
 /*
  * Ceph file operations
  *
@@ -568,6 +573,7 @@ more:
        req->r_inode = inode;
 
        ret = ceph_osdc_start_request(&fsc->client->osdc, req, false);
+       trace_ceph_sync_writepages_req(req);
        if (!ret) {
                if (req->r_safe_callback) {
                        /*
diff --git a/include/trace/events/ceph.h b/include/trace/events/ceph.h
new file mode 100644
index 0000000..182af2c
--- /dev/null
+++ b/include/trace/events/ceph.h
@@ -0,0 +1,77 @@
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM ceph
+
+#if !defined(_TRACE_CEPH_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_CEPH_H
+
+
+#if !defined(TRACE_HEADER_MULTI_READ)
+
+static __always_inline int
+__ceph_req_num_ops(struct ceph_osd_request *req)
+{
+       struct ceph_osd_request_head *reqhead = req->r_request->front.iov_base;
+       return le16_to_cpu(reqhead->num_ops);
+}
+
+static __always_inline int
+__ceph_req_op_opcode(struct ceph_osd_request *req, int op)
+{
+       struct ceph_osd_request_head *reqhead = req->r_request->front.iov_base;
+       if (op < le16_to_cpu(reqhead->num_ops))
+               return le16_to_cpu(reqhead->ops[op].op);
+       else
+               return 0;
+}
+
+#endif
+
+DECLARE_EVENT_CLASS(ceph_start_req_class,
+       TP_PROTO(struct ceph_osd_request *req),
+       TP_ARGS(req),
+       TP_STRUCT__entry(
+               __field(unsigned long long, tid)
+               __field(int, osd)
+               __field(int, num_ops)
+               __array(unsigned, ops, 3)
+               __field(unsigned, pages)
+       ),
+       TP_fast_assign(
+               __entry->tid = req->r_tid;
+               __entry->osd = req->r_osd->o_osd;
+               __entry->num_ops = __ceph_req_num_ops(req);
+               __entry->ops[0] = __ceph_req_op_opcode(req, 0);
+               __entry->ops[1] = __ceph_req_op_opcode(req, 1);
+               __entry->ops[2] = __ceph_req_op_opcode(req, 2);
+               __entry->pages = req->r_num_pages;
+       ),
+       TP_printk("tid %llu osd%d ops %d 0x%04x/0x%04x/0x%04x pages %u",
+                 __entry->tid, __entry->osd, __entry->num_ops,
+                 __entry->ops[0], __entry->ops[1], __entry->ops[2],
+                 __entry->pages
+       )
+);
+
+#define DEFINE_CEPH_START_REQ_EVENT(name) \
+DEFINE_EVENT(ceph_start_req_class, name, \
+       TP_PROTO(struct ceph_osd_request *req), TP_ARGS(req))
+
+#ifdef CEPH_TRACE_FS_FILE
+DEFINE_CEPH_START_REQ_EVENT(ceph_sync_writepages_req);
+#endif
+
+#ifdef CEPH_TRACE_FS_ADDR
+DEFINE_CEPH_START_REQ_EVENT(ceph_async_writepages_req);
+DEFINE_CEPH_START_REQ_EVENT(ceph_async_readpages_req);
+#endif
+
+#ifdef CEPH_TRACE_NET_OSDC
+DEFINE_CEPH_START_REQ_EVENT(ceph_osdc_writepages_req);
+DEFINE_CEPH_START_REQ_EVENT(ceph_osdc_readpages_req);
+#endif
+
+
+#endif /* _TRACE_CEPH_H */
+
+/* This part must be outside protection */
+#include <trace/define_trace.h>
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
index 5e25405..f44e400 100644
--- a/net/ceph/osd_client.c
+++ b/net/ceph/osd_client.c
@@ -18,6 +18,11 @@
 #include <linux/ceph/auth.h>
 #include <linux/ceph/pagelist.h>
 
+#include <linux/tracepoint.h>
+#define CREATE_TRACE_POINTS
+#define CEPH_TRACE_NET_OSDC
+#include <trace/events/ceph.h>
+
 #define OSD_OP_FRONT_LEN       4096
 #define OSD_OPREPLY_FRONT_LEN  512
 
@@ -1906,6 +1911,7 @@ int ceph_osdc_readpages(struct ceph_osd_client *osdc,
             off, *plen, req->r_num_pages, page_align);
 
        rc = ceph_osdc_start_request(osdc, req, false);
+       trace_ceph_osdc_readpages_req(req);
        if (!rc)
                rc = ceph_osdc_wait_request(osdc, req);
 
@@ -1948,6 +1954,7 @@ int ceph_osdc_writepages(struct ceph_osd_client *osdc, 
struct ceph_vino vino,
             req->r_num_pages);
 
        rc = ceph_osdc_start_request(osdc, req, nofail);
+       trace_ceph_osdc_writepages_req(req);
        if (!rc)
                rc = ceph_osdc_wait_request(osdc, req);
 
-- 
1.7.8.2


--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to