pblk-init.c 33 KB

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