1 /*- 2 * BSD LICENSE 3 * 4 * Copyright (c) Intel Corporation. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * * Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * * Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in 15 * the documentation and/or other materials provided with the 16 * distribution. 17 * * Neither the name of Intel Corporation nor the names of its 18 * contributors may be used to endorse or promote products derived 19 * from this software without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34 #include "spdk_cunit.h" 35 36 #include "common/lib/ut_multithread.c" 37 #include "unit/lib/json_mock.c" 38 39 #include "spdk/config.h" 40 /* HACK: disable VTune integration so the unit test doesn't need VTune headers and libs to build */ 41 #undef SPDK_CONFIG_VTUNE 42 43 #include "bdev/bdev.c" 44 45 #define BDEV_UT_NUM_THREADS 3 46 47 DEFINE_STUB(spdk_notify_send, uint64_t, (const char *type, const char *ctx), 0); 48 DEFINE_STUB(spdk_notify_type_register, struct spdk_notify_type *, (const char *type), NULL); 49 DEFINE_STUB_V(spdk_scsi_nvme_translate, (const struct spdk_bdev_io *bdev_io, int *sc, int *sk, 50 int *asc, int *ascq)); 51 DEFINE_STUB(spdk_memory_domain_get_dma_device_id, const char *, (struct spdk_memory_domain *domain), 52 "test_domain"); 53 DEFINE_STUB(spdk_memory_domain_get_dma_device_type, enum spdk_dma_device_type, 54 (struct spdk_memory_domain *domain), 0); 55 56 DEFINE_RETURN_MOCK(spdk_memory_domain_pull_data, int); 57 int 58 spdk_memory_domain_pull_data(struct spdk_memory_domain *src_domain, void *src_domain_ctx, 59 struct iovec *src_iov, uint32_t src_iov_cnt, struct iovec *dst_iov, uint32_t dst_iov_cnt, 60 spdk_memory_domain_data_cpl_cb cpl_cb, void *cpl_cb_arg) 61 { 62 HANDLE_RETURN_MOCK(spdk_memory_domain_pull_data); 63 64 cpl_cb(cpl_cb_arg, 0); 65 return 0; 66 } 67 68 DEFINE_RETURN_MOCK(spdk_memory_domain_push_data, int); 69 int 70 spdk_memory_domain_push_data(struct spdk_memory_domain *dst_domain, void *dst_domain_ctx, 71 struct iovec *dst_iov, uint32_t dst_iovcnt, struct iovec *src_iov, uint32_t src_iovcnt, 72 spdk_memory_domain_data_cpl_cb cpl_cb, void *cpl_cb_arg) 73 { 74 HANDLE_RETURN_MOCK(spdk_memory_domain_push_data); 75 76 cpl_cb(cpl_cb_arg, 0); 77 return 0; 78 } 79 80 struct ut_bdev { 81 struct spdk_bdev bdev; 82 void *io_target; 83 }; 84 85 struct ut_bdev_channel { 86 TAILQ_HEAD(, spdk_bdev_io) outstanding_io; 87 uint32_t outstanding_cnt; 88 uint32_t avail_cnt; 89 }; 90 91 int g_io_device; 92 struct ut_bdev g_bdev; 93 struct spdk_bdev_desc *g_desc; 94 bool g_teardown_done = false; 95 bool g_get_io_channel = true; 96 bool g_create_ch = true; 97 bool g_init_complete_called = false; 98 bool g_fini_start_called = true; 99 int g_status = 0; 100 int g_count = 0; 101 struct spdk_histogram_data *g_histogram = NULL; 102 103 static int 104 stub_create_ch(void *io_device, void *ctx_buf) 105 { 106 struct ut_bdev_channel *ch = ctx_buf; 107 108 if (g_create_ch == false) { 109 return -1; 110 } 111 112 TAILQ_INIT(&ch->outstanding_io); 113 ch->outstanding_cnt = 0; 114 /* 115 * When avail gets to 0, the submit_request function will return ENOMEM. 116 * Most tests to not want ENOMEM to occur, so by default set this to a 117 * big value that won't get hit. The ENOMEM tests can then override this 118 * value to something much smaller to induce ENOMEM conditions. 119 */ 120 ch->avail_cnt = 2048; 121 return 0; 122 } 123 124 static void 125 stub_destroy_ch(void *io_device, void *ctx_buf) 126 { 127 } 128 129 static struct spdk_io_channel * 130 stub_get_io_channel(void *ctx) 131 { 132 struct ut_bdev *ut_bdev = ctx; 133 134 if (g_get_io_channel == true) { 135 return spdk_get_io_channel(ut_bdev->io_target); 136 } else { 137 return NULL; 138 } 139 } 140 141 static int 142 stub_destruct(void *ctx) 143 { 144 return 0; 145 } 146 147 static void 148 stub_submit_request(struct spdk_io_channel *_ch, struct spdk_bdev_io *bdev_io) 149 { 150 struct ut_bdev_channel *ch = spdk_io_channel_get_ctx(_ch); 151 struct spdk_bdev_io *io; 152 153 if (bdev_io->type == SPDK_BDEV_IO_TYPE_RESET) { 154 while (!TAILQ_EMPTY(&ch->outstanding_io)) { 155 io = TAILQ_FIRST(&ch->outstanding_io); 156 TAILQ_REMOVE(&ch->outstanding_io, io, module_link); 157 ch->outstanding_cnt--; 158 spdk_bdev_io_complete(io, SPDK_BDEV_IO_STATUS_ABORTED); 159 ch->avail_cnt++; 160 } 161 } else if (bdev_io->type == SPDK_BDEV_IO_TYPE_ABORT) { 162 TAILQ_FOREACH(io, &ch->outstanding_io, module_link) { 163 if (io == bdev_io->u.abort.bio_to_abort) { 164 TAILQ_REMOVE(&ch->outstanding_io, io, module_link); 165 ch->outstanding_cnt--; 166 spdk_bdev_io_complete(io, SPDK_BDEV_IO_STATUS_ABORTED); 167 ch->avail_cnt++; 168 169 spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_SUCCESS); 170 return; 171 } 172 } 173 174 spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED); 175 return; 176 } 177 178 if (ch->avail_cnt > 0) { 179 TAILQ_INSERT_TAIL(&ch->outstanding_io, bdev_io, module_link); 180 ch->outstanding_cnt++; 181 ch->avail_cnt--; 182 } else { 183 spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_NOMEM); 184 } 185 } 186 187 static uint32_t 188 stub_complete_io(void *io_target, uint32_t num_to_complete) 189 { 190 struct spdk_io_channel *_ch = spdk_get_io_channel(io_target); 191 struct ut_bdev_channel *ch = spdk_io_channel_get_ctx(_ch); 192 struct spdk_bdev_io *io; 193 bool complete_all = (num_to_complete == 0); 194 uint32_t num_completed = 0; 195 196 while (complete_all || num_completed < num_to_complete) { 197 if (TAILQ_EMPTY(&ch->outstanding_io)) { 198 break; 199 } 200 io = TAILQ_FIRST(&ch->outstanding_io); 201 TAILQ_REMOVE(&ch->outstanding_io, io, module_link); 202 ch->outstanding_cnt--; 203 spdk_bdev_io_complete(io, SPDK_BDEV_IO_STATUS_SUCCESS); 204 ch->avail_cnt++; 205 num_completed++; 206 } 207 208 spdk_put_io_channel(_ch); 209 return num_completed; 210 } 211 212 static bool 213 stub_io_type_supported(void *ctx, enum spdk_bdev_io_type type) 214 { 215 return true; 216 } 217 218 static struct spdk_bdev_fn_table fn_table = { 219 .get_io_channel = stub_get_io_channel, 220 .destruct = stub_destruct, 221 .submit_request = stub_submit_request, 222 .io_type_supported = stub_io_type_supported, 223 }; 224 225 struct spdk_bdev_module bdev_ut_if; 226 227 static int 228 module_init(void) 229 { 230 spdk_bdev_module_init_done(&bdev_ut_if); 231 return 0; 232 } 233 234 static void 235 module_fini(void) 236 { 237 } 238 239 static void 240 init_complete(void) 241 { 242 g_init_complete_called = true; 243 } 244 245 static void 246 fini_start(void) 247 { 248 g_fini_start_called = true; 249 } 250 251 struct spdk_bdev_module bdev_ut_if = { 252 .name = "bdev_ut", 253 .module_init = module_init, 254 .module_fini = module_fini, 255 .async_init = true, 256 .init_complete = init_complete, 257 .fini_start = fini_start, 258 }; 259 260 SPDK_BDEV_MODULE_REGISTER(bdev_ut, &bdev_ut_if) 261 262 static void 263 register_bdev(struct ut_bdev *ut_bdev, char *name, void *io_target) 264 { 265 memset(ut_bdev, 0, sizeof(*ut_bdev)); 266 267 ut_bdev->io_target = io_target; 268 ut_bdev->bdev.ctxt = ut_bdev; 269 ut_bdev->bdev.name = name; 270 ut_bdev->bdev.fn_table = &fn_table; 271 ut_bdev->bdev.module = &bdev_ut_if; 272 ut_bdev->bdev.blocklen = 4096; 273 ut_bdev->bdev.blockcnt = 1024; 274 275 spdk_bdev_register(&ut_bdev->bdev); 276 } 277 278 static void 279 unregister_bdev(struct ut_bdev *ut_bdev) 280 { 281 /* Handle any deferred messages. */ 282 poll_threads(); 283 spdk_bdev_unregister(&ut_bdev->bdev, NULL, NULL); 284 } 285 286 static void 287 bdev_init_cb(void *done, int rc) 288 { 289 CU_ASSERT(rc == 0); 290 *(bool *)done = true; 291 } 292 293 static void 294 _bdev_event_cb(enum spdk_bdev_event_type type, struct spdk_bdev *bdev, 295 void *event_ctx) 296 { 297 switch (type) { 298 case SPDK_BDEV_EVENT_REMOVE: 299 if (event_ctx != NULL) { 300 *(bool *)event_ctx = true; 301 } 302 break; 303 default: 304 CU_ASSERT(false); 305 break; 306 } 307 } 308 309 static void 310 setup_test(void) 311 { 312 bool done = false; 313 314 allocate_cores(BDEV_UT_NUM_THREADS); 315 allocate_threads(BDEV_UT_NUM_THREADS); 316 set_thread(0); 317 spdk_bdev_initialize(bdev_init_cb, &done); 318 spdk_io_device_register(&g_io_device, stub_create_ch, stub_destroy_ch, 319 sizeof(struct ut_bdev_channel), NULL); 320 register_bdev(&g_bdev, "ut_bdev", &g_io_device); 321 spdk_bdev_open_ext("ut_bdev", true, _bdev_event_cb, NULL, &g_desc); 322 } 323 324 static void 325 finish_cb(void *cb_arg) 326 { 327 g_teardown_done = true; 328 } 329 330 static void 331 teardown_test(void) 332 { 333 set_thread(0); 334 g_teardown_done = false; 335 spdk_bdev_close(g_desc); 336 g_desc = NULL; 337 unregister_bdev(&g_bdev); 338 spdk_io_device_unregister(&g_io_device, NULL); 339 spdk_bdev_finish(finish_cb, NULL); 340 poll_threads(); 341 memset(&g_bdev, 0, sizeof(g_bdev)); 342 CU_ASSERT(g_teardown_done == true); 343 g_teardown_done = false; 344 free_threads(); 345 free_cores(); 346 } 347 348 static uint32_t 349 bdev_io_tailq_cnt(bdev_io_tailq_t *tailq) 350 { 351 struct spdk_bdev_io *io; 352 uint32_t cnt = 0; 353 354 TAILQ_FOREACH(io, tailq, internal.link) { 355 cnt++; 356 } 357 358 return cnt; 359 } 360 361 static void 362 basic(void) 363 { 364 g_init_complete_called = false; 365 setup_test(); 366 CU_ASSERT(g_init_complete_called == true); 367 368 set_thread(0); 369 370 g_get_io_channel = false; 371 g_ut_threads[0].ch = spdk_bdev_get_io_channel(g_desc); 372 CU_ASSERT(g_ut_threads[0].ch == NULL); 373 374 g_get_io_channel = true; 375 g_create_ch = false; 376 g_ut_threads[0].ch = spdk_bdev_get_io_channel(g_desc); 377 CU_ASSERT(g_ut_threads[0].ch == NULL); 378 379 g_get_io_channel = true; 380 g_create_ch = true; 381 g_ut_threads[0].ch = spdk_bdev_get_io_channel(g_desc); 382 CU_ASSERT(g_ut_threads[0].ch != NULL); 383 spdk_put_io_channel(g_ut_threads[0].ch); 384 385 g_fini_start_called = false; 386 teardown_test(); 387 CU_ASSERT(g_fini_start_called == true); 388 } 389 390 static void 391 _bdev_unregistered(void *done, int rc) 392 { 393 CU_ASSERT(rc == 0); 394 *(bool *)done = true; 395 } 396 397 static void 398 unregister_and_close(void) 399 { 400 bool done, remove_notify; 401 struct spdk_bdev_desc *desc = NULL; 402 403 setup_test(); 404 set_thread(0); 405 406 /* setup_test() automatically opens the bdev, 407 * but this test needs to do that in a different 408 * way. */ 409 spdk_bdev_close(g_desc); 410 poll_threads(); 411 412 /* Try hotremoving a bdev with descriptors which don't provide 413 * any context to the notification callback */ 414 spdk_bdev_open_ext("ut_bdev", true, _bdev_event_cb, NULL, &desc); 415 SPDK_CU_ASSERT_FATAL(desc != NULL); 416 417 /* There is an open descriptor on the device. Unregister it, 418 * which can't proceed until the descriptor is closed. */ 419 done = false; 420 spdk_bdev_unregister(&g_bdev.bdev, _bdev_unregistered, &done); 421 422 /* Poll the threads to allow all events to be processed */ 423 poll_threads(); 424 425 /* Make sure the bdev was not unregistered. We still have a 426 * descriptor open */ 427 CU_ASSERT(done == false); 428 429 spdk_bdev_close(desc); 430 poll_threads(); 431 desc = NULL; 432 433 /* The unregister should have completed */ 434 CU_ASSERT(done == true); 435 436 437 /* Register the bdev again */ 438 register_bdev(&g_bdev, "ut_bdev", &g_io_device); 439 440 remove_notify = false; 441 spdk_bdev_open_ext("ut_bdev", true, _bdev_event_cb, &remove_notify, &desc); 442 SPDK_CU_ASSERT_FATAL(desc != NULL); 443 CU_ASSERT(remove_notify == false); 444 445 /* There is an open descriptor on the device. Unregister it, 446 * which can't proceed until the descriptor is closed. */ 447 done = false; 448 spdk_bdev_unregister(&g_bdev.bdev, _bdev_unregistered, &done); 449 /* No polling has occurred, so neither of these should execute */ 450 CU_ASSERT(remove_notify == false); 451 CU_ASSERT(done == false); 452 453 /* Prior to the unregister completing, close the descriptor */ 454 spdk_bdev_close(desc); 455 456 /* Poll the threads to allow all events to be processed */ 457 poll_threads(); 458 459 /* Remove notify should not have been called because the 460 * descriptor is already closed. */ 461 CU_ASSERT(remove_notify == false); 462 463 /* The unregister should have completed */ 464 CU_ASSERT(done == true); 465 466 /* Restore the original g_bdev so that we can use teardown_test(). */ 467 register_bdev(&g_bdev, "ut_bdev", &g_io_device); 468 spdk_bdev_open_ext("ut_bdev", true, _bdev_event_cb, NULL, &g_desc); 469 teardown_test(); 470 } 471 472 static void 473 reset_done(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg) 474 { 475 bool *done = cb_arg; 476 477 CU_ASSERT(success == true); 478 *done = true; 479 spdk_bdev_free_io(bdev_io); 480 } 481 482 static void 483 put_channel_during_reset(void) 484 { 485 struct spdk_io_channel *io_ch; 486 bool done = false; 487 488 setup_test(); 489 490 set_thread(0); 491 io_ch = spdk_bdev_get_io_channel(g_desc); 492 CU_ASSERT(io_ch != NULL); 493 494 /* 495 * Start a reset, but then put the I/O channel before 496 * the deferred messages for the reset get a chance to 497 * execute. 498 */ 499 spdk_bdev_reset(g_desc, io_ch, reset_done, &done); 500 spdk_put_io_channel(io_ch); 501 poll_threads(); 502 stub_complete_io(g_bdev.io_target, 0); 503 504 teardown_test(); 505 } 506 507 static void 508 aborted_reset_done(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg) 509 { 510 enum spdk_bdev_io_status *status = cb_arg; 511 512 *status = success ? SPDK_BDEV_IO_STATUS_SUCCESS : SPDK_BDEV_IO_STATUS_FAILED; 513 spdk_bdev_free_io(bdev_io); 514 } 515 516 static void 517 aborted_reset(void) 518 { 519 struct spdk_io_channel *io_ch[2]; 520 enum spdk_bdev_io_status status1 = SPDK_BDEV_IO_STATUS_PENDING, 521 status2 = SPDK_BDEV_IO_STATUS_PENDING; 522 523 setup_test(); 524 525 set_thread(0); 526 io_ch[0] = spdk_bdev_get_io_channel(g_desc); 527 CU_ASSERT(io_ch[0] != NULL); 528 spdk_bdev_reset(g_desc, io_ch[0], aborted_reset_done, &status1); 529 poll_threads(); 530 CU_ASSERT(g_bdev.bdev.internal.reset_in_progress != NULL); 531 532 /* 533 * First reset has been submitted on ch0. Now submit a second 534 * reset on ch1 which will get queued since there is already a 535 * reset in progress. 536 */ 537 set_thread(1); 538 io_ch[1] = spdk_bdev_get_io_channel(g_desc); 539 CU_ASSERT(io_ch[1] != NULL); 540 spdk_bdev_reset(g_desc, io_ch[1], aborted_reset_done, &status2); 541 poll_threads(); 542 CU_ASSERT(g_bdev.bdev.internal.reset_in_progress != NULL); 543 544 /* 545 * Now destroy ch1. This will abort the queued reset. Check that 546 * the second reset was completed with failed status. Also check 547 * that bdev->internal.reset_in_progress != NULL, since the 548 * original reset has not been completed yet. This ensures that 549 * the bdev code is correctly noticing that the failed reset is 550 * *not* the one that had been submitted to the bdev module. 551 */ 552 set_thread(1); 553 spdk_put_io_channel(io_ch[1]); 554 poll_threads(); 555 CU_ASSERT(status2 == SPDK_BDEV_IO_STATUS_FAILED); 556 CU_ASSERT(g_bdev.bdev.internal.reset_in_progress != NULL); 557 558 /* 559 * Now complete the first reset, verify that it completed with SUCCESS 560 * status and that bdev->internal.reset_in_progress is also set back to NULL. 561 */ 562 set_thread(0); 563 spdk_put_io_channel(io_ch[0]); 564 stub_complete_io(g_bdev.io_target, 0); 565 poll_threads(); 566 CU_ASSERT(status1 == SPDK_BDEV_IO_STATUS_SUCCESS); 567 CU_ASSERT(g_bdev.bdev.internal.reset_in_progress == NULL); 568 569 teardown_test(); 570 } 571 572 static void 573 io_during_io_done(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg) 574 { 575 enum spdk_bdev_io_status *status = cb_arg; 576 577 *status = bdev_io->internal.status; 578 spdk_bdev_free_io(bdev_io); 579 } 580 581 static void 582 io_during_reset(void) 583 { 584 struct spdk_io_channel *io_ch[2]; 585 struct spdk_bdev_channel *bdev_ch[2]; 586 enum spdk_bdev_io_status status0, status1, status_reset; 587 int rc; 588 589 setup_test(); 590 591 /* 592 * First test normal case - submit an I/O on each of two channels (with no resets) 593 * and verify they complete successfully. 594 */ 595 set_thread(0); 596 io_ch[0] = spdk_bdev_get_io_channel(g_desc); 597 bdev_ch[0] = spdk_io_channel_get_ctx(io_ch[0]); 598 CU_ASSERT(bdev_ch[0]->flags == 0); 599 status0 = SPDK_BDEV_IO_STATUS_PENDING; 600 rc = spdk_bdev_read_blocks(g_desc, io_ch[0], NULL, 0, 1, io_during_io_done, &status0); 601 CU_ASSERT(rc == 0); 602 603 set_thread(1); 604 io_ch[1] = spdk_bdev_get_io_channel(g_desc); 605 bdev_ch[1] = spdk_io_channel_get_ctx(io_ch[1]); 606 CU_ASSERT(bdev_ch[1]->flags == 0); 607 status1 = SPDK_BDEV_IO_STATUS_PENDING; 608 rc = spdk_bdev_read_blocks(g_desc, io_ch[1], NULL, 0, 1, io_during_io_done, &status1); 609 CU_ASSERT(rc == 0); 610 611 poll_threads(); 612 CU_ASSERT(status0 == SPDK_BDEV_IO_STATUS_PENDING); 613 CU_ASSERT(status1 == SPDK_BDEV_IO_STATUS_PENDING); 614 615 set_thread(0); 616 stub_complete_io(g_bdev.io_target, 0); 617 CU_ASSERT(status0 == SPDK_BDEV_IO_STATUS_SUCCESS); 618 619 set_thread(1); 620 stub_complete_io(g_bdev.io_target, 0); 621 CU_ASSERT(status1 == SPDK_BDEV_IO_STATUS_SUCCESS); 622 623 /* 624 * Now submit a reset, and leave it pending while we submit I/O on two different 625 * channels. These I/O should be failed by the bdev layer since the reset is in 626 * progress. 627 */ 628 set_thread(0); 629 status_reset = SPDK_BDEV_IO_STATUS_PENDING; 630 rc = spdk_bdev_reset(g_desc, io_ch[0], io_during_io_done, &status_reset); 631 CU_ASSERT(rc == 0); 632 633 CU_ASSERT(bdev_ch[0]->flags == 0); 634 CU_ASSERT(bdev_ch[1]->flags == 0); 635 poll_threads(); 636 CU_ASSERT(bdev_ch[0]->flags == BDEV_CH_RESET_IN_PROGRESS); 637 CU_ASSERT(bdev_ch[1]->flags == BDEV_CH_RESET_IN_PROGRESS); 638 639 set_thread(0); 640 status0 = SPDK_BDEV_IO_STATUS_PENDING; 641 rc = spdk_bdev_read_blocks(g_desc, io_ch[0], NULL, 0, 1, io_during_io_done, &status0); 642 CU_ASSERT(rc == 0); 643 644 set_thread(1); 645 status1 = SPDK_BDEV_IO_STATUS_PENDING; 646 rc = spdk_bdev_read_blocks(g_desc, io_ch[1], NULL, 0, 1, io_during_io_done, &status1); 647 CU_ASSERT(rc == 0); 648 649 /* 650 * A reset is in progress so these read I/O should complete with aborted. Note that we 651 * need to poll_threads() since I/O completed inline have their completion deferred. 652 */ 653 poll_threads(); 654 CU_ASSERT(status_reset == SPDK_BDEV_IO_STATUS_PENDING); 655 CU_ASSERT(status0 == SPDK_BDEV_IO_STATUS_ABORTED); 656 CU_ASSERT(status1 == SPDK_BDEV_IO_STATUS_ABORTED); 657 658 /* 659 * Complete the reset 660 */ 661 set_thread(0); 662 stub_complete_io(g_bdev.io_target, 0); 663 664 /* 665 * Only poll thread 0. We should not get a completion. 666 */ 667 poll_thread(0); 668 CU_ASSERT(status_reset == SPDK_BDEV_IO_STATUS_PENDING); 669 670 /* 671 * Poll both thread 0 and 1 so the messages can propagate and we 672 * get a completion. 673 */ 674 poll_threads(); 675 CU_ASSERT(status_reset == SPDK_BDEV_IO_STATUS_SUCCESS); 676 677 spdk_put_io_channel(io_ch[0]); 678 set_thread(1); 679 spdk_put_io_channel(io_ch[1]); 680 poll_threads(); 681 682 teardown_test(); 683 } 684 685 static void 686 basic_qos(void) 687 { 688 struct spdk_io_channel *io_ch[2]; 689 struct spdk_bdev_channel *bdev_ch[2]; 690 struct spdk_bdev *bdev; 691 enum spdk_bdev_io_status status, abort_status; 692 int rc; 693 694 setup_test(); 695 696 /* Enable QoS */ 697 bdev = &g_bdev.bdev; 698 bdev->internal.qos = calloc(1, sizeof(*bdev->internal.qos)); 699 SPDK_CU_ASSERT_FATAL(bdev->internal.qos != NULL); 700 TAILQ_INIT(&bdev->internal.qos->queued); 701 /* 702 * Enable read/write IOPS, read only byte per second and 703 * read/write byte per second rate limits. 704 * In this case, all rate limits will take equal effect. 705 */ 706 /* 2000 read/write I/O per second, or 2 per millisecond */ 707 bdev->internal.qos->rate_limits[SPDK_BDEV_QOS_RW_IOPS_RATE_LIMIT].limit = 2000; 708 /* 8K read/write byte per millisecond with 4K block size */ 709 bdev->internal.qos->rate_limits[SPDK_BDEV_QOS_RW_BPS_RATE_LIMIT].limit = 8192000; 710 /* 8K read only byte per millisecond with 4K block size */ 711 bdev->internal.qos->rate_limits[SPDK_BDEV_QOS_R_BPS_RATE_LIMIT].limit = 8192000; 712 713 g_get_io_channel = true; 714 715 set_thread(0); 716 io_ch[0] = spdk_bdev_get_io_channel(g_desc); 717 bdev_ch[0] = spdk_io_channel_get_ctx(io_ch[0]); 718 CU_ASSERT(bdev_ch[0]->flags == BDEV_CH_QOS_ENABLED); 719 720 set_thread(1); 721 io_ch[1] = spdk_bdev_get_io_channel(g_desc); 722 bdev_ch[1] = spdk_io_channel_get_ctx(io_ch[1]); 723 CU_ASSERT(bdev_ch[1]->flags == BDEV_CH_QOS_ENABLED); 724 725 /* 726 * Send an I/O on thread 0, which is where the QoS thread is running. 727 */ 728 set_thread(0); 729 status = SPDK_BDEV_IO_STATUS_PENDING; 730 rc = spdk_bdev_read_blocks(g_desc, io_ch[0], NULL, 0, 1, io_during_io_done, &status); 731 CU_ASSERT(rc == 0); 732 CU_ASSERT(status == SPDK_BDEV_IO_STATUS_PENDING); 733 poll_threads(); 734 stub_complete_io(g_bdev.io_target, 0); 735 poll_threads(); 736 CU_ASSERT(status == SPDK_BDEV_IO_STATUS_SUCCESS); 737 738 /* Send an I/O on thread 1. The QoS thread is not running here. */ 739 status = SPDK_BDEV_IO_STATUS_PENDING; 740 set_thread(1); 741 rc = spdk_bdev_read_blocks(g_desc, io_ch[1], NULL, 0, 1, io_during_io_done, &status); 742 CU_ASSERT(rc == 0); 743 CU_ASSERT(status == SPDK_BDEV_IO_STATUS_PENDING); 744 poll_threads(); 745 /* Complete I/O on thread 1. This should not complete the I/O we submitted */ 746 stub_complete_io(g_bdev.io_target, 0); 747 poll_threads(); 748 CU_ASSERT(status == SPDK_BDEV_IO_STATUS_PENDING); 749 /* Now complete I/O on thread 0 */ 750 set_thread(0); 751 poll_threads(); 752 stub_complete_io(g_bdev.io_target, 0); 753 poll_threads(); 754 CU_ASSERT(status == SPDK_BDEV_IO_STATUS_SUCCESS); 755 756 /* Reset rate limit for the next test cases. */ 757 spdk_delay_us(SPDK_BDEV_QOS_TIMESLICE_IN_USEC); 758 poll_threads(); 759 760 /* 761 * Test abort request when QoS is enabled. 762 */ 763 764 /* Send an I/O on thread 0, which is where the QoS thread is running. */ 765 set_thread(0); 766 status = SPDK_BDEV_IO_STATUS_PENDING; 767 rc = spdk_bdev_read_blocks(g_desc, io_ch[0], NULL, 0, 1, io_during_io_done, &status); 768 CU_ASSERT(rc == 0); 769 CU_ASSERT(status == SPDK_BDEV_IO_STATUS_PENDING); 770 /* Send an abort to the I/O on the same thread. */ 771 abort_status = SPDK_BDEV_IO_STATUS_PENDING; 772 rc = spdk_bdev_abort(g_desc, io_ch[0], &status, io_during_io_done, &abort_status); 773 CU_ASSERT(rc == 0); 774 CU_ASSERT(abort_status == SPDK_BDEV_IO_STATUS_PENDING); 775 poll_threads(); 776 CU_ASSERT(abort_status == SPDK_BDEV_IO_STATUS_SUCCESS); 777 CU_ASSERT(status == SPDK_BDEV_IO_STATUS_ABORTED); 778 779 /* Send an I/O on thread 1. The QoS thread is not running here. */ 780 status = SPDK_BDEV_IO_STATUS_PENDING; 781 set_thread(1); 782 rc = spdk_bdev_read_blocks(g_desc, io_ch[1], NULL, 0, 1, io_during_io_done, &status); 783 CU_ASSERT(rc == 0); 784 CU_ASSERT(status == SPDK_BDEV_IO_STATUS_PENDING); 785 poll_threads(); 786 /* Send an abort to the I/O on the same thread. */ 787 abort_status = SPDK_BDEV_IO_STATUS_PENDING; 788 rc = spdk_bdev_abort(g_desc, io_ch[1], &status, io_during_io_done, &abort_status); 789 CU_ASSERT(rc == 0); 790 CU_ASSERT(abort_status == SPDK_BDEV_IO_STATUS_PENDING); 791 poll_threads(); 792 /* Complete the I/O with failure and the abort with success on thread 1. */ 793 CU_ASSERT(abort_status == SPDK_BDEV_IO_STATUS_SUCCESS); 794 CU_ASSERT(status == SPDK_BDEV_IO_STATUS_ABORTED); 795 796 set_thread(0); 797 798 /* 799 * Close the descriptor only, which should stop the qos channel as 800 * the last descriptor removed. 801 */ 802 spdk_bdev_close(g_desc); 803 poll_threads(); 804 CU_ASSERT(bdev->internal.qos->ch == NULL); 805 806 /* 807 * Open the bdev again which shall setup the qos channel as the 808 * channels are valid. 809 */ 810 spdk_bdev_open_ext("ut_bdev", true, _bdev_event_cb, NULL, &g_desc); 811 poll_threads(); 812 CU_ASSERT(bdev->internal.qos->ch != NULL); 813 814 /* Tear down the channels */ 815 set_thread(0); 816 spdk_put_io_channel(io_ch[0]); 817 set_thread(1); 818 spdk_put_io_channel(io_ch[1]); 819 poll_threads(); 820 set_thread(0); 821 822 /* Close the descriptor, which should stop the qos channel */ 823 spdk_bdev_close(g_desc); 824 poll_threads(); 825 CU_ASSERT(bdev->internal.qos->ch == NULL); 826 827 /* Open the bdev again, no qos channel setup without valid channels. */ 828 spdk_bdev_open_ext("ut_bdev", true, _bdev_event_cb, NULL, &g_desc); 829 poll_threads(); 830 CU_ASSERT(bdev->internal.qos->ch == NULL); 831 832 /* Create the channels in reverse order. */ 833 set_thread(1); 834 io_ch[1] = spdk_bdev_get_io_channel(g_desc); 835 bdev_ch[1] = spdk_io_channel_get_ctx(io_ch[1]); 836 CU_ASSERT(bdev_ch[1]->flags == BDEV_CH_QOS_ENABLED); 837 838 set_thread(0); 839 io_ch[0] = spdk_bdev_get_io_channel(g_desc); 840 bdev_ch[0] = spdk_io_channel_get_ctx(io_ch[0]); 841 CU_ASSERT(bdev_ch[0]->flags == BDEV_CH_QOS_ENABLED); 842 843 /* Confirm that the qos thread is now thread 1 */ 844 CU_ASSERT(bdev->internal.qos->ch == bdev_ch[1]); 845 846 /* Tear down the channels */ 847 set_thread(0); 848 spdk_put_io_channel(io_ch[0]); 849 set_thread(1); 850 spdk_put_io_channel(io_ch[1]); 851 poll_threads(); 852 853 set_thread(0); 854 855 teardown_test(); 856 } 857 858 static void 859 io_during_qos_queue(void) 860 { 861 struct spdk_io_channel *io_ch[2]; 862 struct spdk_bdev_channel *bdev_ch[2]; 863 struct spdk_bdev *bdev; 864 enum spdk_bdev_io_status status0, status1, status2; 865 int rc; 866 867 setup_test(); 868 MOCK_SET(spdk_get_ticks, 0); 869 870 /* Enable QoS */ 871 bdev = &g_bdev.bdev; 872 bdev->internal.qos = calloc(1, sizeof(*bdev->internal.qos)); 873 SPDK_CU_ASSERT_FATAL(bdev->internal.qos != NULL); 874 TAILQ_INIT(&bdev->internal.qos->queued); 875 /* 876 * Enable read/write IOPS, read only byte per sec, write only 877 * byte per sec and read/write byte per sec rate limits. 878 * In this case, both read only and write only byte per sec 879 * rate limit will take effect. 880 */ 881 /* 4000 read/write I/O per second, or 4 per millisecond */ 882 bdev->internal.qos->rate_limits[SPDK_BDEV_QOS_RW_IOPS_RATE_LIMIT].limit = 4000; 883 /* 8K byte per millisecond with 4K block size */ 884 bdev->internal.qos->rate_limits[SPDK_BDEV_QOS_RW_BPS_RATE_LIMIT].limit = 8192000; 885 /* 4K byte per millisecond with 4K block size */ 886 bdev->internal.qos->rate_limits[SPDK_BDEV_QOS_R_BPS_RATE_LIMIT].limit = 4096000; 887 /* 4K byte per millisecond with 4K block size */ 888 bdev->internal.qos->rate_limits[SPDK_BDEV_QOS_W_BPS_RATE_LIMIT].limit = 4096000; 889 890 g_get_io_channel = true; 891 892 /* Create channels */ 893 set_thread(0); 894 io_ch[0] = spdk_bdev_get_io_channel(g_desc); 895 bdev_ch[0] = spdk_io_channel_get_ctx(io_ch[0]); 896 CU_ASSERT(bdev_ch[0]->flags == BDEV_CH_QOS_ENABLED); 897 898 set_thread(1); 899 io_ch[1] = spdk_bdev_get_io_channel(g_desc); 900 bdev_ch[1] = spdk_io_channel_get_ctx(io_ch[1]); 901 CU_ASSERT(bdev_ch[1]->flags == BDEV_CH_QOS_ENABLED); 902 903 /* Send two read I/Os */ 904 status1 = SPDK_BDEV_IO_STATUS_PENDING; 905 rc = spdk_bdev_read_blocks(g_desc, io_ch[1], NULL, 0, 1, io_during_io_done, &status1); 906 CU_ASSERT(rc == 0); 907 CU_ASSERT(status1 == SPDK_BDEV_IO_STATUS_PENDING); 908 set_thread(0); 909 status0 = SPDK_BDEV_IO_STATUS_PENDING; 910 rc = spdk_bdev_read_blocks(g_desc, io_ch[0], NULL, 0, 1, io_during_io_done, &status0); 911 CU_ASSERT(rc == 0); 912 CU_ASSERT(status0 == SPDK_BDEV_IO_STATUS_PENDING); 913 /* Send one write I/O */ 914 status2 = SPDK_BDEV_IO_STATUS_PENDING; 915 rc = spdk_bdev_write_blocks(g_desc, io_ch[0], NULL, 0, 1, io_during_io_done, &status2); 916 CU_ASSERT(rc == 0); 917 CU_ASSERT(status2 == SPDK_BDEV_IO_STATUS_PENDING); 918 919 /* Complete any I/O that arrived at the disk */ 920 poll_threads(); 921 set_thread(1); 922 stub_complete_io(g_bdev.io_target, 0); 923 set_thread(0); 924 stub_complete_io(g_bdev.io_target, 0); 925 poll_threads(); 926 927 /* Only one of the two read I/Os should complete. (logical XOR) */ 928 if (status0 == SPDK_BDEV_IO_STATUS_SUCCESS) { 929 CU_ASSERT(status1 == SPDK_BDEV_IO_STATUS_PENDING); 930 } else { 931 CU_ASSERT(status1 == SPDK_BDEV_IO_STATUS_SUCCESS); 932 } 933 /* The write I/O should complete. */ 934 CU_ASSERT(status2 == SPDK_BDEV_IO_STATUS_SUCCESS); 935 936 /* Advance in time by a millisecond */ 937 spdk_delay_us(1000); 938 939 /* Complete more I/O */ 940 poll_threads(); 941 set_thread(1); 942 stub_complete_io(g_bdev.io_target, 0); 943 set_thread(0); 944 stub_complete_io(g_bdev.io_target, 0); 945 poll_threads(); 946 947 /* Now the second read I/O should be done */ 948 CU_ASSERT(status0 == SPDK_BDEV_IO_STATUS_SUCCESS); 949 CU_ASSERT(status1 == SPDK_BDEV_IO_STATUS_SUCCESS); 950 951 /* Tear down the channels */ 952 set_thread(1); 953 spdk_put_io_channel(io_ch[1]); 954 set_thread(0); 955 spdk_put_io_channel(io_ch[0]); 956 poll_threads(); 957 958 teardown_test(); 959 } 960 961 static void 962 io_during_qos_reset(void) 963 { 964 struct spdk_io_channel *io_ch[2]; 965 struct spdk_bdev_channel *bdev_ch[2]; 966 struct spdk_bdev *bdev; 967 enum spdk_bdev_io_status status0, status1, reset_status; 968 int rc; 969 970 setup_test(); 971 MOCK_SET(spdk_get_ticks, 0); 972 973 /* Enable QoS */ 974 bdev = &g_bdev.bdev; 975 bdev->internal.qos = calloc(1, sizeof(*bdev->internal.qos)); 976 SPDK_CU_ASSERT_FATAL(bdev->internal.qos != NULL); 977 TAILQ_INIT(&bdev->internal.qos->queued); 978 /* 979 * Enable read/write IOPS, write only byte per sec and 980 * read/write byte per second rate limits. 981 * In this case, read/write byte per second rate limit will 982 * take effect first. 983 */ 984 /* 2000 read/write I/O per second, or 2 per millisecond */ 985 bdev->internal.qos->rate_limits[SPDK_BDEV_QOS_RW_IOPS_RATE_LIMIT].limit = 2000; 986 /* 4K byte per millisecond with 4K block size */ 987 bdev->internal.qos->rate_limits[SPDK_BDEV_QOS_RW_BPS_RATE_LIMIT].limit = 4096000; 988 /* 8K byte per millisecond with 4K block size */ 989 bdev->internal.qos->rate_limits[SPDK_BDEV_QOS_W_BPS_RATE_LIMIT].limit = 8192000; 990 991 g_get_io_channel = true; 992 993 /* Create channels */ 994 set_thread(0); 995 io_ch[0] = spdk_bdev_get_io_channel(g_desc); 996 bdev_ch[0] = spdk_io_channel_get_ctx(io_ch[0]); 997 CU_ASSERT(bdev_ch[0]->flags == BDEV_CH_QOS_ENABLED); 998 999 set_thread(1); 1000 io_ch[1] = spdk_bdev_get_io_channel(g_desc); 1001 bdev_ch[1] = spdk_io_channel_get_ctx(io_ch[1]); 1002 CU_ASSERT(bdev_ch[1]->flags == BDEV_CH_QOS_ENABLED); 1003 1004 /* Send two I/O. One of these gets queued by QoS. The other is sitting at the disk. */ 1005 status1 = SPDK_BDEV_IO_STATUS_PENDING; 1006 rc = spdk_bdev_write_blocks(g_desc, io_ch[1], NULL, 0, 1, io_during_io_done, &status1); 1007 CU_ASSERT(rc == 0); 1008 set_thread(0); 1009 status0 = SPDK_BDEV_IO_STATUS_PENDING; 1010 rc = spdk_bdev_write_blocks(g_desc, io_ch[0], NULL, 0, 1, io_during_io_done, &status0); 1011 CU_ASSERT(rc == 0); 1012 1013 poll_threads(); 1014 CU_ASSERT(status1 == SPDK_BDEV_IO_STATUS_PENDING); 1015 CU_ASSERT(status0 == SPDK_BDEV_IO_STATUS_PENDING); 1016 1017 /* Reset the bdev. */ 1018 reset_status = SPDK_BDEV_IO_STATUS_PENDING; 1019 rc = spdk_bdev_reset(g_desc, io_ch[0], io_during_io_done, &reset_status); 1020 CU_ASSERT(rc == 0); 1021 1022 /* Complete any I/O that arrived at the disk */ 1023 poll_threads(); 1024 set_thread(1); 1025 stub_complete_io(g_bdev.io_target, 0); 1026 set_thread(0); 1027 stub_complete_io(g_bdev.io_target, 0); 1028 poll_threads(); 1029 1030 CU_ASSERT(reset_status == SPDK_BDEV_IO_STATUS_SUCCESS); 1031 CU_ASSERT(status0 == SPDK_BDEV_IO_STATUS_ABORTED); 1032 CU_ASSERT(status1 == SPDK_BDEV_IO_STATUS_ABORTED); 1033 1034 /* Tear down the channels */ 1035 set_thread(1); 1036 spdk_put_io_channel(io_ch[1]); 1037 set_thread(0); 1038 spdk_put_io_channel(io_ch[0]); 1039 poll_threads(); 1040 1041 teardown_test(); 1042 } 1043 1044 static void 1045 enomem_done(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg) 1046 { 1047 enum spdk_bdev_io_status *status = cb_arg; 1048 1049 *status = success ? SPDK_BDEV_IO_STATUS_SUCCESS : SPDK_BDEV_IO_STATUS_FAILED; 1050 spdk_bdev_free_io(bdev_io); 1051 } 1052 1053 static void 1054 enomem(void) 1055 { 1056 struct spdk_io_channel *io_ch; 1057 struct spdk_bdev_channel *bdev_ch; 1058 struct spdk_bdev_shared_resource *shared_resource; 1059 struct ut_bdev_channel *ut_ch; 1060 const uint32_t IO_ARRAY_SIZE = 64; 1061 const uint32_t AVAIL = 20; 1062 enum spdk_bdev_io_status status[IO_ARRAY_SIZE], status_reset; 1063 uint32_t nomem_cnt, i; 1064 struct spdk_bdev_io *first_io; 1065 int rc; 1066 1067 setup_test(); 1068 1069 set_thread(0); 1070 io_ch = spdk_bdev_get_io_channel(g_desc); 1071 bdev_ch = spdk_io_channel_get_ctx(io_ch); 1072 shared_resource = bdev_ch->shared_resource; 1073 ut_ch = spdk_io_channel_get_ctx(bdev_ch->channel); 1074 ut_ch->avail_cnt = AVAIL; 1075 1076 /* First submit a number of IOs equal to what the channel can support. */ 1077 for (i = 0; i < AVAIL; i++) { 1078 status[i] = SPDK_BDEV_IO_STATUS_PENDING; 1079 rc = spdk_bdev_read_blocks(g_desc, io_ch, NULL, 0, 1, enomem_done, &status[i]); 1080 CU_ASSERT(rc == 0); 1081 } 1082 CU_ASSERT(TAILQ_EMPTY(&shared_resource->nomem_io)); 1083 1084 /* 1085 * Next, submit one additional I/O. This one should fail with ENOMEM and then go onto 1086 * the enomem_io list. 1087 */ 1088 status[AVAIL] = SPDK_BDEV_IO_STATUS_PENDING; 1089 rc = spdk_bdev_read_blocks(g_desc, io_ch, NULL, 0, 1, enomem_done, &status[AVAIL]); 1090 CU_ASSERT(rc == 0); 1091 SPDK_CU_ASSERT_FATAL(!TAILQ_EMPTY(&shared_resource->nomem_io)); 1092 first_io = TAILQ_FIRST(&shared_resource->nomem_io); 1093 1094 /* 1095 * Now submit a bunch more I/O. These should all fail with ENOMEM and get queued behind 1096 * the first_io above. 1097 */ 1098 for (i = AVAIL + 1; i < IO_ARRAY_SIZE; i++) { 1099 status[i] = SPDK_BDEV_IO_STATUS_PENDING; 1100 rc = spdk_bdev_read_blocks(g_desc, io_ch, NULL, 0, 1, enomem_done, &status[i]); 1101 CU_ASSERT(rc == 0); 1102 } 1103 1104 /* Assert that first_io is still at the head of the list. */ 1105 CU_ASSERT(TAILQ_FIRST(&shared_resource->nomem_io) == first_io); 1106 CU_ASSERT(bdev_io_tailq_cnt(&shared_resource->nomem_io) == (IO_ARRAY_SIZE - AVAIL)); 1107 nomem_cnt = bdev_io_tailq_cnt(&shared_resource->nomem_io); 1108 CU_ASSERT(shared_resource->nomem_threshold == (AVAIL - NOMEM_THRESHOLD_COUNT)); 1109 1110 /* 1111 * Complete 1 I/O only. The key check here is bdev_io_tailq_cnt - this should not have 1112 * changed since completing just 1 I/O should not trigger retrying the queued nomem_io 1113 * list. 1114 */ 1115 stub_complete_io(g_bdev.io_target, 1); 1116 CU_ASSERT(bdev_io_tailq_cnt(&shared_resource->nomem_io) == nomem_cnt); 1117 1118 /* 1119 * Complete enough I/O to hit the nomem_threshold. This should trigger retrying nomem_io, 1120 * and we should see I/O get resubmitted to the test bdev module. 1121 */ 1122 stub_complete_io(g_bdev.io_target, NOMEM_THRESHOLD_COUNT - 1); 1123 CU_ASSERT(bdev_io_tailq_cnt(&shared_resource->nomem_io) < nomem_cnt); 1124 nomem_cnt = bdev_io_tailq_cnt(&shared_resource->nomem_io); 1125 1126 /* Complete 1 I/O only. This should not trigger retrying the queued nomem_io. */ 1127 stub_complete_io(g_bdev.io_target, 1); 1128 CU_ASSERT(bdev_io_tailq_cnt(&shared_resource->nomem_io) == nomem_cnt); 1129 1130 /* 1131 * Send a reset and confirm that all I/O are completed, including the ones that 1132 * were queued on the nomem_io list. 1133 */ 1134 status_reset = SPDK_BDEV_IO_STATUS_PENDING; 1135 rc = spdk_bdev_reset(g_desc, io_ch, enomem_done, &status_reset); 1136 poll_threads(); 1137 CU_ASSERT(rc == 0); 1138 /* This will complete the reset. */ 1139 stub_complete_io(g_bdev.io_target, 0); 1140 1141 CU_ASSERT(bdev_io_tailq_cnt(&shared_resource->nomem_io) == 0); 1142 CU_ASSERT(shared_resource->io_outstanding == 0); 1143 1144 spdk_put_io_channel(io_ch); 1145 poll_threads(); 1146 teardown_test(); 1147 } 1148 1149 static void 1150 enomem_multi_bdev(void) 1151 { 1152 struct spdk_io_channel *io_ch; 1153 struct spdk_bdev_channel *bdev_ch; 1154 struct spdk_bdev_shared_resource *shared_resource; 1155 struct ut_bdev_channel *ut_ch; 1156 const uint32_t IO_ARRAY_SIZE = 64; 1157 const uint32_t AVAIL = 20; 1158 enum spdk_bdev_io_status status[IO_ARRAY_SIZE]; 1159 uint32_t i; 1160 struct ut_bdev *second_bdev; 1161 struct spdk_bdev_desc *second_desc = NULL; 1162 struct spdk_bdev_channel *second_bdev_ch; 1163 struct spdk_io_channel *second_ch; 1164 int rc; 1165 1166 setup_test(); 1167 1168 /* Register second bdev with the same io_target */ 1169 second_bdev = calloc(1, sizeof(*second_bdev)); 1170 SPDK_CU_ASSERT_FATAL(second_bdev != NULL); 1171 register_bdev(second_bdev, "ut_bdev2", g_bdev.io_target); 1172 spdk_bdev_open_ext("ut_bdev2", true, _bdev_event_cb, NULL, &second_desc); 1173 SPDK_CU_ASSERT_FATAL(second_desc != NULL); 1174 1175 set_thread(0); 1176 io_ch = spdk_bdev_get_io_channel(g_desc); 1177 bdev_ch = spdk_io_channel_get_ctx(io_ch); 1178 shared_resource = bdev_ch->shared_resource; 1179 ut_ch = spdk_io_channel_get_ctx(bdev_ch->channel); 1180 ut_ch->avail_cnt = AVAIL; 1181 1182 second_ch = spdk_bdev_get_io_channel(second_desc); 1183 second_bdev_ch = spdk_io_channel_get_ctx(second_ch); 1184 SPDK_CU_ASSERT_FATAL(shared_resource == second_bdev_ch->shared_resource); 1185 1186 /* Saturate io_target through bdev A. */ 1187 for (i = 0; i < AVAIL; i++) { 1188 status[i] = SPDK_BDEV_IO_STATUS_PENDING; 1189 rc = spdk_bdev_read_blocks(g_desc, io_ch, NULL, 0, 1, enomem_done, &status[i]); 1190 CU_ASSERT(rc == 0); 1191 } 1192 CU_ASSERT(TAILQ_EMPTY(&shared_resource->nomem_io)); 1193 1194 /* 1195 * Now submit I/O through the second bdev. This should fail with ENOMEM 1196 * and then go onto the nomem_io list. 1197 */ 1198 status[AVAIL] = SPDK_BDEV_IO_STATUS_PENDING; 1199 rc = spdk_bdev_read_blocks(second_desc, second_ch, NULL, 0, 1, enomem_done, &status[AVAIL]); 1200 CU_ASSERT(rc == 0); 1201 SPDK_CU_ASSERT_FATAL(!TAILQ_EMPTY(&shared_resource->nomem_io)); 1202 1203 /* Complete first bdev's I/O. This should retry sending second bdev's nomem_io */ 1204 stub_complete_io(g_bdev.io_target, AVAIL); 1205 1206 SPDK_CU_ASSERT_FATAL(TAILQ_EMPTY(&shared_resource->nomem_io)); 1207 CU_ASSERT(shared_resource->io_outstanding == 1); 1208 1209 /* Now complete our retried I/O */ 1210 stub_complete_io(g_bdev.io_target, 1); 1211 SPDK_CU_ASSERT_FATAL(shared_resource->io_outstanding == 0); 1212 1213 spdk_put_io_channel(io_ch); 1214 spdk_put_io_channel(second_ch); 1215 spdk_bdev_close(second_desc); 1216 unregister_bdev(second_bdev); 1217 poll_threads(); 1218 free(second_bdev); 1219 teardown_test(); 1220 } 1221 1222 1223 static void 1224 enomem_multi_io_target(void) 1225 { 1226 struct spdk_io_channel *io_ch; 1227 struct spdk_bdev_channel *bdev_ch; 1228 struct ut_bdev_channel *ut_ch; 1229 const uint32_t IO_ARRAY_SIZE = 64; 1230 const uint32_t AVAIL = 20; 1231 enum spdk_bdev_io_status status[IO_ARRAY_SIZE]; 1232 uint32_t i; 1233 int new_io_device; 1234 struct ut_bdev *second_bdev; 1235 struct spdk_bdev_desc *second_desc = NULL; 1236 struct spdk_bdev_channel *second_bdev_ch; 1237 struct spdk_io_channel *second_ch; 1238 int rc; 1239 1240 setup_test(); 1241 1242 /* Create new io_target and a second bdev using it */ 1243 spdk_io_device_register(&new_io_device, stub_create_ch, stub_destroy_ch, 1244 sizeof(struct ut_bdev_channel), NULL); 1245 second_bdev = calloc(1, sizeof(*second_bdev)); 1246 SPDK_CU_ASSERT_FATAL(second_bdev != NULL); 1247 register_bdev(second_bdev, "ut_bdev2", &new_io_device); 1248 spdk_bdev_open_ext("ut_bdev2", true, _bdev_event_cb, NULL, &second_desc); 1249 SPDK_CU_ASSERT_FATAL(second_desc != NULL); 1250 1251 set_thread(0); 1252 io_ch = spdk_bdev_get_io_channel(g_desc); 1253 bdev_ch = spdk_io_channel_get_ctx(io_ch); 1254 ut_ch = spdk_io_channel_get_ctx(bdev_ch->channel); 1255 ut_ch->avail_cnt = AVAIL; 1256 1257 /* Different io_target should imply a different shared_resource */ 1258 second_ch = spdk_bdev_get_io_channel(second_desc); 1259 second_bdev_ch = spdk_io_channel_get_ctx(second_ch); 1260 SPDK_CU_ASSERT_FATAL(bdev_ch->shared_resource != second_bdev_ch->shared_resource); 1261 1262 /* Saturate io_target through bdev A. */ 1263 for (i = 0; i < AVAIL; i++) { 1264 status[i] = SPDK_BDEV_IO_STATUS_PENDING; 1265 rc = spdk_bdev_read_blocks(g_desc, io_ch, NULL, 0, 1, enomem_done, &status[i]); 1266 CU_ASSERT(rc == 0); 1267 } 1268 CU_ASSERT(TAILQ_EMPTY(&bdev_ch->shared_resource->nomem_io)); 1269 1270 /* Issue one more I/O to fill ENOMEM list. */ 1271 status[AVAIL] = SPDK_BDEV_IO_STATUS_PENDING; 1272 rc = spdk_bdev_read_blocks(g_desc, io_ch, NULL, 0, 1, enomem_done, &status[AVAIL]); 1273 CU_ASSERT(rc == 0); 1274 SPDK_CU_ASSERT_FATAL(!TAILQ_EMPTY(&bdev_ch->shared_resource->nomem_io)); 1275 1276 /* 1277 * Now submit I/O through the second bdev. This should go through and complete 1278 * successfully because we're using a different io_device underneath. 1279 */ 1280 status[AVAIL] = SPDK_BDEV_IO_STATUS_PENDING; 1281 rc = spdk_bdev_read_blocks(second_desc, second_ch, NULL, 0, 1, enomem_done, &status[AVAIL]); 1282 CU_ASSERT(rc == 0); 1283 SPDK_CU_ASSERT_FATAL(TAILQ_EMPTY(&second_bdev_ch->shared_resource->nomem_io)); 1284 stub_complete_io(second_bdev->io_target, 1); 1285 1286 /* Cleanup; Complete outstanding I/O. */ 1287 stub_complete_io(g_bdev.io_target, AVAIL); 1288 SPDK_CU_ASSERT_FATAL(TAILQ_EMPTY(&bdev_ch->shared_resource->nomem_io)); 1289 /* Complete the ENOMEM I/O */ 1290 stub_complete_io(g_bdev.io_target, 1); 1291 CU_ASSERT(bdev_ch->shared_resource->io_outstanding == 0); 1292 1293 SPDK_CU_ASSERT_FATAL(TAILQ_EMPTY(&bdev_ch->shared_resource->nomem_io)); 1294 CU_ASSERT(bdev_ch->shared_resource->io_outstanding == 0); 1295 spdk_put_io_channel(io_ch); 1296 spdk_put_io_channel(second_ch); 1297 spdk_bdev_close(second_desc); 1298 unregister_bdev(second_bdev); 1299 spdk_io_device_unregister(&new_io_device, NULL); 1300 poll_threads(); 1301 free(second_bdev); 1302 teardown_test(); 1303 } 1304 1305 static void 1306 qos_dynamic_enable_done(void *cb_arg, int status) 1307 { 1308 int *rc = cb_arg; 1309 *rc = status; 1310 } 1311 1312 static void 1313 qos_dynamic_enable(void) 1314 { 1315 struct spdk_io_channel *io_ch[2]; 1316 struct spdk_bdev_channel *bdev_ch[2]; 1317 struct spdk_bdev *bdev; 1318 enum spdk_bdev_io_status bdev_io_status[2]; 1319 uint64_t limits[SPDK_BDEV_QOS_NUM_RATE_LIMIT_TYPES] = {}; 1320 int status, second_status, rc, i; 1321 1322 setup_test(); 1323 MOCK_SET(spdk_get_ticks, 0); 1324 1325 for (i = 0; i < SPDK_BDEV_QOS_NUM_RATE_LIMIT_TYPES; i++) { 1326 limits[i] = UINT64_MAX; 1327 } 1328 1329 bdev = &g_bdev.bdev; 1330 1331 g_get_io_channel = true; 1332 1333 /* Create channels */ 1334 set_thread(0); 1335 io_ch[0] = spdk_bdev_get_io_channel(g_desc); 1336 bdev_ch[0] = spdk_io_channel_get_ctx(io_ch[0]); 1337 CU_ASSERT(bdev_ch[0]->flags == 0); 1338 1339 set_thread(1); 1340 io_ch[1] = spdk_bdev_get_io_channel(g_desc); 1341 bdev_ch[1] = spdk_io_channel_get_ctx(io_ch[1]); 1342 CU_ASSERT(bdev_ch[1]->flags == 0); 1343 1344 set_thread(0); 1345 1346 /* 1347 * Enable QoS: Read/Write IOPS, Read/Write byte, 1348 * Read only byte and Write only byte per second 1349 * rate limits. 1350 * More than 10 I/Os allowed per timeslice. 1351 */ 1352 status = -1; 1353 limits[SPDK_BDEV_QOS_RW_IOPS_RATE_LIMIT] = 10000; 1354 limits[SPDK_BDEV_QOS_RW_BPS_RATE_LIMIT] = 100; 1355 limits[SPDK_BDEV_QOS_R_BPS_RATE_LIMIT] = 100; 1356 limits[SPDK_BDEV_QOS_W_BPS_RATE_LIMIT] = 10; 1357 spdk_bdev_set_qos_rate_limits(bdev, limits, qos_dynamic_enable_done, &status); 1358 poll_threads(); 1359 CU_ASSERT(status == 0); 1360 CU_ASSERT((bdev_ch[0]->flags & BDEV_CH_QOS_ENABLED) != 0); 1361 CU_ASSERT((bdev_ch[1]->flags & BDEV_CH_QOS_ENABLED) != 0); 1362 1363 /* 1364 * Submit and complete 10 I/O to fill the QoS allotment for this timeslice. 1365 * Additional I/O will then be queued. 1366 */ 1367 set_thread(0); 1368 for (i = 0; i < 10; i++) { 1369 bdev_io_status[0] = SPDK_BDEV_IO_STATUS_PENDING; 1370 rc = spdk_bdev_read_blocks(g_desc, io_ch[0], NULL, 0, 1, io_during_io_done, &bdev_io_status[0]); 1371 CU_ASSERT(rc == 0); 1372 CU_ASSERT(bdev_io_status[0] == SPDK_BDEV_IO_STATUS_PENDING); 1373 poll_thread(0); 1374 stub_complete_io(g_bdev.io_target, 0); 1375 CU_ASSERT(bdev_io_status[0] == SPDK_BDEV_IO_STATUS_SUCCESS); 1376 } 1377 1378 /* 1379 * Send two more I/O. These I/O will be queued since the current timeslice allotment has been 1380 * filled already. We want to test that when QoS is disabled that these two I/O: 1381 * 1) are not aborted 1382 * 2) are sent back to their original thread for resubmission 1383 */ 1384 bdev_io_status[0] = SPDK_BDEV_IO_STATUS_PENDING; 1385 rc = spdk_bdev_read_blocks(g_desc, io_ch[0], NULL, 0, 1, io_during_io_done, &bdev_io_status[0]); 1386 CU_ASSERT(rc == 0); 1387 CU_ASSERT(bdev_io_status[0] == SPDK_BDEV_IO_STATUS_PENDING); 1388 set_thread(1); 1389 bdev_io_status[1] = SPDK_BDEV_IO_STATUS_PENDING; 1390 rc = spdk_bdev_read_blocks(g_desc, io_ch[1], NULL, 0, 1, io_during_io_done, &bdev_io_status[1]); 1391 CU_ASSERT(rc == 0); 1392 CU_ASSERT(bdev_io_status[1] == SPDK_BDEV_IO_STATUS_PENDING); 1393 poll_threads(); 1394 1395 /* 1396 * Disable QoS: Read/Write IOPS, Read/Write byte, 1397 * Read only byte rate limits 1398 */ 1399 status = -1; 1400 limits[SPDK_BDEV_QOS_RW_IOPS_RATE_LIMIT] = 0; 1401 limits[SPDK_BDEV_QOS_RW_BPS_RATE_LIMIT] = 0; 1402 limits[SPDK_BDEV_QOS_R_BPS_RATE_LIMIT] = 0; 1403 spdk_bdev_set_qos_rate_limits(bdev, limits, qos_dynamic_enable_done, &status); 1404 poll_threads(); 1405 CU_ASSERT(status == 0); 1406 CU_ASSERT((bdev_ch[0]->flags & BDEV_CH_QOS_ENABLED) != 0); 1407 CU_ASSERT((bdev_ch[1]->flags & BDEV_CH_QOS_ENABLED) != 0); 1408 1409 /* Disable QoS: Write only Byte per second rate limit */ 1410 status = -1; 1411 limits[SPDK_BDEV_QOS_W_BPS_RATE_LIMIT] = 0; 1412 spdk_bdev_set_qos_rate_limits(bdev, limits, qos_dynamic_enable_done, &status); 1413 poll_threads(); 1414 CU_ASSERT(status == 0); 1415 CU_ASSERT((bdev_ch[0]->flags & BDEV_CH_QOS_ENABLED) == 0); 1416 CU_ASSERT((bdev_ch[1]->flags & BDEV_CH_QOS_ENABLED) == 0); 1417 1418 /* 1419 * All I/O should have been resubmitted back on their original thread. Complete 1420 * all I/O on thread 0, and ensure that only the thread 0 I/O was completed. 1421 */ 1422 set_thread(0); 1423 stub_complete_io(g_bdev.io_target, 0); 1424 poll_threads(); 1425 CU_ASSERT(bdev_io_status[0] == SPDK_BDEV_IO_STATUS_SUCCESS); 1426 CU_ASSERT(bdev_io_status[1] == SPDK_BDEV_IO_STATUS_PENDING); 1427 1428 /* Now complete all I/O on thread 1 and ensure the thread 1 I/O was completed. */ 1429 set_thread(1); 1430 stub_complete_io(g_bdev.io_target, 0); 1431 poll_threads(); 1432 CU_ASSERT(bdev_io_status[1] == SPDK_BDEV_IO_STATUS_SUCCESS); 1433 1434 /* Disable QoS again */ 1435 status = -1; 1436 limits[SPDK_BDEV_QOS_RW_IOPS_RATE_LIMIT] = 0; 1437 spdk_bdev_set_qos_rate_limits(bdev, limits, qos_dynamic_enable_done, &status); 1438 poll_threads(); 1439 CU_ASSERT(status == 0); /* This should succeed */ 1440 CU_ASSERT((bdev_ch[0]->flags & BDEV_CH_QOS_ENABLED) == 0); 1441 CU_ASSERT((bdev_ch[1]->flags & BDEV_CH_QOS_ENABLED) == 0); 1442 1443 /* Enable QoS on thread 0 */ 1444 status = -1; 1445 limits[SPDK_BDEV_QOS_RW_IOPS_RATE_LIMIT] = 10000; 1446 spdk_bdev_set_qos_rate_limits(bdev, limits, qos_dynamic_enable_done, &status); 1447 poll_threads(); 1448 CU_ASSERT(status == 0); 1449 CU_ASSERT((bdev_ch[0]->flags & BDEV_CH_QOS_ENABLED) != 0); 1450 CU_ASSERT((bdev_ch[1]->flags & BDEV_CH_QOS_ENABLED) != 0); 1451 1452 /* Disable QoS on thread 1 */ 1453 set_thread(1); 1454 status = -1; 1455 limits[SPDK_BDEV_QOS_RW_IOPS_RATE_LIMIT] = 0; 1456 spdk_bdev_set_qos_rate_limits(bdev, limits, qos_dynamic_enable_done, &status); 1457 /* Don't poll yet. This should leave the channels with QoS enabled */ 1458 CU_ASSERT(status == -1); 1459 CU_ASSERT((bdev_ch[0]->flags & BDEV_CH_QOS_ENABLED) != 0); 1460 CU_ASSERT((bdev_ch[1]->flags & BDEV_CH_QOS_ENABLED) != 0); 1461 1462 /* Enable QoS. This should immediately fail because the previous disable QoS hasn't completed. */ 1463 second_status = 0; 1464 limits[SPDK_BDEV_QOS_RW_BPS_RATE_LIMIT] = 10; 1465 spdk_bdev_set_qos_rate_limits(bdev, limits, qos_dynamic_enable_done, &second_status); 1466 poll_threads(); 1467 CU_ASSERT(status == 0); /* The disable should succeed */ 1468 CU_ASSERT(second_status < 0); /* The enable should fail */ 1469 CU_ASSERT((bdev_ch[0]->flags & BDEV_CH_QOS_ENABLED) == 0); 1470 CU_ASSERT((bdev_ch[1]->flags & BDEV_CH_QOS_ENABLED) == 0); 1471 1472 /* Enable QoS on thread 1. This should succeed now that the disable has completed. */ 1473 status = -1; 1474 limits[SPDK_BDEV_QOS_RW_IOPS_RATE_LIMIT] = 10000; 1475 spdk_bdev_set_qos_rate_limits(bdev, limits, qos_dynamic_enable_done, &status); 1476 poll_threads(); 1477 CU_ASSERT(status == 0); 1478 CU_ASSERT((bdev_ch[0]->flags & BDEV_CH_QOS_ENABLED) != 0); 1479 CU_ASSERT((bdev_ch[1]->flags & BDEV_CH_QOS_ENABLED) != 0); 1480 1481 /* Tear down the channels */ 1482 set_thread(0); 1483 spdk_put_io_channel(io_ch[0]); 1484 set_thread(1); 1485 spdk_put_io_channel(io_ch[1]); 1486 poll_threads(); 1487 1488 set_thread(0); 1489 teardown_test(); 1490 } 1491 1492 static void 1493 histogram_status_cb(void *cb_arg, int status) 1494 { 1495 g_status = status; 1496 } 1497 1498 static void 1499 histogram_data_cb(void *cb_arg, int status, struct spdk_histogram_data *histogram) 1500 { 1501 g_status = status; 1502 g_histogram = histogram; 1503 } 1504 1505 static void 1506 histogram_io_count(void *ctx, uint64_t start, uint64_t end, uint64_t count, 1507 uint64_t total, uint64_t so_far) 1508 { 1509 g_count += count; 1510 } 1511 1512 static void 1513 bdev_histograms_mt(void) 1514 { 1515 struct spdk_io_channel *ch[2]; 1516 struct spdk_histogram_data *histogram; 1517 uint8_t buf[4096]; 1518 int status = false; 1519 int rc; 1520 1521 1522 setup_test(); 1523 1524 set_thread(0); 1525 ch[0] = spdk_bdev_get_io_channel(g_desc); 1526 CU_ASSERT(ch[0] != NULL); 1527 1528 set_thread(1); 1529 ch[1] = spdk_bdev_get_io_channel(g_desc); 1530 CU_ASSERT(ch[1] != NULL); 1531 1532 1533 /* Enable histogram */ 1534 spdk_bdev_histogram_enable(&g_bdev.bdev, histogram_status_cb, NULL, true); 1535 poll_threads(); 1536 CU_ASSERT(g_status == 0); 1537 CU_ASSERT(g_bdev.bdev.internal.histogram_enabled == true); 1538 1539 /* Allocate histogram */ 1540 histogram = spdk_histogram_data_alloc(); 1541 1542 /* Check if histogram is zeroed */ 1543 spdk_bdev_histogram_get(&g_bdev.bdev, histogram, histogram_data_cb, NULL); 1544 poll_threads(); 1545 CU_ASSERT(g_status == 0); 1546 SPDK_CU_ASSERT_FATAL(g_histogram != NULL); 1547 1548 g_count = 0; 1549 spdk_histogram_data_iterate(g_histogram, histogram_io_count, NULL); 1550 1551 CU_ASSERT(g_count == 0); 1552 1553 set_thread(0); 1554 rc = spdk_bdev_write_blocks(g_desc, ch[0], &buf, 0, 1, io_during_io_done, &status); 1555 CU_ASSERT(rc == 0); 1556 1557 spdk_delay_us(10); 1558 stub_complete_io(g_bdev.io_target, 1); 1559 poll_threads(); 1560 CU_ASSERT(status == true); 1561 1562 1563 set_thread(1); 1564 rc = spdk_bdev_read_blocks(g_desc, ch[1], &buf, 0, 1, io_during_io_done, &status); 1565 CU_ASSERT(rc == 0); 1566 1567 spdk_delay_us(10); 1568 stub_complete_io(g_bdev.io_target, 1); 1569 poll_threads(); 1570 CU_ASSERT(status == true); 1571 1572 set_thread(0); 1573 1574 /* Check if histogram gathered data from all I/O channels */ 1575 spdk_bdev_histogram_get(&g_bdev.bdev, histogram, histogram_data_cb, NULL); 1576 poll_threads(); 1577 CU_ASSERT(g_status == 0); 1578 CU_ASSERT(g_bdev.bdev.internal.histogram_enabled == true); 1579 SPDK_CU_ASSERT_FATAL(g_histogram != NULL); 1580 1581 g_count = 0; 1582 spdk_histogram_data_iterate(g_histogram, histogram_io_count, NULL); 1583 CU_ASSERT(g_count == 2); 1584 1585 /* Disable histogram */ 1586 spdk_bdev_histogram_enable(&g_bdev.bdev, histogram_status_cb, NULL, false); 1587 poll_threads(); 1588 CU_ASSERT(g_status == 0); 1589 CU_ASSERT(g_bdev.bdev.internal.histogram_enabled == false); 1590 1591 spdk_histogram_data_free(histogram); 1592 1593 /* Tear down the channels */ 1594 set_thread(0); 1595 spdk_put_io_channel(ch[0]); 1596 set_thread(1); 1597 spdk_put_io_channel(ch[1]); 1598 poll_threads(); 1599 set_thread(0); 1600 teardown_test(); 1601 1602 } 1603 1604 struct timeout_io_cb_arg { 1605 struct iovec iov; 1606 uint8_t type; 1607 }; 1608 1609 static int 1610 bdev_channel_count_submitted_io(struct spdk_bdev_channel *ch) 1611 { 1612 struct spdk_bdev_io *bdev_io; 1613 int n = 0; 1614 1615 if (!ch) { 1616 return -1; 1617 } 1618 1619 TAILQ_FOREACH(bdev_io, &ch->io_submitted, internal.ch_link) { 1620 n++; 1621 } 1622 1623 return n; 1624 } 1625 1626 static void 1627 bdev_channel_io_timeout_cb(void *cb_arg, struct spdk_bdev_io *bdev_io) 1628 { 1629 struct timeout_io_cb_arg *ctx = cb_arg; 1630 1631 ctx->type = bdev_io->type; 1632 ctx->iov.iov_base = bdev_io->iov.iov_base; 1633 ctx->iov.iov_len = bdev_io->iov.iov_len; 1634 } 1635 1636 static bool g_io_done; 1637 1638 static void 1639 io_done(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg) 1640 { 1641 g_io_done = true; 1642 spdk_bdev_free_io(bdev_io); 1643 } 1644 1645 static void 1646 bdev_set_io_timeout_mt(void) 1647 { 1648 struct spdk_io_channel *ch[3]; 1649 struct spdk_bdev_channel *bdev_ch[3]; 1650 struct timeout_io_cb_arg cb_arg; 1651 1652 setup_test(); 1653 1654 g_bdev.bdev.optimal_io_boundary = 16; 1655 g_bdev.bdev.split_on_optimal_io_boundary = true; 1656 1657 set_thread(0); 1658 ch[0] = spdk_bdev_get_io_channel(g_desc); 1659 CU_ASSERT(ch[0] != NULL); 1660 1661 set_thread(1); 1662 ch[1] = spdk_bdev_get_io_channel(g_desc); 1663 CU_ASSERT(ch[1] != NULL); 1664 1665 set_thread(2); 1666 ch[2] = spdk_bdev_get_io_channel(g_desc); 1667 CU_ASSERT(ch[2] != NULL); 1668 1669 /* Multi-thread mode 1670 * 1, Check the poller was registered successfully 1671 * 2, Check the timeout IO and ensure the IO was the submitted by user 1672 * 3, Check the link int the bdev_ch works right. 1673 * 4, Close desc and put io channel during the timeout poller is polling 1674 */ 1675 1676 /* In desc thread set the timeout */ 1677 set_thread(0); 1678 CU_ASSERT(spdk_bdev_set_timeout(g_desc, 5, bdev_channel_io_timeout_cb, &cb_arg) == 0); 1679 CU_ASSERT(g_desc->io_timeout_poller != NULL); 1680 CU_ASSERT(g_desc->cb_fn == bdev_channel_io_timeout_cb); 1681 CU_ASSERT(g_desc->cb_arg == &cb_arg); 1682 1683 /* check the IO submitted list and timeout handler */ 1684 CU_ASSERT(spdk_bdev_read_blocks(g_desc, ch[0], (void *)0x2000, 0, 1, io_done, NULL) == 0); 1685 bdev_ch[0] = spdk_io_channel_get_ctx(ch[0]); 1686 CU_ASSERT(bdev_channel_count_submitted_io(bdev_ch[0]) == 1); 1687 1688 set_thread(1); 1689 CU_ASSERT(spdk_bdev_write_blocks(g_desc, ch[1], (void *)0x1000, 0, 1, io_done, NULL) == 0); 1690 bdev_ch[1] = spdk_io_channel_get_ctx(ch[1]); 1691 CU_ASSERT(bdev_channel_count_submitted_io(bdev_ch[1]) == 1); 1692 1693 /* Now test that a single-vector command is split correctly. 1694 * Offset 14, length 8, payload 0xF000 1695 * Child - Offset 14, length 2, payload 0xF000 1696 * Child - Offset 16, length 6, payload 0xF000 + 2 * 512 1697 * 1698 * Set up the expected values before calling spdk_bdev_read_blocks 1699 */ 1700 set_thread(2); 1701 CU_ASSERT(spdk_bdev_read_blocks(g_desc, ch[2], (void *)0xF000, 14, 8, io_done, NULL) == 0); 1702 bdev_ch[2] = spdk_io_channel_get_ctx(ch[2]); 1703 CU_ASSERT(bdev_channel_count_submitted_io(bdev_ch[2]) == 3); 1704 1705 set_thread(0); 1706 memset(&cb_arg, 0, sizeof(cb_arg)); 1707 spdk_delay_us(3 * spdk_get_ticks_hz()); 1708 poll_threads(); 1709 CU_ASSERT(cb_arg.type == 0); 1710 CU_ASSERT(cb_arg.iov.iov_base == (void *)0x0); 1711 CU_ASSERT(cb_arg.iov.iov_len == 0); 1712 1713 /* Now the time reach the limit */ 1714 spdk_delay_us(3 * spdk_get_ticks_hz()); 1715 poll_thread(0); 1716 CU_ASSERT(cb_arg.type == SPDK_BDEV_IO_TYPE_READ); 1717 CU_ASSERT(cb_arg.iov.iov_base == (void *)0x2000); 1718 CU_ASSERT(cb_arg.iov.iov_len == 1 * g_bdev.bdev.blocklen); 1719 stub_complete_io(g_bdev.io_target, 1); 1720 CU_ASSERT(bdev_channel_count_submitted_io(bdev_ch[0]) == 0); 1721 1722 memset(&cb_arg, 0, sizeof(cb_arg)); 1723 set_thread(1); 1724 poll_thread(1); 1725 CU_ASSERT(cb_arg.type == SPDK_BDEV_IO_TYPE_WRITE); 1726 CU_ASSERT(cb_arg.iov.iov_base == (void *)0x1000); 1727 CU_ASSERT(cb_arg.iov.iov_len == 1 * g_bdev.bdev.blocklen); 1728 stub_complete_io(g_bdev.io_target, 1); 1729 CU_ASSERT(bdev_channel_count_submitted_io(bdev_ch[1]) == 0); 1730 1731 memset(&cb_arg, 0, sizeof(cb_arg)); 1732 set_thread(2); 1733 poll_thread(2); 1734 CU_ASSERT(cb_arg.type == SPDK_BDEV_IO_TYPE_READ); 1735 CU_ASSERT(cb_arg.iov.iov_base == (void *)0xF000); 1736 CU_ASSERT(cb_arg.iov.iov_len == 8 * g_bdev.bdev.blocklen); 1737 stub_complete_io(g_bdev.io_target, 1); 1738 CU_ASSERT(bdev_channel_count_submitted_io(bdev_ch[2]) == 2); 1739 stub_complete_io(g_bdev.io_target, 1); 1740 CU_ASSERT(bdev_channel_count_submitted_io(bdev_ch[2]) == 0); 1741 1742 /* Run poll_timeout_done() it means complete the timeout poller */ 1743 set_thread(0); 1744 poll_thread(0); 1745 CU_ASSERT(g_desc->refs == 0); 1746 CU_ASSERT(spdk_bdev_read_blocks(g_desc, ch[0], (void *)0x1000, 0, 1, io_done, NULL) == 0); 1747 set_thread(1); 1748 CU_ASSERT(spdk_bdev_write_blocks(g_desc, ch[1], (void *)0x2000, 0, 2, io_done, NULL) == 0); 1749 set_thread(2); 1750 CU_ASSERT(spdk_bdev_read_blocks(g_desc, ch[2], (void *)0x3000, 0, 3, io_done, NULL) == 0); 1751 1752 /* Trigger timeout poller to run again, desc->refs is incremented. 1753 * In thread 0 we destroy the io channel before timeout poller runs. 1754 * Timeout callback is not called on thread 0. 1755 */ 1756 spdk_delay_us(6 * spdk_get_ticks_hz()); 1757 memset(&cb_arg, 0, sizeof(cb_arg)); 1758 set_thread(0); 1759 stub_complete_io(g_bdev.io_target, 1); 1760 spdk_put_io_channel(ch[0]); 1761 poll_thread(0); 1762 CU_ASSERT(g_desc->refs == 1) 1763 CU_ASSERT(cb_arg.type == 0); 1764 CU_ASSERT(cb_arg.iov.iov_base == (void *)0x0); 1765 CU_ASSERT(cb_arg.iov.iov_len == 0); 1766 1767 /* In thread 1 timeout poller runs then we destroy the io channel 1768 * Timeout callback is called on thread 1. 1769 */ 1770 memset(&cb_arg, 0, sizeof(cb_arg)); 1771 set_thread(1); 1772 poll_thread(1); 1773 stub_complete_io(g_bdev.io_target, 1); 1774 spdk_put_io_channel(ch[1]); 1775 poll_thread(1); 1776 CU_ASSERT(cb_arg.type == SPDK_BDEV_IO_TYPE_WRITE); 1777 CU_ASSERT(cb_arg.iov.iov_base == (void *)0x2000); 1778 CU_ASSERT(cb_arg.iov.iov_len == 2 * g_bdev.bdev.blocklen); 1779 1780 /* Close the desc. 1781 * Unregister the timeout poller first. 1782 * Then decrement desc->refs but it's not zero yet so desc is not freed. 1783 */ 1784 set_thread(0); 1785 spdk_bdev_close(g_desc); 1786 CU_ASSERT(g_desc->refs == 1); 1787 CU_ASSERT(g_desc->io_timeout_poller == NULL); 1788 1789 /* Timeout poller runs on thread 2 then we destroy the io channel. 1790 * Desc is closed so we would exit the timeout poller directly. 1791 * timeout callback is not called on thread 2. 1792 */ 1793 memset(&cb_arg, 0, sizeof(cb_arg)); 1794 set_thread(2); 1795 poll_thread(2); 1796 stub_complete_io(g_bdev.io_target, 1); 1797 spdk_put_io_channel(ch[2]); 1798 poll_thread(2); 1799 CU_ASSERT(cb_arg.type == 0); 1800 CU_ASSERT(cb_arg.iov.iov_base == (void *)0x0); 1801 CU_ASSERT(cb_arg.iov.iov_len == 0); 1802 1803 set_thread(0); 1804 poll_thread(0); 1805 g_teardown_done = false; 1806 unregister_bdev(&g_bdev); 1807 spdk_io_device_unregister(&g_io_device, NULL); 1808 spdk_bdev_finish(finish_cb, NULL); 1809 poll_threads(); 1810 memset(&g_bdev, 0, sizeof(g_bdev)); 1811 CU_ASSERT(g_teardown_done == true); 1812 g_teardown_done = false; 1813 free_threads(); 1814 free_cores(); 1815 } 1816 1817 static bool g_io_done2; 1818 static bool g_lock_lba_range_done; 1819 static bool g_unlock_lba_range_done; 1820 1821 static void 1822 io_done2(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg) 1823 { 1824 g_io_done2 = true; 1825 spdk_bdev_free_io(bdev_io); 1826 } 1827 1828 static void 1829 lock_lba_range_done(void *ctx, int status) 1830 { 1831 g_lock_lba_range_done = true; 1832 } 1833 1834 static void 1835 unlock_lba_range_done(void *ctx, int status) 1836 { 1837 g_unlock_lba_range_done = true; 1838 } 1839 1840 static uint32_t 1841 stub_channel_outstanding_cnt(void *io_target) 1842 { 1843 struct spdk_io_channel *_ch = spdk_get_io_channel(io_target); 1844 struct ut_bdev_channel *ch = spdk_io_channel_get_ctx(_ch); 1845 uint32_t outstanding_cnt; 1846 1847 outstanding_cnt = ch->outstanding_cnt; 1848 1849 spdk_put_io_channel(_ch); 1850 return outstanding_cnt; 1851 } 1852 1853 static void 1854 lock_lba_range_then_submit_io(void) 1855 { 1856 struct spdk_bdev_desc *desc = NULL; 1857 void *io_target; 1858 struct spdk_io_channel *io_ch[3]; 1859 struct spdk_bdev_channel *bdev_ch[3]; 1860 struct lba_range *range; 1861 char buf[4096]; 1862 int ctx0, ctx1, ctx2; 1863 int rc; 1864 1865 setup_test(); 1866 1867 io_target = g_bdev.io_target; 1868 desc = g_desc; 1869 1870 set_thread(0); 1871 io_ch[0] = spdk_bdev_get_io_channel(desc); 1872 bdev_ch[0] = spdk_io_channel_get_ctx(io_ch[0]); 1873 CU_ASSERT(io_ch[0] != NULL); 1874 1875 set_thread(1); 1876 io_ch[1] = spdk_bdev_get_io_channel(desc); 1877 bdev_ch[1] = spdk_io_channel_get_ctx(io_ch[1]); 1878 CU_ASSERT(io_ch[1] != NULL); 1879 1880 set_thread(0); 1881 g_lock_lba_range_done = false; 1882 rc = bdev_lock_lba_range(desc, io_ch[0], 20, 10, lock_lba_range_done, &ctx0); 1883 CU_ASSERT(rc == 0); 1884 poll_threads(); 1885 1886 /* The lock should immediately become valid, since there are no outstanding 1887 * write I/O. 1888 */ 1889 CU_ASSERT(g_lock_lba_range_done == true); 1890 range = TAILQ_FIRST(&bdev_ch[0]->locked_ranges); 1891 SPDK_CU_ASSERT_FATAL(range != NULL); 1892 CU_ASSERT(range->offset == 20); 1893 CU_ASSERT(range->length == 10); 1894 CU_ASSERT(range->owner_ch == bdev_ch[0]); 1895 1896 g_io_done = false; 1897 CU_ASSERT(TAILQ_EMPTY(&bdev_ch[0]->io_locked)); 1898 rc = spdk_bdev_read_blocks(desc, io_ch[0], buf, 20, 1, io_done, &ctx0); 1899 CU_ASSERT(rc == 0); 1900 CU_ASSERT(stub_channel_outstanding_cnt(io_target) == 1); 1901 1902 stub_complete_io(io_target, 1); 1903 poll_threads(); 1904 CU_ASSERT(g_io_done == true); 1905 CU_ASSERT(TAILQ_EMPTY(&bdev_ch[0]->io_locked)); 1906 1907 /* Try a write I/O. This should actually be allowed to execute, since the channel 1908 * holding the lock is submitting the write I/O. 1909 */ 1910 g_io_done = false; 1911 CU_ASSERT(TAILQ_EMPTY(&bdev_ch[0]->io_locked)); 1912 rc = spdk_bdev_write_blocks(desc, io_ch[0], buf, 20, 1, io_done, &ctx0); 1913 CU_ASSERT(rc == 0); 1914 CU_ASSERT(stub_channel_outstanding_cnt(io_target) == 1); 1915 1916 stub_complete_io(io_target, 1); 1917 poll_threads(); 1918 CU_ASSERT(g_io_done == true); 1919 CU_ASSERT(TAILQ_EMPTY(&bdev_ch[0]->io_locked)); 1920 1921 /* Try a write I/O. This should get queued in the io_locked tailq. */ 1922 set_thread(1); 1923 g_io_done = false; 1924 CU_ASSERT(TAILQ_EMPTY(&bdev_ch[1]->io_locked)); 1925 rc = spdk_bdev_write_blocks(desc, io_ch[1], buf, 20, 1, io_done, &ctx1); 1926 CU_ASSERT(rc == 0); 1927 poll_threads(); 1928 CU_ASSERT(stub_channel_outstanding_cnt(io_target) == 0); 1929 CU_ASSERT(!TAILQ_EMPTY(&bdev_ch[1]->io_locked)); 1930 CU_ASSERT(g_io_done == false); 1931 1932 /* Try to unlock the lba range using thread 1's io_ch. This should fail. */ 1933 rc = bdev_unlock_lba_range(desc, io_ch[1], 20, 10, unlock_lba_range_done, &ctx1); 1934 CU_ASSERT(rc == -EINVAL); 1935 1936 /* Now create a new channel and submit a write I/O with it. This should also be queued. 1937 * The new channel should inherit the active locks from the bdev's internal list. 1938 */ 1939 set_thread(2); 1940 io_ch[2] = spdk_bdev_get_io_channel(desc); 1941 bdev_ch[2] = spdk_io_channel_get_ctx(io_ch[2]); 1942 CU_ASSERT(io_ch[2] != NULL); 1943 1944 g_io_done2 = false; 1945 CU_ASSERT(TAILQ_EMPTY(&bdev_ch[2]->io_locked)); 1946 rc = spdk_bdev_write_blocks(desc, io_ch[2], buf, 22, 2, io_done2, &ctx2); 1947 CU_ASSERT(rc == 0); 1948 poll_threads(); 1949 CU_ASSERT(stub_channel_outstanding_cnt(io_target) == 0); 1950 CU_ASSERT(!TAILQ_EMPTY(&bdev_ch[2]->io_locked)); 1951 CU_ASSERT(g_io_done2 == false); 1952 1953 set_thread(0); 1954 rc = bdev_unlock_lba_range(desc, io_ch[0], 20, 10, unlock_lba_range_done, &ctx0); 1955 CU_ASSERT(rc == 0); 1956 poll_threads(); 1957 CU_ASSERT(TAILQ_EMPTY(&bdev_ch[0]->locked_ranges)); 1958 1959 /* The LBA range is unlocked, so the write IOs should now have started execution. */ 1960 CU_ASSERT(TAILQ_EMPTY(&bdev_ch[1]->io_locked)); 1961 CU_ASSERT(TAILQ_EMPTY(&bdev_ch[2]->io_locked)); 1962 1963 set_thread(1); 1964 CU_ASSERT(stub_channel_outstanding_cnt(io_target) == 1); 1965 stub_complete_io(io_target, 1); 1966 set_thread(2); 1967 CU_ASSERT(stub_channel_outstanding_cnt(io_target) == 1); 1968 stub_complete_io(io_target, 1); 1969 1970 poll_threads(); 1971 CU_ASSERT(g_io_done == true); 1972 CU_ASSERT(g_io_done2 == true); 1973 1974 /* Tear down the channels */ 1975 set_thread(0); 1976 spdk_put_io_channel(io_ch[0]); 1977 set_thread(1); 1978 spdk_put_io_channel(io_ch[1]); 1979 set_thread(2); 1980 spdk_put_io_channel(io_ch[2]); 1981 poll_threads(); 1982 set_thread(0); 1983 teardown_test(); 1984 } 1985 1986 int 1987 main(int argc, char **argv) 1988 { 1989 CU_pSuite suite = NULL; 1990 unsigned int num_failures; 1991 1992 CU_set_error_action(CUEA_ABORT); 1993 CU_initialize_registry(); 1994 1995 suite = CU_add_suite("bdev", NULL, NULL); 1996 1997 CU_ADD_TEST(suite, basic); 1998 CU_ADD_TEST(suite, unregister_and_close); 1999 CU_ADD_TEST(suite, basic_qos); 2000 CU_ADD_TEST(suite, put_channel_during_reset); 2001 CU_ADD_TEST(suite, aborted_reset); 2002 CU_ADD_TEST(suite, io_during_reset); 2003 CU_ADD_TEST(suite, io_during_qos_queue); 2004 CU_ADD_TEST(suite, io_during_qos_reset); 2005 CU_ADD_TEST(suite, enomem); 2006 CU_ADD_TEST(suite, enomem_multi_bdev); 2007 CU_ADD_TEST(suite, enomem_multi_io_target); 2008 CU_ADD_TEST(suite, qos_dynamic_enable); 2009 CU_ADD_TEST(suite, bdev_histograms_mt); 2010 CU_ADD_TEST(suite, bdev_set_io_timeout_mt); 2011 CU_ADD_TEST(suite, lock_lba_range_then_submit_io); 2012 2013 CU_basic_set_mode(CU_BRM_VERBOSE); 2014 CU_basic_run_tests(); 2015 num_failures = CU_get_number_of_failures(); 2016 CU_cleanup_registry(); 2017 return num_failures; 2018 } 2019