4 * Copyright (c) Intel Corporation.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
17 * * Neither the name of Intel Corporation nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 #include "spdk_cunit.h"
36 #include "nvme/nvme_ns_cmd.c"
37 #include "nvme/nvme.c"
39 #include "common/lib/test_env.c"
41 static struct nvme_driver _g_nvme_driver
= {
42 .lock
= PTHREAD_MUTEX_INITIALIZER
,
45 static struct nvme_request
*g_request
= NULL
;
48 spdk_pci_enumerate(struct spdk_pci_driver
*driver
, spdk_pci_enum_cb enum_cb
, void *enum_ctx
)
53 static void nvme_request_reset_sgl(void *cb_arg
, uint32_t sgl_offset
)
57 static int nvme_request_next_sge(void *cb_arg
, void **address
, uint32_t *length
)
59 uint32_t *lba_count
= cb_arg
;
62 * We need to set address to something here, since the SGL splitting code will
63 * use it to determine PRP compatibility. Just use a rather arbitrary address
64 * for now - these tests will not actually cause data to be read from or written
67 *address
= (void *)(uintptr_t)0x10000000;
73 spdk_nvme_transport_available(enum spdk_nvme_transport_type trtype
)
78 struct spdk_nvme_ctrlr
*nvme_transport_ctrlr_construct(const struct spdk_nvme_transport_id
*trid
,
79 const struct spdk_nvme_ctrlr_opts
*opts
,
86 nvme_ctrlr_destruct(struct spdk_nvme_ctrlr
*ctrlr
)
91 nvme_ctrlr_add_process(struct spdk_nvme_ctrlr
*ctrlr
, void *devhandle
)
97 nvme_ctrlr_process_init(struct spdk_nvme_ctrlr
*ctrlr
)
103 nvme_ctrlr_fail(struct spdk_nvme_ctrlr
*ctrlr
, bool hot_remove
)
108 spdk_pci_device_get_addr(struct spdk_pci_device
*pci_dev
)
110 struct spdk_pci_addr pci_addr
;
112 memset(&pci_addr
, 0, sizeof(pci_addr
));
117 spdk_pci_device_get_id(struct spdk_pci_device
*pci_dev
)
119 struct spdk_pci_id pci_id
;
121 memset(&pci_id
, 0xFF, sizeof(pci_id
));
127 spdk_nvme_ctrlr_get_default_ctrlr_opts(struct spdk_nvme_ctrlr_opts
*opts
, size_t opts_size
)
129 memset(opts
, 0, sizeof(*opts
));
133 spdk_nvme_ns_get_sector_size(struct spdk_nvme_ns
*ns
)
135 return ns
->sector_size
;
139 spdk_nvme_ns_get_max_io_xfer_size(struct spdk_nvme_ns
*ns
)
141 return ns
->ctrlr
->max_xfer_size
;
145 nvme_qpair_submit_request(struct spdk_nvme_qpair
*qpair
, struct nvme_request
*req
)
153 nvme_ctrlr_proc_get_ref(struct spdk_nvme_ctrlr
*ctrlr
)
159 nvme_ctrlr_proc_put_ref(struct spdk_nvme_ctrlr
*ctrlr
)
165 nvme_ctrlr_get_ref_count(struct spdk_nvme_ctrlr
*ctrlr
)
171 nvme_transport_ctrlr_scan(struct spdk_nvme_probe_ctx
*probe_ctx
,
178 prepare_for_test(struct spdk_nvme_ns
*ns
, struct spdk_nvme_ctrlr
*ctrlr
,
179 struct spdk_nvme_qpair
*qpair
,
180 uint32_t sector_size
, uint32_t md_size
, uint32_t max_xfer_size
,
181 uint32_t stripe_size
, bool extended_lba
)
183 uint32_t num_requests
= 32;
186 ctrlr
->max_xfer_size
= max_xfer_size
;
188 * Clear the flags field - we especially want to make sure the SGL_SUPPORTED flag is not set
189 * so that we test the SGL splitting path.
192 ctrlr
->min_page_size
= 4096;
193 ctrlr
->page_size
= 4096;
194 memset(&ctrlr
->opts
, 0, sizeof(ctrlr
->opts
));
195 memset(ns
, 0, sizeof(*ns
));
197 ns
->sector_size
= sector_size
;
198 ns
->extended_lba_size
= sector_size
;
200 ns
->flags
|= SPDK_NVME_NS_EXTENDED_LBA_SUPPORTED
;
201 ns
->extended_lba_size
+= md_size
;
203 ns
->md_size
= md_size
;
204 ns
->sectors_per_max_io
= spdk_nvme_ns_get_max_io_xfer_size(ns
) / ns
->extended_lba_size
;
205 ns
->sectors_per_stripe
= stripe_size
/ ns
->extended_lba_size
;
207 memset(qpair
, 0, sizeof(*qpair
));
208 qpair
->ctrlr
= ctrlr
;
209 qpair
->req_buf
= calloc(num_requests
, sizeof(struct nvme_request
));
210 SPDK_CU_ASSERT_FATAL(qpair
->req_buf
!= NULL
);
212 for (i
= 0; i
< num_requests
; i
++) {
213 struct nvme_request
*req
= qpair
->req_buf
+ i
* sizeof(struct nvme_request
);
216 STAILQ_INSERT_HEAD(&qpair
->free_req
, req
, stailq
);
223 cleanup_after_test(struct spdk_nvme_qpair
*qpair
)
225 free(qpair
->req_buf
);
229 nvme_cmd_interpret_rw(const struct spdk_nvme_cmd
*cmd
,
230 uint64_t *lba
, uint32_t *num_blocks
)
232 *lba
= *(const uint64_t *)&cmd
->cdw10
;
233 *num_blocks
= (cmd
->cdw12
& 0xFFFFu
) + 1;
239 struct spdk_nvme_ns ns
;
240 struct spdk_nvme_qpair qpair
;
241 struct spdk_nvme_ctrlr ctrlr
;
243 uint64_t lba
, cmd_lba
;
244 uint32_t lba_count
, cmd_lba_count
;
247 prepare_for_test(&ns
, &ctrlr
, &qpair
, 512, 0, 128 * 1024, 0, false);
248 payload
= malloc(512);
252 rc
= spdk_nvme_ns_cmd_read(&ns
, &qpair
, payload
, lba
, lba_count
, NULL
, NULL
, 0);
254 SPDK_CU_ASSERT_FATAL(rc
== 0);
255 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
257 CU_ASSERT(g_request
->num_children
== 0);
258 nvme_cmd_interpret_rw(&g_request
->cmd
, &cmd_lba
, &cmd_lba_count
);
259 CU_ASSERT(cmd_lba
== lba
);
260 CU_ASSERT(cmd_lba_count
== lba_count
);
263 nvme_free_request(g_request
);
264 cleanup_after_test(&qpair
);
270 struct spdk_nvme_ns ns
;
271 struct spdk_nvme_ctrlr ctrlr
;
272 struct spdk_nvme_qpair qpair
;
273 struct nvme_request
*child
;
275 uint64_t lba
, cmd_lba
;
276 uint32_t lba_count
, cmd_lba_count
;
280 * Controller has max xfer of 128 KB (256 blocks).
281 * Submit an I/O of 256 KB starting at LBA 0, which should be split
282 * on the max I/O boundary into two I/Os of 128 KB.
285 prepare_for_test(&ns
, &ctrlr
, &qpair
, 512, 0, 128 * 1024, 0, false);
286 payload
= malloc(256 * 1024);
288 lba_count
= (256 * 1024) / 512;
290 rc
= spdk_nvme_ns_cmd_read(&ns
, &qpair
, payload
, lba
, lba_count
, NULL
, NULL
, 0);
292 SPDK_CU_ASSERT_FATAL(rc
== 0);
293 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
295 CU_ASSERT(g_request
->num_children
== 2);
297 child
= TAILQ_FIRST(&g_request
->children
);
298 nvme_request_remove_child(g_request
, child
);
299 nvme_cmd_interpret_rw(&child
->cmd
, &cmd_lba
, &cmd_lba_count
);
300 CU_ASSERT(child
->num_children
== 0);
301 CU_ASSERT(child
->payload_size
== 128 * 1024);
302 CU_ASSERT(cmd_lba
== 0);
303 CU_ASSERT(cmd_lba_count
== 256); /* 256 * 512 byte blocks = 128 KB */
304 nvme_free_request(child
);
306 child
= TAILQ_FIRST(&g_request
->children
);
307 nvme_request_remove_child(g_request
, child
);
308 nvme_cmd_interpret_rw(&child
->cmd
, &cmd_lba
, &cmd_lba_count
);
309 CU_ASSERT(child
->num_children
== 0);
310 CU_ASSERT(child
->payload_size
== 128 * 1024);
311 CU_ASSERT(cmd_lba
== 256);
312 CU_ASSERT(cmd_lba_count
== 256);
313 nvme_free_request(child
);
315 CU_ASSERT(TAILQ_EMPTY(&g_request
->children
));
318 nvme_free_request(g_request
);
319 cleanup_after_test(&qpair
);
325 struct spdk_nvme_ns ns
;
326 struct spdk_nvme_ctrlr ctrlr
;
327 struct spdk_nvme_qpair qpair
;
328 struct nvme_request
*child
;
330 uint64_t lba
, cmd_lba
;
331 uint32_t lba_count
, cmd_lba_count
;
335 * Controller has max xfer of 128 KB (256 blocks).
336 * Submit an I/O of 256 KB starting at LBA 10, which should be split
338 * 1) LBA = 10, count = 256 blocks
339 * 2) LBA = 266, count = 256 blocks
342 prepare_for_test(&ns
, &ctrlr
, &qpair
, 512, 0, 128 * 1024, 0, false);
343 payload
= malloc(256 * 1024);
344 lba
= 10; /* Start at an LBA that isn't aligned to the stripe size */
345 lba_count
= (256 * 1024) / 512;
347 rc
= spdk_nvme_ns_cmd_read(&ns
, &qpair
, payload
, lba
, lba_count
, NULL
, NULL
, 0);
349 SPDK_CU_ASSERT_FATAL(rc
== 0);
350 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
352 SPDK_CU_ASSERT_FATAL(g_request
->num_children
== 2);
354 child
= TAILQ_FIRST(&g_request
->children
);
355 nvme_request_remove_child(g_request
, child
);
356 nvme_cmd_interpret_rw(&child
->cmd
, &cmd_lba
, &cmd_lba_count
);
357 CU_ASSERT(child
->num_children
== 0);
358 CU_ASSERT(child
->payload_size
== 128 * 1024);
359 CU_ASSERT(cmd_lba
== 10);
360 CU_ASSERT(cmd_lba_count
== 256);
361 nvme_free_request(child
);
363 child
= TAILQ_FIRST(&g_request
->children
);
364 nvme_request_remove_child(g_request
, child
);
365 nvme_cmd_interpret_rw(&child
->cmd
, &cmd_lba
, &cmd_lba_count
);
366 CU_ASSERT(child
->num_children
== 0);
367 CU_ASSERT(child
->payload_size
== 128 * 1024);
368 CU_ASSERT(cmd_lba
== 266);
369 CU_ASSERT(cmd_lba_count
== 256);
370 nvme_free_request(child
);
372 CU_ASSERT(TAILQ_EMPTY(&g_request
->children
));
375 nvme_free_request(g_request
);
376 cleanup_after_test(&qpair
);
382 struct spdk_nvme_ns ns
;
383 struct spdk_nvme_ctrlr ctrlr
;
384 struct spdk_nvme_qpair qpair
;
385 struct nvme_request
*child
;
387 uint64_t lba
, cmd_lba
;
388 uint32_t lba_count
, cmd_lba_count
;
392 * Controller has max xfer of 128 KB (256 blocks) and a stripe size of 128 KB.
393 * (Same as split_test3 except with driver-assisted striping enabled.)
394 * Submit an I/O of 256 KB starting at LBA 10, which should be split
396 * 1) LBA = 10, count = 246 blocks (less than max I/O size to align to stripe size)
397 * 2) LBA = 256, count = 256 blocks (aligned to stripe size and max I/O size)
398 * 3) LBA = 512, count = 10 blocks (finish off the remaining I/O size)
401 prepare_for_test(&ns
, &ctrlr
, &qpair
, 512, 0, 128 * 1024, 128 * 1024, false);
402 payload
= malloc(256 * 1024);
403 lba
= 10; /* Start at an LBA that isn't aligned to the stripe size */
404 lba_count
= (256 * 1024) / 512;
406 rc
= spdk_nvme_ns_cmd_read(&ns
, &qpair
, payload
, lba
, lba_count
, NULL
, NULL
,
407 SPDK_NVME_IO_FLAGS_FORCE_UNIT_ACCESS
);
409 SPDK_CU_ASSERT_FATAL(rc
== 0);
410 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
412 SPDK_CU_ASSERT_FATAL(g_request
->num_children
== 3);
414 child
= TAILQ_FIRST(&g_request
->children
);
415 nvme_request_remove_child(g_request
, child
);
416 nvme_cmd_interpret_rw(&child
->cmd
, &cmd_lba
, &cmd_lba_count
);
417 CU_ASSERT(child
->num_children
== 0);
418 CU_ASSERT(child
->payload_size
== (256 - 10) * 512);
419 CU_ASSERT(child
->payload_offset
== 0);
420 CU_ASSERT(cmd_lba
== 10);
421 CU_ASSERT(cmd_lba_count
== 256 - 10);
422 CU_ASSERT((child
->cmd
.cdw12
& SPDK_NVME_IO_FLAGS_FORCE_UNIT_ACCESS
) != 0);
423 CU_ASSERT((child
->cmd
.cdw12
& SPDK_NVME_IO_FLAGS_LIMITED_RETRY
) == 0);
424 nvme_free_request(child
);
426 child
= TAILQ_FIRST(&g_request
->children
);
427 nvme_request_remove_child(g_request
, child
);
428 nvme_cmd_interpret_rw(&child
->cmd
, &cmd_lba
, &cmd_lba_count
);
429 CU_ASSERT(child
->num_children
== 0);
430 CU_ASSERT(child
->payload_size
== 128 * 1024);
431 CU_ASSERT(child
->payload_offset
== (256 - 10) * 512);
432 CU_ASSERT(cmd_lba
== 256);
433 CU_ASSERT(cmd_lba_count
== 256);
434 CU_ASSERT((child
->cmd
.cdw12
& SPDK_NVME_IO_FLAGS_FORCE_UNIT_ACCESS
) != 0);
435 CU_ASSERT((child
->cmd
.cdw12
& SPDK_NVME_IO_FLAGS_LIMITED_RETRY
) == 0);
436 nvme_free_request(child
);
438 child
= TAILQ_FIRST(&g_request
->children
);
439 nvme_request_remove_child(g_request
, child
);
440 nvme_cmd_interpret_rw(&child
->cmd
, &cmd_lba
, &cmd_lba_count
);
441 CU_ASSERT(child
->num_children
== 0);
442 CU_ASSERT(child
->payload_size
== 10 * 512);
443 CU_ASSERT(child
->payload_offset
== (512 - 10) * 512);
444 CU_ASSERT(cmd_lba
== 512);
445 CU_ASSERT(cmd_lba_count
== 10);
446 CU_ASSERT((child
->cmd
.cdw12
& SPDK_NVME_IO_FLAGS_FORCE_UNIT_ACCESS
) != 0);
447 CU_ASSERT((child
->cmd
.cdw12
& SPDK_NVME_IO_FLAGS_LIMITED_RETRY
) == 0);
448 nvme_free_request(child
);
450 CU_ASSERT(TAILQ_EMPTY(&g_request
->children
));
453 nvme_free_request(g_request
);
454 cleanup_after_test(&qpair
);
458 test_cmd_child_request(void)
461 struct spdk_nvme_ns ns
;
462 struct spdk_nvme_ctrlr ctrlr
;
463 struct spdk_nvme_qpair qpair
;
465 struct nvme_request
*child
, *tmp
;
467 uint64_t lba
= 0x1000;
470 uint32_t sector_size
= 512;
471 uint32_t max_io_size
= 128 * 1024;
472 uint32_t sectors_per_max_io
= max_io_size
/ sector_size
;
474 prepare_for_test(&ns
, &ctrlr
, &qpair
, sector_size
, 0, max_io_size
, 0, false);
476 payload
= malloc(128 * 1024);
477 rc
= spdk_nvme_ns_cmd_read(&ns
, &qpair
, payload
, lba
, sectors_per_max_io
, NULL
, NULL
, 0);
478 SPDK_CU_ASSERT_FATAL(rc
== 0);
479 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
480 CU_ASSERT(g_request
->payload_offset
== 0);
481 CU_ASSERT(g_request
->num_children
== 0);
482 nvme_free_request(g_request
);
484 rc
= spdk_nvme_ns_cmd_read(&ns
, &qpair
, payload
, lba
, sectors_per_max_io
- 1, NULL
, NULL
, 0);
485 SPDK_CU_ASSERT_FATAL(rc
== 0);
486 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
487 CU_ASSERT(g_request
->payload_offset
== 0);
488 CU_ASSERT(g_request
->num_children
== 0);
489 nvme_free_request(g_request
);
491 rc
= spdk_nvme_ns_cmd_read(&ns
, &qpair
, payload
, lba
, sectors_per_max_io
* 4, NULL
, NULL
, 0);
492 SPDK_CU_ASSERT_FATAL(rc
== 0);
493 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
494 CU_ASSERT(g_request
->num_children
== 4);
496 rc
= spdk_nvme_ns_cmd_read(&ns
, &qpair
, payload
, lba
, (DEFAULT_IO_QUEUE_REQUESTS
+ 1) * sector_size
,
499 SPDK_CU_ASSERT_FATAL(rc
== -EINVAL
);
501 TAILQ_FOREACH_SAFE(child
, &g_request
->children
, child_tailq
, tmp
) {
502 nvme_request_remove_child(g_request
, child
);
503 CU_ASSERT(child
->payload_offset
== offset
);
504 CU_ASSERT(child
->cmd
.opc
== SPDK_NVME_OPC_READ
);
505 CU_ASSERT(child
->cmd
.nsid
== ns
.id
);
506 CU_ASSERT(child
->cmd
.cdw10
== (lba
+ sectors_per_max_io
* i
));
507 CU_ASSERT(child
->cmd
.cdw12
== ((sectors_per_max_io
- 1) | 0));
508 offset
+= max_io_size
;
509 nvme_free_request(child
);
514 nvme_free_request(g_request
);
515 cleanup_after_test(&qpair
);
519 test_nvme_ns_cmd_flush(void)
521 struct spdk_nvme_ns ns
;
522 struct spdk_nvme_ctrlr ctrlr
;
523 struct spdk_nvme_qpair qpair
;
524 spdk_nvme_cmd_cb cb_fn
= NULL
;
528 prepare_for_test(&ns
, &ctrlr
, &qpair
, 512, 0, 128 * 1024, 0, false);
530 rc
= spdk_nvme_ns_cmd_flush(&ns
, &qpair
, cb_fn
, cb_arg
);
531 SPDK_CU_ASSERT_FATAL(rc
== 0);
532 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
533 CU_ASSERT(g_request
->cmd
.opc
== SPDK_NVME_OPC_FLUSH
);
534 CU_ASSERT(g_request
->cmd
.nsid
== ns
.id
);
536 nvme_free_request(g_request
);
537 cleanup_after_test(&qpair
);
541 test_nvme_ns_cmd_write_zeroes(void)
543 struct spdk_nvme_ns ns
= { 0 };
544 struct spdk_nvme_ctrlr ctrlr
= { 0 };
545 struct spdk_nvme_qpair qpair
;
546 spdk_nvme_cmd_cb cb_fn
= NULL
;
549 uint32_t cmd_lba_count
;
552 prepare_for_test(&ns
, &ctrlr
, &qpair
, 512, 0, 128 * 1024, 0, false);
554 rc
= spdk_nvme_ns_cmd_write_zeroes(&ns
, &qpair
, 0, 2, cb_fn
, cb_arg
, 0);
555 SPDK_CU_ASSERT_FATAL(rc
== 0);
556 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
557 CU_ASSERT(g_request
->cmd
.opc
== SPDK_NVME_OPC_WRITE_ZEROES
);
558 CU_ASSERT(g_request
->cmd
.nsid
== ns
.id
);
559 nvme_cmd_interpret_rw(&g_request
->cmd
, &cmd_lba
, &cmd_lba_count
);
560 CU_ASSERT_EQUAL(cmd_lba
, 0);
561 CU_ASSERT_EQUAL(cmd_lba_count
, 2);
563 nvme_free_request(g_request
);
564 cleanup_after_test(&qpair
);
568 test_nvme_ns_cmd_dataset_management(void)
570 struct spdk_nvme_ns ns
;
571 struct spdk_nvme_ctrlr ctrlr
;
572 struct spdk_nvme_qpair qpair
;
573 spdk_nvme_cmd_cb cb_fn
= NULL
;
575 struct spdk_nvme_dsm_range ranges
[256];
579 prepare_for_test(&ns
, &ctrlr
, &qpair
, 512, 0, 128 * 1024, 0, false);
581 for (i
= 0; i
< 256; i
++) {
582 ranges
[i
].starting_lba
= i
;
583 ranges
[i
].length
= 1;
584 ranges
[i
].attributes
.raw
= 0;
588 rc
= spdk_nvme_ns_cmd_dataset_management(&ns
, &qpair
, SPDK_NVME_DSM_ATTR_DEALLOCATE
,
589 ranges
, 1, cb_fn
, cb_arg
);
590 SPDK_CU_ASSERT_FATAL(rc
== 0);
591 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
592 CU_ASSERT(g_request
->cmd
.opc
== SPDK_NVME_OPC_DATASET_MANAGEMENT
);
593 CU_ASSERT(g_request
->cmd
.nsid
== ns
.id
);
594 CU_ASSERT(g_request
->cmd
.cdw10
== 0);
595 CU_ASSERT(g_request
->cmd
.cdw11
== SPDK_NVME_DSM_ATTR_DEALLOCATE
);
596 spdk_dma_free(g_request
->payload
.contig_or_cb_arg
);
597 nvme_free_request(g_request
);
600 rc
= spdk_nvme_ns_cmd_dataset_management(&ns
, &qpair
, SPDK_NVME_DSM_ATTR_DEALLOCATE
,
601 ranges
, 256, cb_fn
, cb_arg
);
602 SPDK_CU_ASSERT_FATAL(rc
== 0);
603 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
604 CU_ASSERT(g_request
->cmd
.opc
== SPDK_NVME_OPC_DATASET_MANAGEMENT
);
605 CU_ASSERT(g_request
->cmd
.nsid
== ns
.id
);
606 CU_ASSERT(g_request
->cmd
.cdw10
== 255u);
607 CU_ASSERT(g_request
->cmd
.cdw11
== SPDK_NVME_DSM_ATTR_DEALLOCATE
);
608 spdk_dma_free(g_request
->payload
.contig_or_cb_arg
);
609 nvme_free_request(g_request
);
611 rc
= spdk_nvme_ns_cmd_dataset_management(&ns
, &qpair
, SPDK_NVME_DSM_ATTR_DEALLOCATE
,
612 NULL
, 0, cb_fn
, cb_arg
);
614 cleanup_after_test(&qpair
);
618 test_nvme_ns_cmd_readv(void)
620 struct spdk_nvme_ns ns
;
621 struct spdk_nvme_ctrlr ctrlr
;
622 struct spdk_nvme_qpair qpair
;
625 uint32_t lba_count
= 256;
626 uint32_t sector_size
= 512;
627 uint64_t sge_length
= lba_count
* sector_size
;
629 cb_arg
= malloc(512);
630 prepare_for_test(&ns
, &ctrlr
, &qpair
, sector_size
, 0, 128 * 1024, 0, false);
631 rc
= spdk_nvme_ns_cmd_readv(&ns
, &qpair
, 0x1000, lba_count
, NULL
, &sge_length
, 0,
632 nvme_request_reset_sgl
, nvme_request_next_sge
);
634 SPDK_CU_ASSERT_FATAL(rc
== 0);
635 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
636 CU_ASSERT(g_request
->cmd
.opc
== SPDK_NVME_OPC_READ
);
637 CU_ASSERT(nvme_payload_type(&g_request
->payload
) == NVME_PAYLOAD_TYPE_SGL
);
638 CU_ASSERT(g_request
->payload
.reset_sgl_fn
== nvme_request_reset_sgl
);
639 CU_ASSERT(g_request
->payload
.next_sge_fn
== nvme_request_next_sge
);
640 CU_ASSERT(g_request
->payload
.contig_or_cb_arg
== &sge_length
);
641 CU_ASSERT(g_request
->cmd
.nsid
== ns
.id
);
643 rc
= spdk_nvme_ns_cmd_readv(&ns
, &qpair
, 0x1000, 256, NULL
, cb_arg
, 0, nvme_request_reset_sgl
,
648 nvme_free_request(g_request
);
649 cleanup_after_test(&qpair
);
653 test_nvme_ns_cmd_writev(void)
655 struct spdk_nvme_ns ns
;
656 struct spdk_nvme_ctrlr ctrlr
;
657 struct spdk_nvme_qpair qpair
;
660 uint32_t lba_count
= 256;
661 uint32_t sector_size
= 512;
662 uint64_t sge_length
= lba_count
* sector_size
;
664 cb_arg
= malloc(512);
665 prepare_for_test(&ns
, &ctrlr
, &qpair
, sector_size
, 0, 128 * 1024, 0, false);
666 rc
= spdk_nvme_ns_cmd_writev(&ns
, &qpair
, 0x1000, lba_count
, NULL
, &sge_length
, 0,
667 nvme_request_reset_sgl
, nvme_request_next_sge
);
669 SPDK_CU_ASSERT_FATAL(rc
== 0);
670 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
671 CU_ASSERT(g_request
->cmd
.opc
== SPDK_NVME_OPC_WRITE
);
672 CU_ASSERT(nvme_payload_type(&g_request
->payload
) == NVME_PAYLOAD_TYPE_SGL
);
673 CU_ASSERT(g_request
->payload
.reset_sgl_fn
== nvme_request_reset_sgl
);
674 CU_ASSERT(g_request
->payload
.next_sge_fn
== nvme_request_next_sge
);
675 CU_ASSERT(g_request
->payload
.contig_or_cb_arg
== &sge_length
);
676 CU_ASSERT(g_request
->cmd
.nsid
== ns
.id
);
678 rc
= spdk_nvme_ns_cmd_writev(&ns
, &qpair
, 0x1000, 256, NULL
, cb_arg
, 0,
679 NULL
, nvme_request_next_sge
);
683 nvme_free_request(g_request
);
684 cleanup_after_test(&qpair
);
688 test_nvme_ns_cmd_comparev(void)
690 struct spdk_nvme_ns ns
;
691 struct spdk_nvme_ctrlr ctrlr
;
692 struct spdk_nvme_qpair qpair
;
695 uint32_t lba_count
= 256;
696 uint32_t sector_size
= 512;
697 uint64_t sge_length
= lba_count
* sector_size
;
699 cb_arg
= malloc(512);
700 prepare_for_test(&ns
, &ctrlr
, &qpair
, sector_size
, 0, 128 * 1024, 0, false);
701 rc
= spdk_nvme_ns_cmd_comparev(&ns
, &qpair
, 0x1000, lba_count
, NULL
, &sge_length
, 0,
702 nvme_request_reset_sgl
, nvme_request_next_sge
);
704 SPDK_CU_ASSERT_FATAL(rc
== 0);
705 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
706 CU_ASSERT(g_request
->cmd
.opc
== SPDK_NVME_OPC_COMPARE
);
707 CU_ASSERT(nvme_payload_type(&g_request
->payload
) == NVME_PAYLOAD_TYPE_SGL
);
708 CU_ASSERT(g_request
->payload
.reset_sgl_fn
== nvme_request_reset_sgl
);
709 CU_ASSERT(g_request
->payload
.next_sge_fn
== nvme_request_next_sge
);
710 CU_ASSERT(g_request
->payload
.contig_or_cb_arg
== &sge_length
);
711 CU_ASSERT(g_request
->cmd
.nsid
== ns
.id
);
713 rc
= spdk_nvme_ns_cmd_comparev(&ns
, &qpair
, 0x1000, 256, NULL
, cb_arg
, 0,
714 nvme_request_reset_sgl
, NULL
);
718 nvme_free_request(g_request
);
719 cleanup_after_test(&qpair
);
725 struct spdk_nvme_ns ns
;
726 struct spdk_nvme_ctrlr ctrlr
;
727 struct spdk_nvme_qpair qpair
;
733 prepare_for_test(&ns
, &ctrlr
, &qpair
, 512, 0, 128 * 1024, 128 * 1024, false);
734 payload
= malloc(256 * 1024);
736 lba_count
= (4 * 1024) / 512;
738 rc
= spdk_nvme_ns_cmd_read(&ns
, &qpair
, payload
, lba
, lba_count
, NULL
, NULL
,
739 SPDK_NVME_IO_FLAGS_FORCE_UNIT_ACCESS
);
740 SPDK_CU_ASSERT_FATAL(rc
== 0);
741 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
742 CU_ASSERT((g_request
->cmd
.cdw12
& SPDK_NVME_IO_FLAGS_FORCE_UNIT_ACCESS
) != 0);
743 CU_ASSERT((g_request
->cmd
.cdw12
& SPDK_NVME_IO_FLAGS_LIMITED_RETRY
) == 0);
744 nvme_free_request(g_request
);
746 rc
= spdk_nvme_ns_cmd_read(&ns
, &qpair
, payload
, lba
, lba_count
, NULL
, NULL
,
747 SPDK_NVME_IO_FLAGS_LIMITED_RETRY
);
748 SPDK_CU_ASSERT_FATAL(rc
== 0);
749 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
750 CU_ASSERT((g_request
->cmd
.cdw12
& SPDK_NVME_IO_FLAGS_FORCE_UNIT_ACCESS
) == 0);
751 CU_ASSERT((g_request
->cmd
.cdw12
& SPDK_NVME_IO_FLAGS_LIMITED_RETRY
) != 0);
752 nvme_free_request(g_request
);
755 cleanup_after_test(&qpair
);
759 test_nvme_ns_cmd_reservation_register(void)
761 struct spdk_nvme_ns ns
;
762 struct spdk_nvme_ctrlr ctrlr
;
763 struct spdk_nvme_qpair qpair
;
764 struct spdk_nvme_reservation_register_data
*payload
;
766 spdk_nvme_cmd_cb cb_fn
= NULL
;
771 prepare_for_test(&ns
, &ctrlr
, &qpair
, 512, 0, 128 * 1024, 0, false);
772 payload
= malloc(sizeof(struct spdk_nvme_reservation_register_data
));
774 rc
= spdk_nvme_ns_cmd_reservation_register(&ns
, &qpair
, payload
, ignore_key
,
775 SPDK_NVME_RESERVE_REGISTER_KEY
,
776 SPDK_NVME_RESERVE_PTPL_NO_CHANGES
,
779 SPDK_CU_ASSERT_FATAL(rc
== 0);
780 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
781 CU_ASSERT(g_request
->cmd
.opc
== SPDK_NVME_OPC_RESERVATION_REGISTER
);
782 CU_ASSERT(g_request
->cmd
.nsid
== ns
.id
);
784 tmp_cdw10
= SPDK_NVME_RESERVE_REGISTER_KEY
;
785 tmp_cdw10
|= ignore_key
? 1 << 3 : 0;
786 tmp_cdw10
|= (uint32_t)SPDK_NVME_RESERVE_PTPL_NO_CHANGES
<< 30;
788 CU_ASSERT(g_request
->cmd
.cdw10
== tmp_cdw10
);
790 spdk_dma_free(g_request
->payload
.contig_or_cb_arg
);
791 nvme_free_request(g_request
);
793 cleanup_after_test(&qpair
);
797 test_nvme_ns_cmd_reservation_release(void)
799 struct spdk_nvme_ns ns
;
800 struct spdk_nvme_ctrlr ctrlr
;
801 struct spdk_nvme_qpair qpair
;
802 struct spdk_nvme_reservation_key_data
*payload
;
804 spdk_nvme_cmd_cb cb_fn
= NULL
;
809 prepare_for_test(&ns
, &ctrlr
, &qpair
, 512, 0, 128 * 1024, 0, false);
810 payload
= malloc(sizeof(struct spdk_nvme_reservation_key_data
));
812 rc
= spdk_nvme_ns_cmd_reservation_release(&ns
, &qpair
, payload
, ignore_key
,
813 SPDK_NVME_RESERVE_RELEASE
,
814 SPDK_NVME_RESERVE_WRITE_EXCLUSIVE
,
817 SPDK_CU_ASSERT_FATAL(rc
== 0);
818 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
819 CU_ASSERT(g_request
->cmd
.opc
== SPDK_NVME_OPC_RESERVATION_RELEASE
);
820 CU_ASSERT(g_request
->cmd
.nsid
== ns
.id
);
822 tmp_cdw10
= SPDK_NVME_RESERVE_RELEASE
;
823 tmp_cdw10
|= ignore_key
? 1 << 3 : 0;
824 tmp_cdw10
|= (uint32_t)SPDK_NVME_RESERVE_WRITE_EXCLUSIVE
<< 8;
826 CU_ASSERT(g_request
->cmd
.cdw10
== tmp_cdw10
);
828 spdk_dma_free(g_request
->payload
.contig_or_cb_arg
);
829 nvme_free_request(g_request
);
831 cleanup_after_test(&qpair
);
835 test_nvme_ns_cmd_reservation_acquire(void)
837 struct spdk_nvme_ns ns
;
838 struct spdk_nvme_ctrlr ctrlr
;
839 struct spdk_nvme_qpair qpair
;
840 struct spdk_nvme_reservation_acquire_data
*payload
;
842 spdk_nvme_cmd_cb cb_fn
= NULL
;
847 prepare_for_test(&ns
, &ctrlr
, &qpair
, 512, 0, 128 * 1024, 0, false);
848 payload
= malloc(sizeof(struct spdk_nvme_reservation_acquire_data
));
850 rc
= spdk_nvme_ns_cmd_reservation_acquire(&ns
, &qpair
, payload
, ignore_key
,
851 SPDK_NVME_RESERVE_ACQUIRE
,
852 SPDK_NVME_RESERVE_WRITE_EXCLUSIVE
,
855 SPDK_CU_ASSERT_FATAL(rc
== 0);
856 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
857 CU_ASSERT(g_request
->cmd
.opc
== SPDK_NVME_OPC_RESERVATION_ACQUIRE
);
858 CU_ASSERT(g_request
->cmd
.nsid
== ns
.id
);
860 tmp_cdw10
= SPDK_NVME_RESERVE_ACQUIRE
;
861 tmp_cdw10
|= ignore_key
? 1 << 3 : 0;
862 tmp_cdw10
|= (uint32_t)SPDK_NVME_RESERVE_WRITE_EXCLUSIVE
<< 8;
864 CU_ASSERT(g_request
->cmd
.cdw10
== tmp_cdw10
);
866 spdk_dma_free(g_request
->payload
.contig_or_cb_arg
);
867 nvme_free_request(g_request
);
869 cleanup_after_test(&qpair
);
873 test_nvme_ns_cmd_reservation_report(void)
875 struct spdk_nvme_ns ns
;
876 struct spdk_nvme_ctrlr ctrlr
;
877 struct spdk_nvme_qpair qpair
;
878 struct spdk_nvme_reservation_status_data
*payload
;
879 spdk_nvme_cmd_cb cb_fn
= NULL
;
882 uint32_t size
= sizeof(struct spdk_nvme_reservation_status_data
);
884 prepare_for_test(&ns
, &ctrlr
, &qpair
, 512, 0, 128 * 1024, 0, false);
886 payload
= calloc(1, size
);
887 SPDK_CU_ASSERT_FATAL(payload
!= NULL
);
889 rc
= spdk_nvme_ns_cmd_reservation_report(&ns
, &qpair
, payload
, size
, cb_fn
, cb_arg
);
891 SPDK_CU_ASSERT_FATAL(rc
== 0);
892 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
893 CU_ASSERT(g_request
->cmd
.opc
== SPDK_NVME_OPC_RESERVATION_REPORT
);
894 CU_ASSERT(g_request
->cmd
.nsid
== ns
.id
);
896 CU_ASSERT(g_request
->cmd
.cdw10
== (size
/ 4));
898 spdk_dma_free(g_request
->payload
.contig_or_cb_arg
);
899 nvme_free_request(g_request
);
901 cleanup_after_test(&qpair
);
905 test_nvme_ns_cmd_write_with_md(void)
907 struct spdk_nvme_ns ns
;
908 struct spdk_nvme_ctrlr ctrlr
;
909 struct spdk_nvme_qpair qpair
;
912 char *metadata
= NULL
;
913 uint32_t block_size
, md_size
;
914 struct nvme_request
*child0
, *child1
;
919 buffer
= malloc((block_size
+ md_size
) * 384);
920 SPDK_CU_ASSERT_FATAL(buffer
!= NULL
);
921 metadata
= malloc(md_size
* 384);
922 SPDK_CU_ASSERT_FATAL(metadata
!= NULL
);
925 * 512 byte data + 128 byte metadata
926 * Separate metadata buffer
927 * Max data transfer size 128 KB
930 * 256 blocks * 512 bytes per block = single 128 KB I/O (no splitting required)
932 prepare_for_test(&ns
, &ctrlr
, &qpair
, 512, 128, 128 * 1024, 0, false);
934 rc
= spdk_nvme_ns_cmd_write_with_md(&ns
, &qpair
, buffer
, metadata
, 0x1000, 256, NULL
, NULL
, 0, 0,
937 SPDK_CU_ASSERT_FATAL(rc
== 0);
938 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
939 SPDK_CU_ASSERT_FATAL(g_request
->num_children
== 0);
941 CU_ASSERT(g_request
->payload
.md
== metadata
);
942 CU_ASSERT(g_request
->payload_size
== 256 * 512);
944 nvme_free_request(g_request
);
945 cleanup_after_test(&qpair
);
948 * 512 byte data + 128 byte metadata
950 * Max data transfer size 128 KB
953 * 256 blocks * (512 + 128) bytes per block = two I/Os:
954 * child 0: 204 blocks - 204 * (512 + 128) = 127.5 KB
957 prepare_for_test(&ns
, &ctrlr
, &qpair
, 512, 128, 128 * 1024, 0, true);
959 rc
= spdk_nvme_ns_cmd_write_with_md(&ns
, &qpair
, buffer
, NULL
, 0x1000, 256, NULL
, NULL
, 0, 0,
962 SPDK_CU_ASSERT_FATAL(rc
== 0);
963 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
964 SPDK_CU_ASSERT_FATAL(g_request
->num_children
== 2);
965 child0
= TAILQ_FIRST(&g_request
->children
);
967 SPDK_CU_ASSERT_FATAL(child0
!= NULL
);
968 CU_ASSERT(child0
->payload
.md
== NULL
);
969 CU_ASSERT(child0
->payload_offset
== 0);
970 CU_ASSERT(child0
->payload_size
== 204 * (512 + 128));
971 child1
= TAILQ_NEXT(child0
, child_tailq
);
973 SPDK_CU_ASSERT_FATAL(child1
!= NULL
);
974 CU_ASSERT(child1
->payload
.md
== NULL
);
975 CU_ASSERT(child1
->payload_offset
== 204 * (512 + 128));
976 CU_ASSERT(child1
->payload_size
== 52 * (512 + 128));
978 nvme_request_free_children(g_request
);
979 nvme_free_request(g_request
);
980 cleanup_after_test(&qpair
);
983 * 512 byte data + 8 byte metadata
985 * Max data transfer size 128 KB
987 * No protection information
989 * 256 blocks * (512 + 8) bytes per block = two I/Os:
990 * child 0: 252 blocks - 252 * (512 + 8) = 127.96875 KB
993 prepare_for_test(&ns
, &ctrlr
, &qpair
, 512, 8, 128 * 1024, 0, true);
995 rc
= spdk_nvme_ns_cmd_write_with_md(&ns
, &qpair
, buffer
, NULL
, 0x1000, 256, NULL
, NULL
, 0, 0,
998 SPDK_CU_ASSERT_FATAL(rc
== 0);
999 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
1000 SPDK_CU_ASSERT_FATAL(g_request
->num_children
== 2);
1001 child0
= TAILQ_FIRST(&g_request
->children
);
1003 SPDK_CU_ASSERT_FATAL(child0
!= NULL
);
1004 CU_ASSERT(child0
->payload
.md
== NULL
);
1005 CU_ASSERT(child0
->payload_offset
== 0);
1006 CU_ASSERT(child0
->payload_size
== 252 * (512 + 8));
1007 child1
= TAILQ_NEXT(child0
, child_tailq
);
1009 SPDK_CU_ASSERT_FATAL(child1
!= NULL
);
1010 CU_ASSERT(child1
->payload
.md
== NULL
);
1011 CU_ASSERT(child1
->payload_offset
== 252 * (512 + 8));
1012 CU_ASSERT(child1
->payload_size
== 4 * (512 + 8));
1014 nvme_request_free_children(g_request
);
1015 nvme_free_request(g_request
);
1016 cleanup_after_test(&qpair
);
1019 * 512 byte data + 8 byte metadata
1021 * Max data transfer size 128 KB
1023 * Protection information enabled + PRACT
1025 * Special case for 8-byte metadata + PI + PRACT: no metadata transferred
1026 * In theory, 256 blocks * 512 bytes per block = one I/O (128 KB)
1027 * However, the splitting code does not account for PRACT when calculating
1028 * max sectors per transfer, so we actually get two I/Os:
1029 * child 0: 252 blocks
1032 prepare_for_test(&ns
, &ctrlr
, &qpair
, 512, 8, 128 * 1024, 0, true);
1033 ns
.flags
|= SPDK_NVME_NS_DPS_PI_SUPPORTED
;
1035 rc
= spdk_nvme_ns_cmd_write_with_md(&ns
, &qpair
, buffer
, NULL
, 0x1000, 256, NULL
, NULL
,
1036 SPDK_NVME_IO_FLAGS_PRACT
, 0, 0);
1038 SPDK_CU_ASSERT_FATAL(rc
== 0);
1039 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
1040 SPDK_CU_ASSERT_FATAL(g_request
->num_children
== 2);
1041 child0
= TAILQ_FIRST(&g_request
->children
);
1043 SPDK_CU_ASSERT_FATAL(child0
!= NULL
);
1044 CU_ASSERT(child0
->payload_offset
== 0);
1045 CU_ASSERT(child0
->payload_size
== 252 * 512); /* NOTE: does not include metadata! */
1046 child1
= TAILQ_NEXT(child0
, child_tailq
);
1048 SPDK_CU_ASSERT_FATAL(child1
!= NULL
);
1049 CU_ASSERT(child1
->payload
.md
== NULL
);
1050 CU_ASSERT(child1
->payload_offset
== 252 * 512);
1051 CU_ASSERT(child1
->payload_size
== 4 * 512);
1053 nvme_request_free_children(g_request
);
1054 nvme_free_request(g_request
);
1055 cleanup_after_test(&qpair
);
1058 * 512 byte data + 8 byte metadata
1059 * Separate metadata buffer
1060 * Max data transfer size 128 KB
1062 * Protection information enabled + PRACT
1064 prepare_for_test(&ns
, &ctrlr
, &qpair
, 512, 8, 128 * 1024, 0, false);
1065 ns
.flags
|= SPDK_NVME_NS_DPS_PI_SUPPORTED
;
1067 rc
= spdk_nvme_ns_cmd_write_with_md(&ns
, &qpair
, buffer
, metadata
, 0x1000, 256, NULL
, NULL
,
1068 SPDK_NVME_IO_FLAGS_PRACT
, 0, 0);
1070 SPDK_CU_ASSERT_FATAL(rc
== 0);
1071 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
1072 SPDK_CU_ASSERT_FATAL(g_request
->num_children
== 0);
1074 CU_ASSERT(g_request
->payload
.md
== metadata
);
1075 CU_ASSERT(g_request
->payload_size
== 256 * 512);
1077 nvme_free_request(g_request
);
1078 cleanup_after_test(&qpair
);
1081 * 512 byte data + 8 byte metadata
1082 * Separate metadata buffer
1083 * Max data transfer size 128 KB
1085 * Protection information enabled + PRACT
1087 * 384 blocks * 512 bytes = two I/Os:
1088 * child 0: 256 blocks
1089 * child 1: 128 blocks
1091 prepare_for_test(&ns
, &ctrlr
, &qpair
, 512, 8, 128 * 1024, 0, false);
1092 ns
.flags
|= SPDK_NVME_NS_DPS_PI_SUPPORTED
;
1094 rc
= spdk_nvme_ns_cmd_write_with_md(&ns
, &qpair
, buffer
, metadata
, 0x1000, 384, NULL
, NULL
,
1095 SPDK_NVME_IO_FLAGS_PRACT
, 0, 0);
1097 SPDK_CU_ASSERT_FATAL(rc
== 0);
1098 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
1099 SPDK_CU_ASSERT_FATAL(g_request
->num_children
== 2);
1100 child0
= TAILQ_FIRST(&g_request
->children
);
1102 SPDK_CU_ASSERT_FATAL(child0
!= NULL
);
1103 CU_ASSERT(child0
->payload_offset
== 0);
1104 CU_ASSERT(child0
->payload_size
== 256 * 512);
1105 CU_ASSERT(child0
->md_offset
== 0);
1106 child1
= TAILQ_NEXT(child0
, child_tailq
);
1108 SPDK_CU_ASSERT_FATAL(child1
!= NULL
);
1109 CU_ASSERT(child1
->payload_offset
== 256 * 512);
1110 CU_ASSERT(child1
->payload_size
== 128 * 512);
1111 CU_ASSERT(child1
->md_offset
== 256 * 8);
1113 nvme_request_free_children(g_request
);
1114 nvme_free_request(g_request
);
1115 cleanup_after_test(&qpair
);
1122 test_nvme_ns_cmd_read_with_md(void)
1124 struct spdk_nvme_ns ns
;
1125 struct spdk_nvme_ctrlr ctrlr
;
1126 struct spdk_nvme_qpair qpair
;
1128 char *buffer
= NULL
;
1129 char *metadata
= NULL
;
1130 uint32_t block_size
, md_size
;
1135 buffer
= malloc(block_size
* 256);
1136 SPDK_CU_ASSERT_FATAL(buffer
!= NULL
);
1137 metadata
= malloc(md_size
* 256);
1138 SPDK_CU_ASSERT_FATAL(metadata
!= NULL
);
1141 * 512 byte data + 128 byte metadata
1142 * Separate metadata buffer
1143 * Max data transfer size 128 KB
1146 * 256 blocks * 512 bytes per block = single 128 KB I/O (no splitting required)
1148 prepare_for_test(&ns
, &ctrlr
, &qpair
, 512, 128, 128 * 1024, 0, false);
1150 rc
= spdk_nvme_ns_cmd_read_with_md(&ns
, &qpair
, buffer
, metadata
, 0x1000, 256, NULL
, NULL
, 0, 0,
1153 SPDK_CU_ASSERT_FATAL(rc
== 0);
1154 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
1155 SPDK_CU_ASSERT_FATAL(g_request
->num_children
== 0);
1157 CU_ASSERT(g_request
->payload
.md
== metadata
);
1158 CU_ASSERT(g_request
->payload_size
== 256 * 512);
1160 nvme_free_request(g_request
);
1161 cleanup_after_test(&qpair
);
1167 test_nvme_ns_cmd_compare_with_md(void)
1169 struct spdk_nvme_ns ns
;
1170 struct spdk_nvme_ctrlr ctrlr
;
1171 struct spdk_nvme_qpair qpair
;
1173 char *buffer
= NULL
;
1174 char *metadata
= NULL
;
1175 uint32_t block_size
, md_size
;
1176 struct nvme_request
*child0
, *child1
;
1181 buffer
= malloc((block_size
+ md_size
) * 384);
1182 SPDK_CU_ASSERT_FATAL(buffer
!= NULL
);
1183 metadata
= malloc(md_size
* 384);
1184 SPDK_CU_ASSERT_FATAL(metadata
!= NULL
);
1187 * 512 byte data + 128 byte metadata
1188 * Separate metadata buffer
1189 * Max data transfer size 128 KB
1192 * 256 blocks * 512 bytes per block = single 128 KB I/O (no splitting required)
1194 prepare_for_test(&ns
, &ctrlr
, &qpair
, 512, 128, 128 * 1024, 0, false);
1196 rc
= spdk_nvme_ns_cmd_compare_with_md(&ns
, &qpair
, buffer
, metadata
, 0x1000, 256,
1197 NULL
, NULL
, 0, 0, 0);
1199 SPDK_CU_ASSERT_FATAL(rc
== 0);
1200 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
1201 SPDK_CU_ASSERT_FATAL(g_request
->num_children
== 0);
1203 CU_ASSERT(g_request
->payload
.md
== metadata
);
1204 CU_ASSERT(g_request
->payload_size
== 256 * 512);
1206 nvme_free_request(g_request
);
1207 cleanup_after_test(&qpair
);
1210 * 512 byte data + 128 byte metadata
1212 * Max data transfer size 128 KB
1215 * 256 blocks * (512 + 128) bytes per block = two I/Os:
1216 * child 0: 204 blocks - 204 * (512 + 128) = 127.5 KB
1217 * child 1: 52 blocks
1219 prepare_for_test(&ns
, &ctrlr
, &qpair
, 512, 128, 128 * 1024, 0, true);
1221 rc
= spdk_nvme_ns_cmd_compare_with_md(&ns
, &qpair
, buffer
, NULL
, 0x1000, 256,
1222 NULL
, NULL
, 0, 0, 0);
1224 SPDK_CU_ASSERT_FATAL(rc
== 0);
1225 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
1226 SPDK_CU_ASSERT_FATAL(g_request
->num_children
== 2);
1227 child0
= TAILQ_FIRST(&g_request
->children
);
1229 SPDK_CU_ASSERT_FATAL(child0
!= NULL
);
1230 CU_ASSERT(child0
->payload
.md
== NULL
);
1231 CU_ASSERT(child0
->payload_offset
== 0);
1232 CU_ASSERT(child0
->payload_size
== 204 * (512 + 128));
1233 child1
= TAILQ_NEXT(child0
, child_tailq
);
1235 SPDK_CU_ASSERT_FATAL(child1
!= NULL
);
1236 CU_ASSERT(child1
->payload
.md
== NULL
);
1237 CU_ASSERT(child1
->payload_offset
== 204 * (512 + 128));
1238 CU_ASSERT(child1
->payload_size
== 52 * (512 + 128));
1240 nvme_request_free_children(g_request
);
1241 nvme_free_request(g_request
);
1242 cleanup_after_test(&qpair
);
1245 * 512 byte data + 8 byte metadata
1247 * Max data transfer size 128 KB
1249 * No protection information
1251 * 256 blocks * (512 + 8) bytes per block = two I/Os:
1252 * child 0: 252 blocks - 252 * (512 + 8) = 127.96875 KB
1255 prepare_for_test(&ns
, &ctrlr
, &qpair
, 512, 8, 128 * 1024, 0, true);
1257 rc
= spdk_nvme_ns_cmd_compare_with_md(&ns
, &qpair
, buffer
, NULL
, 0x1000, 256,
1258 NULL
, NULL
, 0, 0, 0);
1260 SPDK_CU_ASSERT_FATAL(rc
== 0);
1261 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
1262 SPDK_CU_ASSERT_FATAL(g_request
->num_children
== 2);
1263 child0
= TAILQ_FIRST(&g_request
->children
);
1265 SPDK_CU_ASSERT_FATAL(child0
!= NULL
);
1266 CU_ASSERT(child0
->payload
.md
== NULL
);
1267 CU_ASSERT(child0
->payload_offset
== 0);
1268 CU_ASSERT(child0
->payload_size
== 252 * (512 + 8));
1269 child1
= TAILQ_NEXT(child0
, child_tailq
);
1271 SPDK_CU_ASSERT_FATAL(child1
!= NULL
);
1272 CU_ASSERT(child1
->payload
.md
== NULL
);
1273 CU_ASSERT(child1
->payload_offset
== 252 * (512 + 8));
1274 CU_ASSERT(child1
->payload_size
== 4 * (512 + 8));
1276 nvme_request_free_children(g_request
);
1277 nvme_free_request(g_request
);
1278 cleanup_after_test(&qpair
);
1281 * 512 byte data + 8 byte metadata
1283 * Max data transfer size 128 KB
1285 * Protection information enabled + PRACT
1287 * Special case for 8-byte metadata + PI + PRACT: no metadata transferred
1288 * In theory, 256 blocks * 512 bytes per block = one I/O (128 KB)
1289 * However, the splitting code does not account for PRACT when calculating
1290 * max sectors per transfer, so we actually get two I/Os:
1291 * child 0: 252 blocks
1294 prepare_for_test(&ns
, &ctrlr
, &qpair
, 512, 8, 128 * 1024, 0, true);
1295 ns
.flags
|= SPDK_NVME_NS_DPS_PI_SUPPORTED
;
1297 rc
= spdk_nvme_ns_cmd_compare_with_md(&ns
, &qpair
, buffer
, NULL
, 0x1000, 256,
1298 NULL
, NULL
, SPDK_NVME_IO_FLAGS_PRACT
, 0, 0);
1300 SPDK_CU_ASSERT_FATAL(rc
== 0);
1301 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
1302 SPDK_CU_ASSERT_FATAL(g_request
->num_children
== 2);
1303 child0
= TAILQ_FIRST(&g_request
->children
);
1305 SPDK_CU_ASSERT_FATAL(child0
!= NULL
);
1306 CU_ASSERT(child0
->payload_offset
== 0);
1307 CU_ASSERT(child0
->payload_size
== 252 * 512); /* NOTE: does not include metadata! */
1308 child1
= TAILQ_NEXT(child0
, child_tailq
);
1310 SPDK_CU_ASSERT_FATAL(child1
!= NULL
);
1311 CU_ASSERT(child1
->payload
.md
== NULL
);
1312 CU_ASSERT(child1
->payload_offset
== 252 * 512);
1313 CU_ASSERT(child1
->payload_size
== 4 * 512);
1315 nvme_request_free_children(g_request
);
1316 nvme_free_request(g_request
);
1317 cleanup_after_test(&qpair
);
1320 * 512 byte data + 8 byte metadata
1321 * Separate metadata buffer
1322 * Max data transfer size 128 KB
1324 * Protection information enabled + PRACT
1326 prepare_for_test(&ns
, &ctrlr
, &qpair
, 512, 8, 128 * 1024, 0, false);
1327 ns
.flags
|= SPDK_NVME_NS_DPS_PI_SUPPORTED
;
1329 rc
= spdk_nvme_ns_cmd_compare_with_md(&ns
, &qpair
, buffer
, metadata
, 0x1000, 256,
1330 NULL
, NULL
, SPDK_NVME_IO_FLAGS_PRACT
, 0, 0);
1332 SPDK_CU_ASSERT_FATAL(rc
== 0);
1333 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
1334 SPDK_CU_ASSERT_FATAL(g_request
->num_children
== 0);
1336 CU_ASSERT(g_request
->payload
.md
== metadata
);
1337 CU_ASSERT(g_request
->payload_size
== 256 * 512);
1339 nvme_free_request(g_request
);
1340 cleanup_after_test(&qpair
);
1343 * 512 byte data + 8 byte metadata
1344 * Separate metadata buffer
1345 * Max data transfer size 128 KB
1347 * Protection information enabled + PRACT
1349 * 384 blocks * 512 bytes = two I/Os:
1350 * child 0: 256 blocks
1351 * child 1: 128 blocks
1353 prepare_for_test(&ns
, &ctrlr
, &qpair
, 512, 8, 128 * 1024, 0, false);
1354 ns
.flags
|= SPDK_NVME_NS_DPS_PI_SUPPORTED
;
1356 rc
= spdk_nvme_ns_cmd_compare_with_md(&ns
, &qpair
, buffer
, metadata
, 0x1000, 384,
1357 NULL
, NULL
, SPDK_NVME_IO_FLAGS_PRACT
, 0, 0);
1359 SPDK_CU_ASSERT_FATAL(rc
== 0);
1360 SPDK_CU_ASSERT_FATAL(g_request
!= NULL
);
1361 SPDK_CU_ASSERT_FATAL(g_request
->num_children
== 2);
1362 child0
= TAILQ_FIRST(&g_request
->children
);
1364 SPDK_CU_ASSERT_FATAL(child0
!= NULL
);
1365 CU_ASSERT(child0
->payload_offset
== 0);
1366 CU_ASSERT(child0
->payload_size
== 256 * 512);
1367 CU_ASSERT(child0
->md_offset
== 0);
1368 child1
= TAILQ_NEXT(child0
, child_tailq
);
1370 SPDK_CU_ASSERT_FATAL(child1
!= NULL
);
1371 CU_ASSERT(child1
->payload_offset
== 256 * 512);
1372 CU_ASSERT(child1
->payload_size
== 128 * 512);
1373 CU_ASSERT(child1
->md_offset
== 256 * 8);
1375 nvme_request_free_children(g_request
);
1376 nvme_free_request(g_request
);
1377 cleanup_after_test(&qpair
);
1383 int main(int argc
, char **argv
)
1385 CU_pSuite suite
= NULL
;
1386 unsigned int num_failures
;
1388 if (CU_initialize_registry() != CUE_SUCCESS
) {
1389 return CU_get_error();
1392 suite
= CU_add_suite("nvme_ns_cmd", NULL
, NULL
);
1393 if (suite
== NULL
) {
1394 CU_cleanup_registry();
1395 return CU_get_error();
1399 CU_add_test(suite
, "split_test", split_test
) == NULL
1400 || CU_add_test(suite
, "split_test2", split_test2
) == NULL
1401 || CU_add_test(suite
, "split_test3", split_test3
) == NULL
1402 || CU_add_test(suite
, "split_test4", split_test4
) == NULL
1403 || CU_add_test(suite
, "nvme_ns_cmd_flush", test_nvme_ns_cmd_flush
) == NULL
1404 || CU_add_test(suite
, "nvme_ns_cmd_dataset_management",
1405 test_nvme_ns_cmd_dataset_management
) == NULL
1406 || CU_add_test(suite
, "io_flags", test_io_flags
) == NULL
1407 || CU_add_test(suite
, "nvme_ns_cmd_write_zeroes", test_nvme_ns_cmd_write_zeroes
) == NULL
1408 || CU_add_test(suite
, "nvme_ns_cmd_reservation_register",
1409 test_nvme_ns_cmd_reservation_register
) == NULL
1410 || CU_add_test(suite
, "nvme_ns_cmd_reservation_release",
1411 test_nvme_ns_cmd_reservation_release
) == NULL
1412 || CU_add_test(suite
, "nvme_ns_cmd_reservation_acquire",
1413 test_nvme_ns_cmd_reservation_acquire
) == NULL
1414 || CU_add_test(suite
, "nvme_ns_cmd_reservation_report", test_nvme_ns_cmd_reservation_report
) == NULL
1415 || CU_add_test(suite
, "test_cmd_child_request", test_cmd_child_request
) == NULL
1416 || CU_add_test(suite
, "nvme_ns_cmd_readv", test_nvme_ns_cmd_readv
) == NULL
1417 || CU_add_test(suite
, "nvme_ns_cmd_read_with_md", test_nvme_ns_cmd_read_with_md
) == NULL
1418 || CU_add_test(suite
, "nvme_ns_cmd_writev", test_nvme_ns_cmd_writev
) == NULL
1419 || CU_add_test(suite
, "nvme_ns_cmd_write_with_md", test_nvme_ns_cmd_write_with_md
) == NULL
1420 || CU_add_test(suite
, "nvme_ns_cmd_comparev", test_nvme_ns_cmd_comparev
) == NULL
1421 || CU_add_test(suite
, "nvme_ns_cmd_compare_with_md", test_nvme_ns_cmd_compare_with_md
) == NULL
1423 CU_cleanup_registry();
1424 return CU_get_error();
1427 g_spdk_nvme_driver
= &_g_nvme_driver
;
1429 CU_basic_set_mode(CU_BRM_VERBOSE
);
1430 CU_basic_run_tests();
1431 num_failures
= CU_get_number_of_failures();
1432 CU_cleanup_registry();
1433 return num_failures
;