drbd: only start a new epoch, if the current epoch contains writes
authorLars Ellenberg <lars.ellenberg@linbit.com>
Tue, 7 Aug 2012 04:42:09 +0000 (06:42 +0200)
committerPhilipp Reisner <philipp.reisner@linbit.com>
Fri, 9 Nov 2012 13:05:47 +0000 (14:05 +0100)
Almost all code paths calling start_new_tl_epoch() guarded it with
if (... current_tle_writes > 0 ... ).
Just move that inside start_new_tl_epoch().

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 6e8d097..0c1b632 100644 (file)
@@ -162,6 +162,10 @@ static void wake_all_senders(struct drbd_tconn *tconn) {
 /* must hold resource->req_lock */
 static void start_new_tl_epoch(struct drbd_tconn *tconn)
 {
+       /* no point closing an epoch, if it is empty, anyways. */
+       if (tconn->current_tle_writes == 0)
+               return;
+
        tconn->current_tle_writes = 0;
        atomic_inc(&tconn->current_tle_nr);
        wake_all_senders(tconn);
@@ -861,9 +865,8 @@ static void maybe_pull_ahead(struct drbd_conf *mdev)
        }
 
        if (congested) {
-               if (mdev->tconn->current_tle_writes)
-                       /* start a new epoch for non-mirrored writes */
-                       start_new_tl_epoch(mdev->tconn);
+               /* start a new epoch for non-mirrored writes */
+               start_new_tl_epoch(mdev->tconn);
 
                if (on_congestion == OC_PULL_AHEAD)
                        _drbd_set_state(_NS(mdev, conn, C_AHEAD), 0, NULL);
@@ -950,7 +953,7 @@ static int drbd_process_write_request(struct drbd_request *req)
        if (unlikely(req->i.size == 0)) {
                /* The only size==0 bios we expect are empty flushes. */
                D_ASSERT(req->master_bio->bi_rw & REQ_FLUSH);
-               if (remote && mdev->tconn->current_tle_writes)
+               if (remote)
                        start_new_tl_epoch(mdev->tconn);
                return 0;
        }
@@ -1066,13 +1069,15 @@ void __drbd_make_request(struct drbd_conf *mdev, struct bio *bio, unsigned long
 
        /* which transfer log epoch does this belong to? */
        req->epoch = atomic_read(&mdev->tconn->current_tle_nr);
-       if (rw == WRITE)
-               mdev->tconn->current_tle_writes++;
 
        /* no point in adding empty flushes to the transfer log,
         * they are mapped to drbd barriers already. */
-       if (likely(req->i.size!=0))
+       if (likely(req->i.size!=0)) {
+               if (rw == WRITE)
+                       mdev->tconn->current_tle_writes++;
+
                list_add_tail(&req->tl_requests, &mdev->tconn->transfer_log);
+       }
 
        if (rw == WRITE) {
                if (!drbd_process_write_request(req))