aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/lightnvm/pblk-init.c
diff options
context:
space:
mode:
authorJavier González <jg@lightnvm.io>2017-06-26 05:57:28 -0400
committerJens Axboe <axboe@kernel.dk>2017-06-26 18:27:39 -0400
commitef5764946b1314e0aa1ab261493de6b9aa482ff9 (patch)
tree20994287473b382deffea5f0877f1da8277d772f /drivers/lightnvm/pblk-init.c
parentb20ba1bc749ce0cd7a74d24f23826a6462c3de53 (diff)
lightnvm: pblk: set mempool and workqueue params.
Make constants to define sizes for internal mempools and workqueues. In this process, adjust the values to be more meaningful given the internal constrains of the FTL. In order to do this for workqueues, separate the current auxiliary workqueue into two dedicated workqueues to manage lines being closed and bad blocks. Signed-off-by: Javier González <javier@cnexlabs.com> Signed-off-by: Matias Bjørling <matias@cnexlabs.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers/lightnvm/pblk-init.c')
-rw-r--r--drivers/lightnvm/pblk-init.c39
1 files changed, 26 insertions, 13 deletions
diff --git a/drivers/lightnvm/pblk-init.c b/drivers/lightnvm/pblk-init.c
index e8d05a6922f9..6271f85fd165 100644
--- a/drivers/lightnvm/pblk-init.c
+++ b/drivers/lightnvm/pblk-init.c
@@ -251,7 +251,7 @@ static int pblk_core_init(struct pblk *pblk)
251 if (!pblk->page_pool) 251 if (!pblk->page_pool)
252 return -ENOMEM; 252 return -ENOMEM;
253 253
254 pblk->line_ws_pool = mempool_create_slab_pool(geo->nr_luns, 254 pblk->line_ws_pool = mempool_create_slab_pool(PBLK_WS_POOL_SIZE,
255 pblk_blk_ws_cache); 255 pblk_blk_ws_cache);
256 if (!pblk->line_ws_pool) 256 if (!pblk->line_ws_pool)
257 goto free_page_pool; 257 goto free_page_pool;
@@ -260,35 +260,45 @@ static int pblk_core_init(struct pblk *pblk)
260 if (!pblk->rec_pool) 260 if (!pblk->rec_pool)
261 goto free_blk_ws_pool; 261 goto free_blk_ws_pool;
262 262
263 pblk->g_rq_pool = mempool_create_slab_pool(64, pblk_g_rq_cache); 263 pblk->g_rq_pool = mempool_create_slab_pool(PBLK_READ_REQ_POOL_SIZE,
264 pblk_g_rq_cache);
264 if (!pblk->g_rq_pool) 265 if (!pblk->g_rq_pool)
265 goto free_rec_pool; 266 goto free_rec_pool;
266 267
267 pblk->w_rq_pool = mempool_create_slab_pool(64, pblk_w_rq_cache); 268 pblk->w_rq_pool = mempool_create_slab_pool(geo->nr_luns * 2,
269 pblk_w_rq_cache);
268 if (!pblk->w_rq_pool) 270 if (!pblk->w_rq_pool)
269 goto free_g_rq_pool; 271 goto free_g_rq_pool;
270 272
271 pblk->line_meta_pool = 273 pblk->line_meta_pool =
272 mempool_create_slab_pool(16, pblk_line_meta_cache); 274 mempool_create_slab_pool(PBLK_META_POOL_SIZE,
275 pblk_line_meta_cache);
273 if (!pblk->line_meta_pool) 276 if (!pblk->line_meta_pool)
274 goto free_w_rq_pool; 277 goto free_w_rq_pool;
275 278
276 pblk->kw_wq = alloc_workqueue("pblk-aux-wq", 279 pblk->close_wq = alloc_workqueue("pblk-close-wq",
277 WQ_MEM_RECLAIM | WQ_UNBOUND, 1); 280 WQ_MEM_RECLAIM | WQ_UNBOUND, PBLK_NR_CLOSE_JOBS);
278 if (!pblk->kw_wq) 281 if (!pblk->close_wq)
279 goto free_line_meta_pool; 282 goto free_line_meta_pool;
280 283
284 pblk->bb_wq = alloc_workqueue("pblk-bb-wq",
285 WQ_MEM_RECLAIM | WQ_UNBOUND, 0);
286 if (!pblk->bb_wq)
287 goto free_close_wq;
288
281 if (pblk_set_ppaf(pblk)) 289 if (pblk_set_ppaf(pblk))
282 goto free_kw_wq; 290 goto free_bb_wq;
283 291
284 if (pblk_rwb_init(pblk)) 292 if (pblk_rwb_init(pblk))
285 goto free_kw_wq; 293 goto free_bb_wq;
286 294
287 INIT_LIST_HEAD(&pblk->compl_list); 295 INIT_LIST_HEAD(&pblk->compl_list);
288 return 0; 296 return 0;
289 297
290free_kw_wq: 298free_bb_wq:
291 destroy_workqueue(pblk->kw_wq); 299 destroy_workqueue(pblk->bb_wq);
300free_close_wq:
301 destroy_workqueue(pblk->close_wq);
292free_line_meta_pool: 302free_line_meta_pool:
293 mempool_destroy(pblk->line_meta_pool); 303 mempool_destroy(pblk->line_meta_pool);
294free_w_rq_pool: 304free_w_rq_pool:
@@ -306,8 +316,11 @@ free_page_pool:
306 316
307static void pblk_core_free(struct pblk *pblk) 317static void pblk_core_free(struct pblk *pblk)
308{ 318{
309 if (pblk->kw_wq) 319 if (pblk->close_wq)
310 destroy_workqueue(pblk->kw_wq); 320 destroy_workqueue(pblk->close_wq);
321
322 if (pblk->bb_wq)
323 destroy_workqueue(pblk->bb_wq);
311 324
312 mempool_destroy(pblk->page_pool); 325 mempool_destroy(pblk->page_pool);
313 mempool_destroy(pblk->line_ws_pool); 326 mempool_destroy(pblk->line_ws_pool);