RE: [PATCH v2 3/7] zbd: Initialize open zones list referring zone status at fio start

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> -----Original Message-----
> From: Shin'ichiro Kawasaki <shinichiro.kawasaki@xxxxxxx>
> Sent: Friday, August 21, 2020 2:38 AM
> To: fio@xxxxxxxxxxxxxxx; Jens Axboe <axboe@xxxxxxxxx>
> Cc: Damien Le Moal <Damien.LeMoal@xxxxxxx>; Dmitry Fomichev
> <Dmitry.Fomichev@xxxxxxx>; Shinichiro Kawasaki
> <shinichiro.kawasaki@xxxxxxx>
> Subject: [PATCH v2 3/7] zbd: Initialize open zones list referring zone status at
> fio start
> 
> When fio starts write workloads to zones with open status, fio does not
> reflect the zone status to open zone list. This results in inconsistent
> open zone accounting.
> 
> To avoid this inconsistency, initialize the open zone list referring the
> zone status before workload start. If a zone in target range have open
> status, call zbd_open_zone() function to build up the open zone list.
> Since io_u is not available at that timing, make the function independent
> from io_u. If the number of open zones exceeds maximum open zones
> limits,
> reset the exceeding open zone by calling zbd_reset_zone().
> 
> Of note is that fio counts open zones within the write target range.
> Open zones out of the range are not counted or checked.
> 
> Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@xxxxxxx>
> ---
>  zbd.c | 33 ++++++++++++++++++++++++++++-----
>  1 file changed, 28 insertions(+), 5 deletions(-)
> 
> diff --git a/zbd.c b/zbd.c
> index 82d9af62..255a2f60 100644
> --- a/zbd.c
> +++ b/zbd.c
> @@ -628,6 +628,11 @@ static int zbd_init_zone_info(struct thread_data *td,
> struct fio_file *file)
>  	return ret;
>  }
> 
> +static bool zbd_open_zone(struct thread_data *td, const struct fio_file *f,
> +			  uint32_t zone_idx);
> +static int zbd_reset_zone(struct thread_data *td, struct fio_file *f,
> +			  struct fio_zone_info *z);
> +
>  int zbd_setup_files(struct thread_data *td)
>  {
>  	struct fio_file *f;
> @@ -651,6 +656,8 @@ int zbd_setup_files(struct thread_data *td)
> 
>  	for_each_file(td, f, i) {
>  		struct zoned_block_device_info *zbd = f->zbd_info;
> +		struct fio_zone_info *z;
> +		int zi;
> 
>  		if (!zbd)
>  			continue;
> @@ -666,6 +673,23 @@ int zbd_setup_files(struct thread_data *td)
>  			log_err("'max_open_zones' value is limited by
> %u\n", ZBD_MAX_OPEN_ZONES);
>  			return 1;
>  		}
> +
> +		for (zi = f->min_zone; zi < f->max_zone; zi++) {
> +			z = &zbd->zone_info[zi];
> +			if (z->cond != ZBD_ZONE_COND_IMP_OPEN &&
> +			    z->cond != ZBD_ZONE_COND_EXP_OPEN)
> +				continue;
> +			if (zbd_open_zone(td, f, zi))
> +				continue;
> +			/*
> +			 * If the number of open zones exceeds specified
> limits,
> +			 * reset and close the exceeding open zones.

Can simply say "reset all extra open zones" here.
Anyway,
Reviewed-by: Dmitry Fomichev: <dmitry.fomichev@xxxxxxx>

> +			 */
> +			if (zbd_reset_zone(td, f, z) < 0) {
> +				log_err("Failed to reest zone %d\n", zi);
> +				return 1;
> +			}
> +		}
>  	}
> 
>  	return 0;
> @@ -937,11 +961,10 @@ static bool is_zone_open(const struct thread_data
> *td, const struct fio_file *f,
>   * was not yet open and opening a new zone would cause the zone limit to
> be
>   * exceeded.
>   */
> -static bool zbd_open_zone(struct thread_data *td, const struct io_u *io_u,
> +static bool zbd_open_zone(struct thread_data *td, const struct fio_file *f,
>  			  uint32_t zone_idx)
>  {
>  	const uint32_t min_bs = td->o.min_bs[DDIR_WRITE];
> -	const struct fio_file *f = io_u->file;
>  	struct fio_zone_info *z = &f->zbd_info->zone_info[zone_idx];
>  	bool res = true;
> 
> @@ -1129,7 +1152,7 @@ open_other_zone:
>  		zone_lock(td, f, z);
>  		if (z->open)
>  			continue;
> -		if (zbd_open_zone(td, io_u, zone_idx))
> +		if (zbd_open_zone(td, f, zone_idx))
>  			goto out;
>  	}
> 
> @@ -1172,7 +1195,7 @@ static struct fio_zone_info
> *zbd_replay_write_order(struct thread_data *td,
>  	const struct fio_file *f = io_u->file;
>  	const uint32_t min_bs = td->o.min_bs[DDIR_WRITE];
> 
> -	if (!zbd_open_zone(td, io_u, z - f->zbd_info->zone_info)) {
> +	if (!zbd_open_zone(td, f, z - f->zbd_info->zone_info)) {
>  		pthread_mutex_unlock(&z->mutex);
>  		z = zbd_convert_to_open_zone(td, io_u);
>  		assert(z);
> @@ -1582,7 +1605,7 @@ enum io_u_action zbd_adjust_block(struct
> thread_data *td, struct io_u *io_u)
>  	case DDIR_WRITE:
>  		if (io_u->buflen > f->zbd_info->zone_size)
>  			goto eof;
> -		if (!zbd_open_zone(td, io_u, zone_idx_b)) {
> +		if (!zbd_open_zone(td, f, zone_idx_b)) {
>  			pthread_mutex_unlock(&zb->mutex);
>  			zb = zbd_convert_to_open_zone(td, io_u);
>  			if (!zb)
> --
> 2.26.2





[Index of Archives]     [Linux Kernel]     [Linux SCSI]     [Linux IDE]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]

  Powered by Linux