From: Hannes Reinecke <hare@suse.de>
Date: Thu, 26 Jul 2012 11:11:21 +0200
Subject: md: add raid10 tracepoints
References: bnc#768084
Patch-Mainline: not yet

This patch adds tracepoints for md/raid10.

Signed-off-by: Hannes Reinecke <hare@suse.de>
---
 drivers/md/raid10.c |   35 +++++++++++++++++++++++++++++++----
 1 files changed, 31 insertions(+), 4 deletions(-)

diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index 4822ec1..459a625 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -23,6 +23,9 @@
 #include <linux/blkdev.h>
 #include <linux/seq_file.h>
 #include <linux/kthread.h>
+
+#include <trace/events/block.h>
+
 #include "md.h"
 #include "raid10.h"
 #include "raid0.h"
@@ -67,6 +70,9 @@ static void reshape_request_write(mddev_t *mddev, struct r10bio_s *r10_bio);
 static void end_reshape_write(struct bio *bio, int error);
 static void end_reshape(conf_t *conf);
 
+#define raid10_log(md, fmt, args...)				\
+	blk_add_trace_msg((md)->queue, "raid10 " fmt, ##args)
+
 static void * r10bio_pool_alloc(gfp_t gfp_flags, void *data)
 {
 	conf_t *conf = data;
@@ -243,9 +249,10 @@ static void reschedule_retry(r10bio_t *r10_bio)
 static void raid_end_bio_io(r10bio_t *r10_bio)
 {
 	struct bio *bio = r10_bio->master_bio;
+	int error = test_bit(R10BIO_Uptodate, &r10_bio->state) ? 0 : -EIO;
 
-	bio_endio(bio,
-		test_bit(R10BIO_Uptodate, &r10_bio->state) ? 0 : -EIO);
+	trace_block_bio_complete(bdev_get_queue(bio->bi_bdev), bio, error);
+	bio_endio(bio, error);
 	free_r10bio(r10_bio);
 }
 
@@ -267,7 +274,7 @@ static void raid10_end_read_request(struct bio *bio, int error)
 	int slot, dev;
 	conf_t *conf = r10_bio->mddev->private;
 
-
+	trace_block_bio_complete(bdev_get_queue(bio->bi_bdev), bio, error);
 	slot = r10_bio->read_slot;
 	dev = r10_bio->devs[slot].devnum;
 	/*
@@ -324,6 +331,8 @@ static void raid10_end_write_request(struct bio *bio, int error)
 	struct bio *to_put;
 	mdk_rdev_t *rdev;
 
+	trace_block_bio_complete(bdev_get_queue(bio->bi_bdev), bio, error);
+
 	for (slot = 0; slot < conf->copies; slot++)
 		if (r10_bio->devs[slot].bio == bio)
 			break;
@@ -723,6 +732,7 @@ static void flush_pending_writes(conf_t *conf)
 		spin_unlock_irq(&conf->device_lock);
 		/* flush any pending bitmap writes to disk
 		 * before proceeding w/ I/O */
+		raid10_log(conf->mddev, "bitmap unplug");
 		bitmap_unplug(conf->mddev->bitmap);
 
 		while (bio) { /* submit pending writes */
@@ -800,6 +810,7 @@ static void wait_barrier(conf_t *conf)
 		 * that queue to get the nr_pending
 		 * count down.
 		 */
+		raid10_log(conf->mddev, "wait barrier");
 		wait_event_lock_irq(conf->wait_barrier,
 				    !conf->barrier ||
 				    (conf->nr_pending &&
@@ -957,6 +968,7 @@ static int make_request(mddev_t *mddev, struct bio * bio)
 		/* IO spans the reshape position.  Need to wait for
 		 * reshape to pass
 		 */
+		raid10_log(mddev, "reshape delay");
 		allow_barrier(conf);
 		wait_event(conf->wait_barrier,
 			   conf->reshape_progress <= bio->bi_sector ||
@@ -971,6 +983,7 @@ static int make_request(mddev_t *mddev, struct bio * bio)
 	     : (bio->bi_sector + sectors > conf->reshape_safe &&
 		bio->bi_sector < conf->reshape_progress))) {
 		/* Need to update reshape_position in metadata */
+		raid10_log(mddev, "reshape metadata delay");
 		mddev->reshape_position = conf->reshape_progress;
 		set_bit(MD_CHANGE_DEVS, &mddev->flags);
 		set_bit(MD_CHANGE_PENDING, &mddev->flags);
@@ -1015,7 +1028,9 @@ static int make_request(mddev_t *mddev, struct bio * bio)
 		    test_bit(R10BIO_FailFast, &r10_bio->state))
 			read_bio->bi_rw |= REQ_FAILFAST_DEV;
 		read_bio->bi_private = r10_bio;
-
+		trace_block_bio_remap(bdev_get_queue(read_bio->bi_bdev),
+				      read_bio, disk_devt(mddev->gendisk),
+				      r10_bio->sector);
 		generic_make_request(read_bio);
 		return 0;
 	}
@@ -1062,6 +1077,7 @@ static int make_request(mddev_t *mddev, struct bio * bio)
 				d = r10_bio->devs[j].devnum;
 				rdev_dec_pending(conf->mirrors[d].rdev, mddev);
 			}
+		raid10_log(mddev, "rdev %d blocked", blocked_rdev->raid_disk);
 		allow_barrier(conf);
 		md_wait_for_blocked_rdev(blocked_rdev, mddev);
 		wait_barrier(conf);
@@ -1095,6 +1111,9 @@ static int make_request(mddev_t *mddev, struct bio * bio)
 		spin_lock_irqsave(&conf->device_lock, flags);
 		bio_list_add(&conf->pending_bio_list, mbio);
 		spin_unlock_irqrestore(&conf->device_lock, flags);
+		trace_block_bio_remap(bdev_get_queue(mbio->bi_bdev),
+				      mbio, disk_devt(mddev->gendisk),
+				      r10_bio->sector);
 	}
 
 	if (atomic_dec_and_test(&r10_bio->remaining)) {
@@ -1384,6 +1403,8 @@ static void end_sync_read(struct bio *bio, int error)
 	conf_t *conf = r10_bio->mddev->private;
 	int i,d;
 
+	trace_block_bio_complete(bdev_get_queue(bio->bi_bdev), bio, error);
+
 	if (bio == r10_bio->master_bio)
 		/* This is a reshape read */
 		d = r10_bio->read_slot; /* really read_dev */
@@ -1432,6 +1453,8 @@ static void end_sync_write(struct bio *bio, int error)
 	conf_t *conf = mddev->private;
 	int i,d;
 
+	trace_block_bio_complete(bdev_get_queue(bio->bi_bdev), bio, error);
+
 	for (i = 0; i < conf->copies; i++)
 		if (r10_bio->devs[i].bio == bio)
 			break;
@@ -1991,6 +2014,7 @@ static void raid10d(mddev_t *mddev)
 				bio_put(bio);
 			} else {
 				const unsigned long do_sync = (r10_bio->master_bio->bi_rw & REQ_SYNC);
+				dev_t bio_dev = bio->bi_bdev->bd_dev;
 				bio_put(bio);
 				slot = r10_bio->read_slot;
 				rdev = conf->mirrors[mirror].rdev;
@@ -2012,6 +2036,9 @@ static void raid10d(mddev_t *mddev)
 					bio->bi_rw |= REQ_FAILFAST_DEV;
 				bio->bi_private = r10_bio;
 				bio->bi_end_io = raid10_end_read_request;
+				trace_block_bio_remap(bdev_get_queue(bio->bi_bdev),
+						      bio, bio_dev,
+						      r10_bio->devs[slot].addr);
 				generic_make_request(bio);
 			}
 		}
-- 
1.7.4.2

