drbd: performance - don't lose unplug events
authorLars Ellenberg <lars.ellenberg@linbit.com>
Tue, 3 Nov 2009 01:22:06 +0000 (02:22 +0100)
committerPhilipp Reisner <philipp.reisner@linbit.com>
Wed, 4 Nov 2009 14:21:04 +0000 (15:21 +0100)
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
drivers/block/drbd/drbd_req.c

index 3678d3d66c6c8a056c8b9a4a94c074e0c271647f..d09aac4a84ec41a289a256761f9e570f97f7b8bc 100644 (file)
@@ -505,7 +505,7 @@ void __req_mod(struct drbd_request *req, enum drbd_req_event what,
                 * corresponding hlist_del is in _req_may_be_done() */
                hlist_add_head(&req->colision, ar_hash_slot(mdev, req->sector));
 
-               set_bit(UNPLUG_REMOTE, &mdev->flags); /* why? */
+               set_bit(UNPLUG_REMOTE, &mdev->flags);
 
                D_ASSERT(req->rq_state & RQ_NET_PENDING);
                req->rq_state |= RQ_NET_QUEUED;
@@ -536,6 +536,11 @@ void __req_mod(struct drbd_request *req, enum drbd_req_event what,
                 *
                 * Add req to the (now) current epoch (barrier). */
 
+               /* otherwise we may lose an unplug, which may cause some remote
+                * io-scheduler timeout to expire, increasing maximum latency,
+                * hurting performance. */
+               set_bit(UNPLUG_REMOTE, &mdev->flags);
+
                /* see drbd_make_request_common,
                 * just after it grabs the req_lock */
                D_ASSERT(test_bit(CREATE_BARRIER, &mdev->flags) == 0);