pblk-recovery.c 24 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012
  1. /*
  2. * Copyright (C) 2016 CNEX Labs
  3. * Initial: Javier Gonzalez <javier@cnexlabs.com>
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License version
  7. * 2 as published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful, but
  10. * WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. * General Public License for more details.
  13. *
  14. * pblk-recovery.c - pblk's recovery path
  15. */
  16. #include "pblk.h"
  17. int pblk_recov_check_emeta(struct pblk *pblk, struct line_emeta *emeta_buf)
  18. {
  19. u32 crc;
  20. crc = pblk_calc_emeta_crc(pblk, emeta_buf);
  21. if (le32_to_cpu(emeta_buf->crc) != crc)
  22. return 1;
  23. if (le32_to_cpu(emeta_buf->header.identifier) != PBLK_MAGIC)
  24. return 1;
  25. return 0;
  26. }
  27. static int pblk_recov_l2p_from_emeta(struct pblk *pblk, struct pblk_line *line)
  28. {
  29. struct nvm_tgt_dev *dev = pblk->dev;
  30. struct nvm_geo *geo = &dev->geo;
  31. struct pblk_line_meta *lm = &pblk->lm;
  32. struct pblk_emeta *emeta = line->emeta;
  33. struct line_emeta *emeta_buf = emeta->buf;
  34. __le64 *lba_list;
  35. u64 data_start, data_end;
  36. u64 nr_valid_lbas, nr_lbas = 0;
  37. u64 i;
  38. lba_list = emeta_to_lbas(pblk, emeta_buf);
  39. if (!lba_list)
  40. return 1;
  41. data_start = pblk_line_smeta_start(pblk, line) + lm->smeta_sec;
  42. data_end = line->emeta_ssec;
  43. nr_valid_lbas = le64_to_cpu(emeta_buf->nr_valid_lbas);
  44. for (i = data_start; i < data_end; i++) {
  45. struct ppa_addr ppa;
  46. int pos;
  47. ppa = addr_to_gen_ppa(pblk, i, line->id);
  48. pos = pblk_ppa_to_pos(geo, ppa);
  49. /* Do not update bad blocks */
  50. if (test_bit(pos, line->blk_bitmap))
  51. continue;
  52. if (le64_to_cpu(lba_list[i]) == ADDR_EMPTY) {
  53. spin_lock(&line->lock);
  54. if (test_and_set_bit(i, line->invalid_bitmap))
  55. WARN_ONCE(1, "pblk: rec. double invalidate:\n");
  56. else
  57. le32_add_cpu(line->vsc, -1);
  58. spin_unlock(&line->lock);
  59. continue;
  60. }
  61. pblk_update_map(pblk, le64_to_cpu(lba_list[i]), ppa);
  62. nr_lbas++;
  63. }
  64. if (nr_valid_lbas != nr_lbas)
  65. pblk_err(pblk, "line %d - inconsistent lba list(%llu/%llu)\n",
  66. line->id, nr_valid_lbas, nr_lbas);
  67. line->left_msecs = 0;
  68. return 0;
  69. }
  70. static int pblk_calc_sec_in_line(struct pblk *pblk, struct pblk_line *line)
  71. {
  72. struct nvm_tgt_dev *dev = pblk->dev;
  73. struct nvm_geo *geo = &dev->geo;
  74. struct pblk_line_meta *lm = &pblk->lm;
  75. int nr_bb = bitmap_weight(line->blk_bitmap, lm->blk_per_line);
  76. return lm->sec_per_line - lm->smeta_sec - lm->emeta_sec[0] -
  77. nr_bb * geo->clba;
  78. }
  79. struct pblk_recov_alloc {
  80. struct ppa_addr *ppa_list;
  81. struct pblk_sec_meta *meta_list;
  82. struct nvm_rq *rqd;
  83. void *data;
  84. dma_addr_t dma_ppa_list;
  85. dma_addr_t dma_meta_list;
  86. };
  87. static int pblk_recov_read_oob(struct pblk *pblk, struct pblk_line *line,
  88. struct pblk_recov_alloc p, u64 r_ptr)
  89. {
  90. struct nvm_tgt_dev *dev = pblk->dev;
  91. struct nvm_geo *geo = &dev->geo;
  92. struct ppa_addr *ppa_list;
  93. struct pblk_sec_meta *meta_list;
  94. struct nvm_rq *rqd;
  95. struct bio *bio;
  96. void *data;
  97. dma_addr_t dma_ppa_list, dma_meta_list;
  98. u64 r_ptr_int;
  99. int left_ppas;
  100. int rq_ppas, rq_len;
  101. int i, j;
  102. int ret = 0;
  103. ppa_list = p.ppa_list;
  104. meta_list = p.meta_list;
  105. rqd = p.rqd;
  106. data = p.data;
  107. dma_ppa_list = p.dma_ppa_list;
  108. dma_meta_list = p.dma_meta_list;
  109. left_ppas = line->cur_sec - r_ptr;
  110. if (!left_ppas)
  111. return 0;
  112. r_ptr_int = r_ptr;
  113. next_read_rq:
  114. memset(rqd, 0, pblk_g_rq_size);
  115. rq_ppas = pblk_calc_secs(pblk, left_ppas, 0);
  116. if (!rq_ppas)
  117. rq_ppas = pblk->min_write_pgs;
  118. rq_len = rq_ppas * geo->csecs;
  119. bio = bio_map_kern(dev->q, data, rq_len, GFP_KERNEL);
  120. if (IS_ERR(bio))
  121. return PTR_ERR(bio);
  122. bio->bi_iter.bi_sector = 0; /* internal bio */
  123. bio_set_op_attrs(bio, REQ_OP_READ, 0);
  124. rqd->bio = bio;
  125. rqd->opcode = NVM_OP_PREAD;
  126. rqd->meta_list = meta_list;
  127. rqd->nr_ppas = rq_ppas;
  128. rqd->ppa_list = ppa_list;
  129. rqd->dma_ppa_list = dma_ppa_list;
  130. rqd->dma_meta_list = dma_meta_list;
  131. if (pblk_io_aligned(pblk, rq_ppas))
  132. rqd->flags = pblk_set_read_mode(pblk, PBLK_READ_SEQUENTIAL);
  133. else
  134. rqd->flags = pblk_set_read_mode(pblk, PBLK_READ_RANDOM);
  135. for (i = 0; i < rqd->nr_ppas; ) {
  136. struct ppa_addr ppa;
  137. int pos;
  138. ppa = addr_to_gen_ppa(pblk, r_ptr_int, line->id);
  139. pos = pblk_ppa_to_pos(geo, ppa);
  140. while (test_bit(pos, line->blk_bitmap)) {
  141. r_ptr_int += pblk->min_write_pgs;
  142. ppa = addr_to_gen_ppa(pblk, r_ptr_int, line->id);
  143. pos = pblk_ppa_to_pos(geo, ppa);
  144. }
  145. for (j = 0; j < pblk->min_write_pgs; j++, i++, r_ptr_int++)
  146. rqd->ppa_list[i] =
  147. addr_to_gen_ppa(pblk, r_ptr_int, line->id);
  148. }
  149. /* If read fails, more padding is needed */
  150. ret = pblk_submit_io_sync(pblk, rqd);
  151. if (ret) {
  152. pblk_err(pblk, "I/O submission failed: %d\n", ret);
  153. return ret;
  154. }
  155. atomic_dec(&pblk->inflight_io);
  156. /* At this point, the read should not fail. If it does, it is a problem
  157. * we cannot recover from here. Need FTL log.
  158. */
  159. if (rqd->error && rqd->error != NVM_RSP_WARN_HIGHECC) {
  160. pblk_err(pblk, "L2P recovery failed (%d)\n", rqd->error);
  161. return -EINTR;
  162. }
  163. for (i = 0; i < rqd->nr_ppas; i++) {
  164. u64 lba = le64_to_cpu(meta_list[i].lba);
  165. if (lba == ADDR_EMPTY || lba > pblk->rl.nr_secs)
  166. continue;
  167. pblk_update_map(pblk, lba, rqd->ppa_list[i]);
  168. }
  169. left_ppas -= rq_ppas;
  170. if (left_ppas > 0)
  171. goto next_read_rq;
  172. return 0;
  173. }
  174. static void pblk_recov_complete(struct kref *ref)
  175. {
  176. struct pblk_pad_rq *pad_rq = container_of(ref, struct pblk_pad_rq, ref);
  177. complete(&pad_rq->wait);
  178. }
  179. static void pblk_end_io_recov(struct nvm_rq *rqd)
  180. {
  181. struct pblk_pad_rq *pad_rq = rqd->private;
  182. struct pblk *pblk = pad_rq->pblk;
  183. pblk_up_page(pblk, rqd->ppa_list, rqd->nr_ppas);
  184. pblk_free_rqd(pblk, rqd, PBLK_WRITE_INT);
  185. atomic_dec(&pblk->inflight_io);
  186. kref_put(&pad_rq->ref, pblk_recov_complete);
  187. }
  188. static int pblk_recov_pad_oob(struct pblk *pblk, struct pblk_line *line,
  189. int left_ppas)
  190. {
  191. struct nvm_tgt_dev *dev = pblk->dev;
  192. struct nvm_geo *geo = &dev->geo;
  193. struct ppa_addr *ppa_list;
  194. struct pblk_sec_meta *meta_list;
  195. struct pblk_pad_rq *pad_rq;
  196. struct nvm_rq *rqd;
  197. struct bio *bio;
  198. void *data;
  199. dma_addr_t dma_ppa_list, dma_meta_list;
  200. __le64 *lba_list = emeta_to_lbas(pblk, line->emeta->buf);
  201. u64 w_ptr = line->cur_sec;
  202. int left_line_ppas, rq_ppas, rq_len;
  203. int i, j;
  204. int ret = 0;
  205. spin_lock(&line->lock);
  206. left_line_ppas = line->left_msecs;
  207. spin_unlock(&line->lock);
  208. pad_rq = kmalloc(sizeof(struct pblk_pad_rq), GFP_KERNEL);
  209. if (!pad_rq)
  210. return -ENOMEM;
  211. data = vzalloc(array_size(pblk->max_write_pgs, geo->csecs));
  212. if (!data) {
  213. ret = -ENOMEM;
  214. goto free_rq;
  215. }
  216. pad_rq->pblk = pblk;
  217. init_completion(&pad_rq->wait);
  218. kref_init(&pad_rq->ref);
  219. next_pad_rq:
  220. rq_ppas = pblk_calc_secs(pblk, left_ppas, 0);
  221. if (rq_ppas < pblk->min_write_pgs) {
  222. pblk_err(pblk, "corrupted pad line %d\n", line->id);
  223. goto fail_free_pad;
  224. }
  225. rq_len = rq_ppas * geo->csecs;
  226. meta_list = nvm_dev_dma_alloc(dev->parent, GFP_KERNEL, &dma_meta_list);
  227. if (!meta_list) {
  228. ret = -ENOMEM;
  229. goto fail_free_pad;
  230. }
  231. ppa_list = (void *)(meta_list) + pblk_dma_meta_size;
  232. dma_ppa_list = dma_meta_list + pblk_dma_meta_size;
  233. bio = pblk_bio_map_addr(pblk, data, rq_ppas, rq_len,
  234. PBLK_VMALLOC_META, GFP_KERNEL);
  235. if (IS_ERR(bio)) {
  236. ret = PTR_ERR(bio);
  237. goto fail_free_meta;
  238. }
  239. bio->bi_iter.bi_sector = 0; /* internal bio */
  240. bio_set_op_attrs(bio, REQ_OP_WRITE, 0);
  241. rqd = pblk_alloc_rqd(pblk, PBLK_WRITE_INT);
  242. rqd->bio = bio;
  243. rqd->opcode = NVM_OP_PWRITE;
  244. rqd->flags = pblk_set_progr_mode(pblk, PBLK_WRITE);
  245. rqd->meta_list = meta_list;
  246. rqd->nr_ppas = rq_ppas;
  247. rqd->ppa_list = ppa_list;
  248. rqd->dma_ppa_list = dma_ppa_list;
  249. rqd->dma_meta_list = dma_meta_list;
  250. rqd->end_io = pblk_end_io_recov;
  251. rqd->private = pad_rq;
  252. for (i = 0; i < rqd->nr_ppas; ) {
  253. struct ppa_addr ppa;
  254. int pos;
  255. w_ptr = pblk_alloc_page(pblk, line, pblk->min_write_pgs);
  256. ppa = addr_to_gen_ppa(pblk, w_ptr, line->id);
  257. pos = pblk_ppa_to_pos(geo, ppa);
  258. while (test_bit(pos, line->blk_bitmap)) {
  259. w_ptr += pblk->min_write_pgs;
  260. ppa = addr_to_gen_ppa(pblk, w_ptr, line->id);
  261. pos = pblk_ppa_to_pos(geo, ppa);
  262. }
  263. for (j = 0; j < pblk->min_write_pgs; j++, i++, w_ptr++) {
  264. struct ppa_addr dev_ppa;
  265. __le64 addr_empty = cpu_to_le64(ADDR_EMPTY);
  266. dev_ppa = addr_to_gen_ppa(pblk, w_ptr, line->id);
  267. pblk_map_invalidate(pblk, dev_ppa);
  268. lba_list[w_ptr] = meta_list[i].lba = addr_empty;
  269. rqd->ppa_list[i] = dev_ppa;
  270. }
  271. }
  272. kref_get(&pad_rq->ref);
  273. pblk_down_page(pblk, rqd->ppa_list, rqd->nr_ppas);
  274. ret = pblk_submit_io(pblk, rqd);
  275. if (ret) {
  276. pblk_err(pblk, "I/O submission failed: %d\n", ret);
  277. pblk_up_page(pblk, rqd->ppa_list, rqd->nr_ppas);
  278. goto fail_free_bio;
  279. }
  280. left_line_ppas -= rq_ppas;
  281. left_ppas -= rq_ppas;
  282. if (left_ppas && left_line_ppas)
  283. goto next_pad_rq;
  284. kref_put(&pad_rq->ref, pblk_recov_complete);
  285. if (!wait_for_completion_io_timeout(&pad_rq->wait,
  286. msecs_to_jiffies(PBLK_COMMAND_TIMEOUT_MS))) {
  287. pblk_err(pblk, "pad write timed out\n");
  288. ret = -ETIME;
  289. }
  290. if (!pblk_line_is_full(line))
  291. pblk_err(pblk, "corrupted padded line: %d\n", line->id);
  292. vfree(data);
  293. free_rq:
  294. kfree(pad_rq);
  295. return ret;
  296. fail_free_bio:
  297. bio_put(bio);
  298. fail_free_meta:
  299. nvm_dev_dma_free(dev->parent, meta_list, dma_meta_list);
  300. fail_free_pad:
  301. kfree(pad_rq);
  302. vfree(data);
  303. return ret;
  304. }
  305. /* When this function is called, it means that not all upper pages have been
  306. * written in a page that contains valid data. In order to recover this data, we
  307. * first find the write pointer on the device, then we pad all necessary
  308. * sectors, and finally attempt to read the valid data
  309. */
  310. static int pblk_recov_scan_all_oob(struct pblk *pblk, struct pblk_line *line,
  311. struct pblk_recov_alloc p)
  312. {
  313. struct nvm_tgt_dev *dev = pblk->dev;
  314. struct nvm_geo *geo = &dev->geo;
  315. struct ppa_addr *ppa_list;
  316. struct pblk_sec_meta *meta_list;
  317. struct nvm_rq *rqd;
  318. struct bio *bio;
  319. void *data;
  320. dma_addr_t dma_ppa_list, dma_meta_list;
  321. u64 w_ptr = 0, r_ptr;
  322. int rq_ppas, rq_len;
  323. int i, j;
  324. int ret = 0;
  325. int rec_round;
  326. int left_ppas = pblk_calc_sec_in_line(pblk, line) - line->cur_sec;
  327. ppa_list = p.ppa_list;
  328. meta_list = p.meta_list;
  329. rqd = p.rqd;
  330. data = p.data;
  331. dma_ppa_list = p.dma_ppa_list;
  332. dma_meta_list = p.dma_meta_list;
  333. /* we could recover up until the line write pointer */
  334. r_ptr = line->cur_sec;
  335. rec_round = 0;
  336. next_rq:
  337. memset(rqd, 0, pblk_g_rq_size);
  338. rq_ppas = pblk_calc_secs(pblk, left_ppas, 0);
  339. if (!rq_ppas)
  340. rq_ppas = pblk->min_write_pgs;
  341. rq_len = rq_ppas * geo->csecs;
  342. bio = bio_map_kern(dev->q, data, rq_len, GFP_KERNEL);
  343. if (IS_ERR(bio))
  344. return PTR_ERR(bio);
  345. bio->bi_iter.bi_sector = 0; /* internal bio */
  346. bio_set_op_attrs(bio, REQ_OP_READ, 0);
  347. rqd->bio = bio;
  348. rqd->opcode = NVM_OP_PREAD;
  349. rqd->meta_list = meta_list;
  350. rqd->nr_ppas = rq_ppas;
  351. rqd->ppa_list = ppa_list;
  352. rqd->dma_ppa_list = dma_ppa_list;
  353. rqd->dma_meta_list = dma_meta_list;
  354. if (pblk_io_aligned(pblk, rq_ppas))
  355. rqd->flags = pblk_set_read_mode(pblk, PBLK_READ_SEQUENTIAL);
  356. else
  357. rqd->flags = pblk_set_read_mode(pblk, PBLK_READ_RANDOM);
  358. for (i = 0; i < rqd->nr_ppas; ) {
  359. struct ppa_addr ppa;
  360. int pos;
  361. w_ptr = pblk_alloc_page(pblk, line, pblk->min_write_pgs);
  362. ppa = addr_to_gen_ppa(pblk, w_ptr, line->id);
  363. pos = pblk_ppa_to_pos(geo, ppa);
  364. while (test_bit(pos, line->blk_bitmap)) {
  365. w_ptr += pblk->min_write_pgs;
  366. ppa = addr_to_gen_ppa(pblk, w_ptr, line->id);
  367. pos = pblk_ppa_to_pos(geo, ppa);
  368. }
  369. for (j = 0; j < pblk->min_write_pgs; j++, i++, w_ptr++)
  370. rqd->ppa_list[i] =
  371. addr_to_gen_ppa(pblk, w_ptr, line->id);
  372. }
  373. ret = pblk_submit_io_sync(pblk, rqd);
  374. if (ret) {
  375. pblk_err(pblk, "I/O submission failed: %d\n", ret);
  376. return ret;
  377. }
  378. atomic_dec(&pblk->inflight_io);
  379. /* This should not happen since the read failed during normal recovery,
  380. * but the media works funny sometimes...
  381. */
  382. if (!rec_round++ && !rqd->error) {
  383. rec_round = 0;
  384. for (i = 0; i < rqd->nr_ppas; i++, r_ptr++) {
  385. u64 lba = le64_to_cpu(meta_list[i].lba);
  386. if (lba == ADDR_EMPTY || lba > pblk->rl.nr_secs)
  387. continue;
  388. pblk_update_map(pblk, lba, rqd->ppa_list[i]);
  389. }
  390. }
  391. /* Reached the end of the written line */
  392. if (rqd->error == NVM_RSP_ERR_EMPTYPAGE) {
  393. int pad_secs, nr_error_bits, bit;
  394. int ret;
  395. bit = find_first_bit((void *)&rqd->ppa_status, rqd->nr_ppas);
  396. nr_error_bits = rqd->nr_ppas - bit;
  397. /* Roll back failed sectors */
  398. line->cur_sec -= nr_error_bits;
  399. line->left_msecs += nr_error_bits;
  400. bitmap_clear(line->map_bitmap, line->cur_sec, nr_error_bits);
  401. pad_secs = pblk_pad_distance(pblk);
  402. if (pad_secs > line->left_msecs)
  403. pad_secs = line->left_msecs;
  404. ret = pblk_recov_pad_oob(pblk, line, pad_secs);
  405. if (ret)
  406. pblk_err(pblk, "OOB padding failed (err:%d)\n", ret);
  407. ret = pblk_recov_read_oob(pblk, line, p, r_ptr);
  408. if (ret)
  409. pblk_err(pblk, "OOB read failed (err:%d)\n", ret);
  410. left_ppas = 0;
  411. }
  412. left_ppas -= rq_ppas;
  413. if (left_ppas > 0)
  414. goto next_rq;
  415. return ret;
  416. }
  417. static int pblk_recov_scan_oob(struct pblk *pblk, struct pblk_line *line,
  418. struct pblk_recov_alloc p, int *done)
  419. {
  420. struct nvm_tgt_dev *dev = pblk->dev;
  421. struct nvm_geo *geo = &dev->geo;
  422. struct ppa_addr *ppa_list;
  423. struct pblk_sec_meta *meta_list;
  424. struct nvm_rq *rqd;
  425. struct bio *bio;
  426. void *data;
  427. dma_addr_t dma_ppa_list, dma_meta_list;
  428. u64 paddr;
  429. int rq_ppas, rq_len;
  430. int i, j;
  431. int ret = 0;
  432. int left_ppas = pblk_calc_sec_in_line(pblk, line);
  433. ppa_list = p.ppa_list;
  434. meta_list = p.meta_list;
  435. rqd = p.rqd;
  436. data = p.data;
  437. dma_ppa_list = p.dma_ppa_list;
  438. dma_meta_list = p.dma_meta_list;
  439. *done = 1;
  440. next_rq:
  441. memset(rqd, 0, pblk_g_rq_size);
  442. rq_ppas = pblk_calc_secs(pblk, left_ppas, 0);
  443. if (!rq_ppas)
  444. rq_ppas = pblk->min_write_pgs;
  445. rq_len = rq_ppas * geo->csecs;
  446. bio = bio_map_kern(dev->q, data, rq_len, GFP_KERNEL);
  447. if (IS_ERR(bio))
  448. return PTR_ERR(bio);
  449. bio->bi_iter.bi_sector = 0; /* internal bio */
  450. bio_set_op_attrs(bio, REQ_OP_READ, 0);
  451. rqd->bio = bio;
  452. rqd->opcode = NVM_OP_PREAD;
  453. rqd->meta_list = meta_list;
  454. rqd->nr_ppas = rq_ppas;
  455. rqd->ppa_list = ppa_list;
  456. rqd->dma_ppa_list = dma_ppa_list;
  457. rqd->dma_meta_list = dma_meta_list;
  458. if (pblk_io_aligned(pblk, rq_ppas))
  459. rqd->flags = pblk_set_read_mode(pblk, PBLK_READ_SEQUENTIAL);
  460. else
  461. rqd->flags = pblk_set_read_mode(pblk, PBLK_READ_RANDOM);
  462. for (i = 0; i < rqd->nr_ppas; ) {
  463. struct ppa_addr ppa;
  464. int pos;
  465. paddr = pblk_alloc_page(pblk, line, pblk->min_write_pgs);
  466. ppa = addr_to_gen_ppa(pblk, paddr, line->id);
  467. pos = pblk_ppa_to_pos(geo, ppa);
  468. while (test_bit(pos, line->blk_bitmap)) {
  469. paddr += pblk->min_write_pgs;
  470. ppa = addr_to_gen_ppa(pblk, paddr, line->id);
  471. pos = pblk_ppa_to_pos(geo, ppa);
  472. }
  473. for (j = 0; j < pblk->min_write_pgs; j++, i++, paddr++)
  474. rqd->ppa_list[i] =
  475. addr_to_gen_ppa(pblk, paddr, line->id);
  476. }
  477. ret = pblk_submit_io_sync(pblk, rqd);
  478. if (ret) {
  479. pblk_err(pblk, "I/O submission failed: %d\n", ret);
  480. bio_put(bio);
  481. return ret;
  482. }
  483. atomic_dec(&pblk->inflight_io);
  484. /* Reached the end of the written line */
  485. if (rqd->error) {
  486. int nr_error_bits, bit;
  487. bit = find_first_bit((void *)&rqd->ppa_status, rqd->nr_ppas);
  488. nr_error_bits = rqd->nr_ppas - bit;
  489. /* Roll back failed sectors */
  490. line->cur_sec -= nr_error_bits;
  491. line->left_msecs += nr_error_bits;
  492. bitmap_clear(line->map_bitmap, line->cur_sec, nr_error_bits);
  493. left_ppas = 0;
  494. rqd->nr_ppas = bit;
  495. if (rqd->error != NVM_RSP_ERR_EMPTYPAGE)
  496. *done = 0;
  497. }
  498. for (i = 0; i < rqd->nr_ppas; i++) {
  499. u64 lba = le64_to_cpu(meta_list[i].lba);
  500. if (lba == ADDR_EMPTY || lba > pblk->rl.nr_secs)
  501. continue;
  502. pblk_update_map(pblk, lba, rqd->ppa_list[i]);
  503. }
  504. left_ppas -= rq_ppas;
  505. if (left_ppas > 0)
  506. goto next_rq;
  507. return ret;
  508. }
  509. /* Scan line for lbas on out of bound area */
  510. static int pblk_recov_l2p_from_oob(struct pblk *pblk, struct pblk_line *line)
  511. {
  512. struct nvm_tgt_dev *dev = pblk->dev;
  513. struct nvm_geo *geo = &dev->geo;
  514. struct nvm_rq *rqd;
  515. struct ppa_addr *ppa_list;
  516. struct pblk_sec_meta *meta_list;
  517. struct pblk_recov_alloc p;
  518. void *data;
  519. dma_addr_t dma_ppa_list, dma_meta_list;
  520. int done, ret = 0;
  521. meta_list = nvm_dev_dma_alloc(dev->parent, GFP_KERNEL, &dma_meta_list);
  522. if (!meta_list)
  523. return -ENOMEM;
  524. ppa_list = (void *)(meta_list) + pblk_dma_meta_size;
  525. dma_ppa_list = dma_meta_list + pblk_dma_meta_size;
  526. data = kcalloc(pblk->max_write_pgs, geo->csecs, GFP_KERNEL);
  527. if (!data) {
  528. ret = -ENOMEM;
  529. goto free_meta_list;
  530. }
  531. rqd = pblk_alloc_rqd(pblk, PBLK_READ);
  532. p.ppa_list = ppa_list;
  533. p.meta_list = meta_list;
  534. p.rqd = rqd;
  535. p.data = data;
  536. p.dma_ppa_list = dma_ppa_list;
  537. p.dma_meta_list = dma_meta_list;
  538. ret = pblk_recov_scan_oob(pblk, line, p, &done);
  539. if (ret) {
  540. pblk_err(pblk, "could not recover L2P from OOB\n");
  541. goto out;
  542. }
  543. if (!done) {
  544. ret = pblk_recov_scan_all_oob(pblk, line, p);
  545. if (ret) {
  546. pblk_err(pblk, "could not recover L2P from OOB\n");
  547. goto out;
  548. }
  549. }
  550. if (pblk_line_is_full(line))
  551. pblk_line_recov_close(pblk, line);
  552. out:
  553. kfree(data);
  554. free_meta_list:
  555. nvm_dev_dma_free(dev->parent, meta_list, dma_meta_list);
  556. return ret;
  557. }
  558. /* Insert lines ordered by sequence number (seq_num) on list */
  559. static void pblk_recov_line_add_ordered(struct list_head *head,
  560. struct pblk_line *line)
  561. {
  562. struct pblk_line *t = NULL;
  563. list_for_each_entry(t, head, list)
  564. if (t->seq_nr > line->seq_nr)
  565. break;
  566. __list_add(&line->list, t->list.prev, &t->list);
  567. }
  568. static u64 pblk_line_emeta_start(struct pblk *pblk, struct pblk_line *line)
  569. {
  570. struct nvm_tgt_dev *dev = pblk->dev;
  571. struct nvm_geo *geo = &dev->geo;
  572. struct pblk_line_meta *lm = &pblk->lm;
  573. unsigned int emeta_secs;
  574. u64 emeta_start;
  575. struct ppa_addr ppa;
  576. int pos;
  577. emeta_secs = lm->emeta_sec[0];
  578. emeta_start = lm->sec_per_line;
  579. while (emeta_secs) {
  580. emeta_start--;
  581. ppa = addr_to_gen_ppa(pblk, emeta_start, line->id);
  582. pos = pblk_ppa_to_pos(geo, ppa);
  583. if (!test_bit(pos, line->blk_bitmap))
  584. emeta_secs--;
  585. }
  586. return emeta_start;
  587. }
  588. static int pblk_recov_check_line_version(struct pblk *pblk,
  589. struct line_emeta *emeta)
  590. {
  591. struct line_header *header = &emeta->header;
  592. if (header->version_major != EMETA_VERSION_MAJOR) {
  593. pblk_err(pblk, "line major version mismatch: %d, expected: %d\n",
  594. header->version_major, EMETA_VERSION_MAJOR);
  595. return 1;
  596. }
  597. #ifdef CONFIG_NVM_PBLK_DEBUG
  598. if (header->version_minor > EMETA_VERSION_MINOR)
  599. pblk_info(pblk, "newer line minor version found: %d\n",
  600. header->version_minor);
  601. #endif
  602. return 0;
  603. }
  604. static void pblk_recov_wa_counters(struct pblk *pblk,
  605. struct line_emeta *emeta)
  606. {
  607. struct pblk_line_meta *lm = &pblk->lm;
  608. struct line_header *header = &emeta->header;
  609. struct wa_counters *wa = emeta_to_wa(lm, emeta);
  610. /* WA counters were introduced in emeta version 0.2 */
  611. if (header->version_major > 0 || header->version_minor >= 2) {
  612. u64 user = le64_to_cpu(wa->user);
  613. u64 pad = le64_to_cpu(wa->pad);
  614. u64 gc = le64_to_cpu(wa->gc);
  615. atomic64_set(&pblk->user_wa, user);
  616. atomic64_set(&pblk->pad_wa, pad);
  617. atomic64_set(&pblk->gc_wa, gc);
  618. pblk->user_rst_wa = user;
  619. pblk->pad_rst_wa = pad;
  620. pblk->gc_rst_wa = gc;
  621. }
  622. }
  623. static int pblk_line_was_written(struct pblk_line *line,
  624. struct pblk *pblk)
  625. {
  626. struct pblk_line_meta *lm = &pblk->lm;
  627. struct nvm_tgt_dev *dev = pblk->dev;
  628. struct nvm_geo *geo = &dev->geo;
  629. struct nvm_chk_meta *chunk;
  630. struct ppa_addr bppa;
  631. int smeta_blk;
  632. if (line->state == PBLK_LINESTATE_BAD)
  633. return 0;
  634. smeta_blk = find_first_zero_bit(line->blk_bitmap, lm->blk_per_line);
  635. if (smeta_blk >= lm->blk_per_line)
  636. return 0;
  637. bppa = pblk->luns[smeta_blk].bppa;
  638. chunk = &line->chks[pblk_ppa_to_pos(geo, bppa)];
  639. if (chunk->state & NVM_CHK_ST_FREE)
  640. return 0;
  641. return 1;
  642. }
  643. struct pblk_line *pblk_recov_l2p(struct pblk *pblk)
  644. {
  645. struct pblk_line_meta *lm = &pblk->lm;
  646. struct pblk_line_mgmt *l_mg = &pblk->l_mg;
  647. struct pblk_line *line, *tline, *data_line = NULL;
  648. struct pblk_smeta *smeta;
  649. struct pblk_emeta *emeta;
  650. struct line_smeta *smeta_buf;
  651. int found_lines = 0, recovered_lines = 0, open_lines = 0;
  652. int is_next = 0;
  653. int meta_line;
  654. int i, valid_uuid = 0;
  655. LIST_HEAD(recov_list);
  656. /* TODO: Implement FTL snapshot */
  657. /* Scan recovery - takes place when FTL snapshot fails */
  658. spin_lock(&l_mg->free_lock);
  659. meta_line = find_first_zero_bit(&l_mg->meta_bitmap, PBLK_DATA_LINES);
  660. set_bit(meta_line, &l_mg->meta_bitmap);
  661. smeta = l_mg->sline_meta[meta_line];
  662. emeta = l_mg->eline_meta[meta_line];
  663. smeta_buf = (struct line_smeta *)smeta;
  664. spin_unlock(&l_mg->free_lock);
  665. /* Order data lines using their sequence number */
  666. for (i = 0; i < l_mg->nr_lines; i++) {
  667. u32 crc;
  668. line = &pblk->lines[i];
  669. memset(smeta, 0, lm->smeta_len);
  670. line->smeta = smeta;
  671. line->lun_bitmap = ((void *)(smeta_buf)) +
  672. sizeof(struct line_smeta);
  673. if (!pblk_line_was_written(line, pblk))
  674. continue;
  675. /* Lines that cannot be read are assumed as not written here */
  676. if (pblk_line_read_smeta(pblk, line))
  677. continue;
  678. crc = pblk_calc_smeta_crc(pblk, smeta_buf);
  679. if (le32_to_cpu(smeta_buf->crc) != crc)
  680. continue;
  681. if (le32_to_cpu(smeta_buf->header.identifier) != PBLK_MAGIC)
  682. continue;
  683. if (smeta_buf->header.version_major != SMETA_VERSION_MAJOR) {
  684. pblk_err(pblk, "found incompatible line version %u\n",
  685. smeta_buf->header.version_major);
  686. return ERR_PTR(-EINVAL);
  687. }
  688. /* The first valid instance uuid is used for initialization */
  689. if (!valid_uuid) {
  690. memcpy(pblk->instance_uuid, smeta_buf->header.uuid, 16);
  691. valid_uuid = 1;
  692. }
  693. if (memcmp(pblk->instance_uuid, smeta_buf->header.uuid, 16)) {
  694. pblk_debug(pblk, "ignore line %u due to uuid mismatch\n",
  695. i);
  696. continue;
  697. }
  698. /* Update line metadata */
  699. spin_lock(&line->lock);
  700. line->id = le32_to_cpu(smeta_buf->header.id);
  701. line->type = le16_to_cpu(smeta_buf->header.type);
  702. line->seq_nr = le64_to_cpu(smeta_buf->seq_nr);
  703. spin_unlock(&line->lock);
  704. /* Update general metadata */
  705. spin_lock(&l_mg->free_lock);
  706. if (line->seq_nr >= l_mg->d_seq_nr)
  707. l_mg->d_seq_nr = line->seq_nr + 1;
  708. l_mg->nr_free_lines--;
  709. spin_unlock(&l_mg->free_lock);
  710. if (pblk_line_recov_alloc(pblk, line))
  711. goto out;
  712. pblk_recov_line_add_ordered(&recov_list, line);
  713. found_lines++;
  714. pblk_debug(pblk, "recovering data line %d, seq:%llu\n",
  715. line->id, smeta_buf->seq_nr);
  716. }
  717. if (!found_lines) {
  718. pblk_setup_uuid(pblk);
  719. spin_lock(&l_mg->free_lock);
  720. WARN_ON_ONCE(!test_and_clear_bit(meta_line,
  721. &l_mg->meta_bitmap));
  722. spin_unlock(&l_mg->free_lock);
  723. goto out;
  724. }
  725. /* Verify closed blocks and recover this portion of L2P table*/
  726. list_for_each_entry_safe(line, tline, &recov_list, list) {
  727. recovered_lines++;
  728. line->emeta_ssec = pblk_line_emeta_start(pblk, line);
  729. line->emeta = emeta;
  730. memset(line->emeta->buf, 0, lm->emeta_len[0]);
  731. if (pblk_line_read_emeta(pblk, line, line->emeta->buf)) {
  732. pblk_recov_l2p_from_oob(pblk, line);
  733. goto next;
  734. }
  735. if (pblk_recov_check_emeta(pblk, line->emeta->buf)) {
  736. pblk_recov_l2p_from_oob(pblk, line);
  737. goto next;
  738. }
  739. if (pblk_recov_check_line_version(pblk, line->emeta->buf))
  740. return ERR_PTR(-EINVAL);
  741. pblk_recov_wa_counters(pblk, line->emeta->buf);
  742. if (pblk_recov_l2p_from_emeta(pblk, line))
  743. pblk_recov_l2p_from_oob(pblk, line);
  744. next:
  745. if (pblk_line_is_full(line)) {
  746. struct list_head *move_list;
  747. spin_lock(&line->lock);
  748. line->state = PBLK_LINESTATE_CLOSED;
  749. move_list = pblk_line_gc_list(pblk, line);
  750. spin_unlock(&line->lock);
  751. spin_lock(&l_mg->gc_lock);
  752. list_move_tail(&line->list, move_list);
  753. spin_unlock(&l_mg->gc_lock);
  754. kfree(line->map_bitmap);
  755. line->map_bitmap = NULL;
  756. line->smeta = NULL;
  757. line->emeta = NULL;
  758. } else {
  759. if (open_lines > 1)
  760. pblk_err(pblk, "failed to recover L2P\n");
  761. open_lines++;
  762. line->meta_line = meta_line;
  763. data_line = line;
  764. }
  765. }
  766. if (!open_lines) {
  767. spin_lock(&l_mg->free_lock);
  768. WARN_ON_ONCE(!test_and_clear_bit(meta_line,
  769. &l_mg->meta_bitmap));
  770. spin_unlock(&l_mg->free_lock);
  771. pblk_line_replace_data(pblk);
  772. } else {
  773. spin_lock(&l_mg->free_lock);
  774. /* Allocate next line for preparation */
  775. l_mg->data_next = pblk_line_get(pblk);
  776. if (l_mg->data_next) {
  777. l_mg->data_next->seq_nr = l_mg->d_seq_nr++;
  778. l_mg->data_next->type = PBLK_LINETYPE_DATA;
  779. is_next = 1;
  780. }
  781. spin_unlock(&l_mg->free_lock);
  782. }
  783. if (is_next)
  784. pblk_line_erase(pblk, l_mg->data_next);
  785. out:
  786. if (found_lines != recovered_lines)
  787. pblk_err(pblk, "failed to recover all found lines %d/%d\n",
  788. found_lines, recovered_lines);
  789. return data_line;
  790. }
  791. /*
  792. * Pad current line
  793. */
  794. int pblk_recov_pad(struct pblk *pblk)
  795. {
  796. struct pblk_line *line;
  797. struct pblk_line_mgmt *l_mg = &pblk->l_mg;
  798. int left_msecs;
  799. int ret = 0;
  800. spin_lock(&l_mg->free_lock);
  801. line = l_mg->data_line;
  802. left_msecs = line->left_msecs;
  803. spin_unlock(&l_mg->free_lock);
  804. ret = pblk_recov_pad_oob(pblk, line, left_msecs);
  805. if (ret) {
  806. pblk_err(pblk, "tear down padding failed (%d)\n", ret);
  807. return ret;
  808. }
  809. pblk_line_close_meta(pblk, line);
  810. return ret;
  811. }