The following changes since commit 3f2dcb7f855d43244ec178aa2a34bb1475bf6901: Merge branch 'zbd-build' of https://github.com/vincentkfu/fio (2020-04-08 08:46:35 -0600) are available in the Git repository at: git://git.kernel.dk/fio.git master for you to fetch changes up to 25dc6606fbbaca35aec3009c4ff9512ed02d41ba: zbd: fix sequential write pattern with verify= and max_open_zones= (2020-04-13 17:18:31 -0600) ---------------------------------------------------------------- Alexey Dobriyan (2): zbd: fix zonemode=zbd with NDEBUG zbd: fix sequential write pattern with verify= and max_open_zones= Jens Axboe (1): Merge branch 'fix-cflags' of https://github.com/Hi-Angel/fio Konstantin Kharlamov (1): configure/Makefile: don't override user CFLAGS Shin'ichiro Kawasaki (3): t/zbd: Fix a bug in max_open_zones() t/zbd: Fix a bug in reset_zone() for all zones reset zbd: Ensure first I/O is write for random read/write to sequential zones Makefile | 24 ++++++++++----------- configure | 2 +- t/zbd/functions | 6 +++--- zbd.c | 66 ++++++++++++++++++++++++++++++++++++++++----------------- 4 files changed, 62 insertions(+), 36 deletions(-) --- Diff of recent changes: diff --git a/Makefile b/Makefile index 5bcd6064..cb9e1775 100644 --- a/Makefile +++ b/Makefile @@ -22,16 +22,16 @@ endif DEBUGFLAGS = -DFIO_INC_DEBUG CPPFLAGS= -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DFIO_INTERNAL $(DEBUGFLAGS) OPTFLAGS= -g -ffast-math -CFLAGS = -std=gnu99 -Wwrite-strings -Wall -Wdeclaration-after-statement $(OPTFLAGS) $(EXTFLAGS) $(BUILD_CFLAGS) -I. -I$(SRCDIR) +CFLAGS := -std=gnu99 -Wwrite-strings -Wall -Wdeclaration-after-statement $(OPTFLAGS) $(EXTFLAGS) $(BUILD_CFLAGS) -I. -I$(SRCDIR) $(CFLAGS) LIBS += -lm $(EXTLIBS) PROGS = fio SCRIPTS = $(addprefix $(SRCDIR)/,tools/fio_generate_plots tools/plot/fio2gnuplot tools/genfio tools/fiologparser.py tools/hist/fiologparser_hist.py tools/fio_jsonplus_clat2csv) ifndef CONFIG_FIO_NO_OPT - CFLAGS += -O3 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 + CFLAGS := -O3 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $(CFLAGS) endif ifdef CONFIG_BUILD_NATIVE - CFLAGS += -march=native + CFLAGS := -march=native $(CFLAGS) endif ifdef CONFIG_GFIO @@ -55,27 +55,27 @@ SOURCE := $(sort $(patsubst $(SRCDIR)/%,%,$(wildcard $(SRCDIR)/crc/*.c)) \ ifdef CONFIG_LIBHDFS HDFSFLAGS= -I $(JAVA_HOME)/include -I $(JAVA_HOME)/include/linux -I $(FIO_LIBHDFS_INCLUDE) HDFSLIB= -Wl,-rpath $(JAVA_HOME)/jre/lib/$(FIO_HDFS_CPU)/server -L$(JAVA_HOME)/jre/lib/$(FIO_HDFS_CPU)/server $(FIO_LIBHDFS_LIB)/libhdfs.a -ljvm - CFLAGS += $(HDFSFLAGS) + CFLAGS := $(HDFSFLAGS) $(CFLAGS) SOURCE += engines/libhdfs.c endif ifdef CONFIG_LIBISCSI - CFLAGS += $(LIBISCSI_CFLAGS) + CFLAGS := $(LIBISCSI_CFLAGS) $(CFLAGS) LIBS += $(LIBISCSI_LIBS) SOURCE += engines/libiscsi.c endif ifdef CONFIG_LIBNBD - CFLAGS += $(LIBNBD_CFLAGS) + CFLAGS := $(LIBNBD_CFLAGS) $(CFLAGS) LIBS += $(LIBNBD_LIBS) SOURCE += engines/nbd.c endif ifdef CONFIG_64BIT - CFLAGS += -DBITS_PER_LONG=64 + CFLAGS := -DBITS_PER_LONG=64 $(CFLAGS) endif ifdef CONFIG_32BIT - CFLAGS += -DBITS_PER_LONG=32 + CFLAGS := -DBITS_PER_LONG=32 $(CFLAGS) endif ifdef CONFIG_LIBAIO SOURCE += engines/libaio.c @@ -140,7 +140,7 @@ ifdef CONFIG_GFAPI SOURCE += engines/glusterfs_sync.c SOURCE += engines/glusterfs_async.c ifdef CONFIG_GF_FADVISE - CFLAGS += "-DGFAPI_USE_FADVISE" + CFLAGS := "-DGFAPI_USE_FADVISE" $(CFLAGS) endif endif ifdef CONFIG_MTD @@ -208,7 +208,7 @@ ifeq ($(CONFIG_TARGET_OS), AIX) endif ifeq ($(CONFIG_TARGET_OS), HP-UX) LIBS += -lpthread -ldl -lrt - CFLAGS += -D_LARGEFILE64_SOURCE -D_XOPEN_SOURCE_EXTENDED + CFLAGS := -D_LARGEFILE64_SOURCE -D_XOPEN_SOURCE_EXTENDED $(CFLAGS) endif ifeq ($(CONFIG_TARGET_OS), Darwin) LIBS += -lpthread -ldl @@ -217,7 +217,7 @@ ifneq (,$(findstring CYGWIN,$(CONFIG_TARGET_OS))) SOURCE += os/windows/cpu-affinity.c os/windows/posix.c WINDOWS_OBJS = os/windows/cpu-affinity.o os/windows/posix.o lib/hweight.o LIBS += -lpthread -lpsapi -lws2_32 -lssp - CFLAGS += -DPSAPI_VERSION=1 -Ios/windows/posix/include -Wno-format + CFLAGS := -DPSAPI_VERSION=1 -Ios/windows/posix/include -Wno-format $(CFLAGS) endif OBJS := $(SOURCE:.c=.o) @@ -386,7 +386,7 @@ FIO-VERSION-FILE: FORCE @$(SHELL) $(SRCDIR)/FIO-VERSION-GEN -include FIO-VERSION-FILE -override CFLAGS += -DFIO_VERSION='"$(FIO_VERSION)"' +override CFLAGS := -DFIO_VERSION='"$(FIO_VERSION)"' $(CFLAGS) %.o : %.c @mkdir -p $(dir $@) diff --git a/configure b/configure index ae2b3589..cf8b88e4 100755 --- a/configure +++ b/configure @@ -44,7 +44,7 @@ print_config() { } # Default CFLAGS -CFLAGS="-D_GNU_SOURCE -include config-host.h" +CFLAGS="-D_GNU_SOURCE -include config-host.h $CFLAGS" BUILD_CFLAGS="" # Print a helpful header at the top of config.log diff --git a/t/zbd/functions b/t/zbd/functions index 35087b15..1bd22ec4 100644 --- a/t/zbd/functions +++ b/t/zbd/functions @@ -43,7 +43,8 @@ max_open_zones() { local dev=$1 if [ -n "${sg_inq}" ] && [ ! -n "${use_libzbc}" ]; then - if ! ${sg_inq} -e --page=0xB6 --len=20 --hex "$dev" 2> /dev/null; then + if ! ${sg_inq} -e --page=0xB6 --len=20 --hex "$dev" \ + > /dev/null 2>&1; then # Non scsi device such as null_blk can not return max open zones. # Use default value. echo 128 @@ -96,8 +97,7 @@ reset_zone() { if [ -n "${blkzone}" ] && [ ! -n "${use_libzbc}" ]; then if [ "$offset" -lt 0 ]; then - sectors=$(<"/sys/class/block/${dev#/dev/}/size") - ${blkzone} reset -o "${offset}" -l "$sectors" "$dev" + ${blkzone} reset "$dev" else ${blkzone} reset -o "${offset}" -c 1 "$dev" fi diff --git a/zbd.c b/zbd.c index 0b0d4f40..de0c5bf4 100644 --- a/zbd.c +++ b/zbd.c @@ -687,6 +687,22 @@ static int zbd_reset_zone(struct thread_data *td, struct fio_file *f, return zbd_reset_range(td, f, z->start, (z+1)->start - z->start); } +/* The caller must hold f->zbd_info->mutex */ +static void zbd_close_zone(struct thread_data *td, const struct fio_file *f, + unsigned int open_zone_idx) +{ + uint32_t zone_idx; + + assert(open_zone_idx < f->zbd_info->num_open_zones); + zone_idx = f->zbd_info->open_zones[open_zone_idx]; + memmove(f->zbd_info->open_zones + open_zone_idx, + f->zbd_info->open_zones + open_zone_idx + 1, + (ZBD_MAX_OPEN_ZONES - (open_zone_idx + 1)) * + sizeof(f->zbd_info->open_zones[0])); + f->zbd_info->num_open_zones--; + f->zbd_info->zone_info[zone_idx].open = 0; +} + /* * Reset a range of zones. Returns 0 upon success and 1 upon failure. * @td: fio thread data. @@ -710,12 +726,26 @@ static int zbd_reset_zones(struct thread_data *td, struct fio_file *f, dprint(FD_ZBD, "%s: examining zones %u .. %u\n", f->file_name, zbd_zone_nr(f->zbd_info, zb), zbd_zone_nr(f->zbd_info, ze)); for (z = zb; z < ze; z++) { + uint32_t nz = z - f->zbd_info->zone_info; + if (!zbd_zone_swr(z)) continue; zone_lock(td, z); - reset_wp = all_zones ? z->wp != z->start : - (td->o.td_ddir & TD_DDIR_WRITE) && - z->wp % min_bs != 0; + if (all_zones) { + unsigned int i; + + pthread_mutex_lock(&f->zbd_info->mutex); + for (i = 0; i < f->zbd_info->num_open_zones; i++) { + if (f->zbd_info->open_zones[i] == nz) + zbd_close_zone(td, f, i); + } + pthread_mutex_unlock(&f->zbd_info->mutex); + + reset_wp = z->wp != z->start; + } else { + reset_wp = (td->o.td_ddir & TD_DDIR_WRITE) && + z->wp % min_bs != 0; + } if (reset_wp) { dprint(FD_ZBD, "%s: resetting zone %u\n", f->file_name, @@ -905,22 +935,6 @@ out: return res; } -/* The caller must hold f->zbd_info->mutex */ -static void zbd_close_zone(struct thread_data *td, const struct fio_file *f, - unsigned int open_zone_idx) -{ - uint32_t zone_idx; - - assert(open_zone_idx < f->zbd_info->num_open_zones); - zone_idx = f->zbd_info->open_zones[open_zone_idx]; - memmove(f->zbd_info->open_zones + open_zone_idx, - f->zbd_info->open_zones + open_zone_idx + 1, - (ZBD_MAX_OPEN_ZONES - (open_zone_idx + 1)) * - sizeof(f->zbd_info->open_zones[0])); - f->zbd_info->num_open_zones--; - f->zbd_info->zone_info[zone_idx].open = 0; -} - /* Anything goes as long as it is not a constant. */ static uint32_t pick_random_zone_idx(const struct fio_file *f, const struct io_u *io_u) @@ -1220,6 +1234,7 @@ static void zbd_put_io(const struct io_u *io_u) struct zoned_block_device_info *zbd_info = f->zbd_info; struct fio_zone_info *z; uint32_t zone_idx; + int ret; if (!zbd_info) return; @@ -1235,7 +1250,8 @@ static void zbd_put_io(const struct io_u *io_u) "%s: terminate I/O (%lld, %llu) for zone %u\n", f->file_name, io_u->offset, io_u->buflen, zone_idx); - assert(pthread_mutex_unlock(&z->mutex) == 0); + ret = pthread_mutex_unlock(&z->mutex); + assert(ret == 0); zbd_check_swd(f); } @@ -1348,6 +1364,16 @@ enum io_u_action zbd_adjust_block(struct thread_data *td, struct io_u *io_u) if (!zbd_zone_swr(zb)) return io_u_accept; + /* + * In case read direction is chosen for the first random I/O, fio with + * zonemode=zbd stops because no data can be read from zoned block + * devices with all empty zones. Overwrite the first I/O direction as + * write to make sure data to read exists. + */ + if (td_rw(td) && !f->zbd_info->sectors_with_data + && !td->o.read_beyond_wp) + io_u->ddir = DDIR_WRITE; + /* * Accept the I/O offset for reads if reading beyond the write pointer * is enabled.