pblk-init.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2015 IT University of Copenhagen (rrpc.c)
  4. * Copyright (C) 2016 CNEX Labs
  5. * Initial release: Javier Gonzalez <javier@cnexlabs.com>
  6. * Matias Bjorling <matias@cnexlabs.com>
  7. *
  8. * This program is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU General Public License version
  10. * 2 as published by the Free Software Foundation.
  11. *
  12. * This program is distributed in the hope that it will be useful, but
  13. * WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * General Public License for more details.
  16. *
  17. * Implementation of a physical block-device target for Open-channel SSDs.
  18. *
  19. * pblk-init.c - pblk's initialization.
  20. */
  21. #include "pblk.h"
  22. #include "pblk-trace.h"
  23. static unsigned int write_buffer_size;
  24. module_param(write_buffer_size, uint, 0644);
  25. MODULE_PARM_DESC(write_buffer_size, "number of entries in a write buffer");
  26. struct pblk_global_caches {
  27. struct kmem_cache *ws;
  28. struct kmem_cache *rec;
  29. struct kmem_cache *g_rq;
  30. struct kmem_cache *w_rq;
  31. struct kref kref;
  32. struct mutex mutex; /* Ensures consistency between
  33. * caches and kref
  34. */
  35. };
  36. static struct pblk_global_caches pblk_caches = {
  37. .mutex = __MUTEX_INITIALIZER(pblk_caches.mutex),
  38. .kref = KREF_INIT(0),
  39. };
  40. struct bio_set pblk_bio_set;
  41. static int pblk_rw_io(struct request_queue *q, struct pblk *pblk,
  42. struct bio *bio)
  43. {
  44. int ret;
  45. /* Read requests must be <= 256kb due to NVMe's 64 bit completion bitmap
  46. * constraint. Writes can be of arbitrary size.
  47. */
  48. if (bio_data_dir(bio) == READ) {
  49. blk_queue_split(q, &bio);
  50. ret = pblk_submit_read(pblk, bio);
  51. if (ret == NVM_IO_DONE && bio_flagged(bio, BIO_CLONED))
  52. bio_put(bio);
  53. return ret;
  54. }
  55. /* Prevent deadlock in the case of a modest LUN configuration and large
  56. * user I/Os. Unless stalled, the rate limiter leaves at least 256KB
  57. * available for user I/O.
  58. */
  59. if (pblk_get_secs(bio) > pblk_rl_max_io(&pblk->rl))
  60. blk_queue_split(q, &bio);
  61. return pblk_write_to_cache(pblk, bio, PBLK_IOTYPE_USER);
  62. }
  63. static blk_qc_t pblk_make_rq(struct request_queue *q, struct bio *bio)
  64. {
  65. struct pblk *pblk = q->queuedata;
  66. if (bio_op(bio) == REQ_OP_DISCARD) {
  67. pblk_discard(pblk, bio);
  68. if (!(bio->bi_opf & REQ_PREFLUSH)) {
  69. bio_endio(bio);
  70. return BLK_QC_T_NONE;
  71. }
  72. }
  73. switch (pblk_rw_io(q, pblk, bio)) {
  74. case NVM_IO_ERR:
  75. bio_io_error(bio);
  76. break;
  77. case NVM_IO_DONE:
  78. bio_endio(bio);
  79. break;
  80. }
  81. return BLK_QC_T_NONE;
  82. }
  83. static size_t pblk_trans_map_size(struct pblk *pblk)
  84. {
  85. int entry_size = 8;
  86. if (pblk->addrf_len < 32)
  87. entry_size = 4;
  88. return entry_size * pblk->rl.nr_secs;
  89. }
  90. #ifdef CONFIG_NVM_PBLK_DEBUG
  91. static u32 pblk_l2p_crc(struct pblk *pblk)
  92. {
  93. size_t map_size;
  94. u32 crc = ~(u32)0;
  95. map_size = pblk_trans_map_size(pblk);
  96. crc = crc32_le(crc, pblk->trans_map, map_size);
  97. return crc;
  98. }
  99. #endif
  100. static void pblk_l2p_free(struct pblk *pblk)
  101. {
  102. vfree(pblk->trans_map);
  103. }
  104. static int pblk_l2p_recover(struct pblk *pblk, bool factory_init)
  105. {
  106. struct pblk_line *line = NULL;
  107. if (factory_init) {
  108. pblk_setup_uuid(pblk);
  109. } else {
  110. line = pblk_recov_l2p(pblk);
  111. if (IS_ERR(line)) {
  112. pblk_err(pblk, "could not recover l2p table\n");
  113. return -EFAULT;
  114. }
  115. }
  116. #ifdef CONFIG_NVM_PBLK_DEBUG
  117. pblk_info(pblk, "init: L2P CRC: %x\n", pblk_l2p_crc(pblk));
  118. #endif
  119. /* Free full lines directly as GC has not been started yet */
  120. pblk_gc_free_full_lines(pblk);
  121. if (!line) {
  122. /* Configure next line for user data */
  123. line = pblk_line_get_first_data(pblk);
  124. if (!line)
  125. return -EFAULT;
  126. }
  127. return 0;
  128. }
  129. static int pblk_l2p_init(struct pblk *pblk, bool factory_init)
  130. {
  131. sector_t i;
  132. struct ppa_addr ppa;
  133. size_t map_size;
  134. int ret = 0;
  135. map_size = pblk_trans_map_size(pblk);
  136. pblk->trans_map = vmalloc(map_size);
  137. if (!pblk->trans_map)
  138. return -ENOMEM;
  139. pblk_ppa_set_empty(&ppa);
  140. for (i = 0; i < pblk->rl.nr_secs; i++)
  141. pblk_trans_map_set(pblk, i, ppa);
  142. ret = pblk_l2p_recover(pblk, factory_init);
  143. if (ret)
  144. vfree(pblk->trans_map);
  145. return ret;
  146. }
  147. static void pblk_rwb_free(struct pblk *pblk)
  148. {
  149. if (pblk_rb_tear_down_check(&pblk->rwb))
  150. pblk_err(pblk, "write buffer error on tear down\n");
  151. pblk_rb_free(&pblk->rwb);
  152. }
  153. static int pblk_rwb_init(struct pblk *pblk)
  154. {
  155. struct nvm_tgt_dev *dev = pblk->dev;
  156. struct nvm_geo *geo = &dev->geo;
  157. unsigned long buffer_size;
  158. int pgs_in_buffer, threshold;
  159. threshold = geo->mw_cunits * geo->all_luns;
  160. pgs_in_buffer = (max(geo->mw_cunits, geo->ws_opt) + geo->ws_opt)
  161. * geo->all_luns;
  162. if (write_buffer_size && (write_buffer_size > pgs_in_buffer))
  163. buffer_size = write_buffer_size;
  164. else
  165. buffer_size = pgs_in_buffer;
  166. return pblk_rb_init(&pblk->rwb, buffer_size, threshold, geo->csecs);
  167. }
  168. /* Minimum pages needed within a lun */
  169. #define ADDR_POOL_SIZE 64
  170. static int pblk_set_addrf_12(struct pblk *pblk, struct nvm_geo *geo,
  171. struct nvm_addrf_12 *dst)
  172. {
  173. struct nvm_addrf_12 *src = (struct nvm_addrf_12 *)&geo->addrf;
  174. int power_len;
  175. /* Re-calculate channel and lun format to adapt to configuration */
  176. power_len = get_count_order(geo->num_ch);
  177. if (1 << power_len != geo->num_ch) {
  178. pblk_err(pblk, "supports only power-of-two channel config.\n");
  179. return -EINVAL;
  180. }
  181. dst->ch_len = power_len;
  182. power_len = get_count_order(geo->num_lun);
  183. if (1 << power_len != geo->num_lun) {
  184. pblk_err(pblk, "supports only power-of-two LUN config.\n");
  185. return -EINVAL;
  186. }
  187. dst->lun_len = power_len;
  188. dst->blk_len = src->blk_len;
  189. dst->pg_len = src->pg_len;
  190. dst->pln_len = src->pln_len;
  191. dst->sec_len = src->sec_len;
  192. dst->sec_offset = 0;
  193. dst->pln_offset = dst->sec_len;
  194. dst->ch_offset = dst->pln_offset + dst->pln_len;
  195. dst->lun_offset = dst->ch_offset + dst->ch_len;
  196. dst->pg_offset = dst->lun_offset + dst->lun_len;
  197. dst->blk_offset = dst->pg_offset + dst->pg_len;
  198. dst->sec_mask = ((1ULL << dst->sec_len) - 1) << dst->sec_offset;
  199. dst->pln_mask = ((1ULL << dst->pln_len) - 1) << dst->pln_offset;
  200. dst->ch_mask = ((1ULL << dst->ch_len) - 1) << dst->ch_offset;
  201. dst->lun_mask = ((1ULL << dst->lun_len) - 1) << dst->lun_offset;
  202. dst->pg_mask = ((1ULL << dst->pg_len) - 1) << dst->pg_offset;
  203. dst->blk_mask = ((1ULL << dst->blk_len) - 1) << dst->blk_offset;
  204. return dst->blk_offset + src->blk_len;
  205. }
  206. static int pblk_set_addrf_20(struct nvm_geo *geo, struct nvm_addrf *adst,
  207. struct pblk_addrf *udst)
  208. {
  209. struct nvm_addrf *src = &geo->addrf;
  210. adst->ch_len = get_count_order(geo->num_ch);
  211. adst->lun_len = get_count_order(geo->num_lun);
  212. adst->chk_len = src->chk_len;
  213. adst->sec_len = src->sec_len;
  214. adst->sec_offset = 0;
  215. adst->ch_offset = adst->sec_len;
  216. adst->lun_offset = adst->ch_offset + adst->ch_len;
  217. adst->chk_offset = adst->lun_offset + adst->lun_len;
  218. adst->sec_mask = ((1ULL << adst->sec_len) - 1) << adst->sec_offset;
  219. adst->chk_mask = ((1ULL << adst->chk_len) - 1) << adst->chk_offset;
  220. adst->lun_mask = ((1ULL << adst->lun_len) - 1) << adst->lun_offset;
  221. adst->ch_mask = ((1ULL << adst->ch_len) - 1) << adst->ch_offset;
  222. udst->sec_stripe = geo->ws_opt;
  223. udst->ch_stripe = geo->num_ch;
  224. udst->lun_stripe = geo->num_lun;
  225. udst->sec_lun_stripe = udst->sec_stripe * udst->ch_stripe;
  226. udst->sec_ws_stripe = udst->sec_lun_stripe * udst->lun_stripe;
  227. return adst->chk_offset + adst->chk_len;
  228. }
  229. static int pblk_set_addrf(struct pblk *pblk)
  230. {
  231. struct nvm_tgt_dev *dev = pblk->dev;
  232. struct nvm_geo *geo = &dev->geo;
  233. int mod;
  234. switch (geo->version) {
  235. case NVM_OCSSD_SPEC_12:
  236. div_u64_rem(geo->clba, pblk->min_write_pgs, &mod);
  237. if (mod) {
  238. pblk_err(pblk, "bad configuration of sectors/pages\n");
  239. return -EINVAL;
  240. }
  241. pblk->addrf_len = pblk_set_addrf_12(pblk, geo,
  242. (void *)&pblk->addrf);
  243. break;
  244. case NVM_OCSSD_SPEC_20:
  245. pblk->addrf_len = pblk_set_addrf_20(geo, (void *)&pblk->addrf,
  246. &pblk->uaddrf);
  247. break;
  248. default:
  249. pblk_err(pblk, "OCSSD revision not supported (%d)\n",
  250. geo->version);
  251. return -EINVAL;
  252. }
  253. return 0;
  254. }
  255. static int pblk_create_global_caches(void)
  256. {
  257. pblk_caches.ws = kmem_cache_create("pblk_blk_ws",
  258. sizeof(struct pblk_line_ws), 0, 0, NULL);
  259. if (!pblk_caches.ws)
  260. return -ENOMEM;
  261. pblk_caches.rec = kmem_cache_create("pblk_rec",
  262. sizeof(struct pblk_rec_ctx), 0, 0, NULL);
  263. if (!pblk_caches.rec)
  264. goto fail_destroy_ws;
  265. pblk_caches.g_rq = kmem_cache_create("pblk_g_rq", pblk_g_rq_size,
  266. 0, 0, NULL);
  267. if (!pblk_caches.g_rq)
  268. goto fail_destroy_rec;
  269. pblk_caches.w_rq = kmem_cache_create("pblk_w_rq", pblk_w_rq_size,
  270. 0, 0, NULL);
  271. if (!pblk_caches.w_rq)
  272. goto fail_destroy_g_rq;
  273. return 0;
  274. fail_destroy_g_rq:
  275. kmem_cache_destroy(pblk_caches.g_rq);
  276. fail_destroy_rec:
  277. kmem_cache_destroy(pblk_caches.rec);
  278. fail_destroy_ws:
  279. kmem_cache_destroy(pblk_caches.ws);
  280. return -ENOMEM;
  281. }
  282. static int pblk_get_global_caches(void)
  283. {
  284. int ret;
  285. mutex_lock(&pblk_caches.mutex);
  286. if (kref_read(&pblk_caches.kref) > 0) {
  287. kref_get(&pblk_caches.kref);
  288. mutex_unlock(&pblk_caches.mutex);
  289. return 0;
  290. }
  291. ret = pblk_create_global_caches();
  292. if (!ret)
  293. kref_get(&pblk_caches.kref);
  294. mutex_unlock(&pblk_caches.mutex);
  295. return ret;
  296. }
  297. static void pblk_destroy_global_caches(struct kref *ref)
  298. {
  299. struct pblk_global_caches *c;
  300. c = container_of(ref, struct pblk_global_caches, kref);
  301. kmem_cache_destroy(c->ws);
  302. kmem_cache_destroy(c->rec);
  303. kmem_cache_destroy(c->g_rq);
  304. kmem_cache_destroy(c->w_rq);
  305. }
  306. static void pblk_put_global_caches(void)
  307. {
  308. mutex_lock(&pblk_caches.mutex);
  309. kref_put(&pblk_caches.kref, pblk_destroy_global_caches);
  310. mutex_unlock(&pblk_caches.mutex);
  311. }
  312. static int pblk_core_init(struct pblk *pblk)
  313. {
  314. struct nvm_tgt_dev *dev = pblk->dev;
  315. struct nvm_geo *geo = &dev->geo;
  316. int ret, max_write_ppas;
  317. atomic64_set(&pblk->user_wa, 0);
  318. atomic64_set(&pblk->pad_wa, 0);
  319. atomic64_set(&pblk->gc_wa, 0);
  320. pblk->user_rst_wa = 0;
  321. pblk->pad_rst_wa = 0;
  322. pblk->gc_rst_wa = 0;
  323. atomic64_set(&pblk->nr_flush, 0);
  324. pblk->nr_flush_rst = 0;
  325. pblk->min_write_pgs = geo->ws_opt;
  326. max_write_ppas = pblk->min_write_pgs * geo->all_luns;
  327. pblk->max_write_pgs = min_t(int, max_write_ppas, NVM_MAX_VLBA);
  328. pblk->max_write_pgs = min_t(int, pblk->max_write_pgs,
  329. queue_max_hw_sectors(dev->q) / (geo->csecs >> SECTOR_SHIFT));
  330. pblk_set_sec_per_write(pblk, pblk->min_write_pgs);
  331. pblk->pad_dist = kcalloc(pblk->min_write_pgs - 1, sizeof(atomic64_t),
  332. GFP_KERNEL);
  333. if (!pblk->pad_dist)
  334. return -ENOMEM;
  335. if (pblk_get_global_caches())
  336. goto fail_free_pad_dist;
  337. /* Internal bios can be at most the sectors signaled by the device. */
  338. ret = mempool_init_page_pool(&pblk->page_bio_pool, NVM_MAX_VLBA, 0);
  339. if (ret)
  340. goto free_global_caches;
  341. ret = mempool_init_slab_pool(&pblk->gen_ws_pool, PBLK_GEN_WS_POOL_SIZE,
  342. pblk_caches.ws);
  343. if (ret)
  344. goto free_page_bio_pool;
  345. ret = mempool_init_slab_pool(&pblk->rec_pool, geo->all_luns,
  346. pblk_caches.rec);
  347. if (ret)
  348. goto free_gen_ws_pool;
  349. ret = mempool_init_slab_pool(&pblk->r_rq_pool, geo->all_luns,
  350. pblk_caches.g_rq);
  351. if (ret)
  352. goto free_rec_pool;
  353. ret = mempool_init_slab_pool(&pblk->e_rq_pool, geo->all_luns,
  354. pblk_caches.g_rq);
  355. if (ret)
  356. goto free_r_rq_pool;
  357. ret = mempool_init_slab_pool(&pblk->w_rq_pool, geo->all_luns,
  358. pblk_caches.w_rq);
  359. if (ret)
  360. goto free_e_rq_pool;
  361. pblk->close_wq = alloc_workqueue("pblk-close-wq",
  362. WQ_MEM_RECLAIM | WQ_UNBOUND, PBLK_NR_CLOSE_JOBS);
  363. if (!pblk->close_wq)
  364. goto free_w_rq_pool;
  365. pblk->bb_wq = alloc_workqueue("pblk-bb-wq",
  366. WQ_MEM_RECLAIM | WQ_UNBOUND, 0);
  367. if (!pblk->bb_wq)
  368. goto free_close_wq;
  369. pblk->r_end_wq = alloc_workqueue("pblk-read-end-wq",
  370. WQ_MEM_RECLAIM | WQ_UNBOUND, 0);
  371. if (!pblk->r_end_wq)
  372. goto free_bb_wq;
  373. if (pblk_set_addrf(pblk))
  374. goto free_r_end_wq;
  375. INIT_LIST_HEAD(&pblk->compl_list);
  376. INIT_LIST_HEAD(&pblk->resubmit_list);
  377. return 0;
  378. free_r_end_wq:
  379. destroy_workqueue(pblk->r_end_wq);
  380. free_bb_wq:
  381. destroy_workqueue(pblk->bb_wq);
  382. free_close_wq:
  383. destroy_workqueue(pblk->close_wq);
  384. free_w_rq_pool:
  385. mempool_exit(&pblk->w_rq_pool);
  386. free_e_rq_pool:
  387. mempool_exit(&pblk->e_rq_pool);
  388. free_r_rq_pool:
  389. mempool_exit(&pblk->r_rq_pool);
  390. free_rec_pool:
  391. mempool_exit(&pblk->rec_pool);
  392. free_gen_ws_pool:
  393. mempool_exit(&pblk->gen_ws_pool);
  394. free_page_bio_pool:
  395. mempool_exit(&pblk->page_bio_pool);
  396. free_global_caches:
  397. pblk_put_global_caches();
  398. fail_free_pad_dist:
  399. kfree(pblk->pad_dist);
  400. return -ENOMEM;
  401. }
  402. static void pblk_core_free(struct pblk *pblk)
  403. {
  404. if (pblk->close_wq)
  405. destroy_workqueue(pblk->close_wq);
  406. if (pblk->r_end_wq)
  407. destroy_workqueue(pblk->r_end_wq);
  408. if (pblk->bb_wq)
  409. destroy_workqueue(pblk->bb_wq);
  410. mempool_exit(&pblk->page_bio_pool);
  411. mempool_exit(&pblk->gen_ws_pool);
  412. mempool_exit(&pblk->rec_pool);
  413. mempool_exit(&pblk->r_rq_pool);
  414. mempool_exit(&pblk->e_rq_pool);
  415. mempool_exit(&pblk->w_rq_pool);
  416. pblk_put_global_caches();
  417. kfree(pblk->pad_dist);
  418. }
  419. static void pblk_line_mg_free(struct pblk *pblk)
  420. {
  421. struct pblk_line_mgmt *l_mg = &pblk->l_mg;
  422. int i;
  423. kfree(l_mg->bb_template);
  424. kfree(l_mg->bb_aux);
  425. kfree(l_mg->vsc_list);
  426. for (i = 0; i < PBLK_DATA_LINES; i++) {
  427. kfree(l_mg->sline_meta[i]);
  428. pblk_mfree(l_mg->eline_meta[i]->buf, l_mg->emeta_alloc_type);
  429. kfree(l_mg->eline_meta[i]);
  430. }
  431. mempool_destroy(l_mg->bitmap_pool);
  432. kmem_cache_destroy(l_mg->bitmap_cache);
  433. }
  434. static void pblk_line_meta_free(struct pblk_line_mgmt *l_mg,
  435. struct pblk_line *line)
  436. {
  437. struct pblk_w_err_gc *w_err_gc = line->w_err_gc;
  438. kfree(line->blk_bitmap);
  439. kfree(line->erase_bitmap);
  440. kfree(line->chks);
  441. pblk_mfree(w_err_gc->lba_list, l_mg->emeta_alloc_type);
  442. kfree(w_err_gc);
  443. }
  444. static void pblk_lines_free(struct pblk *pblk)
  445. {
  446. struct pblk_line_mgmt *l_mg = &pblk->l_mg;
  447. struct pblk_line *line;
  448. int i;
  449. spin_lock(&l_mg->free_lock);
  450. for (i = 0; i < l_mg->nr_lines; i++) {
  451. line = &pblk->lines[i];
  452. pblk_line_free(line);
  453. pblk_line_meta_free(l_mg, line);
  454. }
  455. spin_unlock(&l_mg->free_lock);
  456. pblk_line_mg_free(pblk);
  457. kfree(pblk->luns);
  458. kfree(pblk->lines);
  459. }
  460. static int pblk_luns_init(struct pblk *pblk)
  461. {
  462. struct nvm_tgt_dev *dev = pblk->dev;
  463. struct nvm_geo *geo = &dev->geo;
  464. struct pblk_lun *rlun;
  465. int i;
  466. /* TODO: Implement unbalanced LUN support */
  467. if (geo->num_lun < 0) {
  468. pblk_err(pblk, "unbalanced LUN config.\n");
  469. return -EINVAL;
  470. }
  471. pblk->luns = kcalloc(geo->all_luns, sizeof(struct pblk_lun),
  472. GFP_KERNEL);
  473. if (!pblk->luns)
  474. return -ENOMEM;
  475. for (i = 0; i < geo->all_luns; i++) {
  476. /* Stripe across channels */
  477. int ch = i % geo->num_ch;
  478. int lun_raw = i / geo->num_ch;
  479. int lunid = lun_raw + ch * geo->num_lun;
  480. rlun = &pblk->luns[i];
  481. rlun->bppa = dev->luns[lunid];
  482. sema_init(&rlun->wr_sem, 1);
  483. }
  484. return 0;
  485. }
  486. /* See comment over struct line_emeta definition */
  487. static unsigned int calc_emeta_len(struct pblk *pblk)
  488. {
  489. struct pblk_line_meta *lm = &pblk->lm;
  490. struct pblk_line_mgmt *l_mg = &pblk->l_mg;
  491. struct nvm_tgt_dev *dev = pblk->dev;
  492. struct nvm_geo *geo = &dev->geo;
  493. /* Round to sector size so that lba_list starts on its own sector */
  494. lm->emeta_sec[1] = DIV_ROUND_UP(
  495. sizeof(struct line_emeta) + lm->blk_bitmap_len +
  496. sizeof(struct wa_counters), geo->csecs);
  497. lm->emeta_len[1] = lm->emeta_sec[1] * geo->csecs;
  498. /* Round to sector size so that vsc_list starts on its own sector */
  499. lm->dsec_per_line = lm->sec_per_line - lm->emeta_sec[0];
  500. lm->emeta_sec[2] = DIV_ROUND_UP(lm->dsec_per_line * sizeof(u64),
  501. geo->csecs);
  502. lm->emeta_len[2] = lm->emeta_sec[2] * geo->csecs;
  503. lm->emeta_sec[3] = DIV_ROUND_UP(l_mg->nr_lines * sizeof(u32),
  504. geo->csecs);
  505. lm->emeta_len[3] = lm->emeta_sec[3] * geo->csecs;
  506. lm->vsc_list_len = l_mg->nr_lines * sizeof(u32);
  507. return (lm->emeta_len[1] + lm->emeta_len[2] + lm->emeta_len[3]);
  508. }
  509. static void pblk_set_provision(struct pblk *pblk, long nr_free_blks)
  510. {
  511. struct nvm_tgt_dev *dev = pblk->dev;
  512. struct pblk_line_mgmt *l_mg = &pblk->l_mg;
  513. struct pblk_line_meta *lm = &pblk->lm;
  514. struct nvm_geo *geo = &dev->geo;
  515. sector_t provisioned;
  516. int sec_meta, blk_meta;
  517. if (geo->op == NVM_TARGET_DEFAULT_OP)
  518. pblk->op = PBLK_DEFAULT_OP;
  519. else
  520. pblk->op = geo->op;
  521. provisioned = nr_free_blks;
  522. provisioned *= (100 - pblk->op);
  523. sector_div(provisioned, 100);
  524. pblk->op_blks = nr_free_blks - provisioned;
  525. /* Internally pblk manages all free blocks, but all calculations based
  526. * on user capacity consider only provisioned blocks
  527. */
  528. pblk->rl.total_blocks = nr_free_blks;
  529. pblk->rl.nr_secs = nr_free_blks * geo->clba;
  530. /* Consider sectors used for metadata */
  531. sec_meta = (lm->smeta_sec + lm->emeta_sec[0]) * l_mg->nr_free_lines;
  532. blk_meta = DIV_ROUND_UP(sec_meta, geo->clba);
  533. pblk->capacity = (provisioned - blk_meta) * geo->clba;
  534. atomic_set(&pblk->rl.free_blocks, nr_free_blks);
  535. atomic_set(&pblk->rl.free_user_blocks, nr_free_blks);
  536. }
  537. static int pblk_setup_line_meta_chk(struct pblk *pblk, struct pblk_line *line,
  538. struct nvm_chk_meta *meta)
  539. {
  540. struct nvm_tgt_dev *dev = pblk->dev;
  541. struct nvm_geo *geo = &dev->geo;
  542. struct pblk_line_meta *lm = &pblk->lm;
  543. int i, nr_bad_chks = 0;
  544. for (i = 0; i < lm->blk_per_line; i++) {
  545. struct pblk_lun *rlun = &pblk->luns[i];
  546. struct nvm_chk_meta *chunk;
  547. struct nvm_chk_meta *chunk_meta;
  548. struct ppa_addr ppa;
  549. int pos;
  550. ppa = rlun->bppa;
  551. pos = pblk_ppa_to_pos(geo, ppa);
  552. chunk = &line->chks[pos];
  553. ppa.m.chk = line->id;
  554. chunk_meta = pblk_chunk_get_off(pblk, meta, ppa);
  555. chunk->state = chunk_meta->state;
  556. chunk->type = chunk_meta->type;
  557. chunk->wi = chunk_meta->wi;
  558. chunk->slba = chunk_meta->slba;
  559. chunk->cnlb = chunk_meta->cnlb;
  560. chunk->wp = chunk_meta->wp;
  561. trace_pblk_chunk_state(pblk_disk_name(pblk), &ppa,
  562. chunk->state);
  563. if (chunk->type & NVM_CHK_TP_SZ_SPEC) {
  564. WARN_ONCE(1, "pblk: custom-sized chunks unsupported\n");
  565. continue;
  566. }
  567. if (!(chunk->state & NVM_CHK_ST_OFFLINE))
  568. continue;
  569. set_bit(pos, line->blk_bitmap);
  570. nr_bad_chks++;
  571. }
  572. return nr_bad_chks;
  573. }
  574. static long pblk_setup_line_meta(struct pblk *pblk, struct pblk_line *line,
  575. void *chunk_meta, int line_id)
  576. {
  577. struct pblk_line_mgmt *l_mg = &pblk->l_mg;
  578. struct pblk_line_meta *lm = &pblk->lm;
  579. long nr_bad_chks, chk_in_line;
  580. line->pblk = pblk;
  581. line->id = line_id;
  582. line->type = PBLK_LINETYPE_FREE;
  583. line->state = PBLK_LINESTATE_NEW;
  584. line->gc_group = PBLK_LINEGC_NONE;
  585. line->vsc = &l_mg->vsc_list[line_id];
  586. spin_lock_init(&line->lock);
  587. nr_bad_chks = pblk_setup_line_meta_chk(pblk, line, chunk_meta);
  588. chk_in_line = lm->blk_per_line - nr_bad_chks;
  589. if (nr_bad_chks < 0 || nr_bad_chks > lm->blk_per_line ||
  590. chk_in_line < lm->min_blk_line) {
  591. line->state = PBLK_LINESTATE_BAD;
  592. list_add_tail(&line->list, &l_mg->bad_list);
  593. return 0;
  594. }
  595. atomic_set(&line->blk_in_line, chk_in_line);
  596. list_add_tail(&line->list, &l_mg->free_list);
  597. l_mg->nr_free_lines++;
  598. return chk_in_line;
  599. }
  600. static int pblk_alloc_line_meta(struct pblk *pblk, struct pblk_line *line)
  601. {
  602. struct pblk_line_meta *lm = &pblk->lm;
  603. line->blk_bitmap = kzalloc(lm->blk_bitmap_len, GFP_KERNEL);
  604. if (!line->blk_bitmap)
  605. return -ENOMEM;
  606. line->erase_bitmap = kzalloc(lm->blk_bitmap_len, GFP_KERNEL);
  607. if (!line->erase_bitmap)
  608. goto free_blk_bitmap;
  609. line->chks = kmalloc_array(lm->blk_per_line,
  610. sizeof(struct nvm_chk_meta), GFP_KERNEL);
  611. if (!line->chks)
  612. goto free_erase_bitmap;
  613. line->w_err_gc = kzalloc(sizeof(struct pblk_w_err_gc), GFP_KERNEL);
  614. if (!line->w_err_gc)
  615. goto free_chks;
  616. return 0;
  617. free_chks:
  618. kfree(line->chks);
  619. free_erase_bitmap:
  620. kfree(line->erase_bitmap);
  621. free_blk_bitmap:
  622. kfree(line->blk_bitmap);
  623. return -ENOMEM;
  624. }
  625. static int pblk_line_mg_init(struct pblk *pblk)
  626. {
  627. struct nvm_tgt_dev *dev = pblk->dev;
  628. struct nvm_geo *geo = &dev->geo;
  629. struct pblk_line_mgmt *l_mg = &pblk->l_mg;
  630. struct pblk_line_meta *lm = &pblk->lm;
  631. int i, bb_distance;
  632. l_mg->nr_lines = geo->num_chk;
  633. l_mg->log_line = l_mg->data_line = NULL;
  634. l_mg->l_seq_nr = l_mg->d_seq_nr = 0;
  635. l_mg->nr_free_lines = 0;
  636. bitmap_zero(&l_mg->meta_bitmap, PBLK_DATA_LINES);
  637. INIT_LIST_HEAD(&l_mg->free_list);
  638. INIT_LIST_HEAD(&l_mg->corrupt_list);
  639. INIT_LIST_HEAD(&l_mg->bad_list);
  640. INIT_LIST_HEAD(&l_mg->gc_full_list);
  641. INIT_LIST_HEAD(&l_mg->gc_high_list);
  642. INIT_LIST_HEAD(&l_mg->gc_mid_list);
  643. INIT_LIST_HEAD(&l_mg->gc_low_list);
  644. INIT_LIST_HEAD(&l_mg->gc_empty_list);
  645. INIT_LIST_HEAD(&l_mg->gc_werr_list);
  646. INIT_LIST_HEAD(&l_mg->emeta_list);
  647. l_mg->gc_lists[0] = &l_mg->gc_werr_list;
  648. l_mg->gc_lists[1] = &l_mg->gc_high_list;
  649. l_mg->gc_lists[2] = &l_mg->gc_mid_list;
  650. l_mg->gc_lists[3] = &l_mg->gc_low_list;
  651. spin_lock_init(&l_mg->free_lock);
  652. spin_lock_init(&l_mg->close_lock);
  653. spin_lock_init(&l_mg->gc_lock);
  654. l_mg->vsc_list = kcalloc(l_mg->nr_lines, sizeof(__le32), GFP_KERNEL);
  655. if (!l_mg->vsc_list)
  656. goto fail;
  657. l_mg->bb_template = kzalloc(lm->sec_bitmap_len, GFP_KERNEL);
  658. if (!l_mg->bb_template)
  659. goto fail_free_vsc_list;
  660. l_mg->bb_aux = kzalloc(lm->sec_bitmap_len, GFP_KERNEL);
  661. if (!l_mg->bb_aux)
  662. goto fail_free_bb_template;
  663. /* smeta is always small enough to fit on a kmalloc memory allocation,
  664. * emeta depends on the number of LUNs allocated to the pblk instance
  665. */
  666. for (i = 0; i < PBLK_DATA_LINES; i++) {
  667. l_mg->sline_meta[i] = kmalloc(lm->smeta_len, GFP_KERNEL);
  668. if (!l_mg->sline_meta[i])
  669. goto fail_free_smeta;
  670. }
  671. l_mg->bitmap_cache = kmem_cache_create("pblk_lm_bitmap",
  672. lm->sec_bitmap_len, 0, 0, NULL);
  673. if (!l_mg->bitmap_cache)
  674. goto fail_free_smeta;
  675. /* the bitmap pool is used for both valid and map bitmaps */
  676. l_mg->bitmap_pool = mempool_create_slab_pool(PBLK_DATA_LINES * 2,
  677. l_mg->bitmap_cache);
  678. if (!l_mg->bitmap_pool)
  679. goto fail_destroy_bitmap_cache;
  680. /* emeta allocates three different buffers for managing metadata with
  681. * in-memory and in-media layouts
  682. */
  683. for (i = 0; i < PBLK_DATA_LINES; i++) {
  684. struct pblk_emeta *emeta;
  685. emeta = kmalloc(sizeof(struct pblk_emeta), GFP_KERNEL);
  686. if (!emeta)
  687. goto fail_free_emeta;
  688. if (lm->emeta_len[0] > KMALLOC_MAX_CACHE_SIZE) {
  689. l_mg->emeta_alloc_type = PBLK_VMALLOC_META;
  690. emeta->buf = vmalloc(lm->emeta_len[0]);
  691. if (!emeta->buf) {
  692. kfree(emeta);
  693. goto fail_free_emeta;
  694. }
  695. emeta->nr_entries = lm->emeta_sec[0];
  696. l_mg->eline_meta[i] = emeta;
  697. } else {
  698. l_mg->emeta_alloc_type = PBLK_KMALLOC_META;
  699. emeta->buf = kmalloc(lm->emeta_len[0], GFP_KERNEL);
  700. if (!emeta->buf) {
  701. kfree(emeta);
  702. goto fail_free_emeta;
  703. }
  704. emeta->nr_entries = lm->emeta_sec[0];
  705. l_mg->eline_meta[i] = emeta;
  706. }
  707. }
  708. for (i = 0; i < l_mg->nr_lines; i++)
  709. l_mg->vsc_list[i] = cpu_to_le32(EMPTY_ENTRY);
  710. bb_distance = (geo->all_luns) * geo->ws_opt;
  711. for (i = 0; i < lm->sec_per_line; i += bb_distance)
  712. bitmap_set(l_mg->bb_template, i, geo->ws_opt);
  713. return 0;
  714. fail_free_emeta:
  715. while (--i >= 0) {
  716. if (l_mg->emeta_alloc_type == PBLK_VMALLOC_META)
  717. vfree(l_mg->eline_meta[i]->buf);
  718. else
  719. kfree(l_mg->eline_meta[i]->buf);
  720. kfree(l_mg->eline_meta[i]);
  721. }
  722. mempool_destroy(l_mg->bitmap_pool);
  723. fail_destroy_bitmap_cache:
  724. kmem_cache_destroy(l_mg->bitmap_cache);
  725. fail_free_smeta:
  726. for (i = 0; i < PBLK_DATA_LINES; i++)
  727. kfree(l_mg->sline_meta[i]);
  728. kfree(l_mg->bb_aux);
  729. fail_free_bb_template:
  730. kfree(l_mg->bb_template);
  731. fail_free_vsc_list:
  732. kfree(l_mg->vsc_list);
  733. fail:
  734. return -ENOMEM;
  735. }
  736. static int pblk_line_meta_init(struct pblk *pblk)
  737. {
  738. struct nvm_tgt_dev *dev = pblk->dev;
  739. struct nvm_geo *geo = &dev->geo;
  740. struct pblk_line_meta *lm = &pblk->lm;
  741. unsigned int smeta_len, emeta_len;
  742. int i;
  743. lm->sec_per_line = geo->clba * geo->all_luns;
  744. lm->blk_per_line = geo->all_luns;
  745. lm->blk_bitmap_len = BITS_TO_LONGS(geo->all_luns) * sizeof(long);
  746. lm->sec_bitmap_len = BITS_TO_LONGS(lm->sec_per_line) * sizeof(long);
  747. lm->lun_bitmap_len = BITS_TO_LONGS(geo->all_luns) * sizeof(long);
  748. lm->mid_thrs = lm->sec_per_line / 2;
  749. lm->high_thrs = lm->sec_per_line / 4;
  750. lm->meta_distance = (geo->all_luns / 2) * pblk->min_write_pgs;
  751. /* Calculate necessary pages for smeta. See comment over struct
  752. * line_smeta definition
  753. */
  754. i = 1;
  755. add_smeta_page:
  756. lm->smeta_sec = i * geo->ws_opt;
  757. lm->smeta_len = lm->smeta_sec * geo->csecs;
  758. smeta_len = sizeof(struct line_smeta) + lm->lun_bitmap_len;
  759. if (smeta_len > lm->smeta_len) {
  760. i++;
  761. goto add_smeta_page;
  762. }
  763. /* Calculate necessary pages for emeta. See comment over struct
  764. * line_emeta definition
  765. */
  766. i = 1;
  767. add_emeta_page:
  768. lm->emeta_sec[0] = i * geo->ws_opt;
  769. lm->emeta_len[0] = lm->emeta_sec[0] * geo->csecs;
  770. emeta_len = calc_emeta_len(pblk);
  771. if (emeta_len > lm->emeta_len[0]) {
  772. i++;
  773. goto add_emeta_page;
  774. }
  775. lm->emeta_bb = geo->all_luns > i ? geo->all_luns - i : 0;
  776. lm->min_blk_line = 1;
  777. if (geo->all_luns > 1)
  778. lm->min_blk_line += DIV_ROUND_UP(lm->smeta_sec +
  779. lm->emeta_sec[0], geo->clba);
  780. if (lm->min_blk_line > lm->blk_per_line) {
  781. pblk_err(pblk, "config. not supported. Min. LUN in line:%d\n",
  782. lm->blk_per_line);
  783. return -EINVAL;
  784. }
  785. return 0;
  786. }
  787. static int pblk_lines_init(struct pblk *pblk)
  788. {
  789. struct pblk_line_mgmt *l_mg = &pblk->l_mg;
  790. struct pblk_line *line;
  791. void *chunk_meta;
  792. long nr_free_chks = 0;
  793. int i, ret;
  794. ret = pblk_line_meta_init(pblk);
  795. if (ret)
  796. return ret;
  797. ret = pblk_line_mg_init(pblk);
  798. if (ret)
  799. return ret;
  800. ret = pblk_luns_init(pblk);
  801. if (ret)
  802. goto fail_free_meta;
  803. chunk_meta = pblk_get_chunk_meta(pblk);
  804. if (IS_ERR(chunk_meta)) {
  805. ret = PTR_ERR(chunk_meta);
  806. goto fail_free_luns;
  807. }
  808. pblk->lines = kcalloc(l_mg->nr_lines, sizeof(struct pblk_line),
  809. GFP_KERNEL);
  810. if (!pblk->lines) {
  811. ret = -ENOMEM;
  812. goto fail_free_chunk_meta;
  813. }
  814. for (i = 0; i < l_mg->nr_lines; i++) {
  815. line = &pblk->lines[i];
  816. ret = pblk_alloc_line_meta(pblk, line);
  817. if (ret)
  818. goto fail_free_lines;
  819. nr_free_chks += pblk_setup_line_meta(pblk, line, chunk_meta, i);
  820. trace_pblk_line_state(pblk_disk_name(pblk), line->id,
  821. line->state);
  822. }
  823. if (!nr_free_chks) {
  824. pblk_err(pblk, "too many bad blocks prevent for sane instance\n");
  825. ret = -EINTR;
  826. goto fail_free_lines;
  827. }
  828. pblk_set_provision(pblk, nr_free_chks);
  829. vfree(chunk_meta);
  830. return 0;
  831. fail_free_lines:
  832. while (--i >= 0)
  833. pblk_line_meta_free(l_mg, &pblk->lines[i]);
  834. kfree(pblk->lines);
  835. fail_free_chunk_meta:
  836. kfree(chunk_meta);
  837. fail_free_luns:
  838. kfree(pblk->luns);
  839. fail_free_meta:
  840. pblk_line_mg_free(pblk);
  841. return ret;
  842. }
  843. static int pblk_writer_init(struct pblk *pblk)
  844. {
  845. pblk->writer_ts = kthread_create(pblk_write_ts, pblk, "pblk-writer-t");
  846. if (IS_ERR(pblk->writer_ts)) {
  847. int err = PTR_ERR(pblk->writer_ts);
  848. if (err != -EINTR)
  849. pblk_err(pblk, "could not allocate writer kthread (%d)\n",
  850. err);
  851. return err;
  852. }
  853. timer_setup(&pblk->wtimer, pblk_write_timer_fn, 0);
  854. mod_timer(&pblk->wtimer, jiffies + msecs_to_jiffies(100));
  855. return 0;
  856. }
  857. static void pblk_writer_stop(struct pblk *pblk)
  858. {
  859. /* The pipeline must be stopped and the write buffer emptied before the
  860. * write thread is stopped
  861. */
  862. WARN(pblk_rb_read_count(&pblk->rwb),
  863. "Stopping not fully persisted write buffer\n");
  864. WARN(pblk_rb_sync_count(&pblk->rwb),
  865. "Stopping not fully synced write buffer\n");
  866. del_timer_sync(&pblk->wtimer);
  867. if (pblk->writer_ts)
  868. kthread_stop(pblk->writer_ts);
  869. }
  870. static void pblk_free(struct pblk *pblk)
  871. {
  872. pblk_lines_free(pblk);
  873. pblk_l2p_free(pblk);
  874. pblk_rwb_free(pblk);
  875. pblk_core_free(pblk);
  876. kfree(pblk);
  877. }
  878. static void pblk_tear_down(struct pblk *pblk, bool graceful)
  879. {
  880. if (graceful)
  881. __pblk_pipeline_flush(pblk);
  882. __pblk_pipeline_stop(pblk);
  883. pblk_writer_stop(pblk);
  884. pblk_rb_sync_l2p(&pblk->rwb);
  885. pblk_rl_free(&pblk->rl);
  886. pblk_debug(pblk, "consistent tear down (graceful:%d)\n", graceful);
  887. }
  888. static void pblk_exit(void *private, bool graceful)
  889. {
  890. struct pblk *pblk = private;
  891. pblk_gc_exit(pblk, graceful);
  892. pblk_tear_down(pblk, graceful);
  893. #ifdef CONFIG_NVM_PBLK_DEBUG
  894. pblk_info(pblk, "exit: L2P CRC: %x\n", pblk_l2p_crc(pblk));
  895. #endif
  896. pblk_free(pblk);
  897. }
  898. static sector_t pblk_capacity(void *private)
  899. {
  900. struct pblk *pblk = private;
  901. return pblk->capacity * NR_PHY_IN_LOG;
  902. }
  903. static void *pblk_init(struct nvm_tgt_dev *dev, struct gendisk *tdisk,
  904. int flags)
  905. {
  906. struct nvm_geo *geo = &dev->geo;
  907. struct request_queue *bqueue = dev->q;
  908. struct request_queue *tqueue = tdisk->queue;
  909. struct pblk *pblk;
  910. int ret;
  911. pblk = kzalloc(sizeof(struct pblk), GFP_KERNEL);
  912. if (!pblk)
  913. return ERR_PTR(-ENOMEM);
  914. pblk->dev = dev;
  915. pblk->disk = tdisk;
  916. pblk->state = PBLK_STATE_RUNNING;
  917. trace_pblk_state(pblk_disk_name(pblk), pblk->state);
  918. pblk->gc.gc_enabled = 0;
  919. if (!(geo->version == NVM_OCSSD_SPEC_12 ||
  920. geo->version == NVM_OCSSD_SPEC_20)) {
  921. pblk_err(pblk, "OCSSD version not supported (%u)\n",
  922. geo->version);
  923. kfree(pblk);
  924. return ERR_PTR(-EINVAL);
  925. }
  926. spin_lock_init(&pblk->resubmit_lock);
  927. spin_lock_init(&pblk->trans_lock);
  928. spin_lock_init(&pblk->lock);
  929. #ifdef CONFIG_NVM_PBLK_DEBUG
  930. atomic_long_set(&pblk->inflight_writes, 0);
  931. atomic_long_set(&pblk->padded_writes, 0);
  932. atomic_long_set(&pblk->padded_wb, 0);
  933. atomic_long_set(&pblk->req_writes, 0);
  934. atomic_long_set(&pblk->sub_writes, 0);
  935. atomic_long_set(&pblk->sync_writes, 0);
  936. atomic_long_set(&pblk->inflight_reads, 0);
  937. atomic_long_set(&pblk->cache_reads, 0);
  938. atomic_long_set(&pblk->sync_reads, 0);
  939. atomic_long_set(&pblk->recov_writes, 0);
  940. atomic_long_set(&pblk->recov_writes, 0);
  941. atomic_long_set(&pblk->recov_gc_writes, 0);
  942. atomic_long_set(&pblk->recov_gc_reads, 0);
  943. #endif
  944. atomic_long_set(&pblk->read_failed, 0);
  945. atomic_long_set(&pblk->read_empty, 0);
  946. atomic_long_set(&pblk->read_high_ecc, 0);
  947. atomic_long_set(&pblk->read_failed_gc, 0);
  948. atomic_long_set(&pblk->write_failed, 0);
  949. atomic_long_set(&pblk->erase_failed, 0);
  950. ret = pblk_core_init(pblk);
  951. if (ret) {
  952. pblk_err(pblk, "could not initialize core\n");
  953. goto fail;
  954. }
  955. ret = pblk_lines_init(pblk);
  956. if (ret) {
  957. pblk_err(pblk, "could not initialize lines\n");
  958. goto fail_free_core;
  959. }
  960. ret = pblk_rwb_init(pblk);
  961. if (ret) {
  962. pblk_err(pblk, "could not initialize write buffer\n");
  963. goto fail_free_lines;
  964. }
  965. ret = pblk_l2p_init(pblk, flags & NVM_TARGET_FACTORY);
  966. if (ret) {
  967. pblk_err(pblk, "could not initialize maps\n");
  968. goto fail_free_rwb;
  969. }
  970. ret = pblk_writer_init(pblk);
  971. if (ret) {
  972. if (ret != -EINTR)
  973. pblk_err(pblk, "could not initialize write thread\n");
  974. goto fail_free_l2p;
  975. }
  976. ret = pblk_gc_init(pblk);
  977. if (ret) {
  978. pblk_err(pblk, "could not initialize gc\n");
  979. goto fail_stop_writer;
  980. }
  981. /* inherit the size from the underlying device */
  982. blk_queue_logical_block_size(tqueue, queue_physical_block_size(bqueue));
  983. blk_queue_max_hw_sectors(tqueue, queue_max_hw_sectors(bqueue));
  984. blk_queue_write_cache(tqueue, true, false);
  985. tqueue->limits.discard_granularity = geo->clba * geo->csecs;
  986. tqueue->limits.discard_alignment = 0;
  987. blk_queue_max_discard_sectors(tqueue, UINT_MAX >> 9);
  988. blk_queue_flag_set(QUEUE_FLAG_DISCARD, tqueue);
  989. pblk_info(pblk, "luns:%u, lines:%d, secs:%llu, buf entries:%u\n",
  990. geo->all_luns, pblk->l_mg.nr_lines,
  991. (unsigned long long)pblk->rl.nr_secs,
  992. pblk->rwb.nr_entries);
  993. wake_up_process(pblk->writer_ts);
  994. /* Check if we need to start GC */
  995. pblk_gc_should_kick(pblk);
  996. return pblk;
  997. fail_stop_writer:
  998. pblk_writer_stop(pblk);
  999. fail_free_l2p:
  1000. pblk_l2p_free(pblk);
  1001. fail_free_rwb:
  1002. pblk_rwb_free(pblk);
  1003. fail_free_lines:
  1004. pblk_lines_free(pblk);
  1005. fail_free_core:
  1006. pblk_core_free(pblk);
  1007. fail:
  1008. kfree(pblk);
  1009. return ERR_PTR(ret);
  1010. }
  1011. /* physical block device target */
  1012. static struct nvm_tgt_type tt_pblk = {
  1013. .name = "pblk",
  1014. .version = {1, 0, 0},
  1015. .make_rq = pblk_make_rq,
  1016. .capacity = pblk_capacity,
  1017. .init = pblk_init,
  1018. .exit = pblk_exit,
  1019. .sysfs_init = pblk_sysfs_init,
  1020. .sysfs_exit = pblk_sysfs_exit,
  1021. .owner = THIS_MODULE,
  1022. };
  1023. static int __init pblk_module_init(void)
  1024. {
  1025. int ret;
  1026. ret = bioset_init(&pblk_bio_set, BIO_POOL_SIZE, 0, 0);
  1027. if (ret)
  1028. return ret;
  1029. ret = nvm_register_tgt_type(&tt_pblk);
  1030. if (ret)
  1031. bioset_exit(&pblk_bio_set);
  1032. return ret;
  1033. }
  1034. static void pblk_module_exit(void)
  1035. {
  1036. bioset_exit(&pblk_bio_set);
  1037. nvm_unregister_tgt_type(&tt_pblk);
  1038. }
  1039. module_init(pblk_module_init);
  1040. module_exit(pblk_module_exit);
  1041. MODULE_AUTHOR("Javier Gonzalez <javier@cnexlabs.com>");
  1042. MODULE_AUTHOR("Matias Bjorling <matias@cnexlabs.com>");
  1043. MODULE_LICENSE("GPL v2");
  1044. MODULE_DESCRIPTION("Physical Block-Device for Open-Channel SSDs");