From: Damien Le Moal Date: Wed, 31 Jul 2019 04:32:07 +0000 (+0900) Subject: bssplit: Fix handling of 0 percentage X-Git-Tag: fio-3.16~46 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=cc5e4cb0b61e78f176754cec57d62c7d53d70fc6;hp=029b42ace698eae477c5e261d2f82b191507526b 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 Signed-off-by: Jens Axboe --- diff --git a/io_u.c b/io_u.c index 910b7deb..80df2854 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;