From db28809b56138e83dd9f9669bbc41b26fbad65fe Mon Sep 17 00:00:00 2001
From: Asias He <asias@cloudius-systems.com>
Date: Thu, 5 Dec 2013 10:47:40 +0800
Subject: [PATCH] virtio-blk: Switch to and add tracepoint

Switch the existing printout based debug info to tracepoint and add new
tracepoint.

Signed-off-by: Asias He <asias@cloudius-systems.com>
Signed-off-by: Pekka Enberg <penberg@cloudius-systems.com>
---
 drivers/virtio-blk.cc | 52 +++++++++++++++++++++++++++----------------
 1 file changed, 33 insertions(+), 19 deletions(-)

diff --git a/drivers/virtio-blk.cc b/drivers/virtio-blk.cc
index a9a0c74b1..a33ce8a13 100644
--- a/drivers/virtio-blk.cc
+++ b/drivers/virtio-blk.cc
@@ -24,12 +24,29 @@
 #include <osv/debug.h>
 
 #include "sched.hh"
+#include "osv/trace.hh"
 #include "drivers/clock.hh"
 #include "drivers/clockevent.hh"
 
 #include <osv/device.h>
 #include <osv/bio.h>
 
+TRACEPOINT(trace_virtio_blk_read_config_capacity, "capacity=%lu", u64);
+TRACEPOINT(trace_virtio_blk_read_config_size_max, "size_max=%u", u32);
+TRACEPOINT(trace_virtio_blk_read_config_seg_max, "seg_max=%u", u32);
+TRACEPOINT(trace_virtio_blk_read_config_geometry, "cylinders=%u, heads=%u, sectors=%u", u32, u32, u32);
+TRACEPOINT(trace_virtio_blk_read_config_blk_size, "blk_size=%u", u32);
+TRACEPOINT(trace_virtio_blk_read_config_topology, "physical_block_exp=%u, alignment_offset=%u, min_io_size=%u, opt_io_size=%u", u32, u32, u32, u32);
+TRACEPOINT(trace_virtio_blk_read_config_wce, "wce=%u", u32);
+TRACEPOINT(trace_virtio_blk_read_config_ro, "readonly=true");
+TRACEPOINT(trace_virtio_blk_make_virtio_request_seg_max, "request of size %d needs more segment than the max %d", size_t, u32);
+TRACEPOINT(trace_virtio_blk_make_virtio_request_readonly, "write on readonly device");
+TRACEPOINT(trace_virtio_blk_wake, "");
+TRACEPOINT(trace_virtio_blk_strategy, "bio=%p", struct bio*);
+TRACEPOINT(trace_virtio_blk_req_ok, "bio=%p, sector=%lu, len=%lu, type=%x", struct bio*, u64, size_t, u32);
+TRACEPOINT(trace_virtio_blk_req_unsupp, "bio=%p, sector=%lu, len=%lu, type=%x", struct bio*, u64, size_t, u32);
+TRACEPOINT(trace_virtio_blk_req_err, "bio=%p, sector=%lu, len=%lu, type=%x", struct bio*, u64, size_t, u32);
+
 using namespace memory;
 
 
@@ -47,6 +64,7 @@ virtio_blk_strategy(struct bio *bio)
 {
     struct virtio_blk_priv *prv = reinterpret_cast<struct virtio_blk_priv*>(bio->bio_dev->private_data);
 
+    trace_virtio_blk_strategy(bio);
     bio->bio_offset += bio->bio_dev->offset;
     prv->drv->make_virtio_request(bio);
 }
@@ -132,29 +150,25 @@ bool virtio_blk::read_config()
     //read all of the block config (including size, mce, topology,..) in one shot
     virtio_conf_read(virtio_pci_config_offset(), &_config, sizeof(_config));
 
-    virtio_i("The capacity of the device is %d", (u64)_config.capacity);
+    trace_virtio_blk_read_config_capacity(_config.capacity);
+
     if (get_guest_feature_bit(VIRTIO_BLK_F_SIZE_MAX))
-        virtio_i("The size_max of the device is %d",(u32)_config.size_max);
+        trace_virtio_blk_read_config_size_max(_config.size_max);
     if (get_guest_feature_bit(VIRTIO_BLK_F_SEG_MAX))
-        virtio_i("The seg_size of the device is %d",(u32)_config.seg_max);
+        trace_virtio_blk_read_config_seg_max(_config.seg_max);
     if (get_guest_feature_bit(VIRTIO_BLK_F_GEOMETRY)) {
-        virtio_i("The cylinders count of the device is %d",(u16)_config.geometry.cylinders);
-        virtio_i("The heads count of the device is %d",(u32)_config.geometry.heads);
-        virtio_i("The sector count of the device is %d",(u32)_config.geometry.sectors);
+        trace_virtio_blk_read_config_geometry((u32)_config.geometry.cylinders, (u32)_config.geometry.heads, (u32)_config.geometry.sectors);
     }
     if (get_guest_feature_bit(VIRTIO_BLK_F_BLK_SIZE))
-        virtio_i("The block size of the device is %d",(u32)_config.blk_size);
+        trace_virtio_blk_read_config_blk_size(_config.blk_size);
     if (get_guest_feature_bit(VIRTIO_BLK_F_TOPOLOGY)) {
-        virtio_i("The physical_block_exp of the device is %d",(u32)_config.physical_block_exp);
-        virtio_i("The alignment_offset of the device is %d",(u32)_config.alignment_offset);
-        virtio_i("The min_io_size of the device is %d",(u16)_config.min_io_size);
-        virtio_i("The opt_io_size of the device is %d",(u32)_config.opt_io_size);
+        trace_virtio_blk_read_config_topology((u32)_config.physical_block_exp, (u32)_config.alignment_offset, (u32)_config.min_io_size, (u32)_config.opt_io_size);
     }
     if (get_guest_feature_bit(VIRTIO_BLK_F_CONFIG_WCE))
-        virtio_i("The write cache enable of the device is %d",(u32)_config.wce);
+        trace_virtio_blk_read_config_wce((u32)_config.wce);
     if (get_guest_feature_bit(VIRTIO_BLK_F_RO)) {
         set_readonly();
-        virtio_i("Device is read only");
+        trace_virtio_blk_read_config_ro();
     }
 
     return true;
@@ -168,6 +182,7 @@ void virtio_blk::response_worker()
     while (1) {
 
         virtio_driver::wait_for_queue(queue, &vring::used_ring_not_empty);
+        trace_virtio_blk_wake();
 
         u32 len;
         while((req = static_cast<virtio_blk_req*>(queue->get_buf_elem(&len))) != nullptr) {
@@ -175,15 +190,15 @@ void virtio_blk::response_worker()
                 switch (req->res.status) {
                 case VIRTIO_BLK_S_OK:
                     biodone(req->bio, true);
+                    trace_virtio_blk_req_ok(req->bio, req->hdr.sector, req->bio->bio_bcount, req->hdr.type);
                     break;
                 case VIRTIO_BLK_S_UNSUPP:
-                    kprintf("unsupported I/O request\n");
                     biodone(req->bio, false);
+                    trace_virtio_blk_req_unsupp(req->bio, req->hdr.sector, req->bio->bio_bcount, req->hdr.type);
                     break;
                 default:
-                    kprintf("virtio-blk: I/O error, sector = %lu, len = %lu, type = %x\n",
-                            req->hdr.sector, req->bio->bio_bcount, req->hdr.type);
                     biodone(req->bio, false);
+                    trace_virtio_blk_req_err(req->bio, req->hdr.sector, req->bio->bio_bcount, req->hdr.type);
                     break;
                }
             }
@@ -218,8 +233,7 @@ int virtio_blk::make_virtio_request(struct bio* bio)
         if (!bio) return EIO;
 
         if (bio->bio_bcount/mmu::page_size + 1 > _config.seg_max) {
-            virtio_w("%s:request of size %d needs more segment than the max %d",
-                    __FUNCTION__, bio->bio_bcount, (u32)_config.seg_max);
+            trace_virtio_blk_make_virtio_request_seg_max(bio->bio_bcount, _config.seg_max);
             return EIO;
         }
 
@@ -232,7 +246,7 @@ int virtio_blk::make_virtio_request(struct bio* bio)
             break;
         case BIO_WRITE:
             if (is_readonly()) {
-                virtio_e("Error: block device is read only");
+                trace_virtio_blk_make_virtio_request_readonly();
                 biodone(bio, false);
                 return EROFS;
             }
-- 
GitLab