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@xxxxxxx> Reviewed-by: Mikulas Patocka <mpatocka@xxxxxxxxxx> > --- > 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@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/dm-devel > -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel