1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright (C) 2017 Intel Corporation. 3 * Copyright (c) 2022-2023 NVIDIA CORPORATION & AFFILIATES. 4 * All rights reserved. 5 */ 6 7 #include "spdk_internal/cunit.h" 8 9 #include "common/lib/ut_multithread.c" 10 #include "unit/lib/json_mock.c" 11 12 #include "spdk/config.h" 13 /* HACK: disable VTune integration so the unit test doesn't need VTune headers and libs to build */ 14 #undef SPDK_CONFIG_VTUNE 15 16 #include "bdev/bdev.c" 17 18 #include "common/lib/bdev/common_stubs.h" 19 20 #define BDEV_UT_NUM_THREADS 3 21 22 DEFINE_RETURN_MOCK(spdk_memory_domain_pull_data, int); 23 int 24 spdk_memory_domain_pull_data(struct spdk_memory_domain *src_domain, void *src_domain_ctx, 25 struct iovec *src_iov, uint32_t src_iov_cnt, struct iovec *dst_iov, uint32_t dst_iov_cnt, 26 spdk_memory_domain_data_cpl_cb cpl_cb, void *cpl_cb_arg) 27 { 28 HANDLE_RETURN_MOCK(spdk_memory_domain_pull_data); 29 30 cpl_cb(cpl_cb_arg, 0); 31 return 0; 32 } 33 34 DEFINE_RETURN_MOCK(spdk_memory_domain_push_data, int); 35 int 36 spdk_memory_domain_push_data(struct spdk_memory_domain *dst_domain, void *dst_domain_ctx, 37 struct iovec *dst_iov, uint32_t dst_iovcnt, struct iovec *src_iov, uint32_t src_iovcnt, 38 spdk_memory_domain_data_cpl_cb cpl_cb, void *cpl_cb_arg) 39 { 40 HANDLE_RETURN_MOCK(spdk_memory_domain_push_data); 41 42 cpl_cb(cpl_cb_arg, 0); 43 return 0; 44 } 45 46 static int g_accel_io_device; 47 48 struct spdk_io_channel * 49 spdk_accel_get_io_channel(void) 50 { 51 return spdk_get_io_channel(&g_accel_io_device); 52 } 53 54 struct ut_bdev { 55 struct spdk_bdev bdev; 56 void *io_target; 57 }; 58 59 struct ut_bdev_io { 60 TAILQ_ENTRY(ut_bdev_io) link; 61 }; 62 63 struct ut_bdev_channel { 64 TAILQ_HEAD(, ut_bdev_io) outstanding_io; 65 uint32_t outstanding_cnt; 66 uint32_t avail_cnt; 67 struct spdk_thread *thread; 68 TAILQ_ENTRY(ut_bdev_channel) link; 69 }; 70 71 int g_io_device; 72 struct ut_bdev g_bdev; 73 struct spdk_bdev_desc *g_desc; 74 bool g_teardown_done = false; 75 bool g_get_io_channel = true; 76 bool g_create_ch = true; 77 bool g_init_complete_called = false; 78 bool g_fini_start_called = true; 79 int g_status = 0; 80 int g_count = 0; 81 struct spdk_histogram_data *g_histogram = NULL; 82 TAILQ_HEAD(, ut_bdev_channel) g_ut_channels; 83 84 static int 85 ut_accel_ch_create_cb(void *io_device, void *ctx) 86 { 87 return 0; 88 } 89 90 static void 91 ut_accel_ch_destroy_cb(void *io_device, void *ctx) 92 { 93 } 94 95 static int 96 stub_create_ch(void *io_device, void *ctx_buf) 97 { 98 struct ut_bdev_channel *ch = ctx_buf; 99 100 if (g_create_ch == false) { 101 return -1; 102 } 103 104 TAILQ_INIT(&ch->outstanding_io); 105 ch->outstanding_cnt = 0; 106 /* 107 * When avail gets to 0, the submit_request function will return ENOMEM. 108 * Most tests to not want ENOMEM to occur, so by default set this to a 109 * big value that won't get hit. The ENOMEM tests can then override this 110 * value to something much smaller to induce ENOMEM conditions. 111 */ 112 ch->avail_cnt = 2048; 113 ch->thread = spdk_get_thread(); 114 115 TAILQ_INSERT_TAIL(&g_ut_channels, ch, link); 116 117 return 0; 118 } 119 120 static void 121 stub_destroy_ch(void *io_device, void *ctx_buf) 122 { 123 struct ut_bdev_channel *ch = ctx_buf; 124 125 TAILQ_REMOVE(&g_ut_channels, ch, link); 126 } 127 128 static struct spdk_io_channel * 129 stub_get_io_channel(void *ctx) 130 { 131 struct ut_bdev *ut_bdev = ctx; 132 133 if (g_get_io_channel == true) { 134 return spdk_get_io_channel(ut_bdev->io_target); 135 } else { 136 return NULL; 137 } 138 } 139 140 static int 141 stub_destruct(void *ctx) 142 { 143 return 0; 144 } 145 146 static void 147 stub_reset_channel(void *ctx) 148 { 149 struct ut_bdev_channel *ch = ctx; 150 struct ut_bdev_io *bio; 151 152 while (!TAILQ_EMPTY(&ch->outstanding_io)) { 153 bio = TAILQ_FIRST(&ch->outstanding_io); 154 TAILQ_REMOVE(&ch->outstanding_io, bio, link); 155 ch->outstanding_cnt--; 156 spdk_bdev_io_complete(spdk_bdev_io_from_ctx(bio), SPDK_BDEV_IO_STATUS_ABORTED); 157 ch->avail_cnt++; 158 } 159 } 160 161 static void 162 stub_submit_request(struct spdk_io_channel *_ch, struct spdk_bdev_io *bdev_io) 163 { 164 struct ut_bdev_channel *ch = spdk_io_channel_get_ctx(_ch), *tmp_ch; 165 struct spdk_bdev_io *io; 166 struct ut_bdev_io *bio; 167 168 if (bdev_io->type == SPDK_BDEV_IO_TYPE_RESET) { 169 TAILQ_FOREACH(tmp_ch, &g_ut_channels, link) { 170 if (spdk_get_thread() == tmp_ch->thread) { 171 stub_reset_channel(tmp_ch); 172 } else { 173 spdk_thread_send_msg(tmp_ch->thread, stub_reset_channel, tmp_ch); 174 } 175 } 176 } else if (bdev_io->type == SPDK_BDEV_IO_TYPE_ABORT) { 177 TAILQ_FOREACH(bio, &ch->outstanding_io, link) { 178 io = spdk_bdev_io_from_ctx(bio); 179 if (io == bdev_io->u.abort.bio_to_abort) { 180 TAILQ_REMOVE(&ch->outstanding_io, bio, link); 181 ch->outstanding_cnt--; 182 spdk_bdev_io_complete(io, SPDK_BDEV_IO_STATUS_ABORTED); 183 ch->avail_cnt++; 184 185 spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_SUCCESS); 186 return; 187 } 188 } 189 190 spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED); 191 return; 192 } 193 194 if (ch->avail_cnt > 0) { 195 TAILQ_INSERT_TAIL(&ch->outstanding_io, (struct ut_bdev_io *)bdev_io->driver_ctx, link); 196 ch->outstanding_cnt++; 197 ch->avail_cnt--; 198 } else { 199 spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_NOMEM); 200 } 201 } 202 203 static uint32_t 204 stub_complete_io(void *io_target, uint32_t num_to_complete) 205 { 206 struct spdk_io_channel *_ch = spdk_get_io_channel(io_target); 207 struct ut_bdev_channel *ch = spdk_io_channel_get_ctx(_ch); 208 struct ut_bdev_io *bio; 209 struct spdk_bdev_io *io; 210 bool complete_all = (num_to_complete == 0); 211 uint32_t num_completed = 0; 212 213 while (complete_all || num_completed < num_to_complete) { 214 if (TAILQ_EMPTY(&ch->outstanding_io)) { 215 break; 216 } 217 bio = TAILQ_FIRST(&ch->outstanding_io); 218 TAILQ_REMOVE(&ch->outstanding_io, bio, link); 219 io = spdk_bdev_io_from_ctx(bio); 220 ch->outstanding_cnt--; 221 spdk_bdev_io_complete(io, SPDK_BDEV_IO_STATUS_SUCCESS); 222 ch->avail_cnt++; 223 num_completed++; 224 } 225 spdk_put_io_channel(_ch); 226 return num_completed; 227 } 228 229 static bool 230 stub_io_type_supported(void *ctx, enum spdk_bdev_io_type type) 231 { 232 return true; 233 } 234 235 static struct spdk_bdev_fn_table fn_table = { 236 .get_io_channel = stub_get_io_channel, 237 .destruct = stub_destruct, 238 .submit_request = stub_submit_request, 239 .io_type_supported = stub_io_type_supported, 240 }; 241 242 struct spdk_bdev_module bdev_ut_if; 243 244 static int 245 module_init(void) 246 { 247 spdk_bdev_module_init_done(&bdev_ut_if); 248 return 0; 249 } 250 251 static void 252 module_fini(void) 253 { 254 } 255 256 static void 257 init_complete(void) 258 { 259 g_init_complete_called = true; 260 } 261 262 static void 263 fini_start(void) 264 { 265 g_fini_start_called = true; 266 } 267 268 static int 269 get_ctx_size(void) 270 { 271 return sizeof(struct ut_bdev_io); 272 } 273 274 struct spdk_bdev_module bdev_ut_if = { 275 .name = "bdev_ut", 276 .module_init = module_init, 277 .module_fini = module_fini, 278 .async_init = true, 279 .init_complete = init_complete, 280 .fini_start = fini_start, 281 .get_ctx_size = get_ctx_size, 282 }; 283 284 SPDK_BDEV_MODULE_REGISTER(bdev_ut, &bdev_ut_if) 285 286 static void 287 register_bdev(struct ut_bdev *ut_bdev, char *name, void *io_target) 288 { 289 memset(ut_bdev, 0, sizeof(*ut_bdev)); 290 291 ut_bdev->io_target = io_target; 292 ut_bdev->bdev.ctxt = ut_bdev; 293 ut_bdev->bdev.name = name; 294 ut_bdev->bdev.fn_table = &fn_table; 295 ut_bdev->bdev.module = &bdev_ut_if; 296 ut_bdev->bdev.blocklen = 4096; 297 ut_bdev->bdev.blockcnt = 1024; 298 299 spdk_bdev_register(&ut_bdev->bdev); 300 } 301 302 static void 303 unregister_bdev(struct ut_bdev *ut_bdev) 304 { 305 /* Handle any deferred messages. */ 306 poll_threads(); 307 spdk_bdev_unregister(&ut_bdev->bdev, NULL, NULL); 308 /* Handle the async bdev unregister. */ 309 poll_threads(); 310 } 311 312 static void 313 bdev_init_cb(void *done, int rc) 314 { 315 CU_ASSERT(rc == 0); 316 *(bool *)done = true; 317 } 318 319 static void 320 _bdev_event_cb(enum spdk_bdev_event_type type, struct spdk_bdev *bdev, 321 void *event_ctx) 322 { 323 switch (type) { 324 case SPDK_BDEV_EVENT_REMOVE: 325 if (event_ctx != NULL) { 326 *(bool *)event_ctx = true; 327 } 328 break; 329 case SPDK_BDEV_EVENT_RESIZE: 330 if (event_ctx != NULL) { 331 *(int *)event_ctx += 1; 332 } 333 break; 334 default: 335 CU_ASSERT(false); 336 break; 337 } 338 } 339 340 static void 341 setup_test(void) 342 { 343 bool done = false; 344 int rc; 345 346 TAILQ_INIT(&g_ut_channels); 347 348 allocate_cores(BDEV_UT_NUM_THREADS); 349 allocate_threads(BDEV_UT_NUM_THREADS); 350 set_thread(0); 351 352 rc = spdk_iobuf_initialize(); 353 CU_ASSERT(rc == 0); 354 spdk_bdev_initialize(bdev_init_cb, &done); 355 spdk_io_device_register(&g_io_device, stub_create_ch, stub_destroy_ch, 356 sizeof(struct ut_bdev_channel), NULL); 357 spdk_io_device_register(&g_accel_io_device, ut_accel_ch_create_cb, 358 ut_accel_ch_destroy_cb, 0, NULL); 359 register_bdev(&g_bdev, "ut_bdev", &g_io_device); 360 spdk_bdev_open_ext("ut_bdev", true, _bdev_event_cb, NULL, &g_desc); 361 } 362 363 static void 364 finish_cb(void *cb_arg) 365 { 366 g_teardown_done = true; 367 } 368 369 static void 370 teardown_test(void) 371 { 372 set_thread(0); 373 g_teardown_done = false; 374 spdk_bdev_close(g_desc); 375 g_desc = NULL; 376 unregister_bdev(&g_bdev); 377 spdk_io_device_unregister(&g_io_device, NULL); 378 spdk_bdev_finish(finish_cb, NULL); 379 spdk_io_device_unregister(&g_accel_io_device, NULL); 380 spdk_iobuf_finish(finish_cb, NULL); 381 poll_threads(); 382 memset(&g_bdev, 0, sizeof(g_bdev)); 383 CU_ASSERT(g_teardown_done == true); 384 g_teardown_done = false; 385 free_threads(); 386 free_cores(); 387 CU_ASSERT(TAILQ_EMPTY(&g_ut_channels)) 388 } 389 390 static uint32_t 391 bdev_io_tailq_cnt(bdev_io_tailq_t *tailq) 392 { 393 struct spdk_bdev_io *io; 394 uint32_t cnt = 0; 395 396 TAILQ_FOREACH(io, tailq, internal.link) { 397 cnt++; 398 } 399 400 return cnt; 401 } 402 403 static void 404 basic(void) 405 { 406 g_init_complete_called = false; 407 setup_test(); 408 CU_ASSERT(g_init_complete_called == true); 409 410 set_thread(0); 411 412 g_get_io_channel = false; 413 g_ut_threads[0].ch = spdk_bdev_get_io_channel(g_desc); 414 CU_ASSERT(g_ut_threads[0].ch == NULL); 415 416 g_get_io_channel = true; 417 g_create_ch = false; 418 g_ut_threads[0].ch = spdk_bdev_get_io_channel(g_desc); 419 CU_ASSERT(g_ut_threads[0].ch == NULL); 420 421 g_get_io_channel = true; 422 g_create_ch = true; 423 g_ut_threads[0].ch = spdk_bdev_get_io_channel(g_desc); 424 CU_ASSERT(g_ut_threads[0].ch != NULL); 425 spdk_put_io_channel(g_ut_threads[0].ch); 426 427 g_fini_start_called = false; 428 teardown_test(); 429 CU_ASSERT(g_fini_start_called == true); 430 } 431 432 static void 433 _bdev_unregistered(void *done, int rc) 434 { 435 CU_ASSERT(rc == 0); 436 *(bool *)done = true; 437 } 438 439 static void 440 unregister_and_close(void) 441 { 442 bool done, remove_notify; 443 struct spdk_bdev_desc *desc = NULL; 444 445 setup_test(); 446 set_thread(0); 447 448 /* setup_test() automatically opens the bdev, 449 * but this test needs to do that in a different 450 * way. */ 451 spdk_bdev_close(g_desc); 452 poll_threads(); 453 454 /* Try hotremoving a bdev with descriptors which don't provide 455 * any context to the notification callback */ 456 spdk_bdev_open_ext("ut_bdev", true, _bdev_event_cb, NULL, &desc); 457 SPDK_CU_ASSERT_FATAL(desc != NULL); 458 459 /* There is an open descriptor on the device. Unregister it, 460 * which can't proceed until the descriptor is closed. */ 461 done = false; 462 spdk_bdev_unregister(&g_bdev.bdev, _bdev_unregistered, &done); 463 464 /* Poll the threads to allow all events to be processed */ 465 poll_threads(); 466 467 /* Make sure the bdev was not unregistered. We still have a 468 * descriptor open */ 469 CU_ASSERT(done == false); 470 471 spdk_bdev_close(desc); 472 poll_threads(); 473 desc = NULL; 474 475 /* The unregister should have completed */ 476 CU_ASSERT(done == true); 477 478 479 /* Register the bdev again */ 480 register_bdev(&g_bdev, "ut_bdev", &g_io_device); 481 482 remove_notify = false; 483 spdk_bdev_open_ext("ut_bdev", true, _bdev_event_cb, &remove_notify, &desc); 484 SPDK_CU_ASSERT_FATAL(desc != NULL); 485 CU_ASSERT(remove_notify == false); 486 487 /* There is an open descriptor on the device. Unregister it, 488 * which can't proceed until the descriptor is closed. */ 489 done = false; 490 spdk_bdev_unregister(&g_bdev.bdev, _bdev_unregistered, &done); 491 /* No polling has occurred, so neither of these should execute */ 492 CU_ASSERT(remove_notify == false); 493 CU_ASSERT(done == false); 494 495 /* Prior to the unregister completing, close the descriptor */ 496 spdk_bdev_close(desc); 497 498 /* Poll the threads to allow all events to be processed */ 499 poll_threads(); 500 501 /* Remove notify should not have been called because the 502 * descriptor is already closed. */ 503 CU_ASSERT(remove_notify == false); 504 505 /* The unregister should have completed */ 506 CU_ASSERT(done == true); 507 508 /* Restore the original g_bdev so that we can use teardown_test(). */ 509 register_bdev(&g_bdev, "ut_bdev", &g_io_device); 510 spdk_bdev_open_ext("ut_bdev", true, _bdev_event_cb, NULL, &g_desc); 511 teardown_test(); 512 } 513 514 static void 515 unregister_and_close_different_threads(void) 516 { 517 bool done; 518 struct spdk_bdev_desc *desc = NULL; 519 520 setup_test(); 521 set_thread(0); 522 523 /* setup_test() automatically opens the bdev, 524 * but this test needs to do that in a different 525 * way. */ 526 spdk_bdev_close(g_desc); 527 poll_threads(); 528 529 set_thread(1); 530 spdk_bdev_open_ext("ut_bdev", true, _bdev_event_cb, NULL, &desc); 531 SPDK_CU_ASSERT_FATAL(desc != NULL); 532 done = false; 533 534 set_thread(0); 535 spdk_bdev_unregister(&g_bdev.bdev, _bdev_unregistered, &done); 536 537 /* Poll the threads to allow all events to be processed */ 538 poll_threads(); 539 540 /* Make sure the bdev was not unregistered. We still have a 541 * descriptor open */ 542 CU_ASSERT(done == false); 543 544 /* Close the descriptor on thread 1. Poll the thread and confirm the 545 * unregister did not complete, since it was unregistered on thread 0. 546 */ 547 set_thread(1); 548 spdk_bdev_close(desc); 549 poll_thread(1); 550 CU_ASSERT(done == false); 551 552 /* Now poll thread 0 and confirm the unregister completed. */ 553 set_thread(0); 554 poll_thread(0); 555 CU_ASSERT(done == true); 556 557 /* Restore the original g_bdev so that we can use teardown_test(). */ 558 register_bdev(&g_bdev, "ut_bdev", &g_io_device); 559 spdk_bdev_open_ext("ut_bdev", true, _bdev_event_cb, NULL, &g_desc); 560 teardown_test(); 561 } 562 563 static void 564 reset_done(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg) 565 { 566 bool *done = cb_arg; 567 568 CU_ASSERT(success == true); 569 *done = true; 570 spdk_bdev_free_io(bdev_io); 571 } 572 573 static void 574 put_channel_during_reset(void) 575 { 576 struct spdk_io_channel *io_ch; 577 bool done = false; 578 uint32_t num_completed; 579 580 setup_test(); 581 582 set_thread(0); 583 io_ch = spdk_bdev_get_io_channel(g_desc); 584 CU_ASSERT(io_ch != NULL); 585 586 /* 587 * Start a reset, but then put the I/O channel before 588 * the deferred messages for the reset get a chance to 589 * execute. 590 */ 591 spdk_bdev_reset(g_desc, io_ch, reset_done, &done); 592 spdk_put_io_channel(io_ch); 593 poll_threads(); 594 595 /* Complete the reset. */ 596 num_completed = stub_complete_io(g_bdev.io_target, 0); 597 CU_ASSERT(num_completed == 1); 598 poll_threads(); 599 CU_ASSERT(done == true); 600 601 teardown_test(); 602 } 603 604 static void 605 aborted_reset_done(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg) 606 { 607 enum spdk_bdev_io_status *status = cb_arg; 608 609 *status = success ? SPDK_BDEV_IO_STATUS_SUCCESS : SPDK_BDEV_IO_STATUS_FAILED; 610 spdk_bdev_free_io(bdev_io); 611 } 612 613 static void io_done(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg); 614 615 static void 616 aborted_reset(void) 617 { 618 struct spdk_io_channel *io_ch[2]; 619 enum spdk_bdev_io_status status1 = SPDK_BDEV_IO_STATUS_PENDING, 620 status2 = SPDK_BDEV_IO_STATUS_PENDING; 621 622 setup_test(); 623 624 set_thread(0); 625 io_ch[0] = spdk_bdev_get_io_channel(g_desc); 626 CU_ASSERT(io_ch[0] != NULL); 627 spdk_bdev_reset(g_desc, io_ch[0], aborted_reset_done, &status1); 628 poll_threads(); 629 CU_ASSERT(g_bdev.bdev.internal.reset_in_progress != NULL); 630 631 /* 632 * First reset has been submitted on ch0. Now submit a second 633 * reset on ch1 which will get queued since there is already a 634 * reset in progress. 635 */ 636 set_thread(1); 637 io_ch[1] = spdk_bdev_get_io_channel(g_desc); 638 CU_ASSERT(io_ch[1] != NULL); 639 spdk_bdev_reset(g_desc, io_ch[1], aborted_reset_done, &status2); 640 poll_threads(); 641 CU_ASSERT(g_bdev.bdev.internal.reset_in_progress != NULL); 642 643 /* 644 * Now destroy ch1. Nothing would really happen because the pending second reset 645 * is still holding a reference of ch1. 646 */ 647 set_thread(1); 648 spdk_put_io_channel(io_ch[1]); 649 poll_threads(); 650 CU_ASSERT(status2 == SPDK_BDEV_IO_STATUS_PENDING); 651 CU_ASSERT(g_bdev.bdev.internal.reset_in_progress != NULL); 652 653 /* 654 * Now complete the first reset, verify that both resets completed with SUCCESS 655 * status and that bdev->internal.reset_in_progress is also set back to NULL. 656 */ 657 set_thread(0); 658 spdk_put_io_channel(io_ch[0]); 659 stub_complete_io(g_bdev.io_target, 0); 660 poll_threads(); 661 CU_ASSERT(status1 == SPDK_BDEV_IO_STATUS_SUCCESS); 662 CU_ASSERT(status2 == SPDK_BDEV_IO_STATUS_SUCCESS); 663 CU_ASSERT(g_bdev.bdev.internal.reset_in_progress == NULL); 664 665 /* 666 * Teardown should succeed. 667 */ 668 teardown_test(); 669 } 670 671 static void 672 aborted_reset_no_outstanding_io(void) 673 { 674 struct spdk_io_channel *io_ch[2]; 675 struct spdk_bdev_channel *bdev_ch[2]; 676 struct spdk_bdev *bdev[2]; 677 enum spdk_bdev_io_status status1 = SPDK_BDEV_IO_STATUS_PENDING, 678 status2 = SPDK_BDEV_IO_STATUS_PENDING; 679 680 setup_test(); 681 682 /* 683 * This time we test the reset without any outstanding IO 684 * present on the bdev channel, so both resets should finish 685 * immediately. 686 */ 687 688 set_thread(0); 689 /* Set reset_io_drain_timeout to allow bdev 690 * reset to stay pending until we call abort. */ 691 io_ch[0] = spdk_bdev_get_io_channel(g_desc); 692 bdev_ch[0] = spdk_io_channel_get_ctx(io_ch[0]); 693 bdev[0] = bdev_ch[0]->bdev; 694 bdev[0]->reset_io_drain_timeout = SPDK_BDEV_RESET_IO_DRAIN_RECOMMENDED_VALUE; 695 CU_ASSERT(io_ch[0] != NULL); 696 spdk_bdev_reset(g_desc, io_ch[0], aborted_reset_done, &status1); 697 poll_threads(); 698 CU_ASSERT(g_bdev.bdev.internal.reset_in_progress == NULL); 699 CU_ASSERT(status1 == SPDK_BDEV_IO_STATUS_SUCCESS); 700 spdk_put_io_channel(io_ch[0]); 701 702 set_thread(1); 703 /* Set reset_io_drain_timeout to allow bdev 704 * reset to stay pending until we call abort. */ 705 io_ch[1] = spdk_bdev_get_io_channel(g_desc); 706 bdev_ch[1] = spdk_io_channel_get_ctx(io_ch[1]); 707 bdev[1] = bdev_ch[1]->bdev; 708 bdev[1]->reset_io_drain_timeout = SPDK_BDEV_RESET_IO_DRAIN_RECOMMENDED_VALUE; 709 CU_ASSERT(io_ch[1] != NULL); 710 spdk_bdev_reset(g_desc, io_ch[1], aborted_reset_done, &status2); 711 poll_threads(); 712 CU_ASSERT(g_bdev.bdev.internal.reset_in_progress == NULL); 713 CU_ASSERT(status2 == SPDK_BDEV_IO_STATUS_SUCCESS); 714 spdk_put_io_channel(io_ch[1]); 715 716 stub_complete_io(g_bdev.io_target, 0); 717 poll_threads(); 718 719 teardown_test(); 720 } 721 722 723 static void 724 io_during_io_done(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg) 725 { 726 enum spdk_bdev_io_status *status = cb_arg; 727 728 *status = bdev_io->internal.status; 729 spdk_bdev_free_io(bdev_io); 730 } 731 732 static void 733 io_during_reset(void) 734 { 735 struct spdk_io_channel *io_ch[2]; 736 struct spdk_bdev_channel *bdev_ch[2]; 737 enum spdk_bdev_io_status status0, status1, status_reset; 738 int rc; 739 740 setup_test(); 741 742 /* 743 * First test normal case - submit an I/O on each of two channels (with no resets) 744 * and verify they complete successfully. 745 */ 746 set_thread(0); 747 io_ch[0] = spdk_bdev_get_io_channel(g_desc); 748 bdev_ch[0] = spdk_io_channel_get_ctx(io_ch[0]); 749 CU_ASSERT(bdev_ch[0]->flags == 0); 750 status0 = SPDK_BDEV_IO_STATUS_PENDING; 751 rc = spdk_bdev_read_blocks(g_desc, io_ch[0], NULL, 0, 1, io_during_io_done, &status0); 752 CU_ASSERT(rc == 0); 753 754 set_thread(1); 755 io_ch[1] = spdk_bdev_get_io_channel(g_desc); 756 bdev_ch[1] = spdk_io_channel_get_ctx(io_ch[1]); 757 CU_ASSERT(bdev_ch[1]->flags == 0); 758 status1 = SPDK_BDEV_IO_STATUS_PENDING; 759 rc = spdk_bdev_read_blocks(g_desc, io_ch[1], NULL, 0, 1, io_during_io_done, &status1); 760 CU_ASSERT(rc == 0); 761 762 poll_threads(); 763 CU_ASSERT(status0 == SPDK_BDEV_IO_STATUS_PENDING); 764 CU_ASSERT(status1 == SPDK_BDEV_IO_STATUS_PENDING); 765 766 set_thread(0); 767 stub_complete_io(g_bdev.io_target, 0); 768 CU_ASSERT(status0 == SPDK_BDEV_IO_STATUS_SUCCESS); 769 770 set_thread(1); 771 stub_complete_io(g_bdev.io_target, 0); 772 CU_ASSERT(status1 == SPDK_BDEV_IO_STATUS_SUCCESS); 773 774 /* 775 * Now submit a reset, and leave it pending while we submit I/O on two different 776 * channels. These I/O should be failed by the bdev layer since the reset is in 777 * progress. 778 */ 779 set_thread(0); 780 status_reset = SPDK_BDEV_IO_STATUS_PENDING; 781 rc = spdk_bdev_reset(g_desc, io_ch[0], io_during_io_done, &status_reset); 782 CU_ASSERT(rc == 0); 783 784 CU_ASSERT(bdev_ch[0]->flags == 0); 785 CU_ASSERT(bdev_ch[1]->flags == 0); 786 poll_threads(); 787 CU_ASSERT(bdev_ch[0]->flags == BDEV_CH_RESET_IN_PROGRESS); 788 CU_ASSERT(bdev_ch[1]->flags == BDEV_CH_RESET_IN_PROGRESS); 789 790 set_thread(0); 791 status0 = SPDK_BDEV_IO_STATUS_PENDING; 792 rc = spdk_bdev_read_blocks(g_desc, io_ch[0], NULL, 0, 1, io_during_io_done, &status0); 793 CU_ASSERT(rc == 0); 794 795 set_thread(1); 796 status1 = SPDK_BDEV_IO_STATUS_PENDING; 797 rc = spdk_bdev_read_blocks(g_desc, io_ch[1], NULL, 0, 1, io_during_io_done, &status1); 798 CU_ASSERT(rc == 0); 799 800 /* 801 * A reset is in progress so these read I/O should complete with aborted. Note that we 802 * need to poll_threads() since I/O completed inline have their completion deferred. 803 */ 804 poll_threads(); 805 CU_ASSERT(status_reset == SPDK_BDEV_IO_STATUS_PENDING); 806 CU_ASSERT(status0 == SPDK_BDEV_IO_STATUS_ABORTED); 807 CU_ASSERT(status1 == SPDK_BDEV_IO_STATUS_ABORTED); 808 809 /* 810 * Complete the reset 811 */ 812 set_thread(0); 813 stub_complete_io(g_bdev.io_target, 0); 814 815 /* 816 * Only poll thread 0. We should not get a completion. 817 */ 818 poll_thread(0); 819 CU_ASSERT(status_reset == SPDK_BDEV_IO_STATUS_PENDING); 820 821 /* 822 * Poll both thread 0 and 1 so the messages can propagate and we 823 * get a completion. 824 */ 825 poll_threads(); 826 CU_ASSERT(status_reset == SPDK_BDEV_IO_STATUS_SUCCESS); 827 828 spdk_put_io_channel(io_ch[0]); 829 set_thread(1); 830 spdk_put_io_channel(io_ch[1]); 831 poll_threads(); 832 833 teardown_test(); 834 } 835 836 static uint32_t 837 count_queued_resets(void *io_target) 838 { 839 struct spdk_io_channel *_ch = spdk_get_io_channel(io_target); 840 struct ut_bdev_channel *ch = spdk_io_channel_get_ctx(_ch); 841 struct ut_bdev_io *bio; 842 struct spdk_bdev_io *io; 843 uint32_t submitted_resets = 0; 844 845 TAILQ_FOREACH(bio, &ch->outstanding_io, link) { 846 io = spdk_bdev_io_from_ctx(bio); 847 if (io->type == SPDK_BDEV_IO_TYPE_RESET) { 848 submitted_resets++; 849 } 850 } 851 852 spdk_put_io_channel(_ch); 853 854 return submitted_resets; 855 } 856 857 static void 858 reset_completions(void) 859 { 860 struct spdk_io_channel *io_ch; 861 struct spdk_bdev_channel *bdev_ch; 862 struct spdk_bdev *bdev; 863 enum spdk_bdev_io_status status0, status_reset; 864 int rc, iter; 865 866 setup_test(); 867 868 /* This test covers four test cases: 869 * 1) reset_io_drain_timeout of a bdev is greater than 0 870 * 2) No outstandind IO are present on any bdev channel 871 * 3) Outstanding IO finish during bdev reset 872 * 4) Outstanding IO do not finish before reset is done waiting 873 * for them. 874 * 875 * Above conditions mainly affect the timing of bdev reset completion 876 * and whether a reset should be skipped via spdk_bdev_io_complete() 877 * or sent down to the underlying bdev module via bdev_io_submit_reset(). */ 878 879 /* Test preparation */ 880 set_thread(0); 881 io_ch = spdk_bdev_get_io_channel(g_desc); 882 bdev_ch = spdk_io_channel_get_ctx(io_ch); 883 CU_ASSERT(bdev_ch->flags == 0); 884 885 886 /* Test case 1) reset_io_drain_timeout set to 0. Reset should be sent down immediately. */ 887 bdev = &g_bdev.bdev; 888 bdev->reset_io_drain_timeout = 0; 889 890 status_reset = SPDK_BDEV_IO_STATUS_PENDING; 891 rc = spdk_bdev_reset(g_desc, io_ch, io_during_io_done, &status_reset); 892 CU_ASSERT(rc == 0); 893 poll_threads(); 894 CU_ASSERT(count_queued_resets(g_bdev.io_target) == 1); 895 896 /* Call reset completion inside bdev module. */ 897 stub_complete_io(g_bdev.io_target, 0); 898 poll_threads(); 899 CU_ASSERT(count_queued_resets(g_bdev.io_target) == 0); 900 CU_ASSERT(status_reset == SPDK_BDEV_IO_STATUS_SUCCESS); 901 CU_ASSERT(g_bdev.bdev.internal.reset_in_progress == NULL); 902 903 904 /* Test case 2) no outstanding IO are present. Reset should perform one iteration over 905 * channels and then be skipped. */ 906 bdev->reset_io_drain_timeout = SPDK_BDEV_RESET_IO_DRAIN_RECOMMENDED_VALUE; 907 status_reset = SPDK_BDEV_IO_STATUS_PENDING; 908 909 rc = spdk_bdev_reset(g_desc, io_ch, io_during_io_done, &status_reset); 910 CU_ASSERT(rc == 0); 911 poll_threads(); 912 /* Reset was never submitted to the bdev module. */ 913 CU_ASSERT(count_queued_resets(g_bdev.io_target) == 0); 914 CU_ASSERT(status_reset == SPDK_BDEV_IO_STATUS_SUCCESS); 915 CU_ASSERT(g_bdev.bdev.internal.reset_in_progress == NULL); 916 917 918 /* Test case 3) outstanding IO finish during bdev reset procedure. Reset should initiate 919 * wait poller to check for IO completions every second, until reset_io_drain_timeout is 920 * reached, but finish earlier than this threshold. */ 921 status0 = SPDK_BDEV_IO_STATUS_PENDING; 922 status_reset = SPDK_BDEV_IO_STATUS_PENDING; 923 rc = spdk_bdev_read_blocks(g_desc, io_ch, NULL, 0, 1, io_during_io_done, &status0); 924 CU_ASSERT(rc == 0); 925 926 rc = spdk_bdev_reset(g_desc, io_ch, io_during_io_done, &status_reset); 927 CU_ASSERT(rc == 0); 928 poll_threads(); 929 /* The reset just started and should not have been submitted yet. */ 930 CU_ASSERT(count_queued_resets(g_bdev.io_target) == 0); 931 932 poll_threads(); 933 CU_ASSERT(status_reset == SPDK_BDEV_IO_STATUS_PENDING); 934 /* Let the poller wait for about half the time then complete outstanding IO. */ 935 for (iter = 0; iter < 2; iter++) { 936 /* Reset is still processing and not submitted at this point. */ 937 CU_ASSERT(count_queued_resets(g_bdev.io_target) == 0); 938 spdk_delay_us(1000 * 1000); 939 poll_threads(); 940 poll_threads(); 941 } 942 CU_ASSERT(status_reset == SPDK_BDEV_IO_STATUS_PENDING); 943 stub_complete_io(g_bdev.io_target, 0); 944 poll_threads(); 945 spdk_delay_us(BDEV_RESET_CHECK_OUTSTANDING_IO_PERIOD); 946 poll_threads(); 947 poll_threads(); 948 CU_ASSERT(status_reset == SPDK_BDEV_IO_STATUS_SUCCESS); 949 /* Sending reset to the bdev module has been skipped. */ 950 CU_ASSERT(count_queued_resets(g_bdev.io_target) == 0); 951 CU_ASSERT(g_bdev.bdev.internal.reset_in_progress == NULL); 952 953 954 /* Test case 4) outstanding IO are still present after reset_io_drain_timeout 955 * seconds have passed. */ 956 status0 = SPDK_BDEV_IO_STATUS_PENDING; 957 status_reset = SPDK_BDEV_IO_STATUS_PENDING; 958 rc = spdk_bdev_read_blocks(g_desc, io_ch, NULL, 0, 1, io_during_io_done, &status0); 959 CU_ASSERT(rc == 0); 960 961 rc = spdk_bdev_reset(g_desc, io_ch, io_during_io_done, &status_reset); 962 CU_ASSERT(rc == 0); 963 poll_threads(); 964 /* The reset just started and should not have been submitted yet. */ 965 CU_ASSERT(count_queued_resets(g_bdev.io_target) == 0); 966 967 poll_threads(); 968 CU_ASSERT(status_reset == SPDK_BDEV_IO_STATUS_PENDING); 969 /* Let the poller wait for reset_io_drain_timeout seconds. */ 970 for (iter = 0; iter < bdev->reset_io_drain_timeout; iter++) { 971 CU_ASSERT(count_queued_resets(g_bdev.io_target) == 0); 972 spdk_delay_us(BDEV_RESET_CHECK_OUTSTANDING_IO_PERIOD); 973 poll_threads(); 974 poll_threads(); 975 } 976 977 /* After timing out, the reset should have been sent to the module. */ 978 CU_ASSERT(count_queued_resets(g_bdev.io_target) == 1); 979 /* Complete reset submitted to the module and the read IO. */ 980 stub_complete_io(g_bdev.io_target, 0); 981 poll_threads(); 982 CU_ASSERT(status_reset == SPDK_BDEV_IO_STATUS_SUCCESS); 983 CU_ASSERT(g_bdev.bdev.internal.reset_in_progress == NULL); 984 985 986 /* Destroy the channel and end the test. */ 987 spdk_put_io_channel(io_ch); 988 poll_threads(); 989 990 teardown_test(); 991 } 992 993 994 static void 995 basic_qos(void) 996 { 997 struct spdk_io_channel *io_ch[2]; 998 struct spdk_bdev_channel *bdev_ch[2]; 999 struct spdk_bdev *bdev; 1000 enum spdk_bdev_io_status status, abort_status; 1001 int rc; 1002 1003 setup_test(); 1004 1005 /* Enable QoS */ 1006 bdev = &g_bdev.bdev; 1007 bdev->internal.qos = calloc(1, sizeof(*bdev->internal.qos)); 1008 SPDK_CU_ASSERT_FATAL(bdev->internal.qos != NULL); 1009 /* 1010 * Enable read/write IOPS, read only byte per second and 1011 * read/write byte per second rate limits. 1012 * In this case, all rate limits will take equal effect. 1013 */ 1014 /* 2000 read/write I/O per second, or 2 per millisecond */ 1015 bdev->internal.qos->rate_limits[SPDK_BDEV_QOS_RW_IOPS_RATE_LIMIT].limit = 2000; 1016 /* 8K read/write byte per millisecond with 4K block size */ 1017 bdev->internal.qos->rate_limits[SPDK_BDEV_QOS_RW_BPS_RATE_LIMIT].limit = 8192000; 1018 /* 8K read only byte per millisecond with 4K block size */ 1019 bdev->internal.qos->rate_limits[SPDK_BDEV_QOS_R_BPS_RATE_LIMIT].limit = 8192000; 1020 1021 g_get_io_channel = true; 1022 1023 set_thread(0); 1024 io_ch[0] = spdk_bdev_get_io_channel(g_desc); 1025 bdev_ch[0] = spdk_io_channel_get_ctx(io_ch[0]); 1026 CU_ASSERT(bdev_ch[0]->flags == BDEV_CH_QOS_ENABLED); 1027 1028 set_thread(1); 1029 io_ch[1] = spdk_bdev_get_io_channel(g_desc); 1030 bdev_ch[1] = spdk_io_channel_get_ctx(io_ch[1]); 1031 CU_ASSERT(bdev_ch[1]->flags == BDEV_CH_QOS_ENABLED); 1032 1033 /* 1034 * Send an I/O on thread 0, which is where the QoS thread is running. 1035 */ 1036 set_thread(0); 1037 status = SPDK_BDEV_IO_STATUS_PENDING; 1038 rc = spdk_bdev_read_blocks(g_desc, io_ch[0], NULL, 0, 1, io_during_io_done, &status); 1039 CU_ASSERT(rc == 0); 1040 CU_ASSERT(status == SPDK_BDEV_IO_STATUS_PENDING); 1041 poll_threads(); 1042 stub_complete_io(g_bdev.io_target, 0); 1043 poll_threads(); 1044 CU_ASSERT(status == SPDK_BDEV_IO_STATUS_SUCCESS); 1045 1046 /* Send an I/O on thread 1. The QoS thread is not running here. */ 1047 status = SPDK_BDEV_IO_STATUS_PENDING; 1048 set_thread(1); 1049 rc = spdk_bdev_read_blocks(g_desc, io_ch[1], NULL, 0, 1, io_during_io_done, &status); 1050 CU_ASSERT(rc == 0); 1051 CU_ASSERT(status == SPDK_BDEV_IO_STATUS_PENDING); 1052 poll_threads(); 1053 /* Complete I/O on thread 0. This should not complete the I/O we submitted. */ 1054 set_thread(0); 1055 stub_complete_io(g_bdev.io_target, 0); 1056 poll_threads(); 1057 CU_ASSERT(status == SPDK_BDEV_IO_STATUS_PENDING); 1058 /* Now complete I/O on original thread 1. */ 1059 set_thread(1); 1060 poll_threads(); 1061 stub_complete_io(g_bdev.io_target, 0); 1062 poll_threads(); 1063 CU_ASSERT(status == SPDK_BDEV_IO_STATUS_SUCCESS); 1064 1065 /* Reset rate limit for the next test cases. */ 1066 spdk_delay_us(SPDK_BDEV_QOS_TIMESLICE_IN_USEC); 1067 poll_threads(); 1068 1069 /* 1070 * Test abort request when QoS is enabled. 1071 */ 1072 1073 /* Send an I/O on thread 0, which is where the QoS thread is running. */ 1074 set_thread(0); 1075 status = SPDK_BDEV_IO_STATUS_PENDING; 1076 rc = spdk_bdev_read_blocks(g_desc, io_ch[0], NULL, 0, 1, io_during_io_done, &status); 1077 CU_ASSERT(rc == 0); 1078 CU_ASSERT(status == SPDK_BDEV_IO_STATUS_PENDING); 1079 /* Send an abort to the I/O on the same thread. */ 1080 abort_status = SPDK_BDEV_IO_STATUS_PENDING; 1081 rc = spdk_bdev_abort(g_desc, io_ch[0], &status, io_during_io_done, &abort_status); 1082 CU_ASSERT(rc == 0); 1083 CU_ASSERT(abort_status == SPDK_BDEV_IO_STATUS_PENDING); 1084 poll_threads(); 1085 CU_ASSERT(abort_status == SPDK_BDEV_IO_STATUS_SUCCESS); 1086 CU_ASSERT(status == SPDK_BDEV_IO_STATUS_ABORTED); 1087 1088 /* Send an I/O on thread 1. The QoS thread is not running here. */ 1089 status = SPDK_BDEV_IO_STATUS_PENDING; 1090 set_thread(1); 1091 rc = spdk_bdev_read_blocks(g_desc, io_ch[1], NULL, 0, 1, io_during_io_done, &status); 1092 CU_ASSERT(rc == 0); 1093 CU_ASSERT(status == SPDK_BDEV_IO_STATUS_PENDING); 1094 poll_threads(); 1095 /* Send an abort to the I/O on the same thread. */ 1096 abort_status = SPDK_BDEV_IO_STATUS_PENDING; 1097 rc = spdk_bdev_abort(g_desc, io_ch[1], &status, io_during_io_done, &abort_status); 1098 CU_ASSERT(rc == 0); 1099 CU_ASSERT(abort_status == SPDK_BDEV_IO_STATUS_PENDING); 1100 poll_threads(); 1101 /* Complete the I/O with failure and the abort with success on thread 1. */ 1102 CU_ASSERT(abort_status == SPDK_BDEV_IO_STATUS_SUCCESS); 1103 CU_ASSERT(status == SPDK_BDEV_IO_STATUS_ABORTED); 1104 1105 set_thread(0); 1106 1107 /* 1108 * Close the descriptor only, which should stop the qos channel as 1109 * the last descriptor removed. 1110 */ 1111 spdk_bdev_close(g_desc); 1112 poll_threads(); 1113 CU_ASSERT(bdev->internal.qos->ch == NULL); 1114 1115 /* 1116 * Open the bdev again which shall setup the qos channel as the 1117 * channels are valid. 1118 */ 1119 spdk_bdev_open_ext("ut_bdev", true, _bdev_event_cb, NULL, &g_desc); 1120 poll_threads(); 1121 CU_ASSERT(bdev->internal.qos->ch != NULL); 1122 1123 /* Tear down the channels */ 1124 set_thread(0); 1125 spdk_put_io_channel(io_ch[0]); 1126 set_thread(1); 1127 spdk_put_io_channel(io_ch[1]); 1128 poll_threads(); 1129 set_thread(0); 1130 1131 /* Close the descriptor, which should stop the qos channel */ 1132 spdk_bdev_close(g_desc); 1133 poll_threads(); 1134 CU_ASSERT(bdev->internal.qos->ch == NULL); 1135 1136 /* Open the bdev again, no qos channel setup without valid channels. */ 1137 spdk_bdev_open_ext("ut_bdev", true, _bdev_event_cb, NULL, &g_desc); 1138 poll_threads(); 1139 CU_ASSERT(bdev->internal.qos->ch == NULL); 1140 1141 /* Create the channels in reverse order. */ 1142 set_thread(1); 1143 io_ch[1] = spdk_bdev_get_io_channel(g_desc); 1144 bdev_ch[1] = spdk_io_channel_get_ctx(io_ch[1]); 1145 CU_ASSERT(bdev_ch[1]->flags == BDEV_CH_QOS_ENABLED); 1146 1147 set_thread(0); 1148 io_ch[0] = spdk_bdev_get_io_channel(g_desc); 1149 bdev_ch[0] = spdk_io_channel_get_ctx(io_ch[0]); 1150 CU_ASSERT(bdev_ch[0]->flags == BDEV_CH_QOS_ENABLED); 1151 1152 /* Confirm that the qos thread is now thread 1 */ 1153 CU_ASSERT(bdev->internal.qos->ch == bdev_ch[1]); 1154 1155 /* Tear down the channels */ 1156 set_thread(0); 1157 spdk_put_io_channel(io_ch[0]); 1158 set_thread(1); 1159 spdk_put_io_channel(io_ch[1]); 1160 poll_threads(); 1161 1162 set_thread(0); 1163 1164 teardown_test(); 1165 } 1166 1167 static void 1168 io_during_qos_queue(void) 1169 { 1170 struct spdk_io_channel *io_ch[2]; 1171 struct spdk_bdev_channel *bdev_ch[2]; 1172 struct spdk_bdev *bdev; 1173 enum spdk_bdev_io_status status0, status1, status2; 1174 int rc; 1175 1176 setup_test(); 1177 MOCK_SET(spdk_get_ticks, 0); 1178 1179 /* Enable QoS */ 1180 bdev = &g_bdev.bdev; 1181 bdev->internal.qos = calloc(1, sizeof(*bdev->internal.qos)); 1182 SPDK_CU_ASSERT_FATAL(bdev->internal.qos != NULL); 1183 1184 /* 1185 * Enable read/write IOPS, read only byte per sec, write only 1186 * byte per sec and read/write byte per sec rate limits. 1187 * In this case, both read only and write only byte per sec 1188 * rate limit will take effect. 1189 */ 1190 /* 4000 read/write I/O per second, or 4 per millisecond */ 1191 bdev->internal.qos->rate_limits[SPDK_BDEV_QOS_RW_IOPS_RATE_LIMIT].limit = 4000; 1192 /* 8K byte per millisecond with 4K block size */ 1193 bdev->internal.qos->rate_limits[SPDK_BDEV_QOS_RW_BPS_RATE_LIMIT].limit = 8192000; 1194 /* 4K byte per millisecond with 4K block size */ 1195 bdev->internal.qos->rate_limits[SPDK_BDEV_QOS_R_BPS_RATE_LIMIT].limit = 4096000; 1196 /* 4K byte per millisecond with 4K block size */ 1197 bdev->internal.qos->rate_limits[SPDK_BDEV_QOS_W_BPS_RATE_LIMIT].limit = 4096000; 1198 1199 g_get_io_channel = true; 1200 1201 /* Create channels */ 1202 set_thread(0); 1203 io_ch[0] = spdk_bdev_get_io_channel(g_desc); 1204 bdev_ch[0] = spdk_io_channel_get_ctx(io_ch[0]); 1205 CU_ASSERT(bdev_ch[0]->flags == BDEV_CH_QOS_ENABLED); 1206 1207 set_thread(1); 1208 io_ch[1] = spdk_bdev_get_io_channel(g_desc); 1209 bdev_ch[1] = spdk_io_channel_get_ctx(io_ch[1]); 1210 CU_ASSERT(bdev_ch[1]->flags == BDEV_CH_QOS_ENABLED); 1211 1212 /* Send two read I/Os */ 1213 status1 = SPDK_BDEV_IO_STATUS_PENDING; 1214 rc = spdk_bdev_read_blocks(g_desc, io_ch[1], NULL, 0, 1, io_during_io_done, &status1); 1215 CU_ASSERT(rc == 0); 1216 CU_ASSERT(status1 == SPDK_BDEV_IO_STATUS_PENDING); 1217 set_thread(0); 1218 status0 = SPDK_BDEV_IO_STATUS_PENDING; 1219 rc = spdk_bdev_read_blocks(g_desc, io_ch[0], NULL, 0, 1, io_during_io_done, &status0); 1220 CU_ASSERT(rc == 0); 1221 CU_ASSERT(status0 == SPDK_BDEV_IO_STATUS_PENDING); 1222 /* Send one write I/O */ 1223 status2 = SPDK_BDEV_IO_STATUS_PENDING; 1224 rc = spdk_bdev_write_blocks(g_desc, io_ch[0], NULL, 0, 1, io_during_io_done, &status2); 1225 CU_ASSERT(rc == 0); 1226 CU_ASSERT(status2 == SPDK_BDEV_IO_STATUS_PENDING); 1227 1228 /* Complete any I/O that arrived at the disk */ 1229 poll_threads(); 1230 set_thread(1); 1231 stub_complete_io(g_bdev.io_target, 0); 1232 set_thread(0); 1233 stub_complete_io(g_bdev.io_target, 0); 1234 poll_threads(); 1235 1236 /* Only one of the two read I/Os should complete. (logical XOR) */ 1237 if (status0 == SPDK_BDEV_IO_STATUS_SUCCESS) { 1238 CU_ASSERT(status1 == SPDK_BDEV_IO_STATUS_PENDING); 1239 } else { 1240 CU_ASSERT(status1 == SPDK_BDEV_IO_STATUS_SUCCESS); 1241 } 1242 /* The write I/O should complete. */ 1243 CU_ASSERT(status2 == SPDK_BDEV_IO_STATUS_SUCCESS); 1244 1245 /* Advance in time by a millisecond */ 1246 spdk_delay_us(1000); 1247 1248 /* Complete more I/O */ 1249 poll_threads(); 1250 set_thread(1); 1251 stub_complete_io(g_bdev.io_target, 0); 1252 set_thread(0); 1253 stub_complete_io(g_bdev.io_target, 0); 1254 poll_threads(); 1255 1256 /* Now the second read I/O should be done */ 1257 CU_ASSERT(status0 == SPDK_BDEV_IO_STATUS_SUCCESS); 1258 CU_ASSERT(status1 == SPDK_BDEV_IO_STATUS_SUCCESS); 1259 1260 /* Tear down the channels */ 1261 set_thread(1); 1262 spdk_put_io_channel(io_ch[1]); 1263 set_thread(0); 1264 spdk_put_io_channel(io_ch[0]); 1265 poll_threads(); 1266 1267 teardown_test(); 1268 } 1269 1270 static void 1271 io_during_qos_reset(void) 1272 { 1273 struct spdk_io_channel *io_ch[2]; 1274 struct spdk_bdev_channel *bdev_ch[2]; 1275 struct spdk_bdev *bdev; 1276 enum spdk_bdev_io_status status0, status1, reset_status; 1277 int rc; 1278 1279 setup_test(); 1280 MOCK_SET(spdk_get_ticks, 0); 1281 1282 /* Enable QoS */ 1283 bdev = &g_bdev.bdev; 1284 bdev->internal.qos = calloc(1, sizeof(*bdev->internal.qos)); 1285 SPDK_CU_ASSERT_FATAL(bdev->internal.qos != NULL); 1286 1287 /* 1288 * Enable read/write IOPS, write only byte per sec and 1289 * read/write byte per second rate limits. 1290 * In this case, read/write byte per second rate limit will 1291 * take effect first. 1292 */ 1293 /* 2000 read/write I/O per second, or 2 per millisecond */ 1294 bdev->internal.qos->rate_limits[SPDK_BDEV_QOS_RW_IOPS_RATE_LIMIT].limit = 2000; 1295 /* 4K byte per millisecond with 4K block size */ 1296 bdev->internal.qos->rate_limits[SPDK_BDEV_QOS_RW_BPS_RATE_LIMIT].limit = 4096000; 1297 /* 8K byte per millisecond with 4K block size */ 1298 bdev->internal.qos->rate_limits[SPDK_BDEV_QOS_W_BPS_RATE_LIMIT].limit = 8192000; 1299 1300 g_get_io_channel = true; 1301 1302 /* Create channels */ 1303 set_thread(0); 1304 io_ch[0] = spdk_bdev_get_io_channel(g_desc); 1305 bdev_ch[0] = spdk_io_channel_get_ctx(io_ch[0]); 1306 CU_ASSERT(bdev_ch[0]->flags == BDEV_CH_QOS_ENABLED); 1307 1308 set_thread(1); 1309 io_ch[1] = spdk_bdev_get_io_channel(g_desc); 1310 bdev_ch[1] = spdk_io_channel_get_ctx(io_ch[1]); 1311 CU_ASSERT(bdev_ch[1]->flags == BDEV_CH_QOS_ENABLED); 1312 1313 /* Send two I/O. One of these gets queued by QoS. The other is sitting at the disk. */ 1314 status1 = SPDK_BDEV_IO_STATUS_PENDING; 1315 rc = spdk_bdev_write_blocks(g_desc, io_ch[1], NULL, 0, 1, io_during_io_done, &status1); 1316 CU_ASSERT(rc == 0); 1317 set_thread(0); 1318 status0 = SPDK_BDEV_IO_STATUS_PENDING; 1319 rc = spdk_bdev_write_blocks(g_desc, io_ch[0], NULL, 0, 1, io_during_io_done, &status0); 1320 CU_ASSERT(rc == 0); 1321 1322 poll_threads(); 1323 CU_ASSERT(status1 == SPDK_BDEV_IO_STATUS_PENDING); 1324 CU_ASSERT(status0 == SPDK_BDEV_IO_STATUS_PENDING); 1325 1326 /* Reset the bdev. */ 1327 reset_status = SPDK_BDEV_IO_STATUS_PENDING; 1328 rc = spdk_bdev_reset(g_desc, io_ch[0], io_during_io_done, &reset_status); 1329 CU_ASSERT(rc == 0); 1330 1331 /* Complete any I/O that arrived at the disk */ 1332 poll_threads(); 1333 set_thread(1); 1334 stub_complete_io(g_bdev.io_target, 0); 1335 set_thread(0); 1336 stub_complete_io(g_bdev.io_target, 0); 1337 poll_threads(); 1338 1339 CU_ASSERT(reset_status == SPDK_BDEV_IO_STATUS_SUCCESS); 1340 CU_ASSERT(status0 == SPDK_BDEV_IO_STATUS_ABORTED); 1341 CU_ASSERT(status1 == SPDK_BDEV_IO_STATUS_ABORTED); 1342 1343 /* Tear down the channels */ 1344 set_thread(1); 1345 spdk_put_io_channel(io_ch[1]); 1346 set_thread(0); 1347 spdk_put_io_channel(io_ch[0]); 1348 poll_threads(); 1349 1350 teardown_test(); 1351 } 1352 1353 static void 1354 enomem_done(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg) 1355 { 1356 enum spdk_bdev_io_status *status = cb_arg; 1357 1358 *status = success ? SPDK_BDEV_IO_STATUS_SUCCESS : SPDK_BDEV_IO_STATUS_FAILED; 1359 spdk_bdev_free_io(bdev_io); 1360 } 1361 1362 static void 1363 enomem(void) 1364 { 1365 struct spdk_io_channel *io_ch; 1366 struct spdk_bdev_channel *bdev_ch; 1367 struct spdk_bdev_shared_resource *shared_resource; 1368 struct ut_bdev_channel *ut_ch; 1369 const uint32_t IO_ARRAY_SIZE = 64; 1370 const uint32_t AVAIL = 20; 1371 enum spdk_bdev_io_status status[IO_ARRAY_SIZE], status_reset; 1372 uint32_t nomem_cnt, i; 1373 struct spdk_bdev_io *first_io; 1374 int rc; 1375 1376 setup_test(); 1377 1378 set_thread(0); 1379 io_ch = spdk_bdev_get_io_channel(g_desc); 1380 bdev_ch = spdk_io_channel_get_ctx(io_ch); 1381 shared_resource = bdev_ch->shared_resource; 1382 ut_ch = spdk_io_channel_get_ctx(bdev_ch->channel); 1383 ut_ch->avail_cnt = AVAIL; 1384 1385 /* First submit a number of IOs equal to what the channel can support. */ 1386 for (i = 0; i < AVAIL; i++) { 1387 status[i] = SPDK_BDEV_IO_STATUS_PENDING; 1388 rc = spdk_bdev_read_blocks(g_desc, io_ch, NULL, 0, 1, enomem_done, &status[i]); 1389 CU_ASSERT(rc == 0); 1390 } 1391 CU_ASSERT(TAILQ_EMPTY(&shared_resource->nomem_io)); 1392 1393 /* 1394 * Next, submit one additional I/O. This one should fail with ENOMEM and then go onto 1395 * the enomem_io list. 1396 */ 1397 status[AVAIL] = SPDK_BDEV_IO_STATUS_PENDING; 1398 rc = spdk_bdev_read_blocks(g_desc, io_ch, NULL, 0, 1, enomem_done, &status[AVAIL]); 1399 CU_ASSERT(rc == 0); 1400 SPDK_CU_ASSERT_FATAL(!TAILQ_EMPTY(&shared_resource->nomem_io)); 1401 first_io = TAILQ_FIRST(&shared_resource->nomem_io); 1402 1403 /* 1404 * Now submit a bunch more I/O. These should all fail with ENOMEM and get queued behind 1405 * the first_io above. 1406 */ 1407 for (i = AVAIL + 1; i < IO_ARRAY_SIZE; i++) { 1408 status[i] = SPDK_BDEV_IO_STATUS_PENDING; 1409 rc = spdk_bdev_read_blocks(g_desc, io_ch, NULL, 0, 1, enomem_done, &status[i]); 1410 CU_ASSERT(rc == 0); 1411 } 1412 1413 /* Assert that first_io is still at the head of the list. */ 1414 CU_ASSERT(TAILQ_FIRST(&shared_resource->nomem_io) == first_io); 1415 CU_ASSERT(bdev_io_tailq_cnt(&shared_resource->nomem_io) == (IO_ARRAY_SIZE - AVAIL)); 1416 nomem_cnt = bdev_io_tailq_cnt(&shared_resource->nomem_io); 1417 CU_ASSERT(shared_resource->nomem_threshold == (AVAIL - NOMEM_THRESHOLD_COUNT)); 1418 1419 /* 1420 * Complete 1 I/O only. The key check here is bdev_io_tailq_cnt - this should not have 1421 * changed since completing just 1 I/O should not trigger retrying the queued nomem_io 1422 * list. 1423 */ 1424 stub_complete_io(g_bdev.io_target, 1); 1425 CU_ASSERT(bdev_io_tailq_cnt(&shared_resource->nomem_io) == nomem_cnt); 1426 1427 /* 1428 * Complete enough I/O to hit the nomem_threshold. This should trigger retrying nomem_io, 1429 * and we should see I/O get resubmitted to the test bdev module. 1430 */ 1431 stub_complete_io(g_bdev.io_target, NOMEM_THRESHOLD_COUNT - 1); 1432 CU_ASSERT(bdev_io_tailq_cnt(&shared_resource->nomem_io) < nomem_cnt); 1433 nomem_cnt = bdev_io_tailq_cnt(&shared_resource->nomem_io); 1434 1435 /* Complete 1 I/O only. This should not trigger retrying the queued nomem_io. */ 1436 stub_complete_io(g_bdev.io_target, 1); 1437 CU_ASSERT(bdev_io_tailq_cnt(&shared_resource->nomem_io) == nomem_cnt); 1438 1439 /* 1440 * Send a reset and confirm that all I/O are completed, including the ones that 1441 * were queued on the nomem_io list. 1442 */ 1443 status_reset = SPDK_BDEV_IO_STATUS_PENDING; 1444 rc = spdk_bdev_reset(g_desc, io_ch, enomem_done, &status_reset); 1445 poll_threads(); 1446 CU_ASSERT(rc == 0); 1447 /* This will complete the reset. */ 1448 stub_complete_io(g_bdev.io_target, 0); 1449 1450 CU_ASSERT(bdev_io_tailq_cnt(&shared_resource->nomem_io) == 0); 1451 CU_ASSERT(shared_resource->io_outstanding == 0); 1452 1453 spdk_put_io_channel(io_ch); 1454 poll_threads(); 1455 teardown_test(); 1456 } 1457 1458 static void 1459 enomem_multi_bdev(void) 1460 { 1461 struct spdk_io_channel *io_ch; 1462 struct spdk_bdev_channel *bdev_ch; 1463 struct spdk_bdev_shared_resource *shared_resource; 1464 struct ut_bdev_channel *ut_ch; 1465 const uint32_t IO_ARRAY_SIZE = 64; 1466 const uint32_t AVAIL = 20; 1467 enum spdk_bdev_io_status status[IO_ARRAY_SIZE]; 1468 uint32_t i; 1469 struct ut_bdev *second_bdev; 1470 struct spdk_bdev_desc *second_desc = NULL; 1471 struct spdk_bdev_channel *second_bdev_ch; 1472 struct spdk_io_channel *second_ch; 1473 int rc; 1474 1475 setup_test(); 1476 1477 /* Register second bdev with the same io_target */ 1478 second_bdev = calloc(1, sizeof(*second_bdev)); 1479 SPDK_CU_ASSERT_FATAL(second_bdev != NULL); 1480 register_bdev(second_bdev, "ut_bdev2", g_bdev.io_target); 1481 spdk_bdev_open_ext("ut_bdev2", true, _bdev_event_cb, NULL, &second_desc); 1482 SPDK_CU_ASSERT_FATAL(second_desc != NULL); 1483 1484 set_thread(0); 1485 io_ch = spdk_bdev_get_io_channel(g_desc); 1486 bdev_ch = spdk_io_channel_get_ctx(io_ch); 1487 shared_resource = bdev_ch->shared_resource; 1488 ut_ch = spdk_io_channel_get_ctx(bdev_ch->channel); 1489 ut_ch->avail_cnt = AVAIL; 1490 1491 second_ch = spdk_bdev_get_io_channel(second_desc); 1492 second_bdev_ch = spdk_io_channel_get_ctx(second_ch); 1493 SPDK_CU_ASSERT_FATAL(shared_resource == second_bdev_ch->shared_resource); 1494 1495 /* Saturate io_target through bdev A. */ 1496 for (i = 0; i < AVAIL; i++) { 1497 status[i] = SPDK_BDEV_IO_STATUS_PENDING; 1498 rc = spdk_bdev_read_blocks(g_desc, io_ch, NULL, 0, 1, enomem_done, &status[i]); 1499 CU_ASSERT(rc == 0); 1500 } 1501 CU_ASSERT(TAILQ_EMPTY(&shared_resource->nomem_io)); 1502 1503 /* 1504 * Now submit I/O through the second bdev. This should fail with ENOMEM 1505 * and then go onto the nomem_io list. 1506 */ 1507 status[AVAIL] = SPDK_BDEV_IO_STATUS_PENDING; 1508 rc = spdk_bdev_read_blocks(second_desc, second_ch, NULL, 0, 1, enomem_done, &status[AVAIL]); 1509 CU_ASSERT(rc == 0); 1510 SPDK_CU_ASSERT_FATAL(!TAILQ_EMPTY(&shared_resource->nomem_io)); 1511 1512 /* Complete first bdev's I/O. This should retry sending second bdev's nomem_io */ 1513 stub_complete_io(g_bdev.io_target, AVAIL); 1514 1515 SPDK_CU_ASSERT_FATAL(TAILQ_EMPTY(&shared_resource->nomem_io)); 1516 CU_ASSERT(shared_resource->io_outstanding == 1); 1517 1518 /* Now complete our retried I/O */ 1519 stub_complete_io(g_bdev.io_target, 1); 1520 SPDK_CU_ASSERT_FATAL(shared_resource->io_outstanding == 0); 1521 1522 spdk_put_io_channel(io_ch); 1523 spdk_put_io_channel(second_ch); 1524 spdk_bdev_close(second_desc); 1525 unregister_bdev(second_bdev); 1526 poll_threads(); 1527 free(second_bdev); 1528 teardown_test(); 1529 } 1530 1531 static void 1532 enomem_multi_bdev_unregister(void) 1533 { 1534 struct spdk_io_channel *io_ch; 1535 struct spdk_bdev_channel *bdev_ch; 1536 struct spdk_bdev_shared_resource *shared_resource; 1537 struct ut_bdev_channel *ut_ch; 1538 const uint32_t IO_ARRAY_SIZE = 64; 1539 const uint32_t AVAIL = 20; 1540 enum spdk_bdev_io_status status[IO_ARRAY_SIZE]; 1541 uint32_t i; 1542 int rc; 1543 1544 setup_test(); 1545 1546 set_thread(0); 1547 io_ch = spdk_bdev_get_io_channel(g_desc); 1548 bdev_ch = spdk_io_channel_get_ctx(io_ch); 1549 shared_resource = bdev_ch->shared_resource; 1550 ut_ch = spdk_io_channel_get_ctx(bdev_ch->channel); 1551 ut_ch->avail_cnt = AVAIL; 1552 1553 /* Saturate io_target through the bdev. */ 1554 for (i = 0; i < AVAIL; i++) { 1555 status[i] = SPDK_BDEV_IO_STATUS_PENDING; 1556 rc = spdk_bdev_read_blocks(g_desc, io_ch, NULL, 0, 1, enomem_done, &status[i]); 1557 CU_ASSERT(rc == 0); 1558 } 1559 CU_ASSERT(TAILQ_EMPTY(&shared_resource->nomem_io)); 1560 1561 /* 1562 * Now submit I/O through the bdev. This should fail with ENOMEM 1563 * and then go onto the nomem_io list. 1564 */ 1565 status[AVAIL] = SPDK_BDEV_IO_STATUS_PENDING; 1566 rc = spdk_bdev_read_blocks(g_desc, io_ch, NULL, 0, 1, enomem_done, &status[AVAIL]); 1567 CU_ASSERT(rc == 0); 1568 SPDK_CU_ASSERT_FATAL(!TAILQ_EMPTY(&shared_resource->nomem_io)); 1569 1570 /* Unregister the bdev to abort the IOs from nomem_io queue. */ 1571 unregister_bdev(&g_bdev); 1572 CU_ASSERT(status[AVAIL] == SPDK_BDEV_IO_STATUS_FAILED); 1573 SPDK_CU_ASSERT_FATAL(TAILQ_EMPTY(&shared_resource->nomem_io)); 1574 SPDK_CU_ASSERT_FATAL(shared_resource->io_outstanding == AVAIL); 1575 1576 /* Complete the bdev's I/O. */ 1577 stub_complete_io(g_bdev.io_target, AVAIL); 1578 SPDK_CU_ASSERT_FATAL(shared_resource->io_outstanding == 0); 1579 1580 spdk_put_io_channel(io_ch); 1581 poll_threads(); 1582 teardown_test(); 1583 } 1584 1585 static void 1586 enomem_multi_io_target(void) 1587 { 1588 struct spdk_io_channel *io_ch; 1589 struct spdk_bdev_channel *bdev_ch; 1590 struct ut_bdev_channel *ut_ch; 1591 const uint32_t IO_ARRAY_SIZE = 64; 1592 const uint32_t AVAIL = 20; 1593 enum spdk_bdev_io_status status[IO_ARRAY_SIZE]; 1594 uint32_t i; 1595 int new_io_device; 1596 struct ut_bdev *second_bdev; 1597 struct spdk_bdev_desc *second_desc = NULL; 1598 struct spdk_bdev_channel *second_bdev_ch; 1599 struct spdk_io_channel *second_ch; 1600 int rc; 1601 1602 setup_test(); 1603 1604 /* Create new io_target and a second bdev using it */ 1605 spdk_io_device_register(&new_io_device, stub_create_ch, stub_destroy_ch, 1606 sizeof(struct ut_bdev_channel), NULL); 1607 second_bdev = calloc(1, sizeof(*second_bdev)); 1608 SPDK_CU_ASSERT_FATAL(second_bdev != NULL); 1609 register_bdev(second_bdev, "ut_bdev2", &new_io_device); 1610 spdk_bdev_open_ext("ut_bdev2", true, _bdev_event_cb, NULL, &second_desc); 1611 SPDK_CU_ASSERT_FATAL(second_desc != NULL); 1612 1613 set_thread(0); 1614 io_ch = spdk_bdev_get_io_channel(g_desc); 1615 bdev_ch = spdk_io_channel_get_ctx(io_ch); 1616 ut_ch = spdk_io_channel_get_ctx(bdev_ch->channel); 1617 ut_ch->avail_cnt = AVAIL; 1618 1619 /* Different io_target should imply a different shared_resource */ 1620 second_ch = spdk_bdev_get_io_channel(second_desc); 1621 second_bdev_ch = spdk_io_channel_get_ctx(second_ch); 1622 SPDK_CU_ASSERT_FATAL(bdev_ch->shared_resource != second_bdev_ch->shared_resource); 1623 1624 /* Saturate io_target through bdev A. */ 1625 for (i = 0; i < AVAIL; i++) { 1626 status[i] = SPDK_BDEV_IO_STATUS_PENDING; 1627 rc = spdk_bdev_read_blocks(g_desc, io_ch, NULL, 0, 1, enomem_done, &status[i]); 1628 CU_ASSERT(rc == 0); 1629 } 1630 CU_ASSERT(TAILQ_EMPTY(&bdev_ch->shared_resource->nomem_io)); 1631 1632 /* Issue one more I/O to fill ENOMEM list. */ 1633 status[AVAIL] = SPDK_BDEV_IO_STATUS_PENDING; 1634 rc = spdk_bdev_read_blocks(g_desc, io_ch, NULL, 0, 1, enomem_done, &status[AVAIL]); 1635 CU_ASSERT(rc == 0); 1636 SPDK_CU_ASSERT_FATAL(!TAILQ_EMPTY(&bdev_ch->shared_resource->nomem_io)); 1637 1638 /* 1639 * Now submit I/O through the second bdev. This should go through and complete 1640 * successfully because we're using a different io_device underneath. 1641 */ 1642 status[AVAIL] = SPDK_BDEV_IO_STATUS_PENDING; 1643 rc = spdk_bdev_read_blocks(second_desc, second_ch, NULL, 0, 1, enomem_done, &status[AVAIL]); 1644 CU_ASSERT(rc == 0); 1645 SPDK_CU_ASSERT_FATAL(TAILQ_EMPTY(&second_bdev_ch->shared_resource->nomem_io)); 1646 stub_complete_io(second_bdev->io_target, 1); 1647 1648 /* Cleanup; Complete outstanding I/O. */ 1649 stub_complete_io(g_bdev.io_target, AVAIL); 1650 SPDK_CU_ASSERT_FATAL(TAILQ_EMPTY(&bdev_ch->shared_resource->nomem_io)); 1651 /* Complete the ENOMEM I/O */ 1652 stub_complete_io(g_bdev.io_target, 1); 1653 CU_ASSERT(bdev_ch->shared_resource->io_outstanding == 0); 1654 1655 SPDK_CU_ASSERT_FATAL(TAILQ_EMPTY(&bdev_ch->shared_resource->nomem_io)); 1656 CU_ASSERT(bdev_ch->shared_resource->io_outstanding == 0); 1657 spdk_put_io_channel(io_ch); 1658 spdk_put_io_channel(second_ch); 1659 spdk_bdev_close(second_desc); 1660 unregister_bdev(second_bdev); 1661 spdk_io_device_unregister(&new_io_device, NULL); 1662 poll_threads(); 1663 free(second_bdev); 1664 teardown_test(); 1665 } 1666 1667 static void 1668 enomem_retry_during_abort(void) 1669 { 1670 struct spdk_io_channel *io_ch; 1671 struct spdk_bdev_channel *bdev_ch; 1672 struct spdk_bdev_shared_resource *shared_resource; 1673 struct ut_bdev_channel *ut_ch; 1674 const uint32_t IO_ARRAY_SIZE = 16; 1675 enum spdk_bdev_io_status status[IO_ARRAY_SIZE], status_reset; 1676 uint32_t i; 1677 int rc; 1678 1679 setup_test(); 1680 1681 set_thread(0); 1682 io_ch = spdk_bdev_get_io_channel(g_desc); 1683 bdev_ch = spdk_io_channel_get_ctx(io_ch); 1684 shared_resource = bdev_ch->shared_resource; 1685 ut_ch = spdk_io_channel_get_ctx(bdev_ch->channel); 1686 ut_ch->avail_cnt = 0; 1687 1688 /** 1689 * Submit a number of IOs. 1690 * All of these I/Os will queue in nomem_io list due to ut_ch->avail_cnt == 0. 1691 */ 1692 for (i = 0; i < IO_ARRAY_SIZE; i++) { 1693 status[i] = SPDK_BDEV_IO_STATUS_PENDING; 1694 rc = spdk_bdev_read_blocks(g_desc, io_ch, NULL, 0, 1, enomem_done, &status[i]); 1695 CU_ASSERT(rc == 0); 1696 } 1697 CU_ASSERT(bdev_io_tailq_cnt(&shared_resource->nomem_io) == IO_ARRAY_SIZE); 1698 CU_ASSERT(shared_resource->io_outstanding == 0); 1699 1700 /* Allow some I/Os to be submitted. */ 1701 ut_ch->avail_cnt = IO_ARRAY_SIZE / 2; 1702 1703 /* Submit a reset to abort the I/Os. */ 1704 status_reset = SPDK_BDEV_IO_STATUS_PENDING; 1705 rc = spdk_bdev_reset(g_desc, io_ch, enomem_done, &status_reset); 1706 poll_threads(); 1707 CU_ASSERT(rc == 0); 1708 1709 /* Complete the reset. */ 1710 stub_complete_io(g_bdev.io_target, 1); 1711 poll_threads(); 1712 CU_ASSERT(status_reset == SPDK_BDEV_IO_STATUS_SUCCESS); 1713 1714 /* All I/Os are aborted. */ 1715 for (i = 0; i < IO_ARRAY_SIZE; i++) { 1716 CU_ASSERT(status[i] == SPDK_BDEV_IO_STATUS_FAILED); 1717 } 1718 1719 CU_ASSERT(bdev_io_tailq_cnt(&shared_resource->nomem_io) == 0); 1720 CU_ASSERT(shared_resource->io_outstanding == 0); 1721 1722 spdk_put_io_channel(io_ch); 1723 poll_threads(); 1724 teardown_test(); 1725 } 1726 1727 static void 1728 qos_dynamic_enable_done(void *cb_arg, int status) 1729 { 1730 int *rc = cb_arg; 1731 *rc = status; 1732 } 1733 1734 static void 1735 qos_dynamic_enable(void) 1736 { 1737 struct spdk_io_channel *io_ch[2]; 1738 struct spdk_bdev_channel *bdev_ch[2]; 1739 struct spdk_bdev *bdev; 1740 enum spdk_bdev_io_status bdev_io_status[2]; 1741 uint64_t limits[SPDK_BDEV_QOS_NUM_RATE_LIMIT_TYPES] = {}; 1742 int status, second_status, rc, i; 1743 1744 setup_test(); 1745 MOCK_SET(spdk_get_ticks, 0); 1746 1747 for (i = 0; i < SPDK_BDEV_QOS_NUM_RATE_LIMIT_TYPES; i++) { 1748 limits[i] = UINT64_MAX; 1749 } 1750 1751 bdev = &g_bdev.bdev; 1752 1753 g_get_io_channel = true; 1754 1755 /* Create channels */ 1756 set_thread(0); 1757 io_ch[0] = spdk_bdev_get_io_channel(g_desc); 1758 bdev_ch[0] = spdk_io_channel_get_ctx(io_ch[0]); 1759 CU_ASSERT(bdev_ch[0]->flags == 0); 1760 1761 set_thread(1); 1762 io_ch[1] = spdk_bdev_get_io_channel(g_desc); 1763 bdev_ch[1] = spdk_io_channel_get_ctx(io_ch[1]); 1764 CU_ASSERT(bdev_ch[1]->flags == 0); 1765 1766 set_thread(0); 1767 1768 /* 1769 * Enable QoS: Read/Write IOPS, Read/Write byte, 1770 * Read only byte and Write only byte per second 1771 * rate limits. 1772 * More than 10 I/Os allowed per timeslice. 1773 */ 1774 status = -1; 1775 limits[SPDK_BDEV_QOS_RW_IOPS_RATE_LIMIT] = 10000; 1776 limits[SPDK_BDEV_QOS_RW_BPS_RATE_LIMIT] = 100; 1777 limits[SPDK_BDEV_QOS_R_BPS_RATE_LIMIT] = 100; 1778 limits[SPDK_BDEV_QOS_W_BPS_RATE_LIMIT] = 10; 1779 spdk_bdev_set_qos_rate_limits(bdev, limits, qos_dynamic_enable_done, &status); 1780 poll_threads(); 1781 CU_ASSERT(status == 0); 1782 CU_ASSERT((bdev_ch[0]->flags & BDEV_CH_QOS_ENABLED) != 0); 1783 CU_ASSERT((bdev_ch[1]->flags & BDEV_CH_QOS_ENABLED) != 0); 1784 1785 /* 1786 * Submit and complete 10 I/O to fill the QoS allotment for this timeslice. 1787 * Additional I/O will then be queued. 1788 */ 1789 set_thread(0); 1790 for (i = 0; i < 10; i++) { 1791 bdev_io_status[0] = SPDK_BDEV_IO_STATUS_PENDING; 1792 rc = spdk_bdev_read_blocks(g_desc, io_ch[0], NULL, 0, 1, io_during_io_done, &bdev_io_status[0]); 1793 CU_ASSERT(rc == 0); 1794 CU_ASSERT(bdev_io_status[0] == SPDK_BDEV_IO_STATUS_PENDING); 1795 poll_thread(0); 1796 stub_complete_io(g_bdev.io_target, 0); 1797 CU_ASSERT(bdev_io_status[0] == SPDK_BDEV_IO_STATUS_SUCCESS); 1798 } 1799 1800 /* 1801 * Send two more I/O. These I/O will be queued since the current timeslice allotment has been 1802 * filled already. We want to test that when QoS is disabled that these two I/O: 1803 * 1) are not aborted 1804 * 2) are sent back to their original thread for resubmission 1805 */ 1806 bdev_io_status[0] = SPDK_BDEV_IO_STATUS_PENDING; 1807 rc = spdk_bdev_read_blocks(g_desc, io_ch[0], NULL, 0, 1, io_during_io_done, &bdev_io_status[0]); 1808 CU_ASSERT(rc == 0); 1809 CU_ASSERT(bdev_io_status[0] == SPDK_BDEV_IO_STATUS_PENDING); 1810 set_thread(1); 1811 bdev_io_status[1] = SPDK_BDEV_IO_STATUS_PENDING; 1812 rc = spdk_bdev_read_blocks(g_desc, io_ch[1], NULL, 0, 1, io_during_io_done, &bdev_io_status[1]); 1813 CU_ASSERT(rc == 0); 1814 CU_ASSERT(bdev_io_status[1] == SPDK_BDEV_IO_STATUS_PENDING); 1815 poll_threads(); 1816 1817 /* 1818 * Disable QoS: Read/Write IOPS, Read/Write byte, 1819 * Read only byte rate limits 1820 */ 1821 status = -1; 1822 limits[SPDK_BDEV_QOS_RW_IOPS_RATE_LIMIT] = 0; 1823 limits[SPDK_BDEV_QOS_RW_BPS_RATE_LIMIT] = 0; 1824 limits[SPDK_BDEV_QOS_R_BPS_RATE_LIMIT] = 0; 1825 spdk_bdev_set_qos_rate_limits(bdev, limits, qos_dynamic_enable_done, &status); 1826 poll_threads(); 1827 CU_ASSERT(status == 0); 1828 CU_ASSERT((bdev_ch[0]->flags & BDEV_CH_QOS_ENABLED) != 0); 1829 CU_ASSERT((bdev_ch[1]->flags & BDEV_CH_QOS_ENABLED) != 0); 1830 1831 /* Disable QoS: Write only Byte per second rate limit */ 1832 status = -1; 1833 limits[SPDK_BDEV_QOS_W_BPS_RATE_LIMIT] = 0; 1834 spdk_bdev_set_qos_rate_limits(bdev, limits, qos_dynamic_enable_done, &status); 1835 poll_threads(); 1836 CU_ASSERT(status == 0); 1837 CU_ASSERT((bdev_ch[0]->flags & BDEV_CH_QOS_ENABLED) == 0); 1838 CU_ASSERT((bdev_ch[1]->flags & BDEV_CH_QOS_ENABLED) == 0); 1839 1840 /* 1841 * All I/O should have been resubmitted back on their original thread. Complete 1842 * all I/O on thread 0, and ensure that only the thread 0 I/O was completed. 1843 */ 1844 set_thread(0); 1845 stub_complete_io(g_bdev.io_target, 0); 1846 poll_threads(); 1847 CU_ASSERT(bdev_io_status[0] == SPDK_BDEV_IO_STATUS_SUCCESS); 1848 CU_ASSERT(bdev_io_status[1] == SPDK_BDEV_IO_STATUS_PENDING); 1849 1850 /* Now complete all I/O on thread 1 and ensure the thread 1 I/O was completed. */ 1851 set_thread(1); 1852 stub_complete_io(g_bdev.io_target, 0); 1853 poll_threads(); 1854 CU_ASSERT(bdev_io_status[1] == SPDK_BDEV_IO_STATUS_SUCCESS); 1855 1856 /* Disable QoS again */ 1857 status = -1; 1858 limits[SPDK_BDEV_QOS_RW_IOPS_RATE_LIMIT] = 0; 1859 spdk_bdev_set_qos_rate_limits(bdev, limits, qos_dynamic_enable_done, &status); 1860 poll_threads(); 1861 CU_ASSERT(status == 0); /* This should succeed */ 1862 CU_ASSERT((bdev_ch[0]->flags & BDEV_CH_QOS_ENABLED) == 0); 1863 CU_ASSERT((bdev_ch[1]->flags & BDEV_CH_QOS_ENABLED) == 0); 1864 1865 /* Enable QoS on thread 0 */ 1866 status = -1; 1867 limits[SPDK_BDEV_QOS_RW_IOPS_RATE_LIMIT] = 10000; 1868 spdk_bdev_set_qos_rate_limits(bdev, limits, qos_dynamic_enable_done, &status); 1869 poll_threads(); 1870 CU_ASSERT(status == 0); 1871 CU_ASSERT((bdev_ch[0]->flags & BDEV_CH_QOS_ENABLED) != 0); 1872 CU_ASSERT((bdev_ch[1]->flags & BDEV_CH_QOS_ENABLED) != 0); 1873 1874 /* Disable QoS on thread 1 */ 1875 set_thread(1); 1876 status = -1; 1877 limits[SPDK_BDEV_QOS_RW_IOPS_RATE_LIMIT] = 0; 1878 spdk_bdev_set_qos_rate_limits(bdev, limits, qos_dynamic_enable_done, &status); 1879 /* Don't poll yet. This should leave the channels with QoS enabled */ 1880 CU_ASSERT(status == -1); 1881 CU_ASSERT((bdev_ch[0]->flags & BDEV_CH_QOS_ENABLED) != 0); 1882 CU_ASSERT((bdev_ch[1]->flags & BDEV_CH_QOS_ENABLED) != 0); 1883 1884 /* Enable QoS. This should immediately fail because the previous disable QoS hasn't completed. */ 1885 second_status = 0; 1886 limits[SPDK_BDEV_QOS_RW_BPS_RATE_LIMIT] = 10; 1887 spdk_bdev_set_qos_rate_limits(bdev, limits, qos_dynamic_enable_done, &second_status); 1888 poll_threads(); 1889 CU_ASSERT(status == 0); /* The disable should succeed */ 1890 CU_ASSERT(second_status < 0); /* The enable should fail */ 1891 CU_ASSERT((bdev_ch[0]->flags & BDEV_CH_QOS_ENABLED) == 0); 1892 CU_ASSERT((bdev_ch[1]->flags & BDEV_CH_QOS_ENABLED) == 0); 1893 1894 /* Enable QoS on thread 1. This should succeed now that the disable has completed. */ 1895 status = -1; 1896 limits[SPDK_BDEV_QOS_RW_IOPS_RATE_LIMIT] = 10000; 1897 spdk_bdev_set_qos_rate_limits(bdev, limits, qos_dynamic_enable_done, &status); 1898 poll_threads(); 1899 CU_ASSERT(status == 0); 1900 CU_ASSERT((bdev_ch[0]->flags & BDEV_CH_QOS_ENABLED) != 0); 1901 CU_ASSERT((bdev_ch[1]->flags & BDEV_CH_QOS_ENABLED) != 0); 1902 1903 /* Tear down the channels */ 1904 set_thread(0); 1905 spdk_put_io_channel(io_ch[0]); 1906 set_thread(1); 1907 spdk_put_io_channel(io_ch[1]); 1908 poll_threads(); 1909 1910 set_thread(0); 1911 teardown_test(); 1912 } 1913 1914 static void 1915 histogram_status_cb(void *cb_arg, int status) 1916 { 1917 g_status = status; 1918 } 1919 1920 static void 1921 histogram_data_cb(void *cb_arg, int status, struct spdk_histogram_data *histogram) 1922 { 1923 g_status = status; 1924 g_histogram = histogram; 1925 } 1926 1927 static void 1928 histogram_io_count(void *ctx, uint64_t start, uint64_t end, uint64_t count, 1929 uint64_t total, uint64_t so_far) 1930 { 1931 g_count += count; 1932 } 1933 1934 static void 1935 bdev_histograms_mt(void) 1936 { 1937 struct spdk_io_channel *ch[2]; 1938 struct spdk_histogram_data *histogram; 1939 uint8_t buf[4096]; 1940 int status = false; 1941 int rc; 1942 1943 1944 setup_test(); 1945 1946 set_thread(0); 1947 ch[0] = spdk_bdev_get_io_channel(g_desc); 1948 CU_ASSERT(ch[0] != NULL); 1949 1950 set_thread(1); 1951 ch[1] = spdk_bdev_get_io_channel(g_desc); 1952 CU_ASSERT(ch[1] != NULL); 1953 1954 1955 /* Enable histogram */ 1956 spdk_bdev_histogram_enable(&g_bdev.bdev, histogram_status_cb, NULL, true); 1957 poll_threads(); 1958 CU_ASSERT(g_status == 0); 1959 CU_ASSERT(g_bdev.bdev.internal.histogram_enabled == true); 1960 1961 /* Allocate histogram */ 1962 histogram = spdk_histogram_data_alloc(); 1963 1964 /* Check if histogram is zeroed */ 1965 spdk_bdev_histogram_get(&g_bdev.bdev, histogram, histogram_data_cb, NULL); 1966 poll_threads(); 1967 CU_ASSERT(g_status == 0); 1968 SPDK_CU_ASSERT_FATAL(g_histogram != NULL); 1969 1970 g_count = 0; 1971 spdk_histogram_data_iterate(g_histogram, histogram_io_count, NULL); 1972 1973 CU_ASSERT(g_count == 0); 1974 1975 set_thread(0); 1976 rc = spdk_bdev_write_blocks(g_desc, ch[0], &buf, 0, 1, io_during_io_done, &status); 1977 CU_ASSERT(rc == 0); 1978 1979 spdk_delay_us(10); 1980 stub_complete_io(g_bdev.io_target, 1); 1981 poll_threads(); 1982 CU_ASSERT(status == true); 1983 1984 1985 set_thread(1); 1986 rc = spdk_bdev_read_blocks(g_desc, ch[1], &buf, 0, 1, io_during_io_done, &status); 1987 CU_ASSERT(rc == 0); 1988 1989 spdk_delay_us(10); 1990 stub_complete_io(g_bdev.io_target, 1); 1991 poll_threads(); 1992 CU_ASSERT(status == true); 1993 1994 set_thread(0); 1995 1996 /* Check if histogram gathered data from all I/O channels */ 1997 spdk_bdev_histogram_get(&g_bdev.bdev, histogram, histogram_data_cb, NULL); 1998 poll_threads(); 1999 CU_ASSERT(g_status == 0); 2000 CU_ASSERT(g_bdev.bdev.internal.histogram_enabled == true); 2001 SPDK_CU_ASSERT_FATAL(g_histogram != NULL); 2002 2003 g_count = 0; 2004 spdk_histogram_data_iterate(g_histogram, histogram_io_count, NULL); 2005 CU_ASSERT(g_count == 2); 2006 2007 /* Disable histogram */ 2008 spdk_bdev_histogram_enable(&g_bdev.bdev, histogram_status_cb, NULL, false); 2009 poll_threads(); 2010 CU_ASSERT(g_status == 0); 2011 CU_ASSERT(g_bdev.bdev.internal.histogram_enabled == false); 2012 2013 spdk_histogram_data_free(histogram); 2014 2015 /* Tear down the channels */ 2016 set_thread(0); 2017 spdk_put_io_channel(ch[0]); 2018 set_thread(1); 2019 spdk_put_io_channel(ch[1]); 2020 poll_threads(); 2021 set_thread(0); 2022 teardown_test(); 2023 2024 } 2025 2026 struct timeout_io_cb_arg { 2027 struct iovec iov; 2028 uint8_t type; 2029 }; 2030 2031 static int 2032 bdev_channel_count_submitted_io(struct spdk_bdev_channel *ch) 2033 { 2034 struct spdk_bdev_io *bdev_io; 2035 int n = 0; 2036 2037 if (!ch) { 2038 return -1; 2039 } 2040 2041 TAILQ_FOREACH(bdev_io, &ch->io_submitted, internal.ch_link) { 2042 n++; 2043 } 2044 2045 return n; 2046 } 2047 2048 static void 2049 bdev_channel_io_timeout_cb(void *cb_arg, struct spdk_bdev_io *bdev_io) 2050 { 2051 struct timeout_io_cb_arg *ctx = cb_arg; 2052 2053 ctx->type = bdev_io->type; 2054 ctx->iov.iov_base = bdev_io->iov.iov_base; 2055 ctx->iov.iov_len = bdev_io->iov.iov_len; 2056 } 2057 2058 static bool g_io_done; 2059 2060 static void 2061 io_done(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg) 2062 { 2063 g_io_done = true; 2064 spdk_bdev_free_io(bdev_io); 2065 } 2066 2067 static void 2068 bdev_set_io_timeout_mt(void) 2069 { 2070 struct spdk_io_channel *ch[3]; 2071 struct spdk_bdev_channel *bdev_ch[3]; 2072 struct timeout_io_cb_arg cb_arg; 2073 2074 setup_test(); 2075 2076 g_bdev.bdev.optimal_io_boundary = 16; 2077 g_bdev.bdev.split_on_optimal_io_boundary = true; 2078 2079 set_thread(0); 2080 ch[0] = spdk_bdev_get_io_channel(g_desc); 2081 CU_ASSERT(ch[0] != NULL); 2082 2083 set_thread(1); 2084 ch[1] = spdk_bdev_get_io_channel(g_desc); 2085 CU_ASSERT(ch[1] != NULL); 2086 2087 set_thread(2); 2088 ch[2] = spdk_bdev_get_io_channel(g_desc); 2089 CU_ASSERT(ch[2] != NULL); 2090 2091 /* Multi-thread mode 2092 * 1, Check the poller was registered successfully 2093 * 2, Check the timeout IO and ensure the IO was the submitted by user 2094 * 3, Check the link int the bdev_ch works right. 2095 * 4, Close desc and put io channel during the timeout poller is polling 2096 */ 2097 2098 /* In desc thread set the timeout */ 2099 set_thread(0); 2100 CU_ASSERT(spdk_bdev_set_timeout(g_desc, 5, bdev_channel_io_timeout_cb, &cb_arg) == 0); 2101 CU_ASSERT(g_desc->io_timeout_poller != NULL); 2102 CU_ASSERT(g_desc->cb_fn == bdev_channel_io_timeout_cb); 2103 CU_ASSERT(g_desc->cb_arg == &cb_arg); 2104 2105 /* check the IO submitted list and timeout handler */ 2106 CU_ASSERT(spdk_bdev_read_blocks(g_desc, ch[0], (void *)0x2000, 0, 1, io_done, NULL) == 0); 2107 bdev_ch[0] = spdk_io_channel_get_ctx(ch[0]); 2108 CU_ASSERT(bdev_channel_count_submitted_io(bdev_ch[0]) == 1); 2109 2110 set_thread(1); 2111 CU_ASSERT(spdk_bdev_write_blocks(g_desc, ch[1], (void *)0x1000, 0, 1, io_done, NULL) == 0); 2112 bdev_ch[1] = spdk_io_channel_get_ctx(ch[1]); 2113 CU_ASSERT(bdev_channel_count_submitted_io(bdev_ch[1]) == 1); 2114 2115 /* Now test that a single-vector command is split correctly. 2116 * Offset 14, length 8, payload 0xF000 2117 * Child - Offset 14, length 2, payload 0xF000 2118 * Child - Offset 16, length 6, payload 0xF000 + 2 * 512 2119 * 2120 * Set up the expected values before calling spdk_bdev_read_blocks 2121 */ 2122 set_thread(2); 2123 CU_ASSERT(spdk_bdev_read_blocks(g_desc, ch[2], (void *)0xF000, 14, 8, io_done, NULL) == 0); 2124 bdev_ch[2] = spdk_io_channel_get_ctx(ch[2]); 2125 CU_ASSERT(bdev_channel_count_submitted_io(bdev_ch[2]) == 3); 2126 2127 set_thread(0); 2128 memset(&cb_arg, 0, sizeof(cb_arg)); 2129 spdk_delay_us(3 * spdk_get_ticks_hz()); 2130 poll_threads(); 2131 CU_ASSERT(cb_arg.type == 0); 2132 CU_ASSERT(cb_arg.iov.iov_base == (void *)0x0); 2133 CU_ASSERT(cb_arg.iov.iov_len == 0); 2134 2135 /* Now the time reach the limit */ 2136 spdk_delay_us(3 * spdk_get_ticks_hz()); 2137 poll_thread(0); 2138 CU_ASSERT(cb_arg.type == SPDK_BDEV_IO_TYPE_READ); 2139 CU_ASSERT(cb_arg.iov.iov_base == (void *)0x2000); 2140 CU_ASSERT(cb_arg.iov.iov_len == 1 * g_bdev.bdev.blocklen); 2141 stub_complete_io(g_bdev.io_target, 1); 2142 CU_ASSERT(bdev_channel_count_submitted_io(bdev_ch[0]) == 0); 2143 2144 memset(&cb_arg, 0, sizeof(cb_arg)); 2145 set_thread(1); 2146 poll_thread(1); 2147 CU_ASSERT(cb_arg.type == SPDK_BDEV_IO_TYPE_WRITE); 2148 CU_ASSERT(cb_arg.iov.iov_base == (void *)0x1000); 2149 CU_ASSERT(cb_arg.iov.iov_len == 1 * g_bdev.bdev.blocklen); 2150 stub_complete_io(g_bdev.io_target, 1); 2151 CU_ASSERT(bdev_channel_count_submitted_io(bdev_ch[1]) == 0); 2152 2153 memset(&cb_arg, 0, sizeof(cb_arg)); 2154 set_thread(2); 2155 poll_thread(2); 2156 CU_ASSERT(cb_arg.type == SPDK_BDEV_IO_TYPE_READ); 2157 CU_ASSERT(cb_arg.iov.iov_base == (void *)0xF000); 2158 CU_ASSERT(cb_arg.iov.iov_len == 8 * g_bdev.bdev.blocklen); 2159 stub_complete_io(g_bdev.io_target, 1); 2160 CU_ASSERT(bdev_channel_count_submitted_io(bdev_ch[2]) == 2); 2161 stub_complete_io(g_bdev.io_target, 1); 2162 CU_ASSERT(bdev_channel_count_submitted_io(bdev_ch[2]) == 0); 2163 2164 /* Run poll_timeout_done() it means complete the timeout poller */ 2165 set_thread(0); 2166 poll_thread(0); 2167 CU_ASSERT(g_desc->refs == 0); 2168 CU_ASSERT(spdk_bdev_read_blocks(g_desc, ch[0], (void *)0x1000, 0, 1, io_done, NULL) == 0); 2169 set_thread(1); 2170 CU_ASSERT(spdk_bdev_write_blocks(g_desc, ch[1], (void *)0x2000, 0, 2, io_done, NULL) == 0); 2171 set_thread(2); 2172 CU_ASSERT(spdk_bdev_read_blocks(g_desc, ch[2], (void *)0x3000, 0, 3, io_done, NULL) == 0); 2173 2174 /* Trigger timeout poller to run again, desc->refs is incremented. 2175 * In thread 0 we destroy the io channel before timeout poller runs. 2176 * Timeout callback is not called on thread 0. 2177 */ 2178 spdk_delay_us(6 * spdk_get_ticks_hz()); 2179 memset(&cb_arg, 0, sizeof(cb_arg)); 2180 set_thread(0); 2181 stub_complete_io(g_bdev.io_target, 1); 2182 spdk_put_io_channel(ch[0]); 2183 poll_thread(0); 2184 CU_ASSERT(g_desc->refs == 1) 2185 CU_ASSERT(cb_arg.type == 0); 2186 CU_ASSERT(cb_arg.iov.iov_base == (void *)0x0); 2187 CU_ASSERT(cb_arg.iov.iov_len == 0); 2188 2189 /* In thread 1 timeout poller runs then we destroy the io channel 2190 * Timeout callback is called on thread 1. 2191 */ 2192 memset(&cb_arg, 0, sizeof(cb_arg)); 2193 set_thread(1); 2194 poll_thread(1); 2195 stub_complete_io(g_bdev.io_target, 1); 2196 spdk_put_io_channel(ch[1]); 2197 poll_thread(1); 2198 CU_ASSERT(cb_arg.type == SPDK_BDEV_IO_TYPE_WRITE); 2199 CU_ASSERT(cb_arg.iov.iov_base == (void *)0x2000); 2200 CU_ASSERT(cb_arg.iov.iov_len == 2 * g_bdev.bdev.blocklen); 2201 2202 /* Close the desc. 2203 * Unregister the timeout poller first. 2204 * Then decrement desc->refs but it's not zero yet so desc is not freed. 2205 */ 2206 set_thread(0); 2207 spdk_bdev_close(g_desc); 2208 CU_ASSERT(g_desc->refs == 1); 2209 CU_ASSERT(g_desc->io_timeout_poller == NULL); 2210 2211 /* Timeout poller runs on thread 2 then we destroy the io channel. 2212 * Desc is closed so we would exit the timeout poller directly. 2213 * timeout callback is not called on thread 2. 2214 */ 2215 memset(&cb_arg, 0, sizeof(cb_arg)); 2216 set_thread(2); 2217 poll_thread(2); 2218 stub_complete_io(g_bdev.io_target, 1); 2219 spdk_put_io_channel(ch[2]); 2220 poll_thread(2); 2221 CU_ASSERT(cb_arg.type == 0); 2222 CU_ASSERT(cb_arg.iov.iov_base == (void *)0x0); 2223 CU_ASSERT(cb_arg.iov.iov_len == 0); 2224 2225 set_thread(0); 2226 poll_thread(0); 2227 g_teardown_done = false; 2228 unregister_bdev(&g_bdev); 2229 spdk_io_device_unregister(&g_io_device, NULL); 2230 spdk_bdev_finish(finish_cb, NULL); 2231 spdk_iobuf_finish(finish_cb, NULL); 2232 poll_threads(); 2233 memset(&g_bdev, 0, sizeof(g_bdev)); 2234 CU_ASSERT(g_teardown_done == true); 2235 g_teardown_done = false; 2236 free_threads(); 2237 free_cores(); 2238 } 2239 2240 static bool g_io_done2; 2241 static bool g_lock_lba_range_done; 2242 static bool g_unlock_lba_range_done; 2243 2244 static void 2245 io_done2(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg) 2246 { 2247 g_io_done2 = true; 2248 spdk_bdev_free_io(bdev_io); 2249 } 2250 2251 static void 2252 lock_lba_range_done(struct lba_range *range, void *ctx, int status) 2253 { 2254 g_lock_lba_range_done = true; 2255 } 2256 2257 static void 2258 unlock_lba_range_done(struct lba_range *range, void *ctx, int status) 2259 { 2260 g_unlock_lba_range_done = true; 2261 } 2262 2263 static uint32_t 2264 stub_channel_outstanding_cnt(void *io_target) 2265 { 2266 struct spdk_io_channel *_ch = spdk_get_io_channel(io_target); 2267 struct ut_bdev_channel *ch = spdk_io_channel_get_ctx(_ch); 2268 uint32_t outstanding_cnt; 2269 2270 outstanding_cnt = ch->outstanding_cnt; 2271 2272 spdk_put_io_channel(_ch); 2273 return outstanding_cnt; 2274 } 2275 2276 static void 2277 lock_lba_range_then_submit_io(void) 2278 { 2279 struct spdk_bdev_desc *desc = NULL; 2280 void *io_target; 2281 struct spdk_io_channel *io_ch[3]; 2282 struct spdk_bdev_channel *bdev_ch[3]; 2283 struct lba_range *range; 2284 char buf[4096]; 2285 int ctx0, ctx1, ctx2; 2286 int rc; 2287 2288 setup_test(); 2289 2290 io_target = g_bdev.io_target; 2291 desc = g_desc; 2292 2293 set_thread(0); 2294 io_ch[0] = spdk_bdev_get_io_channel(desc); 2295 bdev_ch[0] = spdk_io_channel_get_ctx(io_ch[0]); 2296 CU_ASSERT(io_ch[0] != NULL); 2297 2298 set_thread(1); 2299 io_ch[1] = spdk_bdev_get_io_channel(desc); 2300 bdev_ch[1] = spdk_io_channel_get_ctx(io_ch[1]); 2301 CU_ASSERT(io_ch[1] != NULL); 2302 2303 set_thread(0); 2304 g_lock_lba_range_done = false; 2305 rc = bdev_lock_lba_range(desc, io_ch[0], 20, 10, lock_lba_range_done, &ctx0); 2306 CU_ASSERT(rc == 0); 2307 poll_threads(); 2308 2309 /* The lock should immediately become valid, since there are no outstanding 2310 * write I/O. 2311 */ 2312 CU_ASSERT(g_lock_lba_range_done == true); 2313 range = TAILQ_FIRST(&bdev_ch[0]->locked_ranges); 2314 SPDK_CU_ASSERT_FATAL(range != NULL); 2315 CU_ASSERT(range->offset == 20); 2316 CU_ASSERT(range->length == 10); 2317 CU_ASSERT(range->owner_ch == bdev_ch[0]); 2318 2319 g_io_done = false; 2320 CU_ASSERT(TAILQ_EMPTY(&bdev_ch[0]->io_locked)); 2321 rc = spdk_bdev_read_blocks(desc, io_ch[0], buf, 20, 1, io_done, &ctx0); 2322 CU_ASSERT(rc == 0); 2323 CU_ASSERT(stub_channel_outstanding_cnt(io_target) == 1); 2324 2325 stub_complete_io(io_target, 1); 2326 poll_threads(); 2327 CU_ASSERT(g_io_done == true); 2328 CU_ASSERT(TAILQ_EMPTY(&bdev_ch[0]->io_locked)); 2329 2330 /* Try a write I/O. This should actually be allowed to execute, since the channel 2331 * holding the lock is submitting the write I/O. 2332 */ 2333 g_io_done = false; 2334 CU_ASSERT(TAILQ_EMPTY(&bdev_ch[0]->io_locked)); 2335 rc = spdk_bdev_write_blocks(desc, io_ch[0], buf, 20, 1, io_done, &ctx0); 2336 CU_ASSERT(rc == 0); 2337 CU_ASSERT(stub_channel_outstanding_cnt(io_target) == 1); 2338 2339 stub_complete_io(io_target, 1); 2340 poll_threads(); 2341 CU_ASSERT(g_io_done == true); 2342 CU_ASSERT(TAILQ_EMPTY(&bdev_ch[0]->io_locked)); 2343 2344 /* Try a write I/O. This should get queued in the io_locked tailq. */ 2345 set_thread(1); 2346 g_io_done = false; 2347 CU_ASSERT(TAILQ_EMPTY(&bdev_ch[1]->io_locked)); 2348 rc = spdk_bdev_write_blocks(desc, io_ch[1], buf, 20, 1, io_done, &ctx1); 2349 CU_ASSERT(rc == 0); 2350 poll_threads(); 2351 CU_ASSERT(stub_channel_outstanding_cnt(io_target) == 0); 2352 CU_ASSERT(!TAILQ_EMPTY(&bdev_ch[1]->io_locked)); 2353 CU_ASSERT(g_io_done == false); 2354 2355 /* Try to unlock the lba range using thread 1's io_ch. This should fail. */ 2356 rc = bdev_unlock_lba_range(desc, io_ch[1], 20, 10, unlock_lba_range_done, &ctx1); 2357 CU_ASSERT(rc == -EINVAL); 2358 2359 /* Now create a new channel and submit a write I/O with it. This should also be queued. 2360 * The new channel should inherit the active locks from the bdev's internal list. 2361 */ 2362 set_thread(2); 2363 io_ch[2] = spdk_bdev_get_io_channel(desc); 2364 bdev_ch[2] = spdk_io_channel_get_ctx(io_ch[2]); 2365 CU_ASSERT(io_ch[2] != NULL); 2366 2367 g_io_done2 = false; 2368 CU_ASSERT(TAILQ_EMPTY(&bdev_ch[2]->io_locked)); 2369 rc = spdk_bdev_write_blocks(desc, io_ch[2], buf, 22, 2, io_done2, &ctx2); 2370 CU_ASSERT(rc == 0); 2371 poll_threads(); 2372 CU_ASSERT(stub_channel_outstanding_cnt(io_target) == 0); 2373 CU_ASSERT(!TAILQ_EMPTY(&bdev_ch[2]->io_locked)); 2374 CU_ASSERT(g_io_done2 == false); 2375 2376 set_thread(0); 2377 rc = bdev_unlock_lba_range(desc, io_ch[0], 20, 10, unlock_lba_range_done, &ctx0); 2378 CU_ASSERT(rc == 0); 2379 poll_threads(); 2380 CU_ASSERT(TAILQ_EMPTY(&bdev_ch[0]->locked_ranges)); 2381 2382 /* The LBA range is unlocked, so the write IOs should now have started execution. */ 2383 CU_ASSERT(TAILQ_EMPTY(&bdev_ch[1]->io_locked)); 2384 CU_ASSERT(TAILQ_EMPTY(&bdev_ch[2]->io_locked)); 2385 2386 set_thread(1); 2387 CU_ASSERT(stub_channel_outstanding_cnt(io_target) == 1); 2388 stub_complete_io(io_target, 1); 2389 set_thread(2); 2390 CU_ASSERT(stub_channel_outstanding_cnt(io_target) == 1); 2391 stub_complete_io(io_target, 1); 2392 2393 poll_threads(); 2394 CU_ASSERT(g_io_done == true); 2395 CU_ASSERT(g_io_done2 == true); 2396 2397 /* Tear down the channels */ 2398 set_thread(0); 2399 spdk_put_io_channel(io_ch[0]); 2400 set_thread(1); 2401 spdk_put_io_channel(io_ch[1]); 2402 set_thread(2); 2403 spdk_put_io_channel(io_ch[2]); 2404 poll_threads(); 2405 set_thread(0); 2406 teardown_test(); 2407 } 2408 2409 /* spdk_bdev_reset() freezes and unfreezes I/O channels by using spdk_for_each_channel(). 2410 * spdk_bdev_unregister() calls spdk_io_device_unregister() in the end. However 2411 * spdk_io_device_unregister() fails if it is called while executing spdk_for_each_channel(). 2412 * Hence, in this case, spdk_io_device_unregister() is deferred until spdk_bdev_reset() 2413 * completes. Test this behavior. 2414 */ 2415 static void 2416 unregister_during_reset(void) 2417 { 2418 struct spdk_io_channel *io_ch[2]; 2419 bool done_reset = false, done_unregister = false; 2420 int rc; 2421 2422 setup_test(); 2423 set_thread(0); 2424 2425 io_ch[0] = spdk_bdev_get_io_channel(g_desc); 2426 SPDK_CU_ASSERT_FATAL(io_ch[0] != NULL); 2427 2428 set_thread(1); 2429 2430 io_ch[1] = spdk_bdev_get_io_channel(g_desc); 2431 SPDK_CU_ASSERT_FATAL(io_ch[1] != NULL); 2432 2433 set_thread(0); 2434 2435 CU_ASSERT(g_bdev.bdev.internal.reset_in_progress == NULL); 2436 2437 rc = spdk_bdev_reset(g_desc, io_ch[0], reset_done, &done_reset); 2438 CU_ASSERT(rc == 0); 2439 2440 set_thread(0); 2441 2442 poll_thread_times(0, 1); 2443 2444 spdk_bdev_close(g_desc); 2445 spdk_bdev_unregister(&g_bdev.bdev, _bdev_unregistered, &done_unregister); 2446 2447 CU_ASSERT(done_reset == false); 2448 CU_ASSERT(done_unregister == false); 2449 2450 poll_threads(); 2451 2452 stub_complete_io(g_bdev.io_target, 0); 2453 2454 poll_threads(); 2455 2456 CU_ASSERT(done_reset == true); 2457 CU_ASSERT(done_unregister == false); 2458 2459 spdk_put_io_channel(io_ch[0]); 2460 2461 set_thread(1); 2462 2463 spdk_put_io_channel(io_ch[1]); 2464 2465 poll_threads(); 2466 2467 CU_ASSERT(done_unregister == true); 2468 2469 /* Restore the original g_bdev so that we can use teardown_test(). */ 2470 set_thread(0); 2471 register_bdev(&g_bdev, "ut_bdev", &g_io_device); 2472 spdk_bdev_open_ext("ut_bdev", true, _bdev_event_cb, NULL, &g_desc); 2473 teardown_test(); 2474 } 2475 2476 static void 2477 bdev_init_wt_cb(void *done, int rc) 2478 { 2479 } 2480 2481 static int 2482 wrong_thread_setup(void) 2483 { 2484 allocate_cores(1); 2485 allocate_threads(2); 2486 set_thread(0); 2487 2488 spdk_io_device_register(&g_accel_io_device, ut_accel_ch_create_cb, 2489 ut_accel_ch_destroy_cb, 0, NULL); 2490 spdk_bdev_initialize(bdev_init_wt_cb, NULL); 2491 spdk_io_device_register(&g_io_device, stub_create_ch, stub_destroy_ch, 2492 sizeof(struct ut_bdev_channel), NULL); 2493 2494 set_thread(1); 2495 2496 return 0; 2497 } 2498 2499 static int 2500 wrong_thread_teardown(void) 2501 { 2502 int rc = 0; 2503 2504 set_thread(0); 2505 2506 g_teardown_done = false; 2507 spdk_io_device_unregister(&g_io_device, NULL); 2508 spdk_bdev_finish(finish_cb, NULL); 2509 poll_threads(); 2510 memset(&g_bdev, 0, sizeof(g_bdev)); 2511 if (!g_teardown_done) { 2512 fprintf(stderr, "%s:%d %s: teardown not done\n", __FILE__, __LINE__, __func__); 2513 rc = -1; 2514 } 2515 g_teardown_done = false; 2516 2517 spdk_io_device_unregister(&g_accel_io_device, NULL); 2518 free_threads(); 2519 free_cores(); 2520 2521 return rc; 2522 } 2523 2524 static void 2525 _bdev_unregistered_wt(void *ctx, int rc) 2526 { 2527 struct spdk_thread **threadp = ctx; 2528 2529 *threadp = spdk_get_thread(); 2530 } 2531 2532 static void 2533 spdk_bdev_register_wt(void) 2534 { 2535 struct spdk_bdev bdev = { 0 }; 2536 int rc; 2537 struct spdk_thread *unreg_thread; 2538 2539 bdev.name = "wt_bdev"; 2540 bdev.fn_table = &fn_table; 2541 bdev.module = &bdev_ut_if; 2542 bdev.blocklen = 4096; 2543 bdev.blockcnt = 1024; 2544 2545 /* Can register only on app thread */ 2546 rc = spdk_bdev_register(&bdev); 2547 CU_ASSERT(rc == -EINVAL); 2548 2549 /* Can unregister on any thread */ 2550 set_thread(0); 2551 rc = spdk_bdev_register(&bdev); 2552 CU_ASSERT(rc == 0); 2553 set_thread(1); 2554 unreg_thread = NULL; 2555 spdk_bdev_unregister(&bdev, _bdev_unregistered_wt, &unreg_thread); 2556 poll_threads(); 2557 CU_ASSERT(unreg_thread == spdk_get_thread()); 2558 2559 /* Can unregister by name on any thread */ 2560 set_thread(0); 2561 rc = spdk_bdev_register(&bdev); 2562 CU_ASSERT(rc == 0); 2563 set_thread(1); 2564 unreg_thread = NULL; 2565 rc = spdk_bdev_unregister_by_name(bdev.name, bdev.module, _bdev_unregistered_wt, 2566 &unreg_thread); 2567 CU_ASSERT(rc == 0); 2568 poll_threads(); 2569 CU_ASSERT(unreg_thread == spdk_get_thread()); 2570 } 2571 2572 static void 2573 wait_for_examine_cb(void *arg) 2574 { 2575 struct spdk_thread **thread = arg; 2576 2577 *thread = spdk_get_thread(); 2578 } 2579 2580 static void 2581 spdk_bdev_examine_wt(void) 2582 { 2583 int rc; 2584 bool save_auto_examine = g_bdev_opts.bdev_auto_examine; 2585 struct spdk_thread *thread; 2586 2587 g_bdev_opts.bdev_auto_examine = false; 2588 2589 set_thread(0); 2590 register_bdev(&g_bdev, "ut_bdev_wt", &g_io_device); 2591 CU_ASSERT(spdk_bdev_get_by_name("ut_bdev_wt") != NULL); 2592 set_thread(1); 2593 2594 /* Can examine only on the app thread */ 2595 rc = spdk_bdev_examine("ut_bdev_wt"); 2596 CU_ASSERT(rc == -EINVAL); 2597 unregister_bdev(&g_bdev); 2598 CU_ASSERT(spdk_bdev_get_by_name("ut_bdev_wt") == NULL); 2599 2600 /* Can wait for examine on app thread, callback called on app thread. */ 2601 set_thread(0); 2602 register_bdev(&g_bdev, "ut_bdev_wt", &g_io_device); 2603 CU_ASSERT(spdk_bdev_get_by_name("ut_bdev_wt") != NULL); 2604 thread = NULL; 2605 rc = spdk_bdev_wait_for_examine(wait_for_examine_cb, &thread); 2606 CU_ASSERT(rc == 0); 2607 poll_threads(); 2608 CU_ASSERT(thread == spdk_get_thread()); 2609 unregister_bdev(&g_bdev); 2610 CU_ASSERT(spdk_bdev_get_by_name("ut_bdev_wt") == NULL); 2611 2612 /* Can wait for examine on non-app thread, callback called on same thread. */ 2613 set_thread(0); 2614 register_bdev(&g_bdev, "ut_bdev_wt", &g_io_device); 2615 CU_ASSERT(spdk_bdev_get_by_name("ut_bdev_wt") != NULL); 2616 thread = NULL; 2617 rc = spdk_bdev_wait_for_examine(wait_for_examine_cb, &thread); 2618 CU_ASSERT(rc == 0); 2619 poll_threads(); 2620 CU_ASSERT(thread == spdk_get_thread()); 2621 unregister_bdev(&g_bdev); 2622 CU_ASSERT(spdk_bdev_get_by_name("ut_bdev_wt") == NULL); 2623 2624 unregister_bdev(&g_bdev); 2625 g_bdev_opts.bdev_auto_examine = save_auto_examine; 2626 } 2627 2628 static void 2629 event_notify_and_close(void) 2630 { 2631 int resize_notify_count = 0; 2632 struct spdk_bdev_desc *desc = NULL; 2633 struct spdk_bdev *bdev; 2634 int rc; 2635 2636 setup_test(); 2637 set_thread(0); 2638 2639 /* setup_test() automatically opens the bdev, but this test needs to do 2640 * that in a different way. */ 2641 spdk_bdev_close(g_desc); 2642 poll_threads(); 2643 2644 set_thread(1); 2645 2646 rc = spdk_bdev_open_ext("ut_bdev", true, _bdev_event_cb, &resize_notify_count, &desc); 2647 CU_ASSERT(rc == 0); 2648 SPDK_CU_ASSERT_FATAL(desc != NULL); 2649 2650 bdev = spdk_bdev_desc_get_bdev(desc); 2651 SPDK_CU_ASSERT_FATAL(bdev != NULL); 2652 2653 /* Test a normal case that a resize event is notified. */ 2654 set_thread(0); 2655 2656 rc = spdk_bdev_notify_blockcnt_change(bdev, 1024 * 2); 2657 CU_ASSERT(rc == 0); 2658 CU_ASSERT(bdev->blockcnt == 1024 * 2); 2659 CU_ASSERT(desc->refs == 1); 2660 CU_ASSERT(resize_notify_count == 0); 2661 2662 poll_threads(); 2663 2664 CU_ASSERT(desc->refs == 0); 2665 CU_ASSERT(resize_notify_count == 1); 2666 2667 /* Test a complex case if the bdev is closed after two event_notify messages are sent, 2668 * then both event_notify messages are discarded and the desc is freed. 2669 */ 2670 rc = spdk_bdev_notify_blockcnt_change(bdev, 1024 * 3); 2671 CU_ASSERT(rc == 0); 2672 CU_ASSERT(bdev->blockcnt == 1024 * 3); 2673 CU_ASSERT(desc->refs == 1); 2674 CU_ASSERT(resize_notify_count == 1); 2675 2676 rc = spdk_bdev_notify_blockcnt_change(bdev, 1024 * 4); 2677 CU_ASSERT(rc == 0); 2678 CU_ASSERT(bdev->blockcnt == 1024 * 4); 2679 CU_ASSERT(desc->refs == 2); 2680 CU_ASSERT(resize_notify_count == 1); 2681 2682 set_thread(1); 2683 2684 spdk_bdev_close(desc); 2685 CU_ASSERT(desc->closed == true); 2686 CU_ASSERT(desc->refs == 2); 2687 CU_ASSERT(resize_notify_count == 1); 2688 2689 poll_threads(); 2690 2691 CU_ASSERT(resize_notify_count == 1); 2692 2693 set_thread(0); 2694 2695 /* Restore g_desc. Then, we can execute teardown_test(). */ 2696 spdk_bdev_open_ext("ut_bdev", true, _bdev_event_cb, NULL, &g_desc); 2697 teardown_test(); 2698 } 2699 2700 /* There was a bug that bdev_channel_poll_qos() called spdk_for_each_channel() 2701 * after spdk_io_device_unregister() is called for a bdev. 2702 * 2703 * This occurred in the following sequence. 2704 * - There was a bdev and a channel for it. 2705 * - QoS was enabled and started. 2706 * - spdk_bdev_unregister() was called. However, there was a open descriptor. 2707 * Hence, remove notification was sent and unregistration was pending. 2708 * - Receiving a event notification, spdk_put_io_channel() and spdk_bdev_close() were 2709 * called. In spdk_bdev_close(), the existing QoS was unbound and a message was sent 2710 * to it, and then the pending spdk_io_device_unregister() was finally executed. 2711 * - If bdev_channel_poll_qos() was executed before the message was processed, 2712 * bdev_channel_poll_qos() called spdk_bdev_for_each_channel() and hit assert(). 2713 * 2714 * The fix was in this case bdev_channel_poll_qos() returned immediately because QoS 2715 * was not enabled. bdev_qos_destroy() created a new disabled QoS and swapped it with 2716 * the existing QoS. 2717 * 2718 * This test case was added to avoid degradation in future. 2719 */ 2720 static void 2721 unregister_and_qos_poller(void) 2722 { 2723 struct spdk_io_channel *io_ch; 2724 struct spdk_bdev_channel *bdev_ch; 2725 struct spdk_bdev_desc *desc = NULL; 2726 struct spdk_bdev_qos *old_qos; 2727 uint64_t limits[SPDK_BDEV_QOS_NUM_RATE_LIMIT_TYPES] = {}; 2728 bool remove_notify = false, done_unregister = false; 2729 int status = -1, rc; 2730 2731 setup_test(); 2732 set_thread(0); 2733 2734 MOCK_SET(spdk_get_ticks, 10); 2735 2736 /* setup_test() automatically opens the bdev, but this test needs to do 2737 * that in a different way. 2738 */ 2739 spdk_bdev_close(g_desc); 2740 poll_threads(); 2741 2742 /* We want to get remove event notification to check if unregistration 2743 * is deferred. 2744 */ 2745 spdk_bdev_open_ext("ut_bdev", true, _bdev_event_cb, &remove_notify, &desc); 2746 SPDK_CU_ASSERT_FATAL(desc != NULL); 2747 CU_ASSERT(remove_notify == false); 2748 2749 io_ch = spdk_bdev_get_io_channel(desc); 2750 SPDK_CU_ASSERT_FATAL(io_ch != NULL); 2751 bdev_ch = spdk_io_channel_get_ctx(io_ch); 2752 2753 limits[SPDK_BDEV_QOS_RW_IOPS_RATE_LIMIT] = 10000; 2754 limits[SPDK_BDEV_QOS_RW_BPS_RATE_LIMIT] = 0; 2755 limits[SPDK_BDEV_QOS_R_BPS_RATE_LIMIT] = 0; 2756 limits[SPDK_BDEV_QOS_W_BPS_RATE_LIMIT] = 0; 2757 spdk_bdev_set_qos_rate_limits(&g_bdev.bdev, limits, qos_dynamic_enable_done, &status); 2758 poll_threads(); 2759 CU_ASSERT(status == 0); 2760 CU_ASSERT((bdev_ch->flags & BDEV_CH_QOS_ENABLED) != 0); 2761 2762 old_qos = g_bdev.bdev.internal.qos; 2763 CU_ASSERT(old_qos != NULL); 2764 2765 spdk_bdev_unregister(&g_bdev.bdev, _bdev_unregistered, &done_unregister); 2766 CU_ASSERT(done_unregister == false); 2767 CU_ASSERT(remove_notify == false); 2768 2769 poll_threads(); 2770 CU_ASSERT(done_unregister == false); 2771 CU_ASSERT(remove_notify == true); 2772 2773 spdk_put_io_channel(io_ch); 2774 spdk_bdev_close(desc); 2775 2776 CU_ASSERT(g_bdev.bdev.internal.qos != NULL); 2777 CU_ASSERT(g_bdev.bdev.internal.qos->thread == NULL); 2778 CU_ASSERT(old_qos != g_bdev.bdev.internal.qos); 2779 2780 /* bdev_channel_poll_qos() has a chance to be executed in this small window. */ 2781 spdk_delay_us(SPDK_BDEV_QOS_TIMESLICE_IN_USEC); 2782 2783 rc = bdev_channel_poll_qos(&g_bdev.bdev); 2784 CU_ASSERT(rc == SPDK_POLLER_IDLE); 2785 2786 poll_threads(); 2787 2788 CU_ASSERT(done_unregister == true); 2789 2790 /* Restore the original g_bdev so that we can use teardown_test(). */ 2791 set_thread(0); 2792 register_bdev(&g_bdev, "ut_bdev", &g_io_device); 2793 spdk_bdev_open_ext("ut_bdev", true, _bdev_event_cb, NULL, &g_desc); 2794 teardown_test(); 2795 } 2796 2797 /** 2798 * There was a race between reset start and complete: 2799 * 2800 * 1. reset_1 is completing. It clears bdev->internal.reset_in_progress and sends 2801 * unfreeze_channel messages to remove queued resets of all channels. 2802 * 2. reset_2 is starting. As bdev->internal.reset_in_progress has been cleared, it 2803 * is inserted to queued_resets list and starts to freeze channels. 2804 * 3. reset_1's unfreeze_channel message removes reset_2 from queued_resets list. 2805 * 4. reset_2 finishes freezing channels, but the corresponding bdev_io has gone, 2806 * hence resulting in segmentation fault. 2807 * 2808 * To fix this, 2809 * 1. Do not queue the reset that is submitted to the underlying device. 2810 * 2. Queue all other resets in a per-bdev list, so all of them can be completed 2811 * at once. 2812 */ 2813 static void 2814 reset_start_complete_race(void) 2815 { 2816 struct spdk_io_channel *io_ch; 2817 bool done_reset_1 = false, done_reset_2 = false; 2818 uint32_t num_completed; 2819 int rc; 2820 2821 setup_test(); 2822 set_thread(0); 2823 2824 io_ch = spdk_bdev_get_io_channel(g_desc); 2825 SPDK_CU_ASSERT_FATAL(io_ch != NULL); 2826 2827 CU_ASSERT(g_bdev.bdev.internal.reset_in_progress == NULL); 2828 2829 /** 2830 * Submit reset_1. 2831 */ 2832 rc = spdk_bdev_reset(g_desc, io_ch, reset_done, &done_reset_1); 2833 CU_ASSERT(rc == 0); 2834 2835 /** 2836 * Poll threads so that reset_1 completes freezing channels and gets submitted to 2837 * the undelying device. 2838 */ 2839 poll_threads(); 2840 2841 /** 2842 * Complete reset_1. This will start the unfreezing channel stage of reset_1, but 2843 * not complete it until next poll_threads. 2844 */ 2845 num_completed = stub_complete_io(g_bdev.io_target, 0); 2846 CU_ASSERT(num_completed == 1); 2847 2848 /** 2849 * Submit reset_2. It should be queued because reset_1 has not been completed yet. 2850 */ 2851 rc = spdk_bdev_reset(g_desc, io_ch, reset_done, &done_reset_2); 2852 CU_ASSERT(rc == 0); 2853 2854 /** 2855 * Poll threads. reset_1 completes unfreezing channels, then completes queued reset_2, 2856 * and finally itself gets completed. 2857 */ 2858 poll_threads(); 2859 CU_ASSERT(done_reset_1 == true); 2860 CU_ASSERT(done_reset_2 == true); 2861 2862 spdk_put_io_channel(io_ch); 2863 teardown_test(); 2864 } 2865 2866 int 2867 main(int argc, char **argv) 2868 { 2869 CU_pSuite suite = NULL; 2870 CU_pSuite suite_wt = NULL; 2871 unsigned int num_failures; 2872 2873 CU_initialize_registry(); 2874 2875 suite = CU_add_suite("bdev", NULL, NULL); 2876 suite_wt = CU_add_suite("bdev_wrong_thread", wrong_thread_setup, wrong_thread_teardown); 2877 2878 CU_ADD_TEST(suite, basic); 2879 CU_ADD_TEST(suite, unregister_and_close); 2880 CU_ADD_TEST(suite, unregister_and_close_different_threads); 2881 CU_ADD_TEST(suite, basic_qos); 2882 CU_ADD_TEST(suite, put_channel_during_reset); 2883 CU_ADD_TEST(suite, aborted_reset); 2884 CU_ADD_TEST(suite, aborted_reset_no_outstanding_io); 2885 CU_ADD_TEST(suite, io_during_reset); 2886 CU_ADD_TEST(suite, reset_completions); 2887 CU_ADD_TEST(suite, io_during_qos_queue); 2888 CU_ADD_TEST(suite, io_during_qos_reset); 2889 CU_ADD_TEST(suite, enomem); 2890 CU_ADD_TEST(suite, enomem_multi_bdev); 2891 CU_ADD_TEST(suite, enomem_multi_bdev_unregister); 2892 CU_ADD_TEST(suite, enomem_multi_io_target); 2893 CU_ADD_TEST(suite, enomem_retry_during_abort); 2894 CU_ADD_TEST(suite, qos_dynamic_enable); 2895 CU_ADD_TEST(suite, bdev_histograms_mt); 2896 CU_ADD_TEST(suite, bdev_set_io_timeout_mt); 2897 CU_ADD_TEST(suite, lock_lba_range_then_submit_io); 2898 CU_ADD_TEST(suite, unregister_during_reset); 2899 CU_ADD_TEST(suite_wt, spdk_bdev_register_wt); 2900 CU_ADD_TEST(suite_wt, spdk_bdev_examine_wt); 2901 CU_ADD_TEST(suite, event_notify_and_close); 2902 CU_ADD_TEST(suite, unregister_and_qos_poller); 2903 CU_ADD_TEST(suite, reset_start_complete_race); 2904 2905 num_failures = spdk_ut_run_tests(argc, argv, NULL); 2906 CU_cleanup_registry(); 2907 return num_failures; 2908 } 2909