drbd: queue writes on submitter thread, unless they pass the activity log fastpath
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
6c3c4355d6
commit
779b3fe4c0
|
@ -1020,6 +1020,14 @@ drbd_submit_req_private_bio(struct drbd_request *req)
|
||||||
bio_endio(bio, -EIO);
|
bio_endio(bio, -EIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void drbd_queue_write(struct drbd_conf *mdev, struct drbd_request *req)
|
||||||
|
{
|
||||||
|
spin_lock(&mdev->submit.lock);
|
||||||
|
list_add_tail(&req->tl_requests, &mdev->submit.writes);
|
||||||
|
spin_unlock(&mdev->submit.lock);
|
||||||
|
queue_work(mdev->submit.wq, &mdev->submit.worker);
|
||||||
|
}
|
||||||
|
|
||||||
/* returns the new drbd_request pointer, if the caller is expected to
|
/* returns the new drbd_request pointer, if the caller is expected to
|
||||||
* drbd_send_and_submit() it (to save latency), or NULL if we queued the
|
* drbd_send_and_submit() it (to save latency), or NULL if we queued the
|
||||||
* request on the submitter thread.
|
* request on the submitter thread.
|
||||||
|
@ -1048,17 +1056,13 @@ drbd_request_prepare(struct drbd_conf *mdev, struct bio *bio, unsigned long star
|
||||||
req->private_bio = NULL;
|
req->private_bio = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For WRITES going to the local disk, grab a reference on the target
|
|
||||||
* extent. This waits for any resync activity in the corresponding
|
|
||||||
* resync extent to finish, and, if necessary, pulls in the target
|
|
||||||
* extent into the activity log, which involves further disk io because
|
|
||||||
* of transactional on-disk meta data updates.
|
|
||||||
* Empty flushes don't need to go into the activity log, they can only
|
|
||||||
* flush data for pending writes which are already in there. */
|
|
||||||
if (rw == WRITE && req->private_bio && req->i.size
|
if (rw == WRITE && req->private_bio && req->i.size
|
||||||
&& !test_bit(AL_SUSPENDED, &mdev->flags)) {
|
&& !test_bit(AL_SUSPENDED, &mdev->flags)) {
|
||||||
|
if (!drbd_al_begin_io_fastpath(mdev, &req->i)) {
|
||||||
|
drbd_queue_write(mdev, req);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
req->rq_state |= RQ_IN_ACT_LOG;
|
req->rq_state |= RQ_IN_ACT_LOG;
|
||||||
drbd_al_begin_io(mdev, &req->i, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return req;
|
return req;
|
||||||
|
|
Loading…
Reference in New Issue