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

[Xen-changelog] [xen-unstable] [BLKBACK/BLKTAP] add sysfs throughput profiling to blk{back/tap}



# HG changeset patch
# User Jake Wires <jwires@xxxxxxxxxxxxx>
# Date 1172086924 28800
# Node ID ad3ee81cc8c4bf44edc01404782c7a197f8764fc
# Parent  87f31a0db841b3be5be938213adf2bd47acf3080
[BLKBACK/BLKTAP] add sysfs throughput profiling to blk{back/tap}
---
 linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c |    6 +
 linux-2.6-xen-sparse/drivers/xen/blkback/common.h  |    2 
 linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c  |   12 +-
 linux-2.6-xen-sparse/drivers/xen/blktap/blktap.c   |   12 ++
 linux-2.6-xen-sparse/drivers/xen/blktap/common.h   |    2 
 linux-2.6-xen-sparse/drivers/xen/blktap/xenbus.c   |   96 ++++++++++++++++-----
 6 files changed, 104 insertions(+), 26 deletions(-)

diff -r 87f31a0db841 -r ad3ee81cc8c4 
linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c
--- a/linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c        Wed Feb 21 
19:12:16 2007 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c        Wed Feb 21 
11:42:04 2007 -0800
@@ -490,6 +490,12 @@ static void dispatch_rw_block_io(blkif_t
 
        for (i = 0; i < nbio; i++)
                submit_bio(operation, biolist[i]);
+
+        if (operation == READ) {
+                blkif->st_rd_sect += preq.nr_sects;
+        } else if (operation == WRITE) {
+                blkif->st_wr_sect += preq.nr_sects;
+        }
 
        return;
 
diff -r 87f31a0db841 -r ad3ee81cc8c4 
linux-2.6-xen-sparse/drivers/xen/blkback/common.h
--- a/linux-2.6-xen-sparse/drivers/xen/blkback/common.h Wed Feb 21 19:12:16 
2007 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/blkback/common.h Wed Feb 21 11:42:04 
2007 -0800
@@ -88,6 +88,8 @@ typedef struct blkif_st {
        int                 st_wr_req;
        int                 st_oo_req;
        int                 st_br_req;
+        int                 st_rd_sect;
+        int                 st_wr_sect;
 
        wait_queue_head_t waiting_to_free;
 
diff -r 87f31a0db841 -r ad3ee81cc8c4 
linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c
--- a/linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c Wed Feb 21 19:12:16 
2007 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c Wed Feb 21 11:42:04 
2007 -0800
@@ -111,16 +111,20 @@ static void update_blkif_status(blkif_t 
        }                                                               \
        DEVICE_ATTR(name, S_IRUGO, show_##name, NULL)
 
-VBD_SHOW(oo_req, "%d\n", be->blkif->st_oo_req);
-VBD_SHOW(rd_req, "%d\n", be->blkif->st_rd_req);
-VBD_SHOW(wr_req, "%d\n", be->blkif->st_wr_req);
-VBD_SHOW(br_req, "%d\n", be->blkif->st_br_req);
+VBD_SHOW(oo_req,  "%d\n", be->blkif->st_oo_req);
+VBD_SHOW(rd_req,  "%d\n", be->blkif->st_rd_req);
+VBD_SHOW(wr_req,  "%d\n", be->blkif->st_wr_req);
+VBD_SHOW(br_req,  "%d\n", be->blkif->st_br_req);
+VBD_SHOW(rd_sect, "%d\n", be->blkif->st_rd_sect);
+VBD_SHOW(wr_sect, "%d\n", be->blkif->st_wr_sect);
 
 static struct attribute *vbdstat_attrs[] = {
        &dev_attr_oo_req.attr,
        &dev_attr_rd_req.attr,
        &dev_attr_wr_req.attr,
        &dev_attr_br_req.attr,
+       &dev_attr_rd_sect.attr,
+       &dev_attr_wr_sect.attr,
        NULL
 };
 
diff -r 87f31a0db841 -r ad3ee81cc8c4 
linux-2.6-xen-sparse/drivers/xen/blktap/blktap.c
--- a/linux-2.6-xen-sparse/drivers/xen/blktap/blktap.c  Wed Feb 21 19:12:16 
2007 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/blktap/blktap.c  Wed Feb 21 11:42:04 
2007 -0800
@@ -1195,7 +1195,7 @@ static void dispatch_rw_block_io(blkif_t
        int op, operation = (req->operation == BLKIF_OP_WRITE) ? WRITE : READ;
        struct gnttab_map_grant_ref map[BLKIF_MAX_SEGMENTS_PER_REQUEST*2];
        unsigned int nseg;
-       int ret, i;
+       int ret, i, nr_sects = 0;
        tap_blkif_t *info;
        uint64_t sector;
        blkif_request_t *target;
@@ -1291,6 +1291,9 @@ static void dispatch_rw_block_io(blkif_t
                                          req->seg[i].gref, blkif->domid);
                        op++;
                }
+
+               nr_sects += (req->seg[i].last_sect - 
+                            req->seg[i].first_sect + 1);
        }
 
        ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, map, op);
@@ -1403,6 +1406,13 @@ static void dispatch_rw_block_io(blkif_t
        target->id = usr_idx;
        wmb(); /* blktap_poll() reads req_prod_pvt asynchronously */
        info->ufe_ring.req_prod_pvt++;
+
+       if (operation == READ) {
+               blkif->st_rd_sect += nr_sects;
+       } else if (operation == WRITE) {
+               blkif->st_wr_sect += nr_sects;
+       }
+
        return;
 
  fail_flush:
diff -r 87f31a0db841 -r ad3ee81cc8c4 
linux-2.6-xen-sparse/drivers/xen/blktap/common.h
--- a/linux-2.6-xen-sparse/drivers/xen/blktap/common.h  Wed Feb 21 19:12:16 
2007 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/blktap/common.h  Wed Feb 21 11:42:04 
2007 -0800
@@ -76,6 +76,8 @@ typedef struct blkif_st {
        int                 st_rd_req;
        int                 st_wr_req;
        int                 st_oo_req;
+       int                 st_rd_sect;
+       int                 st_wr_sect;
 
        wait_queue_head_t waiting_to_free;
 
diff -r 87f31a0db841 -r ad3ee81cc8c4 
linux-2.6-xen-sparse/drivers/xen/blktap/xenbus.c
--- a/linux-2.6-xen-sparse/drivers/xen/blktap/xenbus.c  Wed Feb 21 19:12:16 
2007 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/blktap/xenbus.c  Wed Feb 21 11:42:04 
2007 -0800
@@ -112,6 +112,74 @@ static int blktap_name(blkif_t *blkif, c
        return 0;
 }
 
+/****************************************************************
+ *  sysfs interface for VBD I/O requests
+ */
+
+#define VBD_SHOW(name, format, args...)                                        
\
+       static ssize_t show_##name(struct device *_dev,                 \
+                                  struct device_attribute *attr,       \
+                                  char *buf)                           \
+       {                                                               \
+               struct xenbus_device *dev = to_xenbus_device(_dev);     \
+               struct backend_info *be = dev->dev.driver_data;         \
+                                                                       \
+               return sprintf(buf, format, ##args);                    \
+       }                                                               \
+       DEVICE_ATTR(name, S_IRUGO, show_##name, NULL)
+
+VBD_SHOW(tap_oo_req,  "%d\n", be->blkif->st_oo_req);
+VBD_SHOW(tap_rd_req,  "%d\n", be->blkif->st_rd_req);
+VBD_SHOW(tap_wr_req,  "%d\n", be->blkif->st_wr_req);
+VBD_SHOW(tap_rd_sect, "%d\n", be->blkif->st_rd_sect);
+VBD_SHOW(tap_wr_sect, "%d\n", be->blkif->st_wr_sect);
+
+static struct attribute *tapstat_attrs[] = {
+       &dev_attr_tap_oo_req.attr,
+       &dev_attr_tap_rd_req.attr,
+       &dev_attr_tap_wr_req.attr,
+       &dev_attr_tap_rd_sect.attr,
+       &dev_attr_tap_wr_sect.attr,
+       NULL
+};
+
+static struct attribute_group tapstat_group = {
+       .name = "statistics",
+       .attrs = tapstat_attrs,
+};
+
+int xentap_sysfs_addif(struct xenbus_device *dev)
+{
+       return sysfs_create_group(&dev->dev.kobj, &tapstat_group);
+}
+
+void xentap_sysfs_delif(struct xenbus_device *dev)
+{
+       sysfs_remove_group(&dev->dev.kobj, &tapstat_group);
+}
+
+static int blktap_remove(struct xenbus_device *dev)
+{
+       struct backend_info *be = dev->dev.driver_data;
+
+       if (be->backend_watch.node) {
+               unregister_xenbus_watch(&be->backend_watch);
+               kfree(be->backend_watch.node);
+               be->backend_watch.node = NULL;
+       }
+       if (be->blkif) {
+               if (be->blkif->xenblkd)
+                       kthread_stop(be->blkif->xenblkd);
+               signal_tapdisk(be->blkif->dev_num);
+               tap_blkif_free(be->blkif);
+               be->blkif = NULL;
+       }
+       xentap_sysfs_delif(be->dev);
+       kfree(be);
+       dev->dev.driver_data = NULL;
+       return 0;
+}
+
 static void tap_update_blkif_status(blkif_t *blkif)
 { 
        int err;
@@ -134,6 +202,13 @@ static void tap_update_blkif_status(blki
        err = blktap_name(blkif, name);
        if (err) {
                xenbus_dev_error(blkif->be->dev, err, "get blktap dev name");
+               return;
+       }
+
+       err = xentap_sysfs_addif(blkif->be->dev);
+       if (err) {
+               xenbus_dev_fatal(blkif->be->dev, err, 
+                                "creating sysfs entries");
                return;
        }
 
@@ -144,27 +219,6 @@ static void tap_update_blkif_status(blki
                xenbus_dev_fatal(blkif->be->dev, err, "start xenblkd");
                WPRINTK("Error starting thread\n");
        }
-}
-
-static int blktap_remove(struct xenbus_device *dev)
-{
-       struct backend_info *be = dev->dev.driver_data;
-
-       if (be->backend_watch.node) {
-               unregister_xenbus_watch(&be->backend_watch);
-               kfree(be->backend_watch.node);
-               be->backend_watch.node = NULL;
-       }
-       if (be->blkif) {
-               if (be->blkif->xenblkd)
-                       kthread_stop(be->blkif->xenblkd);
-               signal_tapdisk(be->blkif->dev_num);
-               tap_blkif_free(be->blkif);
-               be->blkif = NULL;
-       }
-       kfree(be);
-       dev->dev.driver_data = NULL;
-       return 0;
 }
 
 /**

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

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