Recent changes (master)
The following changes since commit d13596b225baf61425a9ca92b0583fc3fa97765d:
Fio 3.21 (2020-07-20 16:37:50 -0600)
are available in the Git repository at:
git://git.kernel.dk/fio.git master
for you to fetch changes up to 5090d1d0f2a109c276384c93308566b7a3bfa5ad:
zbd: fix %lu -> %llu dprint() formatting (2020-07-21 09:40:07 -0600)
----------------------------------------------------------------
Hans Holmberg (3):
options: Add zonecapacity option for zonemode=zbd t/zbd: Support testing zone capacity smaller than zone size t/zbd: Add test case to check zonecapacity option
Jens Axboe (1):
zbd: fix %lu -> %llu dprint() formatting
Shin'ichiro Kawasaki (3):
zbd: Support zone capacity smaller than zone size
t/zbd: Mandate blkzone capacity report for devices with zone capacity t/zbd: Support testing zone capacity smaller than zone size with null_blk
HOWTO | 18 +++++- cconv.c | 2 + configure | 19 ++++++ engines/libzbc.c | 5 ++ fio.1 | 13 +++- options.c | 11 ++++ oslib/linux-blkzoned.c | 11 ++++ t/zbd/functions | 82 ++++++++++++++++++++++++ t/zbd/run-tests-against-zoned-nullb | 30 ++++++++- t/zbd/test-zbd-support | 123 ++++++++++++++++++++++++++---------- thread_options.h | 2 + zbd.c | 87 ++++++++++++++++++++----- zbd.h | 2 + zbd_types.h | 1 + 14 files changed, 348 insertions(+), 58 deletions(-)
---
Diff of recent changes:
HOWTO +15 -3
@@ -970,14 +970,15 @@ Target file/device Accepted values are: **none** - The :option:`zonerange`, :option:`zonesize` and - :option:`zoneskip` parameters are ignored. + The :option:`zonerange`, :option:`zonesize`, + :option `zonecapacity` and option:`zoneskip` + parameters are ignored. **strided** I/O happens in a single zone until :option:`zonesize` bytes have been transferred. After that number of bytes has been transferred processing of the next zone - starts. + starts. :option `zonecapacity` is ignored. **zbd** Zoned block device mode. I/O happens sequentially in each zone, even if random I/O
@@ -1004,6 +1005,17 @@ Target file/device For :option:`zonemode` =zbd, this is the size of a single zone. The :option:`zonerange` parameter is ignored in this mode. + +.. option:: zonecapacity=int + + For :option:`zonemode` =zbd, this defines the capacity of a single zone, + which is the accessible area starting from the zone start address. + This parameter only applies when using :option:`zonemode` =zbd in + combination with regular block devices. If not specified it defaults to + the zone size. If the target device is a zoned block device, the zone + capacity is obtained from the device information and this option is + ignored. + .. option:: zoneskip=int For :option:`zonemode` =strided, the number of bytes to skip after
cconv.c +2 -0
@@ -223,6 +223,7 @@ void convert_thread_options_to_cpu(struct thread_options *o, o->ss_limit.u.f =fio_uint64_to_double (le64_to_cpu (top->ss_limit.u.i)); o->zone_range =le64_to_cpu (top->zone_range); o->zone_size =le64_to_cpu (top->zone_size); + o->zone_capacity =le64_to_cpu (top->zone_capacity); o->zone_skip =le64_to_cpu (top->zone_skip); o->zone_mode =le32_to_cpu (top->zone_mode); o->lockmem =le64_to_cpu (top->lockmem);
@@ -563,6 +564,7 @@ void convert_thread_options_to_net(struct thread_options_pack *top, top->ss_limit.u.i =__cpu_to_le64 (fio_double_to_uint64 (o->ss_limit.u.f)); top->zone_range =__cpu_to_le64 (o->zone_range); top->zone_size =__cpu_to_le64 (o->zone_size); + top->zone_capacity =__cpu_to_le64 (o->zone_capacity); top->zone_skip =__cpu_to_le64 (o->zone_skip); top->zone_mode =__cpu_to_le32 (o->zone_mode); top->lockmem =__cpu_to_le64 (o->lockmem);
configure +19 -0
@@ -2390,6 +2390,7 @@ if compile_prog "" "" "valgrind_dev"; then fi print_config "Valgrind headers" "$valgrind_dev" +if test "$targetos" = "Linux" ; then ########################################## # <linux/blkzoned.h> probe if test "$linux_blkzoned" != "yes" ; then
@@ -2407,6 +2408,24 @@ if compile_prog "" "" "linux_blkzoned"; then fi print_config "Zoned block device support" "$linux_blkzoned" +########################################## +# Check BLK_ZONE_REP_CAPACITY +cat > $TMPC << EOF +#include <linux/blkzoned.h> +int main(void) +{ + return BLK_ZONE_REP_CAPACITY; +} +EOF +if compile_prog "" "" "blkzoned report capacity"; then + output_sym "CONFIG_HAVE_REP_CAPACITY" + rep_capacity="yes" +else + rep_capacity="no" +fi +print_config "Zoned block device capacity" "$rep_capacity" +fi + ########################################## # libzbc probe if test "$libzbc" != "yes" ; then
engines/libzbc.c +5 -0
@@ -235,6 +235,11 @@ static int libzbc_report_zones(struct thread_data *td, struct fio_file *f, zbdz->start = zones[i].zbz_start <<9 ; zbdz->len = zones[i].zbz_length <<9 ; zbdz->wp = zones[i].zbz_write_pointer <<9 ; +/* +* ZBC/ZAC do not define zone capacity, so use the zone size as +* the zone capacity. +*/ + zbdz->capacity = zbdz->len;switch (zones[i].zbz_type) {case ZBC_ZT_CONVENTIONAL :
fio.1 +11 -2
@@ -738,12 +738,13 @@ Accepted values are: .RS .TP .B none -The \fBzonerange\fR, \fBzonesize\fR and \fBzoneskip\fR parameters are ignored. +The \fBzonerange\fR, \fBzonesize\fR \fBzonecapacity\fR and \fBzoneskip\fR +parameters are ignored. .TP .B strided I/O happens in a single zone until \fBzonesize\fR bytes have been transferred. After that number of bytes has been transferred processing of the next zone -starts. +starts. The \fBzonecapacity\fR parameter is ignored. .TP .B zbd Zoned block device mode. I/O happens sequentially in each zone, even if random
@@ -771,6 +772,14 @@ zoned block device, the specified \fBzonesize\fR must be 0 or equal to the device zone size. For a regular block device or file, the specified \fBzonesize\fR must be at least 512B. .TP +.BI zonecapacity \fR=\fPint +For \fBzonemode\fR=zbd, this defines the capacity of a single zone, which is +the accessible area starting from the zone start address. This parameter only +applies when using \fBzonemode\fR=zbd in combination with regular block devices. +If not specified it defaults to the zone size. If the target device is a zoned +block device, the zone capacity is obtained from the device information and this +option is ignored. +.TP .BI zoneskip \fR=\fPint For \fBzonemode\fR=strided, the number of bytes to skip after \fBzonesize\fR bytes of data have been transferred.
options.c +11 -0
@@ -3327,6 +3327,17 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .category = FIO_OPT_C_IO, .group = FIO_OPT_G_ZONE, }, + { + .name = "zonecapacity", + .lname = "Zone capacity", + .type = FIO_OPT_STR_VAL, + .off1 = offsetof(struct thread_options, zone_capacity), + .help = "Capacity per zone", + .def = "0", + .interval = 1024 * 1024, + .category = FIO_OPT_C_IO, + .group = FIO_OPT_G_ZONE, + }, { .name = "zonerange", .lname = "Zone range",
oslib/linux-blkzoned.c +11 -0
@@ -113,6 +113,16 @@ out:return 0 ; } +static uint64_t zone_capacity (struct blk_zone_report *hdr, +struct blk_zone *blkz) +{ +#ifdef CONFIG_HAVE_REP_CAPACITY +if (hdr->flags &BLK_ZONE_REP_CAPACITY ) +return blkz->capacity <<9 ; +#endif +return blkz->len <<9 ; +} +int blkzoned_report_zones (struct thread_data *td,struct fio_file *f,uint64_t offset,struct zbd_zone *zones,unsigned int nr_zones)
@@ -149,6 +159,7 @@ int blkzoned_report_zones(struct thread_data *td, struct fio_file *f, z->start = blkz->start <<9 ; z->wp = blkz->wp <<9 ; z->len = blkz->len <<9 ; + z->capacity =zone_capacity (hdr, blkz);switch (blkz->type) {case BLK_ZONE_TYPE_CONVENTIONAL :
t/zbd/functions +82 -0
94 lines not on this page · raw message
t/zbd/run-tests-against-zoned-nullb +27 -3
@@ -6,6 +6,21 @@ scriptdir="$(cd "$(dirname "$0")" && pwd)" +zone_size=1 +zone_capacity=1 +if [[ ${1} == "-h" ]]; then + echo "Usage: ${0} [OPTIONS]" + echo "Options:" + echo -e "\t-h Show this message." + echo -e "\t-zone-cap Use null blk with zone capacity less than zone size." + echo -e "\tany option supported by test-zbd-support script." + exit 1 +elif [[ ${1} == "-zone-cap" ]]; then + zone_size=4 + zone_capacity=3 + shift +fi + for d in /sys/kernel/config/nullb/*; do [ -d "$d" ] && rmdir "$d"; done modprobe -r null_blk modprobe null_blk nr_devices=0 || exit $?
@@ -17,9 +32,18 @@ modprobe -r null_blk modprobe null_blk nr_devices=0 && cd /sys/kernel/config/nullb && mkdir nullb0 && - cd nullb0 && - echo 1 > zoned && - echo 1 > zone_size && + cd nullb0 || exit $? + +if ((zone_capacity < zone_size)); then + if [[ ! -w zone_capacity ]]; then + echo "null blk does not support zone capacity" + exit 1 + fi + echo "${zone_capacity}" > zone_capacity +fi + +echo 1 > zoned && + echo "${zone_size}" > zone_size && echo 0 > completion_nsec && echo 4096 > blocksize && echo 1024 > size &&
t/zbd/test-zbd-support +88 -35
302 lines not on this page · raw message
thread_options.h +2 -0
@@ -193,6 +193,7 @@ struct thread_options {unsigned int loops;unsigned long long zone_range;unsigned long long zone_size; +unsigned long long zone_capacity;unsigned long long zone_skip;enum fio_zone_mode zone_mode;unsigned long long lockmem;
@@ -487,6 +488,7 @@ struct thread_options_pack {uint32_t loops;uint64_t zone_range;uint64_t zone_size; +uint64_t zone_capacity;uint64_t zone_skip;uint64_t lockmem;uint32_t mem_type;
zbd.c +72 -15
194 lines not on this page · raw message
zbd.h +2 -0
@@ -23,6 +23,7 @@ enum io_u_action {* struct fio_zone_info - information about a single ZBD zone * @start: zone start location (bytes) * @wp: zone write pointer location (bytes) +* @capacity: maximum size usable from the start of a zone (bytes) * @verify_block: number of blocks that have been verified for this zone * @mutex: protects the modifiable members in this structure * @type: zone type (BLK_ZONE_TYPE_*)
@@ -35,6 +36,7 @@ struct fio_zone_info {pthread_mutex_t mutex;uint64_t start;uint64_t wp; +uint64_t capacity;uint32_t verify_block; enum zbd_zone_type type:2; enum zbd_zone_cond cond:4;
zbd_types.h +1 -0
@@ -50,6 +50,7 @@ struct zbd_zone {uint64_t start;uint64_t wp;uint64_t len; +uint64_t capacity;enum zbd_zone_type type;enum zbd_zone_cond cond; };