summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Le Moal <damien.lemoal@wdc.com>2019-07-31 13:32:07 +0900
committerJens Axboe <axboe@kernel.dk>2019-07-31 08:47:59 -0600
commitcc5e4cb0b61e78f176754cec57d62c7d53d70fc6 (patch)
treeb208eedeb1c691e700a43a4160b8bc577c8e23b1
parent029b42ace698eae477c5e261d2f82b191507526b (diff)
bssplit: Fix handling of 0 percentage
If a block size percentage is ispecified as 0 in bssplit, the block size defined is not ignored by the loop in get_next_buflen(). In particular, if the first (smallest) block size specified has a 0 percentage, the loop is existed and that block size used as the next IO size, resulting in a behavior equivalent to specifying 100%. E.g. using --bssplit=64k/0,1024k/100 results in 100% of issued IOs to be 64KB instead of 1MB. Fix this by ignoring bssplit entries that have a 0 percentage. This is safe as the initialization of the bssplit array ensure that the sum of all percentages is always 100, guaranteeing that a block size will be chosen for the next IO size. Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r--io_u.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/io_u.c b/io_u.c
index 910b7de..80df285 100644
--- a/io_u.c
+++ b/io_u.c
@@ -557,10 +557,10 @@ static unsigned long long get_next_buflen(struct thread_data *td, struct io_u *i
for (i = 0; i < td->o.bssplit_nr[ddir]; i++) {
struct bssplit *bsp = &td->o.bssplit[ddir][i];
+ if (!bsp->perc)
+ continue;
buflen = bsp->bs;
perc += bsp->perc;
- if (!perc)
- break;
if ((r / perc <= frand_max / 100ULL) &&
io_u_fits(td, io_u, buflen))
break;