summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoe Thornber <ejt@redhat.com>2012-12-21 20:23:31 +0000
committerAlasdair G Kergon <agk@redhat.com>2012-12-21 20:23:31 +0000
commit563af186df08002d2600c4e718ad8f3bde109f53 (patch)
treee8ba7cf56e84a1aacb77d41499387c89bf58cce6
parente8088073c9610af017fd47fddd104a2c3afb32e8 (diff)
downloadlinux-563af186df08002d2600c4e718ad8f3bde109f53.tar.gz
linux-563af186df08002d2600c4e718ad8f3bde109f53.tar.bz2
linux-563af186df08002d2600c4e718ad8f3bde109f53.zip
dm thin: wake worker when discard is prepared
When discards are prepared it is best to directly wake the worker that will process them. The worker will be woken anyway, via periodic commit, but there is no reason to not wake_worker here. Signed-off-by: Joe Thornber <ejt@redhat.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com> Signed-off-by: Alasdair G Kergon <agk@redhat.com>
-rw-r--r--drivers/md/dm-thin.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c
index 41c9e81ba74a..aeb9e20f5978 100644
--- a/drivers/md/dm-thin.c
+++ b/drivers/md/dm-thin.c
@@ -2676,10 +2676,13 @@ static int thin_endio(struct dm_target *ti,
if (h->all_io_entry) {
INIT_LIST_HEAD(&work);
dm_deferred_entry_dec(h->all_io_entry, &work);
- spin_lock_irqsave(&pool->lock, flags);
- list_for_each_entry_safe(m, tmp, &work, list)
- list_add(&m->list, &pool->prepared_discards);
- spin_unlock_irqrestore(&pool->lock, flags);
+ if (!list_empty(&work)) {
+ spin_lock_irqsave(&pool->lock, flags);
+ list_for_each_entry_safe(m, tmp, &work, list)
+ list_add(&m->list, &pool->prepared_discards);
+ spin_unlock_irqrestore(&pool->lock, flags);
+ wake_worker(pool);
+ }
}
mempool_free(h, pool->endio_hook_pool);