From ad3fee790088d36ad862e31535b5b99c25adeef4 Mon Sep 17 00:00:00 2001 From: Lars Ellenberg Date: Fri, 20 Dec 2013 11:22:13 +0100 Subject: drbd: improve throttling decisions of background resynchronisation Background resynchronisation does some "side-stepping", or throttles itself, if it detects application IO activity, and the current resync rate estimate is above the configured "cmin-rate". What was not detected: if there is no application IO, because it blocks on activity log transactions. Introduce a new atomic_t ap_actlog_cnt, tracking such blocked requests, and count non-zero as application IO activity. This counter is exposed at proc_details level 2 and above. Also make sure to release the currently locked resync extent if we side-step due to such voluntary throttling. Signed-off-by: Philipp Reisner Signed-off-by: Lars Ellenberg --- drivers/block/drbd/drbd_req.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'drivers/block/drbd/drbd_req.c') diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c index 3f6a6ed2fd03..74ebef101dc7 100644 --- a/drivers/block/drbd/drbd_req.c +++ b/drivers/block/drbd/drbd_req.c @@ -1218,6 +1218,7 @@ drbd_request_prepare(struct drbd_device *device, struct bio *bio, unsigned long if (rw == WRITE && req->private_bio && req->i.size && !test_bit(AL_SUSPENDED, &device->flags)) { if (!drbd_al_begin_io_fastpath(device, &req->i)) { + atomic_inc(&device->ap_actlog_cnt); drbd_queue_write(device, req); return NULL; } @@ -1354,6 +1355,7 @@ static void submit_fast_path(struct drbd_device *device, struct list_head *incom req->rq_state |= RQ_IN_ACT_LOG; req->in_actlog_jif = jiffies; + atomic_dec(&device->ap_actlog_cnt); } list_del_init(&req->tl_requests); @@ -1439,6 +1441,7 @@ skip_fast_path: list_for_each_entry_safe(req, tmp, &pending, tl_requests) { req->rq_state |= RQ_IN_ACT_LOG; req->in_actlog_jif = jiffies; + atomic_dec(&device->ap_actlog_cnt); list_del_init(&req->tl_requests); drbd_send_and_submit(device, req); } @@ -1454,6 +1457,7 @@ skip_fast_path: if (!was_cold) { req->rq_state |= RQ_IN_ACT_LOG; req->in_actlog_jif = jiffies; + atomic_dec(&device->ap_actlog_cnt); /* Corresponding extent was hot after all? */ drbd_send_and_submit(device, req); } else { -- cgit v1.2.3