[dm-devel] [PATCH] dm: do not call dm_sync_table() when creating new devices
Mikulas Patocka
mpatocka at redhat.com
Wed Nov 5 22:16:21 UTC 2014
On Wed, 5 Nov 2014, Hannes Reinecke wrote:
> When creating new devices dm_sync_table() calls
> synchronize_rcu_expedited(), causing _all_ pending
> RCU pointers to be flushed. This causes a latency
> overhead especially noticeable when creating lots
> of devices.
> And all of this is pointless as there are no old
> maps to be disconnected, and hence no stale pointers
> which would need to be cleared up.
>
> Signed-off-by: Hannes Reinecke <hare at suse.de>
Reviewed-by: Mikulas Patocka <mpatocka at redhat.com>
> ---
> drivers/md/dm.c | 9 ++++++---
> 1 file changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/md/dm.c b/drivers/md/dm.c
> index 58f3927..2c2c6cf 100644
> --- a/drivers/md/dm.c
> +++ b/drivers/md/dm.c
> @@ -2341,7 +2341,8 @@ static struct dm_table *__bind(struct mapped_device *md, struct dm_table *t,
> set_bit(DMF_MERGE_IS_OPTIONAL, &md->flags);
> else
> clear_bit(DMF_MERGE_IS_OPTIONAL, &md->flags);
> - dm_sync_table(md);
> + if (old_map)
> + dm_sync_table(md);
>
> return old_map;
> }
> @@ -2782,7 +2783,8 @@ int dm_suspend(struct mapped_device *md, unsigned suspend_flags)
> * flush_workqueue(md->wq).
> */
> set_bit(DMF_BLOCK_IO_FOR_SUSPEND, &md->flags);
> - synchronize_srcu(&md->io_barrier);
> + if (map)
> + synchronize_srcu(&md->io_barrier);
>
> /*
> * Stop md->queue before flushing md->wq in case request-based
> @@ -2802,7 +2804,8 @@ int dm_suspend(struct mapped_device *md, unsigned suspend_flags)
>
> if (noflush)
> clear_bit(DMF_NOFLUSH_SUSPENDING, &md->flags);
> - synchronize_srcu(&md->io_barrier);
> + if (map)
> + synchronize_srcu(&md->io_barrier);
>
> /* were we interrupted ? */
> if (r < 0) {
> --
> 1.8.5.2
>
> --
> dm-devel mailing list
> dm-devel at redhat.com
> https://www.redhat.com/mailman/listinfo/dm-devel
>
More information about the dm-devel
mailing list