diff options
author | Philipp Reisner <philipp.reisner@linbit.com> | 2010-11-09 11:45:06 -0500 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2011-03-10 05:34:57 -0500 |
commit | aeda1cd6a58009ef21b6d9c09b1a3ded726c2d10 (patch) | |
tree | bfe98db19ead95ce7021798b80299fe1942db42d /drivers | |
parent | f91ab6282df251d28aa4ad1bd85194ebe0a0115b (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>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/block/drbd/drbd_req.c | 12 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_req.h | 1 |
2 files changed, 8 insertions, 5 deletions
diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c index a8d1ff2bda27..eff0fbf69dd4 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 | ||
760 | static int drbd_make_request_common(struct drbd_conf *mdev, struct bio *bio) | 760 | static 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 40d3dcd8fc81..077c47b1e9d7 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); |