Commit aeda1cd6 authored by Philipp Reisner's avatar Philipp Reisner

drbd: Begin to account BIO processing time before inc_ap_bio()

Since inc_ap_bio() might sleep already
Signed-off-by: default avatarPhilipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: default avatarLars Ellenberg <lars.ellenberg@linbit.com>
parent f91ab628
...@@ -757,7 +757,7 @@ static int drbd_may_do_local_read(struct drbd_conf *mdev, sector_t sector, int s ...@@ -757,7 +757,7 @@ static int drbd_may_do_local_read(struct drbd_conf *mdev, sector_t sector, int s
return 0 == drbd_bm_count_bits(mdev, sbnr, ebnr); return 0 == drbd_bm_count_bits(mdev, sbnr, ebnr);
} }
static int drbd_make_request_common(struct drbd_conf *mdev, struct bio *bio) static int drbd_make_request_common(struct drbd_conf *mdev, struct bio *bio, unsigned long start_time)
{ {
const int rw = bio_rw(bio); const int rw = bio_rw(bio);
const int size = bio->bi_size; const int size = bio->bi_size;
...@@ -778,6 +778,7 @@ static int drbd_make_request_common(struct drbd_conf *mdev, struct bio *bio) ...@@ -778,6 +778,7 @@ static int drbd_make_request_common(struct drbd_conf *mdev, struct bio *bio)
bio_endio(bio, -ENOMEM); bio_endio(bio, -ENOMEM);
return 0; return 0;
} }
req->start_time = start_time;
local = get_ldev(mdev); local = get_ldev(mdev);
if (!local) { if (!local) {
...@@ -1076,12 +1077,15 @@ int drbd_make_request_26(struct request_queue *q, struct bio *bio) ...@@ -1076,12 +1077,15 @@ int drbd_make_request_26(struct request_queue *q, struct bio *bio)
{ {
unsigned int s_enr, e_enr; unsigned int s_enr, e_enr;
struct drbd_conf *mdev = (struct drbd_conf *) q->queuedata; struct drbd_conf *mdev = (struct drbd_conf *) q->queuedata;
unsigned long start_time;
if (drbd_fail_request_early(mdev, bio_data_dir(bio) & WRITE)) { if (drbd_fail_request_early(mdev, bio_data_dir(bio) & WRITE)) {
bio_endio(bio, -EPERM); bio_endio(bio, -EPERM);
return 0; return 0;
} }
start_time = jiffies;
/* /*
* what we "blindly" assume: * what we "blindly" assume:
*/ */
...@@ -1096,7 +1100,7 @@ int drbd_make_request_26(struct request_queue *q, struct bio *bio) ...@@ -1096,7 +1100,7 @@ int drbd_make_request_26(struct request_queue *q, struct bio *bio)
if (likely(s_enr == e_enr)) { if (likely(s_enr == e_enr)) {
inc_ap_bio(mdev, 1); inc_ap_bio(mdev, 1);
return drbd_make_request_common(mdev, bio); return drbd_make_request_common(mdev, bio, start_time);
} }
/* can this bio be split generically? /* can this bio be split generically?
...@@ -1138,10 +1142,10 @@ int drbd_make_request_26(struct request_queue *q, struct bio *bio) ...@@ -1138,10 +1142,10 @@ int drbd_make_request_26(struct request_queue *q, struct bio *bio)
D_ASSERT(e_enr == s_enr + 1); D_ASSERT(e_enr == s_enr + 1);
while (drbd_make_request_common(mdev, &bp->bio1)) while (drbd_make_request_common(mdev, &bp->bio1, start_time))
inc_ap_bio(mdev, 1); inc_ap_bio(mdev, 1);
while (drbd_make_request_common(mdev, &bp->bio2)) while (drbd_make_request_common(mdev, &bp->bio2, start_time))
inc_ap_bio(mdev, 1); inc_ap_bio(mdev, 1);
dec_ap_bio(mdev); dec_ap_bio(mdev);
......
...@@ -291,7 +291,6 @@ static inline struct drbd_request *drbd_req_new(struct drbd_conf *mdev, ...@@ -291,7 +291,6 @@ static inline struct drbd_request *drbd_req_new(struct drbd_conf *mdev,
req->epoch = 0; req->epoch = 0;
req->sector = bio_src->bi_sector; req->sector = bio_src->bi_sector;
req->size = bio_src->bi_size; req->size = bio_src->bi_size;
req->start_time = jiffies;
INIT_HLIST_NODE(&req->colision); INIT_HLIST_NODE(&req->colision);
INIT_LIST_HEAD(&req->tl_requests); INIT_LIST_HEAD(&req->tl_requests);
INIT_LIST_HEAD(&req->w.list); INIT_LIST_HEAD(&req->w.list);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment