summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Axboe <jens.axboe@oracle.com>2009-03-11 11:00:13 +0100
committerJens Axboe <jens.axboe@oracle.com>2009-03-11 11:00:13 +0100
commit2b7a01d01ea19f6e4090c7a8280bc6bf983e781f (patch)
treea3af388d89be08a03e620fccde9ffb7383b2384e
parent903dc3f6f7a44b17f09152a4fd9a2e2d767cc2cc (diff)
downloadfio-2b7a01d01ea19f6e4090c7a8280bc6bf983e781f.tar.gz
fio-2b7a01d01ea19f6e4090c7a8280bc6bf983e781f.tar.bz2
Add blockalign/ba option
Allows the job to specify alignment of the IO specifically, instead of relying on using blocksize as the offset alignment. Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
-rw-r--r--HOWTO8
-rw-r--r--fio.16
-rw-r--r--fio.h1
-rw-r--r--init.c15
-rw-r--r--io_u.c4
-rw-r--r--options.c10
6 files changed, 42 insertions, 2 deletions
diff --git a/HOWTO b/HOWTO
index 4e52e650..999f7778 100644
--- a/HOWTO
+++ b/HOWTO
@@ -327,6 +327,14 @@ bs=int The block size used for the io units. Defaults to 4k. Values
can do so by passing an empty read size - bs=,8k will set
8k for writes and leave the read default value.
+blockalign=int
+ba=int At what boundary to align random IO offsets. Defaults to
+ the same as 'blocksize' the minimum blocksize given.
+ Minimum alignment is typically 512b for using direct IO,
+ though it usually depends on the hardware block size. This
+ option is mutually exclusive with using a random map for
+ files, so it will turn off that option.
+
blocksize_range=irange
bsrange=irange Instead of giving a single block size, specify a range
and fio will mix the issued io block sizes. The issued
diff --git a/fio.1 b/fio.1
index 2eb44557..dd8eda97 100644
--- a/fio.1
+++ b/fio.1
@@ -193,6 +193,12 @@ blocks and 40% 32k blocks.
If set, any size in \fBblocksize_range\fR may be used. This typically won't
work with direct I/O, as that normally requires sector alignment.
.TP
+.BI blockalign \fR=\fPint[,int] "\fR,\fB ba" \fR=\fPint[,int]
+At what boundary to align random IO offsets. Defaults to the same as
+'blocksize' the minimum blocksize given. Minimum alignment is typically 512b
+for using direct IO, though it usually depends on the hardware block size.
+This option is mutually exclusive with using a random map for files, so it
+will turn off that option.
.B zero_buffers
Initialise buffers with all zeros. Default: fill buffers with random data.
.TP
diff --git a/fio.h b/fio.h
index b6ffe60b..a9e2e3bb 100644
--- a/fio.h
+++ b/fio.h
@@ -429,6 +429,7 @@ struct thread_options {
unsigned long long start_offset;
unsigned int bs[2];
+ unsigned int ba[2];
unsigned int min_bs[2];
unsigned int max_bs[2];
struct bssplit *bssplit;
diff --git a/init.c b/init.c
index 4ae3baf0..80d098dd 100644
--- a/init.c
+++ b/init.c
@@ -273,6 +273,21 @@ static int fixup_options(struct thread_data *td)
o->rw_min_bs = min(o->min_bs[DDIR_READ], o->min_bs[DDIR_WRITE]);
+ /*
+ * For random IO, allow blockalign offset other than min_bs.
+ */
+ if (!o->ba[DDIR_READ] || !td_random(td))
+ o->ba[DDIR_READ] = o->min_bs[DDIR_READ];
+ if (!o->ba[DDIR_WRITE] || !td_random(td))
+ o->ba[DDIR_WRITE] = o->min_bs[DDIR_WRITE];
+
+ if ((o->ba[DDIR_READ] != o->min_bs[DDIR_READ] ||
+ o->ba[DDIR_WRITE] != o->min_bs[DDIR_WRITE]) &&
+ !td->o.norandommap) {
+ log_err("fio: Any use of blockalign= turns off randommap\n");
+ td->o.norandommap = 1;
+ }
+
if (!o->file_size_high)
o->file_size_high = o->file_size_low;
diff --git a/io_u.c b/io_u.c
index 27014c8a..476658ed 100644
--- a/io_u.c
+++ b/io_u.c
@@ -95,7 +95,7 @@ static unsigned long long last_block(struct thread_data *td, struct fio_file *f,
if (max_size > f->real_file_size)
max_size = f->real_file_size;
- max_blocks = max_size / (unsigned long long) td->o.min_bs[ddir];
+ max_blocks = max_size / (unsigned long long) td->o.ba[ddir];
if (!max_blocks)
return 0;
@@ -212,7 +212,7 @@ static int get_next_offset(struct thread_data *td, struct io_u *io_u)
b = (f->last_pos - f->file_offset) / td->o.min_bs[ddir];
}
- io_u->offset = b * td->o.min_bs[ddir];
+ io_u->offset = b * td->o.ba[ddir];
if (io_u->offset >= f->io_size) {
dprint(FD_IO, "get_next_offset: offset %llu >= io_size %llu\n",
io_u->offset, f->io_size);
diff --git a/options.c b/options.c
index 73815bb0..97001109 100644
--- a/options.c
+++ b/options.c
@@ -793,6 +793,16 @@ static struct fio_option options[] = {
.parent = "rw",
},
{
+ .name = "ba",
+ .alias = "blockalign",
+ .type = FIO_OPT_STR_VAL_INT,
+ .off1 = td_var_offset(ba[DDIR_READ]),
+ .off2 = td_var_offset(ba[DDIR_WRITE]),
+ .minval = 1,
+ .help = "IO block offset alignment",
+ .parent = "rw",
+ },
+ {
.name = "bsrange",
.alias = "blocksize_range",
.type = FIO_OPT_RANGE,