1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright (c) Intel Corporation. 3 * All rights reserved. 4 */ 5 6 #include "spdk/likely.h" 7 #include "spdk/stdinc.h" 8 #include "spdk/nvme.h" 9 #include "spdk/thread.h" 10 #include "spdk/bdev_module.h" 11 #include "spdk/string.h" 12 #include "spdk/ftl.h" 13 #include "spdk/crc32.h" 14 15 #include "ftl_core.h" 16 #include "ftl_band.h" 17 #include "ftl_io.h" 18 #include "ftl_debug.h" 19 #include "ftl_internal.h" 20 #include "mngt/ftl_mngt.h" 21 22 23 size_t 24 spdk_ftl_io_size(void) 25 { 26 return sizeof(struct ftl_io); 27 } 28 29 static void 30 ftl_io_cmpl_cb(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg) 31 { 32 struct ftl_io *io = cb_arg; 33 34 if (spdk_unlikely(!success)) { 35 io->status = -EIO; 36 } 37 38 ftl_io_dec_req(io); 39 if (ftl_io_done(io)) { 40 ftl_io_complete(io); 41 } 42 43 spdk_bdev_free_io(bdev_io); 44 } 45 46 static void 47 ftl_band_erase(struct ftl_band *band) 48 { 49 assert(band->md->state == FTL_BAND_STATE_CLOSED || 50 band->md->state == FTL_BAND_STATE_FREE); 51 52 ftl_band_set_state(band, FTL_BAND_STATE_PREP); 53 } 54 55 static size_t 56 ftl_get_limit(const struct spdk_ftl_dev *dev, int type) 57 { 58 assert(type < SPDK_FTL_LIMIT_MAX); 59 return dev->conf.limits[type]; 60 } 61 62 static bool 63 ftl_shutdown_complete(struct spdk_ftl_dev *dev) 64 { 65 uint64_t i; 66 67 if (dev->num_inflight) { 68 return false; 69 } 70 71 if (!ftl_nv_cache_is_halted(&dev->nv_cache)) { 72 ftl_nv_cache_halt(&dev->nv_cache); 73 return false; 74 } 75 76 if (!ftl_writer_is_halted(&dev->writer_user)) { 77 ftl_writer_halt(&dev->writer_user); 78 return false; 79 } 80 81 if (!ftl_writer_is_halted(&dev->writer_gc)) { 82 ftl_writer_halt(&dev->writer_gc); 83 return false; 84 } 85 86 if (!ftl_nv_cache_chunks_busy(&dev->nv_cache)) { 87 return false; 88 } 89 90 for (i = 0; i < ftl_get_num_bands(dev); ++i) { 91 if (dev->bands[i].queue_depth || 92 dev->bands[i].md->state == FTL_BAND_STATE_CLOSING) { 93 return false; 94 } 95 } 96 97 if (!ftl_l2p_is_halted(dev)) { 98 ftl_l2p_halt(dev); 99 return false; 100 } 101 102 return true; 103 } 104 105 void 106 ftl_apply_limits(struct spdk_ftl_dev *dev) 107 { 108 size_t limit; 109 int i; 110 111 /* Clear existing limit */ 112 dev->limit = SPDK_FTL_LIMIT_MAX; 113 114 for (i = SPDK_FTL_LIMIT_CRIT; i < SPDK_FTL_LIMIT_MAX; ++i) { 115 limit = ftl_get_limit(dev, i); 116 117 if (dev->num_free <= limit) { 118 dev->limit = i; 119 break; 120 } 121 } 122 } 123 124 void 125 ftl_invalidate_addr(struct spdk_ftl_dev *dev, ftl_addr addr) 126 { 127 struct ftl_band *band; 128 struct ftl_p2l_map *p2l_map; 129 130 if (ftl_addr_in_nvc(dev, addr)) { 131 return; 132 } 133 134 band = ftl_band_from_addr(dev, addr); 135 p2l_map = &band->p2l_map; 136 137 /* TODO: fix case when the same address is invalidated from multiple sources */ 138 assert(p2l_map->num_valid > 0); 139 p2l_map->num_valid--; 140 141 /* Invalidate open/full band p2l_map entry to keep p2l and l2p 142 * consistency when band is going to close state */ 143 if (FTL_BAND_STATE_OPEN == band->md->state || FTL_BAND_STATE_FULL == band->md->state) { 144 p2l_map->band_map[ftl_band_block_offset_from_addr(band, addr)] = FTL_LBA_INVALID; 145 } 146 } 147 148 static int 149 ftl_read_canceled(int rc) 150 { 151 return rc == -EFAULT; 152 } 153 154 static int 155 ftl_get_next_read_addr(struct ftl_io *io, ftl_addr *addr) 156 { 157 struct spdk_ftl_dev *dev = io->dev; 158 ftl_addr next_addr; 159 size_t i; 160 bool addr_cached = false; 161 162 *addr = ftl_l2p_get(dev, ftl_io_current_lba(io)); 163 io->map[io->pos] = *addr; 164 165 /* If the address is invalid, skip it */ 166 if (*addr == FTL_ADDR_INVALID) { 167 return -EFAULT; 168 } 169 170 addr_cached = ftl_addr_in_nvc(dev, *addr); 171 172 for (i = 1; i < ftl_io_iovec_len_left(io); ++i) { 173 next_addr = ftl_l2p_get(dev, ftl_io_get_lba(io, io->pos + i)); 174 175 if (next_addr == FTL_ADDR_INVALID) { 176 break; 177 } 178 179 /* It's not enough to check for contiguity, if user data is on the last block 180 * of base device and first nvc, then they're 'contiguous', but can't be handled 181 * with one read request. 182 */ 183 if (addr_cached != ftl_addr_in_nvc(dev, next_addr)) { 184 break; 185 } 186 187 if (*addr + i != next_addr) { 188 break; 189 } 190 191 io->map[io->pos + i] = next_addr; 192 } 193 194 return i; 195 } 196 197 static void ftl_submit_read(struct ftl_io *io); 198 199 static void 200 _ftl_submit_read(void *_io) 201 { 202 struct ftl_io *io = _io; 203 204 ftl_submit_read(io); 205 } 206 207 static void 208 ftl_submit_read(struct ftl_io *io) 209 { 210 struct spdk_ftl_dev *dev = io->dev; 211 ftl_addr addr; 212 int rc = 0, num_blocks; 213 214 while (io->pos < io->num_blocks) { 215 num_blocks = ftl_get_next_read_addr(io, &addr); 216 rc = num_blocks; 217 218 /* User LBA doesn't hold valid data (trimmed or never written to), fill with 0 and skip this block */ 219 if (ftl_read_canceled(rc)) { 220 memset(ftl_io_iovec_addr(io), 0, FTL_BLOCK_SIZE); 221 ftl_io_advance(io, 1); 222 continue; 223 } 224 225 assert(num_blocks > 0); 226 227 if (ftl_addr_in_nvc(dev, addr)) { 228 rc = ftl_nv_cache_read(io, addr, num_blocks, ftl_io_cmpl_cb, io); 229 } else { 230 rc = spdk_bdev_read_blocks(dev->base_bdev_desc, dev->base_ioch, 231 ftl_io_iovec_addr(io), 232 addr, num_blocks, ftl_io_cmpl_cb, io); 233 } 234 235 if (spdk_unlikely(rc)) { 236 if (rc == -ENOMEM) { 237 struct spdk_bdev *bdev; 238 struct spdk_io_channel *ch; 239 240 if (ftl_addr_in_nvc(dev, addr)) { 241 bdev = spdk_bdev_desc_get_bdev(dev->nv_cache.bdev_desc); 242 ch = dev->nv_cache.cache_ioch; 243 } else { 244 bdev = spdk_bdev_desc_get_bdev(dev->base_bdev_desc); 245 ch = dev->base_ioch; 246 } 247 io->bdev_io_wait.bdev = bdev; 248 io->bdev_io_wait.cb_fn = _ftl_submit_read; 249 io->bdev_io_wait.cb_arg = io; 250 spdk_bdev_queue_io_wait(bdev, ch, &io->bdev_io_wait); 251 return; 252 } else { 253 ftl_abort(); 254 } 255 } 256 257 ftl_io_inc_req(io); 258 ftl_io_advance(io, num_blocks); 259 } 260 261 /* If we didn't have to read anything from the device, */ 262 /* complete the request right away */ 263 if (ftl_io_done(io)) { 264 ftl_io_complete(io); 265 } 266 } 267 268 void 269 spdk_ftl_dev_get_attrs(const struct spdk_ftl_dev *dev, struct spdk_ftl_attrs *attrs) 270 { 271 attrs->num_blocks = dev->num_lbas; 272 attrs->block_size = FTL_BLOCK_SIZE; 273 attrs->optimum_io_size = dev->xfer_size; 274 } 275 276 static void 277 ftl_io_pin_cb(struct spdk_ftl_dev *dev, int status, struct ftl_l2p_pin_ctx *pin_ctx) 278 { 279 struct ftl_io *io = pin_ctx->cb_ctx; 280 281 if (spdk_unlikely(status != 0)) { 282 /* Retry on the internal L2P fault */ 283 io->status = -EAGAIN; 284 ftl_io_complete(io); 285 return; 286 } 287 288 io->flags |= FTL_IO_PINNED; 289 ftl_submit_read(io); 290 } 291 292 static void 293 ftl_io_pin(struct ftl_io *io) 294 { 295 if (spdk_unlikely(io->flags & FTL_IO_PINNED)) { 296 /* 297 * The IO is in a retry path and it had been pinned already. 298 * Continue with further processing. 299 */ 300 ftl_l2p_pin_skip(io->dev, ftl_io_pin_cb, io, &io->l2p_pin_ctx); 301 } else { 302 /* First time when pinning the IO */ 303 ftl_l2p_pin(io->dev, io->lba, io->num_blocks, 304 ftl_io_pin_cb, io, &io->l2p_pin_ctx); 305 } 306 } 307 308 static void 309 start_io(struct ftl_io *io) 310 { 311 struct ftl_io_channel *ioch = ftl_io_channel_get_ctx(io->ioch); 312 struct spdk_ftl_dev *dev = io->dev; 313 314 io->map = ftl_mempool_get(ioch->map_pool); 315 if (spdk_unlikely(!io->map)) { 316 io->status = -ENOMEM; 317 ftl_io_complete(io); 318 return; 319 } 320 321 switch (io->type) { 322 case FTL_IO_READ: 323 TAILQ_INSERT_TAIL(&dev->rd_sq, io, queue_entry); 324 break; 325 case FTL_IO_WRITE: 326 TAILQ_INSERT_TAIL(&dev->wr_sq, io, queue_entry); 327 break; 328 case FTL_IO_UNMAP: 329 default: 330 io->status = -EOPNOTSUPP; 331 ftl_io_complete(io); 332 } 333 } 334 335 static int 336 queue_io(struct spdk_ftl_dev *dev, struct ftl_io *io) 337 { 338 size_t result; 339 struct ftl_io_channel *ioch = ftl_io_channel_get_ctx(io->ioch); 340 341 result = spdk_ring_enqueue(ioch->sq, (void **)&io, 1, NULL); 342 if (spdk_unlikely(0 == result)) { 343 return -EAGAIN; 344 } 345 346 return 0; 347 } 348 349 int 350 spdk_ftl_writev(struct spdk_ftl_dev *dev, struct ftl_io *io, struct spdk_io_channel *ch, 351 uint64_t lba, uint64_t lba_cnt, struct iovec *iov, size_t iov_cnt, spdk_ftl_fn cb_fn, 352 void *cb_arg) 353 { 354 int rc; 355 356 if (iov_cnt == 0) { 357 return -EINVAL; 358 } 359 360 if (lba_cnt == 0) { 361 return -EINVAL; 362 } 363 364 if (lba_cnt != ftl_iovec_num_blocks(iov, iov_cnt)) { 365 FTL_ERRLOG(dev, "Invalid IO vector to handle, device %s, LBA %"PRIu64"\n", 366 dev->conf.name, lba); 367 return -EINVAL; 368 } 369 370 if (!dev->initialized) { 371 return -EBUSY; 372 } 373 374 rc = ftl_io_init(ch, io, lba, lba_cnt, iov, iov_cnt, cb_fn, cb_arg, FTL_IO_WRITE); 375 if (rc) { 376 return rc; 377 } 378 379 return queue_io(dev, io); 380 } 381 382 int 383 spdk_ftl_readv(struct spdk_ftl_dev *dev, struct ftl_io *io, struct spdk_io_channel *ch, 384 uint64_t lba, uint64_t lba_cnt, struct iovec *iov, size_t iov_cnt, spdk_ftl_fn cb_fn, void *cb_arg) 385 { 386 int rc; 387 388 if (iov_cnt == 0) { 389 return -EINVAL; 390 } 391 392 if (lba_cnt == 0) { 393 return -EINVAL; 394 } 395 396 if (lba_cnt != ftl_iovec_num_blocks(iov, iov_cnt)) { 397 FTL_ERRLOG(dev, "Invalid IO vector to handle, device %s, LBA %"PRIu64"\n", 398 dev->conf.name, lba); 399 return -EINVAL; 400 } 401 402 if (!dev->initialized) { 403 return -EBUSY; 404 } 405 406 rc = ftl_io_init(ch, io, lba, lba_cnt, iov, iov_cnt, cb_fn, cb_arg, FTL_IO_READ); 407 if (rc) { 408 return rc; 409 } 410 411 return queue_io(dev, io); 412 } 413 414 #define FTL_IO_QUEUE_BATCH 16 415 int 416 ftl_io_channel_poll(void *arg) 417 { 418 struct ftl_io_channel *ch = arg; 419 void *ios[FTL_IO_QUEUE_BATCH]; 420 uint64_t i, count; 421 422 count = spdk_ring_dequeue(ch->cq, ios, FTL_IO_QUEUE_BATCH); 423 if (count == 0) { 424 return SPDK_POLLER_IDLE; 425 } 426 427 for (i = 0; i < count; i++) { 428 struct ftl_io *io = ios[i]; 429 io->user_fn(io->cb_ctx, io->status); 430 } 431 432 return SPDK_POLLER_BUSY; 433 } 434 435 static void 436 ftl_process_io_channel(struct spdk_ftl_dev *dev, struct ftl_io_channel *ioch) 437 { 438 void *ios[FTL_IO_QUEUE_BATCH]; 439 size_t count, i; 440 441 count = spdk_ring_dequeue(ioch->sq, ios, FTL_IO_QUEUE_BATCH); 442 if (count == 0) { 443 return; 444 } 445 446 for (i = 0; i < count; i++) { 447 struct ftl_io *io = ios[i]; 448 start_io(io); 449 } 450 } 451 452 static void 453 ftl_process_io_queue(struct spdk_ftl_dev *dev) 454 { 455 struct ftl_io_channel *ioch; 456 struct ftl_io *io; 457 458 /* TODO: Try to figure out a mechanism to batch more requests at the same time, 459 * with keeping enough resources (pinned pages), between reads, writes and gc/compaction 460 */ 461 if (!TAILQ_EMPTY(&dev->rd_sq)) { 462 io = TAILQ_FIRST(&dev->rd_sq); 463 TAILQ_REMOVE(&dev->rd_sq, io, queue_entry); 464 assert(io->type == FTL_IO_READ); 465 ftl_io_pin(io); 466 } 467 468 if (!ftl_nv_cache_full(&dev->nv_cache) && !TAILQ_EMPTY(&dev->wr_sq)) { 469 io = TAILQ_FIRST(&dev->wr_sq); 470 TAILQ_REMOVE(&dev->wr_sq, io, queue_entry); 471 assert(io->type == FTL_IO_WRITE); 472 if (!ftl_nv_cache_write(io)) { 473 TAILQ_INSERT_HEAD(&dev->wr_sq, io, queue_entry); 474 } 475 } 476 477 TAILQ_FOREACH(ioch, &dev->ioch_queue, entry) { 478 ftl_process_io_channel(dev, ioch); 479 } 480 } 481 482 int 483 ftl_core_poller(void *ctx) 484 { 485 struct spdk_ftl_dev *dev = ctx; 486 uint64_t io_activity_total_old = dev->io_activity_total; 487 488 if (dev->halt && ftl_shutdown_complete(dev)) { 489 spdk_poller_unregister(&dev->core_poller); 490 return SPDK_POLLER_IDLE; 491 } 492 493 ftl_process_io_queue(dev); 494 ftl_writer_run(&dev->writer_user); 495 ftl_writer_run(&dev->writer_gc); 496 ftl_nv_cache_process(dev); 497 ftl_l2p_process(dev); 498 499 if (io_activity_total_old != dev->io_activity_total) { 500 return SPDK_POLLER_BUSY; 501 } 502 503 return SPDK_POLLER_IDLE; 504 } 505 506 struct ftl_band * 507 ftl_band_get_next_free(struct spdk_ftl_dev *dev) 508 { 509 struct ftl_band *band = NULL; 510 511 if (!TAILQ_EMPTY(&dev->free_bands)) { 512 band = TAILQ_FIRST(&dev->free_bands); 513 TAILQ_REMOVE(&dev->free_bands, band, queue_entry); 514 ftl_band_erase(band); 515 } 516 517 return band; 518 } 519 520 void *g_ftl_write_buf; 521 void *g_ftl_read_buf; 522 523 int 524 spdk_ftl_init(void) 525 { 526 g_ftl_write_buf = spdk_zmalloc(FTL_ZERO_BUFFER_SIZE, FTL_ZERO_BUFFER_SIZE, NULL, 527 SPDK_ENV_LCORE_ID_ANY, SPDK_MALLOC_DMA); 528 if (!g_ftl_write_buf) { 529 return -ENOMEM; 530 } 531 532 g_ftl_read_buf = spdk_zmalloc(FTL_ZERO_BUFFER_SIZE, FTL_ZERO_BUFFER_SIZE, NULL, 533 SPDK_ENV_LCORE_ID_ANY, SPDK_MALLOC_DMA); 534 if (!g_ftl_read_buf) { 535 spdk_free(g_ftl_write_buf); 536 g_ftl_write_buf = NULL; 537 return -ENOMEM; 538 } 539 return 0; 540 } 541 542 void 543 spdk_ftl_fini(void) 544 { 545 spdk_free(g_ftl_write_buf); 546 spdk_free(g_ftl_read_buf); 547 } 548 549 struct spdk_io_channel * 550 spdk_ftl_get_io_channel(struct spdk_ftl_dev *dev) 551 { 552 return spdk_get_io_channel(dev); 553 } 554 555 SPDK_LOG_REGISTER_COMPONENT(ftl_core) 556