From c5f6a16d89fe6e3f85cdaf8c6cb61b66fea9a808 Mon Sep 17 00:00:00 2001 From: Krzysztof Mazur Date: Wed, 9 Jan 2013 20:54:36 +0100 Subject: [PATCH 84/84] lsbd: use plugging Signed-off-by: Krzysztof Mazur --- drivers/block/lsbd.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/drivers/block/lsbd.c b/drivers/block/lsbd.c index dd8b2f4..e517412 100644 --- a/drivers/block/lsbd.c +++ b/drivers/block/lsbd.c @@ -142,6 +142,8 @@ struct lsbd { unsigned int blocks_to_write; struct semaphore req_sem; + struct tq_struct plug_tq; + struct lsbd_partition part[LSBD_PARTITIONS]; int stop; @@ -1757,7 +1759,7 @@ static int lsbd_queue_bh(struct lsbd *p, struct buffer_head *bh, out_unlock: spin_unlock_irqrestore(&p->wqueue_lock, flags); if (need_wakeup) - wake_up_interruptible(&p->wqueue_wait); + queue_task(&p->plug_tq, &tq_disk); return 0; } @@ -2563,6 +2565,13 @@ static int lsbd_write_block(struct lsbd *p) return 0; } +static void lsbd_unplug_device(void *data) +{ + struct lsbd *p = data; + + wake_up_interruptible(&p->wqueue_wait); +} + /** * lsbd_thread - LSBD write thread */ @@ -2836,6 +2845,8 @@ int __init lsbd_init_module(void) sema_init(&p->req_sem, 512); p->tsk = NULL; p->use = 0; + + INIT_TQUEUE(&p->plug_tq, lsbd_unplug_device, p); } if (devfs_register_blkdev(MAJOR_NR, "lsbd", &lsbd_fops)) { -- 1.8.4.652.g0d6e0ce