From 9a3c571a5ca2c9d164243993b64c5f4c3632c357 Mon Sep 17 00:00:00 2001 From: Krzysztof Mazur Date: Tue, 14 Feb 2012 14:27:41 +0100 Subject: [PATCH 71/84] lsbd: increase clean window on empty write queue Then the write queue was not sufficient requests for full block the clean window is now increased. This significantly improves performance on devices with high variations of block usage density. Signed-off-by: Krzysztof Mazur --- drivers/block/lsbd.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/block/lsbd.c b/drivers/block/lsbd.c index 0d267c4..dda760f 100644 --- a/drivers/block/lsbd.c +++ b/drivers/block/lsbd.c @@ -62,6 +62,8 @@ enum { LSBD_QUEUE_COUNT, /* must be last */ }; +#define LSBD_CLEAN_HIGH 256 + /* LSBD_CLEAN_WINDOW defines the wanted minimum number of clean blocks */ #define LSBD_CLEAN_WINDOW 16 @@ -2418,6 +2420,7 @@ static int lsbd_thread(void *data) complete(p->event); for (;;) { DECLARE_WAITQUEUE(wait, current); + int wq_len; want_write = 0; want_clean = 0; @@ -2428,6 +2431,7 @@ static int lsbd_thread(void *data) if (__lsbd_want_write(p) || p->blocks_to_write) want_write = 1; + wq_len = p->wqueue_len; spin_unlock_irq(&p->wqueue_lock); want_clean = (lsbd_clean_blocks(p) < LSBD_CLEAN_WINDOW); if (!(want_write || want_clean || p->stop)) @@ -2463,6 +2467,12 @@ static int lsbd_thread(void *data) for (i = 0; i < blocks; i++) lsbd_clean_block(p); + } else if (wq_len < p->sectors_per_block - 1) { + unsigned int blocks = p->mirrored ? 2 : 1; + + if (lsbd_clean_blocks(p) < LSBD_CLEAN_HIGH) + for (i = 0; i < blocks; i++) + lsbd_clean_block(p); } while (want_write && (lsbd_clean_blocks(p) > 1)) { -- 1.8.4.652.g0d6e0ce