diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index 5ed9b6fbe..13b04c81a 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -1474,6 +1474,12 @@ bdev_qos_io_to_limit(struct spdk_bdev_io *bdev_io) case SPDK_BDEV_IO_TYPE_READ: case SPDK_BDEV_IO_TYPE_WRITE: return true; + case SPDK_BDEV_IO_TYPE_ZCOPY: + if (bdev_io->u.bdev.zcopy.start) { + return true; + } else { + return false; + } default: return false; } @@ -1493,6 +1499,13 @@ bdev_is_read_io(struct spdk_bdev_io *bdev_io) } case SPDK_BDEV_IO_TYPE_READ: return true; + case SPDK_BDEV_IO_TYPE_ZCOPY: + /* Populate to read from disk */ + if (bdev_io->u.bdev.zcopy.populate) { + return true; + } else { + return false; + } default: return false; } @@ -1510,6 +1523,13 @@ bdev_get_io_size_in_byte(struct spdk_bdev_io *bdev_io) case SPDK_BDEV_IO_TYPE_READ: case SPDK_BDEV_IO_TYPE_WRITE: return bdev_io->u.bdev.num_blocks * bdev->blocklen; + case SPDK_BDEV_IO_TYPE_ZCOPY: + /* Track the data in the start phase only */ + if (bdev_io->u.bdev.zcopy.start) { + return bdev_io->u.bdev.num_blocks * bdev->blocklen; + } else { + return 0; + } default: return 0; } @@ -4481,6 +4501,23 @@ bdev_io_complete(void *ctx) bdev_io->internal.ch->stat.bytes_unmapped += bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen; bdev_io->internal.ch->stat.num_unmap_ops++; bdev_io->internal.ch->stat.unmap_latency_ticks += tsc_diff; + break; + case SPDK_BDEV_IO_TYPE_ZCOPY: + /* Track the data in the start phase only */ + if (bdev_io->u.bdev.zcopy.start) { + if (bdev_io->u.bdev.zcopy.populate) { + bdev_io->internal.ch->stat.bytes_read += + bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen; + bdev_io->internal.ch->stat.num_read_ops++; + bdev_io->internal.ch->stat.read_latency_ticks += tsc_diff; + } else { + bdev_io->internal.ch->stat.bytes_written += + bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen; + bdev_io->internal.ch->stat.num_write_ops++; + bdev_io->internal.ch->stat.write_latency_ticks += tsc_diff; + } + } + break; default: break; }