aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/lightnvm/pblk-init.c
diff options
context:
space:
mode:
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);