From cfc99db7b9e806e7739b360dfa005360d0fe8837 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Wed, 14 Mar 2007 10:34:47 +0100 Subject: [PATCH] mmap engine: make sure that page unaligned syncs work Signed-off-by: Jens Axboe --- engines/mmap.c | 20 ++++++++++++++------ fio.c | 4 +++- fio.h | 1 + 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/engines/mmap.c b/engines/mmap.c index bb4a81a5..0922e97e 100644 --- a/engines/mmap.c +++ b/engines/mmap.c @@ -22,23 +22,31 @@ static int fio_mmapio_queue(struct thread_data *td, struct io_u *io_u) else if (io_u->ddir == DDIR_WRITE) memcpy(f->mmap + real_off, io_u->xfer_buf, io_u->xfer_buflen); else if (io_u->ddir == DDIR_SYNC) { - if (msync(f->mmap, f->file_size, MS_SYNC)) + size_t len = (f->file_size + page_size - 1) & ~page_mask; + + if (msync(f->mmap, len, MS_SYNC)) { io_u->error = errno; + td_verror(td, io_u->error, "msync"); + } } /* * not really direct, but should drop the pages from the cache */ if (td->odirect && io_u->ddir != DDIR_SYNC) { - if (msync(f->mmap + real_off, io_u->xfer_buflen, MS_SYNC) < 0) + size_t len = (io_u->xfer_buflen + page_size - 1) & ~page_mask; + unsigned long long off = real_off & ~page_mask; + + if (msync(f->mmap + off, len, MS_SYNC) < 0) { io_u->error = errno; - if (madvise(f->mmap + real_off, io_u->xfer_buflen, MADV_DONTNEED) < 0) + td_verror(td, io_u->error, "msync"); + } + if (madvise(f->mmap + off, len, MADV_DONTNEED) < 0) { io_u->error = errno; + td_verror(td, io_u->error, "madvise"); + } } - if (io_u->error) - td_verror(td, io_u->error, "sync"); - return FIO_Q_COMPLETED; } diff --git a/fio.c b/fio.c index 85eb22be..e6bd18a0 100644 --- a/fio.c +++ b/fio.c @@ -37,7 +37,8 @@ #include "fio.h" #include "os.h" -static unsigned long page_mask; +unsigned long page_mask; +unsigned long page_size; #define ALIGN(buf) \ (char *) (((unsigned long) (buf) + page_mask) & ~page_mask) @@ -1158,6 +1159,7 @@ int main(int argc, char *argv[]) return 1; } + page_size = ps; page_mask = ps - 1; if (write_bw_log) { diff --git a/fio.h b/fio.h index 5098ff8f..72104226 100644 --- a/fio.h +++ b/fio.h @@ -534,6 +534,7 @@ extern FILE *f_out; extern FILE *f_err; extern int temp_stall_ts; extern unsigned long long mlock_size; +extern unsigned long page_mask, page_size; extern struct thread_data *threads; -- 2.25.1