From: Mike Snitzer <snitzer@redhat.com>
To: "Martin K. Petersen" <mkp@mkp.net>
Cc: Jens Axboe <jaxboe@fusionio.com>,
device-mapper development <dm-devel@redhat.com>,
"Martin K. Petersen" <martin.petersen@oracle.com>,
Zdenek Kabelac <zkabelac@redhat.com>
Subject: Re: [PATCH] block: Require subsystems to explicitly allocate bio_set integrity mempool (was: Re: mirrored device with thousand of mappingtableentries)
Date: Fri, 11 Mar 2011 11:53:05 -0500 [thread overview]
Message-ID: <20110311165305.GA28769@redhat.com> (raw)
In-Reply-To: <yq1aah37y5u.fsf@sermon.lab.mkp.net>
On Thu, Mar 10 2011 at 11:11am -0500,
Martin K. Petersen <mkp@mkp.net> wrote:
> >>>>> "Mike" == Mike Snitzer <snitzer@redhat.com> writes:
>
> Mike> In general this approach looks fine too. Doesn't address the
> Mike> concern I had yesterday about the blk_integrity block_size
> Mike> relative to DM (load vs resume) but I'd imagine you'd like to sort
> Mike> that out in a separate patch.
>
> Yeah, that'll come as part of my DIX1.1 patch set.
Seems my concern should be fixed independent of a larger update
patchset. Unless DIX isn't meaningful for "stable" kernels without your
full DIX1.1 update?
> I believe I've addressed all your issues below.
The block and DM changes look good. I haven't put time to the MD
changes (cc'ing neil).
Thanks,
Mike
> block: Require subsystems to explicitly allocate bio_set integrity mempool
>
> MD and DM create a new bio_set for every metadevice. Each bio_set has an
> integrity mempool attached regardless of whether the metadevice is
> capable of passing integrity metadata. This is a waste of memory.
>
> Instead we defer the allocation decision to MD and DM since we know at
> metadevice creation time whether integrity passthrough is needed or not.
>
> Automatic integrity mempool allocation can then be removed from
> bioset_create() and we make an explicit integrity allocation for the
> fs_bio_set.
>
> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
> Reported-by: Zdenek Kabelac <zkabelac@redhat.com>
> Acked-by: Mike Snitzer <snizer@redhat.com>
>
> diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c
> index 38e4eb1..4e8e314 100644
> --- a/drivers/md/dm-table.c
> +++ b/drivers/md/dm-table.c
> @@ -55,6 +55,7 @@ struct dm_table {
> struct dm_target *targets;
>
> unsigned discards_supported:1;
> + unsigned integrity_supported:1;
>
> /*
> * Indicates the rw permissions for the new logical
> @@ -859,7 +860,7 @@ int dm_table_alloc_md_mempools(struct dm_table *t)
> return -EINVAL;
> }
>
> - t->mempools = dm_alloc_md_mempools(type);
> + t->mempools = dm_alloc_md_mempools(type, t->integrity_supported);
> if (!t->mempools)
> return -ENOMEM;
>
> @@ -935,8 +936,10 @@ static int dm_table_prealloc_integrity(struct dm_table *t, struct mapped_device
> struct dm_dev_internal *dd;
>
> list_for_each_entry(dd, devices, list)
> - if (bdev_get_integrity(dd->dm_dev.bdev))
> + if (bdev_get_integrity(dd->dm_dev.bdev)) {
> + t->integrity_supported = 1;
> return blk_integrity_register(dm_disk(md), NULL);
> + }
>
> return 0;
> }
> diff --git a/drivers/md/dm.c b/drivers/md/dm.c
> index eaa3af0..105963d 100644
> --- a/drivers/md/dm.c
> +++ b/drivers/md/dm.c
> @@ -2643,9 +2643,10 @@ int dm_noflush_suspending(struct dm_target *ti)
> }
> EXPORT_SYMBOL_GPL(dm_noflush_suspending);
>
> -struct dm_md_mempools *dm_alloc_md_mempools(unsigned type)
> +struct dm_md_mempools *dm_alloc_md_mempools(unsigned type, unsigned integrity)
> {
> struct dm_md_mempools *pools = kmalloc(sizeof(*pools), GFP_KERNEL);
> + unsigned int pool_size = (type == DM_TYPE_BIO_BASED) ? 16 : MIN_IOS;
>
> if (!pools)
> return NULL;
> @@ -2662,13 +2663,18 @@ struct dm_md_mempools *dm_alloc_md_mempools(unsigned type)
> if (!pools->tio_pool)
> goto free_io_pool_and_out;
>
> - pools->bs = (type == DM_TYPE_BIO_BASED) ?
> - bioset_create(16, 0) : bioset_create(MIN_IOS, 0);
> + pools->bs = bioset_create(pool_size, 0);
> if (!pools->bs)
> goto free_tio_pool_and_out;
>
> + if (integrity && bioset_integrity_create(pools->bs, pool_size))
> + goto free_bioset_and_out;
> +
> return pools;
>
> +free_bioset_and_out:
> + bioset_free(pools->bs);
> +
> free_tio_pool_and_out:
> mempool_destroy(pools->tio_pool);
>
> diff --git a/drivers/md/dm.h b/drivers/md/dm.h
> index 0c2dd5f..1aaf167 100644
> --- a/drivers/md/dm.h
> +++ b/drivers/md/dm.h
> @@ -149,7 +149,7 @@ void dm_kcopyd_exit(void);
> /*
> * Mempool operations
> */
> -struct dm_md_mempools *dm_alloc_md_mempools(unsigned type);
> +struct dm_md_mempools *dm_alloc_md_mempools(unsigned type, unsigned integrity);
> void dm_free_md_mempools(struct dm_md_mempools *pools);
>
> #endif
> diff --git a/drivers/md/linear.c b/drivers/md/linear.c
> index 0ed7f6b..b317544 100644
> --- a/drivers/md/linear.c
> +++ b/drivers/md/linear.c
> @@ -227,8 +227,7 @@ static int linear_run (mddev_t *mddev)
> mddev->queue->unplug_fn = linear_unplug;
> mddev->queue->backing_dev_info.congested_fn = linear_congested;
> mddev->queue->backing_dev_info.congested_data = mddev;
> - md_integrity_register(mddev);
> - return 0;
> + return md_integrity_register(mddev);
> }
>
> static void free_conf(struct rcu_head *head)
> diff --git a/drivers/md/md.c b/drivers/md/md.c
> index 818313e..f11e0bc 100644
> --- a/drivers/md/md.c
> +++ b/drivers/md/md.c
> @@ -1804,8 +1804,12 @@ int md_integrity_register(mddev_t *mddev)
> mdname(mddev));
> return -EINVAL;
> }
> - printk(KERN_NOTICE "md: data integrity on %s enabled\n",
> - mdname(mddev));
> + printk(KERN_NOTICE "md: data integrity enabled on %s\n", mdname(mddev));
> + if (bioset_integrity_create(mddev->bio_set, BIO_POOL_SIZE)) {
> + printk(KERN_ERR "md: failed to create integrity pool for %s\n",
> + mdname(mddev));
> + return -EINVAL;
> + }
> return 0;
> }
> EXPORT_SYMBOL(md_integrity_register);
> diff --git a/drivers/md/multipath.c b/drivers/md/multipath.c
> index 3a62d44..54b8d7c 100644
> --- a/drivers/md/multipath.c
> +++ b/drivers/md/multipath.c
> @@ -345,7 +345,7 @@ static int multipath_remove_disk(mddev_t *mddev, int number)
> p->rdev = rdev;
> goto abort;
> }
> - md_integrity_register(mddev);
> + err = md_integrity_register(mddev);
> }
> abort:
>
> @@ -520,7 +520,10 @@ static int multipath_run (mddev_t *mddev)
> mddev->queue->unplug_fn = multipath_unplug;
> mddev->queue->backing_dev_info.congested_fn = multipath_congested;
> mddev->queue->backing_dev_info.congested_data = mddev;
> - md_integrity_register(mddev);
> +
> + if (md_integrity_register(mddev))
> + goto out_free_conf;
> +
> return 0;
>
> out_free_conf:
> diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c
> index c0ac457..17c001c 100644
> --- a/drivers/md/raid0.c
> +++ b/drivers/md/raid0.c
> @@ -395,8 +395,7 @@ static int raid0_run(mddev_t *mddev)
>
> blk_queue_merge_bvec(mddev->queue, raid0_mergeable_bvec);
> dump_zones(mddev);
> - md_integrity_register(mddev);
> - return 0;
> + return md_integrity_register(mddev);
> }
>
> static int raid0_stop(mddev_t *mddev)
> diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
> index 06cd712..1cca285 100644
> --- a/drivers/md/raid1.c
> +++ b/drivers/md/raid1.c
> @@ -1178,7 +1178,7 @@ static int raid1_remove_disk(mddev_t *mddev, int number)
> p->rdev = rdev;
> goto abort;
> }
> - md_integrity_register(mddev);
> + err = md_integrity_register(mddev);
> }
> abort:
>
> @@ -2069,8 +2069,7 @@ static int run(mddev_t *mddev)
> mddev->queue->unplug_fn = raid1_unplug;
> mddev->queue->backing_dev_info.congested_fn = raid1_congested;
> mddev->queue->backing_dev_info.congested_data = mddev;
> - md_integrity_register(mddev);
> - return 0;
> + return md_integrity_register(mddev);
> }
>
> static int stop(mddev_t *mddev)
> diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
> index 747d061..17a2891 100644
> --- a/drivers/md/raid10.c
> +++ b/drivers/md/raid10.c
> @@ -1233,7 +1233,7 @@ static int raid10_remove_disk(mddev_t *mddev, int number)
> p->rdev = rdev;
> goto abort;
> }
> - md_integrity_register(mddev);
> + err = md_integrity_register(mddev);
> }
> abort:
>
> @@ -2395,7 +2395,10 @@ static int run(mddev_t *mddev)
>
> if (conf->near_copies < conf->raid_disks)
> blk_queue_merge_bvec(mddev->queue, raid10_mergeable_bvec);
> - md_integrity_register(mddev);
> +
> + if (md_integrity_register(mddev))
> + goto out_free_conf;
> +
> return 0;
>
> out_free_conf:
> diff --git a/fs/bio-integrity.c b/fs/bio-integrity.c
> index e49cce2..9c5e6b2 100644
> --- a/fs/bio-integrity.c
> +++ b/fs/bio-integrity.c
> @@ -761,6 +761,9 @@ int bioset_integrity_create(struct bio_set *bs, int pool_size)
> {
> unsigned int max_slab = vecs_to_idx(BIO_MAX_PAGES);
>
> + if (bs->bio_integrity_pool)
> + return 0;
> +
> bs->bio_integrity_pool =
> mempool_create_slab_pool(pool_size, bip_slab[max_slab].slab);
>
> diff --git a/fs/bio.c b/fs/bio.c
> index 5694b75..85e2eab 100644
> --- a/fs/bio.c
> +++ b/fs/bio.c
> @@ -1636,9 +1636,6 @@ struct bio_set *bioset_create(unsigned int pool_size, unsigned int front_pad)
> if (!bs->bio_pool)
> goto bad;
>
> - if (bioset_integrity_create(bs, pool_size))
> - goto bad;
> -
> if (!biovec_create_pools(bs, pool_size))
> return bs;
>
> @@ -1682,6 +1679,9 @@ static int __init init_bio(void)
> if (!fs_bio_set)
> panic("bio: can't allocate bios\n");
>
> + if (bioset_integrity_create(fs_bio_set, BIO_POOL_SIZE))
> + panic("bio: can't create integrity pool\n");
> +
> bio_split_pool = mempool_create_kmalloc_pool(BIO_SPLIT_ENTRIES,
> sizeof(struct bio_pair));
> if (!bio_split_pool)
>
> --
> dm-devel mailing list
> dm-devel@redhat.com
> https://www.redhat.com/mailman/listinfo/dm-devel
next prev parent reply other threads:[~2011-03-11 16:53 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-02-28 11:21 mirrored device with thousand of mapping table entries Eli Malul
2011-02-28 11:48 ` Alasdair G Kergon
2011-02-28 11:59 ` mirrored device with thousand of mapping tableentries Eli Malul
2011-02-28 12:11 ` Alasdair G Kergon
2011-02-28 12:17 ` mirrored device with thousand of mappingtableentries Eli Malul
2011-02-28 13:10 ` Alasdair G Kergon
2011-02-28 13:13 ` Eli Malul
2011-02-28 13:29 ` Alasdair G Kergon
2011-02-28 13:42 ` Eli Malul
2011-02-28 16:25 ` Eli Malul
2011-02-28 13:38 ` Zdenek Kabelac
2011-02-28 15:01 ` Martin K. Petersen
2011-03-06 20:39 ` Zdenek Kabelac
2011-03-07 2:59 ` Martin K. Petersen
2011-03-07 14:24 ` Zdenek Kabelac
2011-03-07 16:09 ` Mike Snitzer
2011-03-08 6:51 ` Martin K. Petersen
2011-03-08 17:13 ` Mike Snitzer
2011-03-10 16:11 ` Martin K. Petersen
2011-03-11 16:53 ` Mike Snitzer [this message]
2011-03-11 17:11 ` [PATCH] block: Require subsystems to explicitly allocate bio_set integrity mempool Martin K. Petersen
2011-03-07 20:10 ` mirrored device with thousand of mappingtableentries Mike Snitzer
2011-03-07 20:22 ` Martin K. Petersen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110311165305.GA28769@redhat.com \
--to=snitzer@redhat.com \
--cc=dm-devel@redhat.com \
--cc=jaxboe@fusionio.com \
--cc=martin.petersen@oracle.com \
--cc=mkp@mkp.net \
--cc=zkabelac@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.