diff options
author | Mike Snitzer <snitzer@redhat.com> | 2013-09-12 18:06:12 -0400 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2013-09-23 10:42:24 -0400 |
commit | e8603136cb04ec2d0c9b4b5be7a071fc003cb399 (patch) | |
tree | e642b195034f281eeb76de62f5bcf3deb2985de1 | |
parent | f47908269fb53d522a956b78612a0037f5faf8e7 (diff) |
dm: add reserved_bio_based_ios module parameter
Allow user to change the number of IOs that are reserved by
bio-based DM's mempools by writing to this file:
/sys/module/dm_mod/parameters/reserved_bio_based_ios
The default value is RESERVED_BIO_BASED_IOS (16). The maximum allowed
value is RESERVED_MAX_IOS (1024).
Export dm_get_reserved_bio_based_ios() for use by DM targets and core
code. Switch to sizing dm-io's mempool and bioset using DM core's
configurable 'reserved_bio_based_ios'.
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Signed-off-by: Frank Mayhar <fmayhar@google.com>
-rw-r--r-- | drivers/md/dm-io.c | 7 | ||||
-rw-r--r-- | drivers/md/dm.c | 17 | ||||
-rw-r--r-- | drivers/md/dm.h | 1 |
3 files changed, 20 insertions, 5 deletions
diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c index ea49834377c8..2a20986a2fec 100644 --- a/drivers/md/dm-io.c +++ b/drivers/md/dm-io.c | |||
@@ -19,8 +19,6 @@ | |||
19 | #define DM_MSG_PREFIX "io" | 19 | #define DM_MSG_PREFIX "io" |
20 | 20 | ||
21 | #define DM_IO_MAX_REGIONS BITS_PER_LONG | 21 | #define DM_IO_MAX_REGIONS BITS_PER_LONG |
22 | #define MIN_IOS 16 | ||
23 | #define MIN_BIOS 16 | ||
24 | 22 | ||
25 | struct dm_io_client { | 23 | struct dm_io_client { |
26 | mempool_t *pool; | 24 | mempool_t *pool; |
@@ -50,16 +48,17 @@ static struct kmem_cache *_dm_io_cache; | |||
50 | struct dm_io_client *dm_io_client_create(void) | 48 | struct dm_io_client *dm_io_client_create(void) |
51 | { | 49 | { |
52 | struct dm_io_client *client; | 50 | struct dm_io_client *client; |
51 | unsigned min_ios = dm_get_reserved_bio_based_ios(); | ||
53 | 52 | ||
54 | client = kmalloc(sizeof(*client), GFP_KERNEL); | 53 | client = kmalloc(sizeof(*client), GFP_KERNEL); |
55 | if (!client) | 54 | if (!client) |
56 | return ERR_PTR(-ENOMEM); | 55 | return ERR_PTR(-ENOMEM); |
57 | 56 | ||
58 | client->pool = mempool_create_slab_pool(MIN_IOS, _dm_io_cache); | 57 | client->pool = mempool_create_slab_pool(min_ios, _dm_io_cache); |
59 | if (!client->pool) | 58 | if (!client->pool) |
60 | goto bad; | 59 | goto bad; |
61 | 60 | ||
62 | client->bios = bioset_create(MIN_BIOS, 0); | 61 | client->bios = bioset_create(min_ios, 0); |
63 | if (!client->bios) | 62 | if (!client->bios) |
64 | goto bad; | 63 | goto bad; |
65 | 64 | ||
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 1e85f1da1ef3..b3e26c7d1417 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c | |||
@@ -218,6 +218,11 @@ static struct kmem_cache *_io_cache; | |||
218 | static struct kmem_cache *_rq_tio_cache; | 218 | static struct kmem_cache *_rq_tio_cache; |
219 | 219 | ||
220 | /* | 220 | /* |
221 | * Bio-based DM's mempools' reserved IOs set by the user. | ||
222 | */ | ||
223 | static unsigned reserved_bio_based_ios = RESERVED_BIO_BASED_IOS; | ||
224 | |||
225 | /* | ||
221 | * Request-based DM's mempools' reserved IOs set by the user. | 226 | * Request-based DM's mempools' reserved IOs set by the user. |
222 | */ | 227 | */ |
223 | static unsigned reserved_rq_based_ios = RESERVED_REQUEST_BASED_IOS; | 228 | static unsigned reserved_rq_based_ios = RESERVED_REQUEST_BASED_IOS; |
@@ -241,6 +246,13 @@ static unsigned __dm_get_reserved_ios(unsigned *reserved_ios, | |||
241 | return ios; | 246 | return ios; |
242 | } | 247 | } |
243 | 248 | ||
249 | unsigned dm_get_reserved_bio_based_ios(void) | ||
250 | { | ||
251 | return __dm_get_reserved_ios(&reserved_bio_based_ios, | ||
252 | RESERVED_BIO_BASED_IOS, RESERVED_MAX_IOS); | ||
253 | } | ||
254 | EXPORT_SYMBOL_GPL(dm_get_reserved_bio_based_ios); | ||
255 | |||
244 | unsigned dm_get_reserved_rq_based_ios(void) | 256 | unsigned dm_get_reserved_rq_based_ios(void) |
245 | { | 257 | { |
246 | return __dm_get_reserved_ios(&reserved_rq_based_ios, | 258 | return __dm_get_reserved_ios(&reserved_rq_based_ios, |
@@ -2906,7 +2918,7 @@ struct dm_md_mempools *dm_alloc_md_mempools(unsigned type, unsigned integrity, u | |||
2906 | 2918 | ||
2907 | if (type == DM_TYPE_BIO_BASED) { | 2919 | if (type == DM_TYPE_BIO_BASED) { |
2908 | cachep = _io_cache; | 2920 | cachep = _io_cache; |
2909 | pool_size = RESERVED_BIO_BASED_IOS; | 2921 | pool_size = dm_get_reserved_bio_based_ios(); |
2910 | front_pad = roundup(per_bio_data_size, __alignof__(struct dm_target_io)) + offsetof(struct dm_target_io, clone); | 2922 | front_pad = roundup(per_bio_data_size, __alignof__(struct dm_target_io)) + offsetof(struct dm_target_io, clone); |
2911 | } else if (type == DM_TYPE_REQUEST_BASED) { | 2923 | } else if (type == DM_TYPE_REQUEST_BASED) { |
2912 | cachep = _rq_tio_cache; | 2924 | cachep = _rq_tio_cache; |
@@ -2969,6 +2981,9 @@ module_exit(dm_exit); | |||
2969 | module_param(major, uint, 0); | 2981 | module_param(major, uint, 0); |
2970 | MODULE_PARM_DESC(major, "The major number of the device mapper"); | 2982 | MODULE_PARM_DESC(major, "The major number of the device mapper"); |
2971 | 2983 | ||
2984 | module_param(reserved_bio_based_ios, uint, S_IRUGO | S_IWUSR); | ||
2985 | MODULE_PARM_DESC(reserved_bio_based_ios, "Reserved IOs in bio-based mempools"); | ||
2986 | |||
2972 | module_param(reserved_rq_based_ios, uint, S_IRUGO | S_IWUSR); | 2987 | module_param(reserved_rq_based_ios, uint, S_IRUGO | S_IWUSR); |
2973 | MODULE_PARM_DESC(reserved_rq_based_ios, "Reserved IOs in request-based mempools"); | 2988 | MODULE_PARM_DESC(reserved_rq_based_ios, "Reserved IOs in request-based mempools"); |
2974 | 2989 | ||
diff --git a/drivers/md/dm.h b/drivers/md/dm.h index 15396501e0b3..1d1ad7b7e527 100644 --- a/drivers/md/dm.h +++ b/drivers/md/dm.h | |||
@@ -184,6 +184,7 @@ void dm_free_md_mempools(struct dm_md_mempools *pools); | |||
184 | /* | 184 | /* |
185 | * Helpers that are used by DM core | 185 | * Helpers that are used by DM core |
186 | */ | 186 | */ |
187 | unsigned dm_get_reserved_bio_based_ios(void); | ||
187 | unsigned dm_get_reserved_rq_based_ios(void); | 188 | unsigned dm_get_reserved_rq_based_ios(void); |
188 | 189 | ||
189 | static inline bool dm_message_test_buffer_overflow(char *result, unsigned maxlen) | 190 | static inline bool dm_message_test_buffer_overflow(char *result, unsigned maxlen) |