X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=filesetup.c;h=a3f96a15ef0e2a965406c3c050d57cfa47bbce38;hp=68516b9d9a8141ce9c74224464b99fb13434b12e;hb=ac89311241264280574c81e6400c9a0c59615082;hpb=9d7dfdaef1ed5f6227fd31117d310ac15ae63152 diff --git a/filesetup.c b/filesetup.c index 68516b9d..a3f96a15 100644 --- a/filesetup.c +++ b/filesetup.c @@ -119,6 +119,54 @@ err: return 1; } +static int pre_read_file(struct thread_data *td, struct fio_file *f) +{ + int r, did_open = 0, old_runstate; + unsigned long long left; + unsigned int bs; + char *b; + + if (!(f->flags & FIO_FILE_OPEN)) { + if (td->io_ops->open_file(td, f)) { + log_err("fio: cannot pre-read, failed to open file\n"); + return 1; + } + did_open = 1; + } + + old_runstate = td->runstate; + td_set_runstate(td, TD_PRE_READING); + + bs = td->o.max_bs[DDIR_READ]; + b = malloc(bs); + memset(b, 0, bs); + + lseek(f->fd, f->file_offset, SEEK_SET); + left = f->io_size; + + while (left && !td->terminate) { + if (bs > left) + bs = left; + + r = read(f->fd, b, bs); + + if (r == (int) bs) { + left -= bs; + continue; + } else { + td_verror(td, EIO, "pre_read"); + break; + } + } + + td_set_runstate(td, old_runstate); + + if (did_open) + td->io_ops->close_file(td, f); + free(b); + return 0; +} + static unsigned long long get_rand_file_size(struct thread_data *td) { unsigned long long ret, sized; @@ -207,8 +255,11 @@ static int __file_invalidate_cache(struct thread_data *td, struct fio_file *f, { int ret = 0; - if (len == -1ULL) + if (len == -1ULL) { len = f->io_size; + if (len == -1ULL && td->o.fill_device) + return 0; + } if (off == -1ULL) off = f->file_offset; @@ -218,8 +269,8 @@ static int __file_invalidate_cache(struct thread_data *td, struct fio_file *f, /* * FIXME: add blockdev flushing too */ - if (f->mmap) - ret = madvise(f->mmap, len, MADV_DONTNEED); + if (f->mmap_ptr) + ret = madvise(f->mmap_ptr, f->mmap_sz, MADV_DONTNEED); else if (f->filetype == FIO_TYPE_FILE) { ret = fadvise(f->fd, off, len, POSIX_FADV_DONTNEED); } else if (f->filetype == FIO_TYPE_BD) { @@ -397,7 +448,7 @@ static int get_file_sizes(struct thread_data *td) dprint(FD_FILE, "get file size for %p/%d/%p\n", f, i, f->file_name); - if (td->io_ops->get_file_size(td, f)) { + if (td_io_get_file_size(td, f)) { if (td->error != ENOENT) { log_err("%s\n", td->verror); err = 1; @@ -572,6 +623,20 @@ err_offset: return 1; } +int pre_read_files(struct thread_data *td) +{ + struct fio_file *f; + unsigned int i; + + dprint(FD_FILE, "pre_read files\n"); + + for_each_file(td, f, i) { + pre_read_file(td, f); + } + + return 1; +} + int init_random_map(struct thread_data *td) { unsigned long long blocks, num_maps; @@ -686,7 +751,7 @@ int add_file(struct thread_data *td, const char *fname) f->fd = -1; if (td->files_size <= td->files_index) { - int new_size = td->o.nr_files; + int new_size = td->o.nr_files + 1; dprint(FD_FILE, "resize file array to %d files\n", new_size);