diff options
author | Joe Thornber <[email protected]> | 2012-12-21 20:23:31 +0000 |
---|---|---|
committer | Alasdair G Kergon <[email protected]> | 2012-12-21 20:23:31 +0000 |
commit | 563af186df08002d2600c4e718ad8f3bde109f53 (patch) | |
tree | e8ba7cf56e84a1aacb77d41499387c89bf58cce6 | |
parent | e8088073c9610af017fd47fddd104a2c3afb32e8 (diff) |
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 <[email protected]>
Signed-off-by: Mike Snitzer <[email protected]>
Signed-off-by: Alasdair G Kergon <[email protected]>
-rw-r--r-- | drivers/md/dm-thin.c | 11 |
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); |