Patchwork [3/3] Samples to add a tracepoint.

login
register
mail settings
Submitter Prerna Saxena
Date May 24, 2010, 4:19 p.m.
Message ID <4BFAA72C.9030808@linux.vnet.ibm.com>
Download mbox | patch
Permalink /patch/53447/
State New
Headers show

Comments

Prerna Saxena - May 24, 2010, 4:19 p.m.
Steps for adding a tracepoint :
1. In trace-entries.h, add a DECLARE_TRACE() in the said format.
2. In trace-entries.c:
     i) add a DEFINE_TRACE() for the tracepoint in the said format.
     ii) add an INIT_TRACE(name) for the tracepoint in the function 
init_tracepoints(void)
3. The call site should have a 'trace_name(args..)'
(Remember to include "trace-entries.h" in the file where the tracepoint 
is logged)

This patch adds tracepoints to virtio_blk_rw_complete() and paio_submit()
Stefan Hajnoczi - May 25, 2010, 11:38 a.m.
@@ -87,6 +91,8 @@ static void virtio_blk_rw_complete(void
 {
     VirtIOBlockReq *req = opaque;

+    trace_virtio_blk_rw_complete(req, ret);
+
     if (ret) {
         int is_read = !(req->out->type & VIRTIO_BLK_T_OUT);
         if (virtio_blk_handle_rw_error(req, -ret, is_read))

What happens when CONFIG_QEMU_TRACE is not defined?  Linker error for missing
symbol trace_virtio_blk_rw_complete()?

This is handled by the tracing backends patchset I posted.  When
tracing is disabled the nop backend will make tracepoints empty inline
functions.  The compiler makes them disappear but the tracepoint
invocation is still parsed and type checked by the compiler.  It
shouldn't be hard to add your tracer as a backend.

Stefan

Patch

Signed-off by : Prerna (prerna@linux.vnet.ibm.com)

Index: qemu/hw/virtio-blk.c
===================================================================
--- qemu.orig/hw/virtio-blk.c
+++ qemu/hw/virtio-blk.c
@@ -19,6 +19,10 @@ 
 # include <scsi/sg.h>
 #endif
 
+#ifdef CONFIG_QEMU_TRACE
+#include "trace-entries.h"
+#endif
+
 typedef struct VirtIOBlock
 {
     VirtIODevice vdev;
@@ -87,6 +91,8 @@  static void virtio_blk_rw_complete(void 
 {
     VirtIOBlockReq *req = opaque;
 
+    trace_virtio_blk_rw_complete(req, ret);
+
     if (ret) {
         int is_read = !(req->out->type & VIRTIO_BLK_T_OUT);
         if (virtio_blk_handle_rw_error(req, -ret, is_read))
Index: qemu/posix-aio-compat.c
===================================================================
--- qemu.orig/posix-aio-compat.c
+++ qemu/posix-aio-compat.c
@@ -29,6 +29,9 @@ 
 
 #include "block/raw-posix-aio.h"
 
+#ifdef CONFIG_QEMU_TRACE
+#include "trace-entries.h"
+#endif
 
 struct qemu_paiocb {
     BlockDriverAIOCB common;
@@ -565,6 +568,7 @@  BlockDriverAIOCB *paio_submit(BlockDrive
 {
     struct qemu_paiocb *acb;
 
+    trace_paio_submit(fd, sector_num);
     acb = qemu_aio_get(&raw_aio_pool, bs, cb, opaque);
     if (!acb)
         return NULL;
Index: qemu/trace-entries.h
===================================================================
--- qemu.orig/trace-entries.h
+++ qemu/trace-entries.h
@@ -29,5 +29,20 @@  void init_tracepoints(void);
  * 		),
  * )
  */
+DECLARE_TRACE(virtio_blk_rw_complete,
+       TP_PROTO(void* req, int ret),
+       TP_STRUCT__entry(
+               __field(void*, req);
+               __field(int, ret);
+               )
+)
+
+DECLARE_TRACE(paio_submit,
+       TP_PROTO(int fd, int64_t sector_num),
+       TP_STRUCT__entry(
+               __field(int, fd);
+               __field(int64_t, sector_num);
+               )
+)
 
 #endif /*__TRACE_ENTRIES_H__ */
Index: qemu/trace-entries.c
===================================================================
--- qemu.orig/trace-entries.c
+++ qemu/trace-entries.c
@@ -20,7 +20,8 @@ 
 void init_tracepoints(void)
 {
 // INIT_TRACE(foo);
-
+   INIT_TRACE(virtio_blk_rw_complete);
+   INIT_TRACE(paio_submit);
    return;
 }
 
@@ -37,4 +38,23 @@  void init_tracepoints(void)
  * )
  *
  */
+DEFINE_TRACE( virtio_blk_rw_complete,
+       TP_PROTO(void* req, int ret),
+       TP_fast_assign(
+               __entry->req = req;
+               __entry->ret = ret;
+       ),
+       TP_printk("virtio_blk_rw_complete: req %p ret %d\n",__entry->req,
+		 __entry->ret)
+)
+
+DEFINE_TRACE( paio_submit,
+       TP_PROTO(int fd, int64_t sector_num),
+       TP_fast_assign(
+               __entry->fd = fd;
+               __entry->sector_num = sector_num;
+       ),
+       TP_printk("paio_submit: fd %d sector_num %ld\n",__entry->fd,
+						 __entry->sector_num)
+)