aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp Reisner <philipp.reisner@linbit.com>2010-11-09 11:45:06 -0500
committerPhilipp Reisner <philipp.reisner@linbit.com>2011-03-10 05:34:57 -0500
commitaeda1cd6a58009ef21b6d9c09b1a3ded726c2d10 (patch)
treebfe98db19ead95ce7021798b80299fe1942db42d
parentf91ab6282df251d28aa4ad1bd85194ebe0a0115b (diff)
drbd: Begin to account BIO processing time before inc_ap_bio()
Since inc_ap_bio() might sleep already Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
-rw-r--r--drivers/block/drbd/drbd_req.c12
-rw-r--r--drivers/block/drbd/drbd_req.h1
2 files changed, 8 insertions, 5 deletions
diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c
index a8d1ff2bda2..eff0fbf69dd 100644
--- a/drivers/block/drbd/drbd_req.c
+++ b/drivers/block/drbd/drbd_req.c
@@ -757,7 +757,7 @@ static int drbd_may_do_local_read(struct drbd_conf *mdev, sector_t sector, int s
757 return 0 == drbd_bm_count_bits(mdev, sbnr, ebnr); 757 return 0 == drbd_bm_count_bits(mdev, sbnr, ebnr);
758} 758}
759 759
760static int drbd_make_request_common(struct drbd_conf *mdev, struct bio *bio) 760static int drbd_make_request_common(struct drbd_conf *mdev, struct bio *bio, unsigned long start_time)
761{ 761{
762 const int rw = bio_rw(bio); 762 const int rw = bio_rw(bio);
763 const int size = bio->bi_size; 763 const int size = bio->bi_size;
@@ -778,6 +778,7 @@ static int drbd_make_request_common(struct drbd_conf *mdev, struct bio *bio)
778 bio_endio(bio, -ENOMEM); 778 bio_endio(bio, -ENOMEM);
779 return 0; 779 return 0;
780 } 780 }
781 req->start_time = start_time;
781 782
782 local = get_ldev(mdev); 783 local = get_ldev(mdev);
783 if (!local) { 784 if (!local) {
@@ -1076,12 +1077,15 @@ int drbd_make_request_26(struct request_queue *q, struct bio *bio)
1076{ 1077{
1077 unsigned int s_enr, e_enr; 1078 unsigned int s_enr, e_enr;
1078 struct drbd_conf *mdev = (struct drbd_conf *) q->queuedata; 1079 struct drbd_conf *mdev = (struct drbd_conf *) q->queuedata;
1080 unsigned long start_time;
1079 1081
1080 if (drbd_fail_request_early(mdev, bio_data_dir(bio) & WRITE)) { 1082 if (drbd_fail_request_early(mdev, bio_data_dir(bio) & WRITE)) {
1081 bio_endio(bio, -EPERM); 1083 bio_endio(bio, -EPERM);
1082 return 0; 1084 return 0;
1083 } 1085 }
1084 1086
1087 start_time = jiffies;
1088
1085 /* 1089 /*
1086 * what we "blindly" assume: 1090 * what we "blindly" assume:
1087 */ 1091 */
@@ -1096,7 +1100,7 @@ int drbd_make_request_26(struct request_queue *q, struct bio *bio)
1096 1100
1097 if (likely(s_enr == e_enr)) { 1101 if (likely(s_enr == e_enr)) {
1098 inc_ap_bio(mdev, 1); 1102 inc_ap_bio(mdev, 1);
1099 return drbd_make_request_common(mdev, bio); 1103 return drbd_make_request_common(mdev, bio, start_time);
1100 } 1104 }
1101 1105
1102 /* can this bio be split generically? 1106 /* can this bio be split generically?
@@ -1138,10 +1142,10 @@ int drbd_make_request_26(struct request_queue *q, struct bio *bio)
1138 1142
1139 D_ASSERT(e_enr == s_enr + 1); 1143 D_ASSERT(e_enr == s_enr + 1);
1140 1144
1141 while (drbd_make_request_common(mdev, &bp->bio1)) 1145 while (drbd_make_request_common(mdev, &bp->bio1, start_time))
1142 inc_ap_bio(mdev, 1); 1146 inc_ap_bio(mdev, 1);
1143 1147
1144 while (drbd_make_request_common(mdev, &bp->bio2)) 1148 while (drbd_make_request_common(mdev, &bp->bio2, start_time))
1145 inc_ap_bio(mdev, 1); 1149 inc_ap_bio(mdev, 1);
1146 1150
1147 dec_ap_bio(mdev); 1151 dec_ap_bio(mdev);
diff --git a/drivers/block/drbd/drbd_req.h b/drivers/block/drbd/drbd_req.h
index 40d3dcd8fc8..077c47b1e9d 100644
--- a/drivers/block/drbd/drbd_req.h
+++ b/drivers/block/drbd/drbd_req.h
@@ -291,7 +291,6 @@ static inline struct drbd_request *drbd_req_new(struct drbd_conf *mdev,
291 req->epoch = 0; 291 req->epoch = 0;
292 req->sector = bio_src->bi_sector; 292 req->sector = bio_src->bi_sector;
293 req->size = bio_src->bi_size; 293 req->size = bio_src->bi_size;
294 req->start_time = jiffies;
295 INIT_HLIST_NODE(&req->colision); 294 INIT_HLIST_NODE(&req->colision);
296 INIT_LIST_HEAD(&req->tl_requests); 295 INIT_LIST_HEAD(&req->tl_requests);
297 INIT_LIST_HEAD(&req->w.list); 296 INIT_LIST_HEAD(&req->w.list);