12866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe/* 2a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai * sync/psync engine 3da751ca9665bcdeca56d2eec5b629a0953c07662Jens Axboe * 4da751ca9665bcdeca56d2eec5b629a0953c07662Jens Axboe * IO engine that does regular read(2)/write(2) with lseek(2) to transfer 5a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai * data and IO engine that does regular pread(2)/pwrite(2) to transfer data. 62866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe * 72866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe */ 82866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe#include <stdio.h> 92866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe#include <stdlib.h> 102866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe#include <unistd.h> 115921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe#include <sys/uio.h> 122866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe#include <errno.h> 132866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe#include <assert.h> 145f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe 155f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe#include "../fio.h" 16eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#include "../optgroup.h" 172866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe 18ef5f5a3a63f8b7c472f30484c520265aba6ef162Jens Axboe/* 19ef5f5a3a63f8b7c472f30484c520265aba6ef162Jens Axboe * Sync engine uses engine_data to store last offset 20ef5f5a3a63f8b7c472f30484c520265aba6ef162Jens Axboe */ 21eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#define LAST_POS(f) ((f)->engine_pos) 22ef5f5a3a63f8b7c472f30484c520265aba6ef162Jens Axboe 231d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboestruct syncio_data { 241d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe struct iovec *iovecs; 251d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe struct io_u **io_us; 261d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe unsigned int queued; 27e51cf72c29e92619534ed84a59047e62eaa05a5aJens Axboe unsigned int events; 281d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe unsigned long queued_bytes; 291d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 301d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe unsigned long long last_offset; 311d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe struct fio_file *last_file; 321d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe enum fio_ddir last_ddir; 331d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe}; 341d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 35eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#ifdef FIO_HAVE_PWRITEV2 36eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesstruct psyncv2_options { 37eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes void *pad; 38eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes unsigned int hipri; 39eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes}; 40eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 41eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesstatic struct fio_option options[] = { 42eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes { 43eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes .name = "hipri", 44eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes .lname = "RWF_HIPRI", 45eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes .type = FIO_OPT_STR_SET, 46eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes .off1 = offsetof(struct psyncv2_options, hipri), 47eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes .help = "Set RWF_HIPRI for pwritev2/preadv2", 48eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes .category = FIO_OPT_C_ENGINE, 49eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes .group = FIO_OPT_G_INVALID, 50eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes }, 51eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes { 52eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes .name = NULL, 53eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes }, 54eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes}; 55eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#endif 56eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 572866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboestatic int fio_syncio_prep(struct thread_data *td, struct io_u *io_u) 582866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe{ 5953cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe struct fio_file *f = io_u->file; 6053cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe 61ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe if (!ddir_rw(io_u->ddir)) 6287dc1ab1b4df7b977f60e3d43533a896e2ee665bJens Axboe return 0; 6387dc1ab1b4df7b977f60e3d43533a896e2ee665bJens Axboe 64ef5f5a3a63f8b7c472f30484c520265aba6ef162Jens Axboe if (LAST_POS(f) != -1ULL && LAST_POS(f) == io_u->offset) 65e943b8785fa19ab5536d91242f1063ae809cdf2bJens Axboe return 0; 66e943b8785fa19ab5536d91242f1063ae809cdf2bJens Axboe 6753cdc6864f7471b28cc9b40a5314ab43e5b1cb5eJens Axboe if (lseek(f->fd, io_u->offset, SEEK_SET) == -1) { 68e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, errno, "lseek"); 692866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe return 1; 702866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe } 712866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe 722866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe return 0; 732866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe} 742866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe 752bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboestatic int fio_io_end(struct thread_data *td, struct io_u *io_u, int ret) 762866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe{ 77ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe if (io_u->file && ret >= 0 && ddir_rw(io_u->ddir)) 78ef5f5a3a63f8b7c472f30484c520265aba6ef162Jens Axboe LAST_POS(io_u->file) = io_u->offset + ret; 79e943b8785fa19ab5536d91242f1063ae809cdf2bJens Axboe 80cec6b55da1c282b5b91ad346c7804171fccf151eJens Axboe if (ret != (int) io_u->xfer_buflen) { 8122819ec237297fc39435ed566bee01a4225bfb39Jens Axboe if (ret >= 0) { 82cec6b55da1c282b5b91ad346c7804171fccf151eJens Axboe io_u->resid = io_u->xfer_buflen - ret; 83cec6b55da1c282b5b91ad346c7804171fccf151eJens Axboe io_u->error = 0; 8436167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe return FIO_Q_COMPLETED; 852866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe } else 862866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe io_u->error = errno; 872866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe } 882866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe 898f99b954bd2950d051f620228c9e10fc45b3cbadJens Axboe if (io_u->error) { 908f99b954bd2950d051f620228c9e10fc45b3cbadJens Axboe io_u_log_error(td, io_u); 91e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_verror(td, io_u->error, "xfer"); 928f99b954bd2950d051f620228c9e10fc45b3cbadJens Axboe } 932866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe 9436167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe return FIO_Q_COMPLETED; 952866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe} 962866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe 9707fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe#ifdef CONFIG_PWRITEV 9807fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboestatic int fio_pvsyncio_queue(struct thread_data *td, struct io_u *io_u) 9907fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe{ 100eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes struct syncio_data *sd = td->io_ops_data; 10107fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe struct iovec *iov = &sd->iovecs[0]; 10207fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe struct fio_file *f = io_u->file; 10307fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe int ret; 10407fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe 10507fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe fio_ro_check(td, io_u); 10607fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe 10707fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe iov->iov_base = io_u->xfer_buf; 10807fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe iov->iov_len = io_u->xfer_buflen; 10907fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe 11007fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe if (io_u->ddir == DDIR_READ) 11107fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe ret = preadv(f->fd, iov, 1, io_u->offset); 11207fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe else if (io_u->ddir == DDIR_WRITE) 11307fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe ret = pwritev(f->fd, iov, 1, io_u->offset); 11407fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe else if (io_u->ddir == DDIR_TRIM) { 11507fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe do_io_u_trim(td, io_u); 11607fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe return FIO_Q_COMPLETED; 11707fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe } else 11807fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe ret = do_io_u_sync(td, io_u); 11907fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe 12007fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe return fio_io_end(td, io_u, ret); 12107fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe} 12207fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe#endif 12307fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe 124eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#ifdef FIO_HAVE_PWRITEV2 125eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesstatic int fio_pvsyncio2_queue(struct thread_data *td, struct io_u *io_u) 126eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes{ 127eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes struct syncio_data *sd = td->io_ops_data; 128eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes struct psyncv2_options *o = td->eo; 129eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes struct iovec *iov = &sd->iovecs[0]; 130eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes struct fio_file *f = io_u->file; 131eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes int ret, flags = 0; 132eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 133eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes fio_ro_check(td, io_u); 134eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 135eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (o->hipri) 136eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes flags |= RWF_HIPRI; 137eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 138eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes iov->iov_base = io_u->xfer_buf; 139eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes iov->iov_len = io_u->xfer_buflen; 140eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 141eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (io_u->ddir == DDIR_READ) 142eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes ret = preadv2(f->fd, iov, 1, io_u->offset, flags); 143eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes else if (io_u->ddir == DDIR_WRITE) 144eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes ret = pwritev2(f->fd, iov, 1, io_u->offset, flags); 145eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes else if (io_u->ddir == DDIR_TRIM) { 146eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes do_io_u_trim(td, io_u); 147eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return FIO_Q_COMPLETED; 148eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes } else 149eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes ret = do_io_u_sync(td, io_u); 150eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 151eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return fio_io_end(td, io_u, ret); 152eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes} 153eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#endif 154eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 155eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 1562bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboestatic int fio_psyncio_queue(struct thread_data *td, struct io_u *io_u) 157a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai{ 1582bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe struct fio_file *f = io_u->file; 1592bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe int ret; 1602bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe 1612bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe fio_ro_check(td, io_u); 1622bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe 1632bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe if (io_u->ddir == DDIR_READ) 1642bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe ret = pread(f->fd, io_u->xfer_buf, io_u->xfer_buflen, io_u->offset); 1652bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe else if (io_u->ddir == DDIR_WRITE) 1662bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe ret = pwrite(f->fd, io_u->xfer_buf, io_u->xfer_buflen, io_u->offset); 1676eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li else if (io_u->ddir == DDIR_TRIM) { 1686eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li do_io_u_trim(td, io_u); 1696eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li return FIO_Q_COMPLETED; 1706eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li } else 1710a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe ret = do_io_u_sync(td, io_u); 1722bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe 1732bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe return fio_io_end(td, io_u, ret); 1742bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe} 1752bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe 1762bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboestatic int fio_syncio_queue(struct thread_data *td, struct io_u *io_u) 1772bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe{ 1782bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe struct fio_file *f = io_u->file; 1792bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe int ret; 1802bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe 1812bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe fio_ro_check(td, io_u); 1822bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe 1832bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe if (io_u->ddir == DDIR_READ) 1842bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe ret = read(f->fd, io_u->xfer_buf, io_u->xfer_buflen); 1852bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe else if (io_u->ddir == DDIR_WRITE) 1862bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe ret = write(f->fd, io_u->xfer_buf, io_u->xfer_buflen); 1876eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li else if (io_u->ddir == DDIR_TRIM) { 1886eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li do_io_u_trim(td, io_u); 1896eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li return FIO_Q_COMPLETED; 1906eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li } else 1910a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe ret = do_io_u_sync(td, io_u); 1922bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe 1932bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe return fio_io_end(td, io_u, ret); 194a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai} 195a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai 1961d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboestatic int fio_vsyncio_getevents(struct thread_data *td, unsigned int min, 1971d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe unsigned int max, 1980cbbc3919c80d969926f499cb6045be3d5cd0305Jens Axboe const struct timespec fio_unused *t) 1991d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe{ 200eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes struct syncio_data *sd = td->io_ops_data; 2011d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe int ret; 2021d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 2031d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe if (min) { 204e51cf72c29e92619534ed84a59047e62eaa05a5aJens Axboe ret = sd->events; 205e51cf72c29e92619534ed84a59047e62eaa05a5aJens Axboe sd->events = 0; 2061d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe } else 2071d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe ret = 0; 2081d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 2091d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe dprint(FD_IO, "vsyncio_getevents: min=%d,max=%d: %d\n", min, max, ret); 2101d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe return ret; 2111d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe} 2121d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 2131d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboestatic struct io_u *fio_vsyncio_event(struct thread_data *td, int event) 2141d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe{ 215eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes struct syncio_data *sd = td->io_ops_data; 2161d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 2171d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe return sd->io_us[event]; 2181d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe} 2191d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 2201d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboestatic int fio_vsyncio_append(struct thread_data *td, struct io_u *io_u) 2211d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe{ 222eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes struct syncio_data *sd = td->io_ops_data; 2231d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 2245f9099ea8adf423d0db01274ef0d7e65629c0e1cJens Axboe if (ddir_sync(io_u->ddir)) 2251d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe return 0; 2261d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 2271d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe if (io_u->offset == sd->last_offset && io_u->file == sd->last_file && 2281d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe io_u->ddir == sd->last_ddir) 2291d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe return 1; 2301d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 2311d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe return 0; 2321d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe} 2331d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 2341d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboestatic void fio_vsyncio_set_iov(struct syncio_data *sd, struct io_u *io_u, 2352b13e716c0921356c0930522718e00b8df34293aJens Axboe int idx) 2361d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe{ 2372b13e716c0921356c0930522718e00b8df34293aJens Axboe sd->io_us[idx] = io_u; 2382b13e716c0921356c0930522718e00b8df34293aJens Axboe sd->iovecs[idx].iov_base = io_u->xfer_buf; 2392b13e716c0921356c0930522718e00b8df34293aJens Axboe sd->iovecs[idx].iov_len = io_u->xfer_buflen; 2401d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe sd->last_offset = io_u->offset + io_u->xfer_buflen; 2411d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe sd->last_file = io_u->file; 2421d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe sd->last_ddir = io_u->ddir; 2431d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe sd->queued_bytes += io_u->xfer_buflen; 2441d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe sd->queued++; 2451d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe} 2461d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 2471d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboestatic int fio_vsyncio_queue(struct thread_data *td, struct io_u *io_u) 2481d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe{ 249eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes struct syncio_data *sd = td->io_ops_data; 2501d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 2511d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe fio_ro_check(td, io_u); 2521d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 2531d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe if (!fio_vsyncio_append(td, io_u)) { 2541d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe dprint(FD_IO, "vsyncio_queue: no append (%d)\n", sd->queued); 2551d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe /* 2561d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe * If we can't append and have stuff queued, tell fio to 2571d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe * commit those first and then retry this io 2581d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe */ 2591d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe if (sd->queued) 2601d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe return FIO_Q_BUSY; 2610a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe if (ddir_sync(io_u->ddir)) { 2620a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe int ret = do_io_u_sync(td, io_u); 2630a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe 2640a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe return fio_io_end(td, io_u, ret); 2650a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe } 266cc9159c3f6f6a650cb973a636c35b41b8be34dbfJens Axboe 2671d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe sd->queued = 0; 2681d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe sd->queued_bytes = 0; 2691d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe fio_vsyncio_set_iov(sd, io_u, 0); 2701d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe } else { 2711d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe if (sd->queued == td->o.iodepth) { 2721d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe dprint(FD_IO, "vsyncio_queue: max depth %d\n", sd->queued); 2731d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe return FIO_Q_BUSY; 2741d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe } 2751d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 2761d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe dprint(FD_IO, "vsyncio_queue: append\n"); 2771d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe fio_vsyncio_set_iov(sd, io_u, sd->queued); 2781d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe } 2791d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 2801d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe dprint(FD_IO, "vsyncio_queue: depth now %d\n", sd->queued); 2811d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe return FIO_Q_QUEUED; 2821d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe} 2831d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 2841d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe/* 2851d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe * Check that we transferred all bytes, or saw an error, etc 2861d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe */ 2871d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboestatic int fio_vsyncio_end(struct thread_data *td, ssize_t bytes) 2881d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe{ 289eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes struct syncio_data *sd = td->io_ops_data; 2901d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe struct io_u *io_u; 2911d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe unsigned int i; 2921d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe int err; 2931d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 2941d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe /* 2951d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe * transferred everything, perfect 2961d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe */ 2971d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe if (bytes == sd->queued_bytes) 2981d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe return 0; 2991d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 3001d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe err = errno; 3011d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe for (i = 0; i < sd->queued; i++) { 3021d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe io_u = sd->io_us[i]; 3031d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 3041d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe if (bytes == -1) { 3051d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe io_u->error = err; 3061d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe } else { 3071d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe unsigned int this_io; 3081d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 3091d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe this_io = bytes; 3101d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe if (this_io > io_u->xfer_buflen) 3111d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe this_io = io_u->xfer_buflen; 3121d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 3131d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe io_u->resid = io_u->xfer_buflen - this_io; 3141d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe io_u->error = 0; 3151d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe bytes -= this_io; 3161d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe } 3171d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe } 3181d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 3191d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe if (bytes == -1) { 3201d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe td_verror(td, err, "xfer vsync"); 3211d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe return -err; 3221d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe } 3231d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 3241d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe return 0; 3251d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe} 3261d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 3271d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboestatic int fio_vsyncio_commit(struct thread_data *td) 3281d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe{ 329eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes struct syncio_data *sd = td->io_ops_data; 3301d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe struct fio_file *f; 3311d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe ssize_t ret; 3321d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 3331d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe if (!sd->queued) 3341d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe return 0; 3351d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 336838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe io_u_mark_submit(td, sd->queued); 3371d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe f = sd->last_file; 3381d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 3391d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe if (lseek(f->fd, sd->io_us[0]->offset, SEEK_SET) == -1) { 3401d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe int err = -errno; 3411d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 3421d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe td_verror(td, errno, "lseek"); 3431d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe return err; 3441d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe } 3451d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 3461d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe if (sd->last_ddir == DDIR_READ) 3471d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe ret = readv(f->fd, sd->iovecs, sd->queued); 3481d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe else 3491d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe ret = writev(f->fd, sd->iovecs, sd->queued); 3501d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 3511d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe dprint(FD_IO, "vsyncio_commit: %d\n", (int) ret); 352e51cf72c29e92619534ed84a59047e62eaa05a5aJens Axboe sd->events = sd->queued; 353e51cf72c29e92619534ed84a59047e62eaa05a5aJens Axboe sd->queued = 0; 3541d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe return fio_vsyncio_end(td, ret); 3551d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe} 3561d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 3571d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboestatic int fio_vsyncio_init(struct thread_data *td) 3581d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe{ 3591d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe struct syncio_data *sd; 3601d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 3611d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe sd = malloc(sizeof(*sd)); 3621d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe memset(sd, 0, sizeof(*sd)); 3631d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe sd->last_offset = -1ULL; 3641d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe sd->iovecs = malloc(td->o.iodepth * sizeof(struct iovec)); 3651d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe sd->io_us = malloc(td->o.iodepth * sizeof(struct io_u *)); 3661d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 367eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes td->io_ops_data = sd; 3681d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe return 0; 3691d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe} 3701d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 3711d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboestatic void fio_vsyncio_cleanup(struct thread_data *td) 3721d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe{ 373eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes struct syncio_data *sd = td->io_ops_data; 3741d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 375eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (sd) { 376eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes free(sd->iovecs); 377eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes free(sd->io_us); 378eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes free(sd); 379eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes } 3801d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe} 3811d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 382a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas paistatic struct ioengine_ops ioengine_rw = { 3832866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe .name = "sync", 3842866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe .version = FIO_IOOPS_VERSION, 3852866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe .prep = fio_syncio_prep, 3862866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe .queue = fio_syncio_queue, 387b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe .open_file = generic_open_file, 388b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe .close_file = generic_close_file, 389df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe .get_file_size = generic_get_file_size, 3902866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe .flags = FIO_SYNCIO, 3912866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe}; 3925f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe 393a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas paistatic struct ioengine_ops ioengine_prw = { 394a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai .name = "psync", 395a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai .version = FIO_IOOPS_VERSION, 3962bd3eabc6ed08bf0ede81928396ac2db096480a1Jens Axboe .queue = fio_psyncio_queue, 397a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai .open_file = generic_open_file, 398a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai .close_file = generic_close_file, 399df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe .get_file_size = generic_get_file_size, 400a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai .flags = FIO_SYNCIO, 401a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai}; 402a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai 4031d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboestatic struct ioengine_ops ioengine_vrw = { 4041d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe .name = "vsync", 4051d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe .version = FIO_IOOPS_VERSION, 4061d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe .init = fio_vsyncio_init, 4071d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe .cleanup = fio_vsyncio_cleanup, 4081d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe .queue = fio_vsyncio_queue, 4091d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe .commit = fio_vsyncio_commit, 4101d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe .event = fio_vsyncio_event, 4111d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe .getevents = fio_vsyncio_getevents, 4121d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe .open_file = generic_open_file, 4131d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe .close_file = generic_close_file, 414df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe .get_file_size = generic_get_file_size, 4151d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe .flags = FIO_SYNCIO, 4161d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe}; 4171d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe 41807fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe#ifdef CONFIG_PWRITEV 41907fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboestatic struct ioengine_ops ioengine_pvrw = { 42007fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe .name = "pvsync", 42107fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe .version = FIO_IOOPS_VERSION, 42207fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe .init = fio_vsyncio_init, 42307fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe .cleanup = fio_vsyncio_cleanup, 42407fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe .queue = fio_pvsyncio_queue, 42507fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe .open_file = generic_open_file, 42607fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe .close_file = generic_close_file, 42707fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe .get_file_size = generic_get_file_size, 42807fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe .flags = FIO_SYNCIO, 42907fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe}; 43007fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe#endif 43107fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe 432eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#ifdef FIO_HAVE_PWRITEV2 433eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesstatic struct ioengine_ops ioengine_pvrw2 = { 434eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes .name = "pvsync2", 435eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes .version = FIO_IOOPS_VERSION, 436eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes .init = fio_vsyncio_init, 437eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes .cleanup = fio_vsyncio_cleanup, 438eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes .queue = fio_pvsyncio2_queue, 439eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes .open_file = generic_open_file, 440eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes .close_file = generic_close_file, 441eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes .get_file_size = generic_get_file_size, 442eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes .flags = FIO_SYNCIO, 443eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes .options = options, 444eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes .option_struct_size = sizeof(struct psyncv2_options), 445eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes}; 446eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#endif 447eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 4485f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboestatic void fio_init fio_syncio_register(void) 4495f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe{ 450a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai register_ioengine(&ioengine_rw); 451a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai register_ioengine(&ioengine_prw); 4521d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe register_ioengine(&ioengine_vrw); 4539a0ced5a97ae9fde87dae1a3d762b1bc090e8786Jens Axboe#ifdef CONFIG_PWRITEV 45407fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe register_ioengine(&ioengine_pvrw); 4559a0ced5a97ae9fde87dae1a3d762b1bc090e8786Jens Axboe#endif 456eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#ifdef FIO_HAVE_PWRITEV2 457eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes register_ioengine(&ioengine_pvrw2); 458eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#endif 4595f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe} 4605f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe 4615f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboestatic void fio_exit fio_syncio_unregister(void) 4625f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe{ 463a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai unregister_ioengine(&ioengine_rw); 464a31041eaf5a306b5f6ad3dd14b60da6212775037gurudas pai unregister_ioengine(&ioengine_prw); 4651d2af02a16fc3c3561c994be4de887b926b2b774Jens Axboe unregister_ioengine(&ioengine_vrw); 4669a0ced5a97ae9fde87dae1a3d762b1bc090e8786Jens Axboe#ifdef CONFIG_PWRITEV 46707fc0acd46e024b4df7ac60a3424fa1434a84600Jens Axboe unregister_ioengine(&ioengine_pvrw); 4689a0ced5a97ae9fde87dae1a3d762b1bc090e8786Jens Axboe#endif 469eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#ifdef FIO_HAVE_PWRITEV2 470eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes unregister_ioengine(&ioengine_pvrw2); 471eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#endif 4725f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe} 473