aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorMike Snitzer <snitzer@redhat.com>2013-09-12 18:06:12 -0400
committerMike Snitzer <snitzer@redhat.com>2013-09-23 10:42:24 -0400
commitf47908269fb53d522a956b78612a0037f5faf8e7 (patch)
tree47723023a5389daa5cdd974d4b53c3d91198be6e /drivers
parent6cfa58573f9b4a543005baa002e137820504c7af (diff)
dm: add reserved_rq_based_ios module parameter
Allow user to change the number of IOs that are reserved by request-based DM's mempools by writing to this file: /sys/module/dm_mod/parameters/reserved_rq_based_ios The default value is RESERVED_REQUEST_BASED_IOS (256). The maximum allowed value is RESERVED_MAX_IOS (1024). Export dm_get_reserved_rq_based_ios() for use by DM targets and core code. Switch to sizing dm-mpath's mempool using DM core's configurable 'reserved_rq_based_ios'. Signed-off-by: Mike Snitzer <snitzer@redhat.com> Signed-off-by: Frank Mayhar <fmayhar@google.com> Acked-by: Mikulas Patocka <mpatocka@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/md/dm-mpath.c6
-rw-r--r--drivers/md/dm.c38
-rw-r--r--drivers/md/dm.h2
3 files changed, 42 insertions, 4 deletions
diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c
index e08be94959fd..de570a558764 100644
--- a/drivers/md/dm-mpath.c
+++ b/drivers/md/dm-mpath.c
@@ -7,6 +7,7 @@
7 7
8#include <linux/device-mapper.h> 8#include <linux/device-mapper.h>
9 9
10#include "dm.h"
10#include "dm-path-selector.h" 11#include "dm-path-selector.h"
11#include "dm-uevent.h" 12#include "dm-uevent.h"
12 13
@@ -116,8 +117,6 @@ struct dm_mpath_io {
116 117
117typedef int (*action_fn) (struct pgpath *pgpath); 118typedef int (*action_fn) (struct pgpath *pgpath);
118 119
119#define MIN_IOS 256 /* Mempool size */
120
121static struct kmem_cache *_mpio_cache; 120static struct kmem_cache *_mpio_cache;
122 121
123static struct workqueue_struct *kmultipathd, *kmpath_handlerd; 122static struct workqueue_struct *kmultipathd, *kmpath_handlerd;
@@ -190,6 +189,7 @@ static void free_priority_group(struct priority_group *pg,
190static struct multipath *alloc_multipath(struct dm_target *ti) 189static struct multipath *alloc_multipath(struct dm_target *ti)
191{ 190{
192 struct multipath *m; 191 struct multipath *m;
192 unsigned min_ios = dm_get_reserved_rq_based_ios();
193 193
194 m = kzalloc(sizeof(*m), GFP_KERNEL); 194 m = kzalloc(sizeof(*m), GFP_KERNEL);
195 if (m) { 195 if (m) {
@@ -202,7 +202,7 @@ static struct multipath *alloc_multipath(struct dm_target *ti)
202 INIT_WORK(&m->trigger_event, trigger_event); 202 INIT_WORK(&m->trigger_event, trigger_event);
203 init_waitqueue_head(&m->pg_init_wait); 203 init_waitqueue_head(&m->pg_init_wait);
204 mutex_init(&m->work_mutex); 204 mutex_init(&m->work_mutex);
205 m->mpio_pool = mempool_create_slab_pool(MIN_IOS, _mpio_cache); 205 m->mpio_pool = mempool_create_slab_pool(min_ios, _mpio_cache);
206 if (!m->mpio_pool) { 206 if (!m->mpio_pool) {
207 kfree(m); 207 kfree(m);
208 return NULL; 208 return NULL;
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index f2e5a50ee84e..1e85f1da1ef3 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -213,9 +213,41 @@ struct dm_md_mempools {
213 213
214#define RESERVED_BIO_BASED_IOS 16 214#define RESERVED_BIO_BASED_IOS 16
215#define RESERVED_REQUEST_BASED_IOS 256 215#define RESERVED_REQUEST_BASED_IOS 256
216#define RESERVED_MAX_IOS 1024
216static struct kmem_cache *_io_cache; 217static struct kmem_cache *_io_cache;
217static struct kmem_cache *_rq_tio_cache; 218static struct kmem_cache *_rq_tio_cache;
218 219
220/*
221 * Request-based DM's mempools' reserved IOs set by the user.
222 */
223static unsigned reserved_rq_based_ios = RESERVED_REQUEST_BASED_IOS;
224
225static unsigned __dm_get_reserved_ios(unsigned *reserved_ios,
226 unsigned def, unsigned max)
227{
228 unsigned ios = ACCESS_ONCE(*reserved_ios);
229 unsigned modified_ios = 0;
230
231 if (!ios)
232 modified_ios = def;
233 else if (ios > max)
234 modified_ios = max;
235
236 if (modified_ios) {
237 (void)cmpxchg(reserved_ios, ios, modified_ios);
238 ios = modified_ios;
239 }
240
241 return ios;
242}
243
244unsigned dm_get_reserved_rq_based_ios(void)
245{
246 return __dm_get_reserved_ios(&reserved_rq_based_ios,
247 RESERVED_REQUEST_BASED_IOS, RESERVED_MAX_IOS);
248}
249EXPORT_SYMBOL_GPL(dm_get_reserved_rq_based_ios);
250
219static int __init local_init(void) 251static int __init local_init(void)
220{ 252{
221 int r = -ENOMEM; 253 int r = -ENOMEM;
@@ -2878,7 +2910,7 @@ struct dm_md_mempools *dm_alloc_md_mempools(unsigned type, unsigned integrity, u
2878 front_pad = roundup(per_bio_data_size, __alignof__(struct dm_target_io)) + offsetof(struct dm_target_io, clone); 2910 front_pad = roundup(per_bio_data_size, __alignof__(struct dm_target_io)) + offsetof(struct dm_target_io, clone);
2879 } else if (type == DM_TYPE_REQUEST_BASED) { 2911 } else if (type == DM_TYPE_REQUEST_BASED) {
2880 cachep = _rq_tio_cache; 2912 cachep = _rq_tio_cache;
2881 pool_size = RESERVED_REQUEST_BASED_IOS; 2913 pool_size = dm_get_reserved_rq_based_ios();
2882 front_pad = offsetof(struct dm_rq_clone_bio_info, clone); 2914 front_pad = offsetof(struct dm_rq_clone_bio_info, clone);
2883 /* per_bio_data_size is not used. See __bind_mempools(). */ 2915 /* per_bio_data_size is not used. See __bind_mempools(). */
2884 WARN_ON(per_bio_data_size != 0); 2916 WARN_ON(per_bio_data_size != 0);
@@ -2936,6 +2968,10 @@ module_exit(dm_exit);
2936 2968
2937module_param(major, uint, 0); 2969module_param(major, uint, 0);
2938MODULE_PARM_DESC(major, "The major number of the device mapper"); 2970MODULE_PARM_DESC(major, "The major number of the device mapper");
2971
2972module_param(reserved_rq_based_ios, uint, S_IRUGO | S_IWUSR);
2973MODULE_PARM_DESC(reserved_rq_based_ios, "Reserved IOs in request-based mempools");
2974
2939MODULE_DESCRIPTION(DM_NAME " driver"); 2975MODULE_DESCRIPTION(DM_NAME " driver");
2940MODULE_AUTHOR("Joe Thornber <dm-devel@redhat.com>"); 2976MODULE_AUTHOR("Joe Thornber <dm-devel@redhat.com>");
2941MODULE_LICENSE("GPL"); 2977MODULE_LICENSE("GPL");
diff --git a/drivers/md/dm.h b/drivers/md/dm.h
index 5e604cc7b4aa..15396501e0b3 100644
--- a/drivers/md/dm.h
+++ b/drivers/md/dm.h
@@ -184,6 +184,8 @@ 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 */
187unsigned dm_get_reserved_rq_based_ios(void);
188
187static inline bool dm_message_test_buffer_overflow(char *result, unsigned maxlen) 189static inline bool dm_message_test_buffer_overflow(char *result, unsigned maxlen)
188{ 190{
189 return !maxlen || strlen(result) + 1 >= maxlen; 191 return !maxlen || strlen(result) + 1 >= maxlen;